public class ChromeVideoMenu extends ChromeMenuWindow
{
    UIComboBox Button_VideoMode;
    UIComboBox Button_BPP;
    UIButton   Button_Fullscreen;
    UIComboBox Button_Filtering;
    UIComboBox Button_TexQ;
    UIComboBox Button_Shadows;
    UIComboBox Button_FX_Q;
    UIComboBox Button_Materials_Q;
    UIButton   Button_Force16bit;
	UISlider Button_Brightness;

    int m_iStandard800x600Mode = 0;
    
    int aiFiltering[] = { /*EFilteringModes.NO_FILTERING, 
                          EFilteringModes.BILINEAR_NO_MIPMAPS,*/
                          EFilteringModes.BILINEAR,
                          EFilteringModes.TRILINEAR,
                          /*EFilteringModes.ANISOTROPIC,
                          EFilteringModes.ANISOTROPIC_TRILINEAR*/
                        };
    int aiTexQuality[] = { ETextureQuality.LOW,
                           ETextureQuality.NORMAL };
/*                          
    int aiTexQuality[] = { ETextureQuality.VERY_LOW, 
                           ETextureQuality.LOW,
                           ETextureQuality.NORMAL,
                           ETextureQuality.HIGH };
*/
    int aiShadows[] = { EShadowModes.NONE,
                        EShadowModes.BLOBS, 
                        EShadowModes.SHADOWMAPS };
    int iGamma;
    
    void Init(MenuBackground cBack)
    {
        MenuModule=(ChromeMenuModule)GetModule();
        
        UIButton cDefButton = (UIButton)GetElem("ID_DEFAULT");
        
        Button_VideoMode = (UIComboBox)GetElem("ID_COMBOBOX_VIDEO_MODE");
        FillResolutionBox();
        
        if (MenuModule.bInGameMenuAct)
            Button_VideoMode.SetDisabled(true);

        Button_BPP = (UIComboBox)GetElem("ID_COMBOBOX_BPP");
        Button_BPP.AddItem("16",null);
        Button_BPP.AddItem("32",null);
        
        if (MenuModule.bInGameMenuAct)
            Button_BPP.SetDisabled(true);

        Button_Fullscreen = (UIButton)GetElem("ID_FULL_SCREEN_CHECK");
        
        Button_Filtering = (UIComboBox)GetElem("ID_COMBOBOX_FILTERING_MODE");
        //Button_Filtering.AddItem("&NOFILTERING&",null);
        //Button_Filtering.AddItem("&BILINEARNOMIPMAPS&",null);
        Button_Filtering.AddItem("&BILINEAR&",null);
        Button_Filtering.AddItem("&TRILINEAR&",null);
        //Button_Filtering.AddItem("&ANISO&",null);
        //Button_Filtering.AddItem("&ANISOTRI&",null);
        
        Button_Materials_Q = (UIComboBox)GetElem("ID_COMBOBOX_MATERIALS_QUALITY");
        Button_Materials_Q.AddItem("&VERYLOW&",null);
        Button_Materials_Q.AddItem("&LOW&",null);
        Button_Materials_Q.AddItem("&NORMAL&",null);
        Button_Materials_Q.AddItem("&HIGH&",null);
        Button_Materials_Q.AddItem("&VERYHIGH&",null);
        
        if (MenuModule.bInGameMenuAct)
        {
            Button_Materials_Q.SetDisabled(true);
            if(EChromeAudioMenuUI.bNoDefSound) cDefButton.Hide();
        }

        Button_FX_Q = (UIComboBox)GetElem("ID_COMBOBOX_FX_QUALITY");
        Button_FX_Q.AddItem("&LOW&",null);
        Button_FX_Q.AddItem("&NORMAL&",null);
            
        Button_TexQ = (UIComboBox)GetElem("ID_COMBOBOX_TEXTURE_QUALITY");
        Button_TexQ.AddItem("&MENU LOW&",null);
        Button_TexQ.AddItem("&NORMAL&",null);
        
        Button_Force16bit = (UIButton)GetElem("ID_16_BIT_TEXTURES_CHECK");
        
        Button_Brightness = (UISlider)GetElem("ID_SLIDER_BRIGHTNESS");
        Button_Brightness.SetRange(0, 10);
        
        Button_Shadows = (UIComboBox)GetElem("ID_COMBOBOX_SHADOWS");
        Button_Shadows.AddItem("&SHADOWS_NONE&",null);//&NONE&");
        Button_Shadows.AddItem("&SHADOWS_BLOBS&",null);//&LOW&");
        Button_Shadows.AddItem("&SHADOWS_SHADOWMAP&", null);
        
        if(Pawn.bTerrainError || EChromeAudioMenuUI.bNoDefSound)
        {
            UIButton cButton = (UIButton)GetElem("ID_DEFAULT");
            cButton.Hide();
        }
        
        if(!GetEngineVersion().equals("0"))
            cDefButton.Hide();
        
        SetButton();
    }
    
    void OnUICommand(UIWindow cSender, int nCommand)
	{
		super.OnUICommand(cSender,nCommand);
		if (nCommand == EUIConst.CM_SLIDER_CHANGEPOS)
		{
            ChangeBrightness();
			return;
		}
		     
		if(nCommand == EUIConst.CM_CLICK || nCommand == EUIConst.CM_DBCLICK)
        {
            if(cSender.m_sId.equals("ID_OK"))
			{
				    SetSettings();
                    SaveSettings();
					//MenuModule.cCursor.OnChangeResolution();
                    MenuModule.SetMenu("ChromeOptionsMenu");
			}else
			if(cSender.m_sId.equals("ID_CANCEL"))
			{
				Discard();
			}else
			if(cSender.m_sId.equals("ID_DEFAULT"))
			{
                OnDefaultOptions();
			}
				
        }
    }
    
    void OnDefaultOptions()
    {
        Button_BPP.SetSelection( 1 );
        Button_Fullscreen.SetCheck( true );
        Button_Filtering.SetSelection( 3 );
        Button_FX_Q.SetSelection( 1 );
        Button_TexQ.SetSelection( 1 );
        Button_Shadows.SetSelection( 1 );
        Button_Force16bit.SetCheck(false);
        Button_Brightness.SetSliderPos( 5 );
        ChangeBrightness();
        
        if (!MenuModule.bInGameMenuAct)
        {
            Button_Materials_Q.SetSelection( 2 );
            Button_VideoMode.SetSelection( GetVideoModePos(m_iStandard800x600Mode) );
        }
    }
    
    void SetButton()
    {
        Button_VideoMode.SetSelection( GetVideoModePos(GetResolutionMode()) );
                         
        if (GetBPP() == 16)
            Button_BPP.SetSelection( 0 );   
        else
            Button_BPP.SetSelection( 1 );
        
        Button_Fullscreen.SetCheck( GetFullscreen() );
        Button_Filtering.SetSelection( FM2FMMode(GetTextureFiltering()) );
        
        int iMatQuality = GetMaterialQuality();
        iMatQuality--; //bo indeksowane od zera
        if( iMatQuality < 0 )
            iMatQuality = 0;
        else if( iMatQuality > 4 )
            iMatQuality = 4;
        Button_Materials_Q.SetSelection( iMatQuality );
        
        //TODO
        int iFXQuality = GetFXQuality();
        if( iFXQuality < 0 )
            iFXQuality = 0;
        else if( iFXQuality > 1 )
            iFXQuality = 1;
        Button_FX_Q.SetSelection( iFXQuality );
        
        Button_TexQ.SetSelection( TQ2TQMode(GetTextureQuality()) );
        Button_Shadows.SetSelection( Shadow2ShadowMode(GetShadows()) );
        Button_Force16bit.SetCheck(GetTextureBPP() == 16);
        
        iGamma = GetGamma();
        Button_Brightness.SetSliderPos( iGamma );
    }
    
    void SaveSettings()
    {
        SaveVideoSettings("");
    }
    
    void SetSettings()
    {
        int iOldResMode = GetResolutionMode();
        int iResMode = ((Integer)Button_VideoMode.GetSelected().m_cData).intValue();

        int iBppMode = Button_BPP.GetSelection();
        int bpp = 24;
        if (iBppMode == 0) bpp = 16;

		ChangeBrightness();
        SetResolutionMode(iResMode, bpp);
        
        SetBPP(bpp);

        SetFullscreen(Button_Fullscreen.GetCheck());
        SetTextureFiltering( aiFiltering[Button_Filtering.GetSelection()] );
        SetMaterialQuality(Button_Materials_Q.GetSelection()+1); //bo indeksowane od zera
        SetFXQuality(Button_FX_Q.GetSelection());
        SetTextureQuality( aiTexQuality[Button_TexQ.GetSelection()] );
        SetTextureBPP( (Button_Force16bit.GetCheck()) ? 16 : 32 );
        SetShadows( aiShadows[Button_Shadows.GetSelection()] );
        
        //TODO
        //Button_FX_Q
        
        ApplyVideoSettings();
        
        //jesli zmienila sie rozdzielczosc ekranu
        if( iOldResMode != iResMode)
        {
            MenuModule.OnChangeResolution();
            MenuModule.cCursor.OnChangeResolution();
     	}
    }
    
    void ChangeBrightness()
    {
        if (Button_Brightness.GetSliderPos() < 0)
            Button_Brightness.SetSliderPos(0);
        if (Button_Brightness.GetSliderPos() > 10)
            Button_Brightness.SetSliderPos(10);

        SetGamma( (int) Button_Brightness.GetSliderPos());
    }
    
    void Discard()
    {
		if(!CanDiscard())
			return;
			
		//uwzglednienie stanu comboboxow
     	if (Button_VideoMode.m_bExpanded)
		{
			Button_VideoMode.Collapse();
			return;
		}
		if (Button_BPP.m_bExpanded)
		{
			Button_BPP.Collapse();
			return;
		}
		if (Button_Filtering.m_bExpanded)
		{
			Button_Filtering.Collapse();
			return;
		}
		if (Button_TexQ.m_bExpanded)
		{
			Button_TexQ.Collapse();
			return;
		}
		if (Button_Shadows.m_bExpanded)
		{
			Button_Shadows.Collapse();
			return;
		}
		if (Button_FX_Q.m_bExpanded)
		{
			Button_FX_Q.Collapse();
			return;
		}
		if (Button_Materials_Q.m_bExpanded)
		{
			Button_Materials_Q.Collapse();
			return;
		}
		
        MenuModule.SetMenu("ChromeOptionsMenu");
    }
    
    int FM2FMMode(int iFM)
    {
        int i;
        for (i = 0; i < aiFiltering.length; ++i)
        {
            if (aiFiltering[i] == iFM)
                return i;
        }
        
        return 0;
    }

    int TQ2TQMode(int iTQ)
    {
        int i;
        for (i = 0; i < aiTexQuality.length; ++i)
        {
            if (aiTexQuality[i] == iTQ)
                return i;
        }
        
        return 0;
    }
    
    int Shadow2ShadowMode(int iS)
    {
        int i;
        for (i = 0; i < aiShadows.length; ++i)
        {
            if (aiShadows[i] == iS)
                return i;
        }
        
        return 0;
    }
    
    void FillResolutionBox()
    {
        //Button_VideoMode.List_Item.Clear(); - wolamy raz na starcie
        
        int bpp = 24;
        if (!Is24bppPresent()) bpp = 16;
        for (int i = 0; ; ++i)
        {
            String mode = EnumResolution(i, bpp);
            
            if (mode.length() == 0)
                break;
            
            if (!IsModeAvailable(mode))
            {
                continue;
            }

            if(mode.equals("800x600"))
                m_iStandard800x600Mode = i;
               
            LogR("" + mode + "\n");
            Button_VideoMode.AddItem(mode,new Integer(i));
        }

        Button_VideoMode.SetSelection(0);
    }
    
    boolean IsModeAvailable(String sMode)
    {
        return sMode.equals("800x600") ||
               sMode.equals("1024x768") ||
               sMode.equals("1152x864") ||
               sMode.equals("1280x960") ||
               sMode.equals("1600x1200");
    }
        
    int GetVideoModePos(int nMode)
    {
        for (int i = 0; i < Button_VideoMode.GetItemCount(); i++)
        {
            if (((Integer)Button_VideoMode.GetItem(i).m_cData).intValue() == nMode)
                return i;
        }
        return -1;
    }
}
