/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#include "tp_3D_SceneIllumination.hrc"
#include "dlg_View3D.hrc"
#include "SchSlotIds.hxx"

#define WIDTH_HEAD 108
#define WIDTH_FT 41
#define WIDTH_LB 57
#define WIDTH_IB 12
#define BUTTON_DISTANCE 14

#define HEIGHT_IB 12
#define HEIGHT_FT 10
#define HEIGHT_LB 12

#define POS_X_0 6
#define POS_X_1 (POS_X_0+WIDTH_LB+4)
#define POS_X_2 (POS_X_1+WIDTH_IB+6)

#define WIDTH_PREVIEW (VIEW3D_PAGE_WIDTH-POS_X_2-6)

#define POS_Y_LIGHTSOURCE_HEAD 3
#define POS_Y_LIGHTSOURCE_BUTTONS (POS_Y_LIGHTSOURCE_HEAD+12)
#define POS_Y_LIGHTSOURCE_BUTTONS_2 (POS_Y_LIGHTSOURCE_BUTTONS+HEIGHT_IB+2)
#define POS_Y_LIGHTSOURCE (POS_Y_LIGHTSOURCE_BUTTONS_2+16)

#define POS_Y_AMBIENT_HEAD (POS_Y_LIGHTSOURCE+18)
#define POS_Y_AMBIENT      (POS_Y_AMBIENT_HEAD+12)

#define POS_Y_PREVIEW POS_Y_LIGHTSOURCE_BUTTONS

#define HEIGHT_PREVIEW POS_Y_AMBIENT+HEIGHT_LB-POS_Y_PREVIEW

TabPage TP_3D_SCENEILLUMINATION
{
    HelpID = "chart2:TabPage:TP_3D_SCENEILLUMINATION";
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( VIEW3D_PAGE_WIDTH , VIEW3D_PAGE_HEIGHT ) ;
	
    FixedText FT_LIGHTSOURCE
	{
	    Pos = MAP_APPFONT ( POS_X_0 , POS_Y_LIGHTSOURCE_HEAD ) ;
		Size = MAP_APPFONT ( WIDTH_HEAD , HEIGHT_FT ) ;
		Text [ en-US ] = "~Light source" ;
	};
	ImageButton BTN_LIGHT_1
	{
	    HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_1";
        Pos = MAP_APPFONT ( POS_X_0 , POS_Y_LIGHTSOURCE_BUTTONS ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_2
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_2";
        Pos = MAP_APPFONT ( POS_X_0+BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_3
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_3";
        Pos = MAP_APPFONT ( POS_X_0+2*BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_4
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_4";
        Pos = MAP_APPFONT ( POS_X_0+3*BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_5
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_5";
        Pos = MAP_APPFONT ( POS_X_0 , POS_Y_LIGHTSOURCE_BUTTONS_2 ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_6
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_6";
        Pos = MAP_APPFONT ( POS_X_0+1*BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS_2 ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_7
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_7";
        Pos = MAP_APPFONT ( POS_X_0+2*BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS_2 ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
    ImageButton BTN_LIGHT_8
	{
        HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHT_8";
        Pos = MAP_APPFONT ( POS_X_0+3*BUTTON_DISTANCE , POS_Y_LIGHTSOURCE_BUTTONS_2 ) ;
        Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
    };
	ListBox LB_LIGHTSOURCE
	{
	    HelpID = "chart2:ListBox:TP_3D_SCENEILLUMINATION:LB_LIGHTSOURCE";
		Border = TRUE ;
        Pos = MAP_APPFONT ( POS_X_0 , POS_Y_LIGHTSOURCE ) ;
		Size = MAP_APPFONT ( WIDTH_LB , HEIGHT_LB ) ;    
		TabStop = TRUE ;
		DropDown = TRUE ;
	};
	ImageButton BTN_LIGHTSOURCE_COLOR
	{
	    HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_LIGHTSOURCE_COLOR";
	    Pos = MAP_APPFONT ( POS_X_1 , POS_Y_LIGHTSOURCE ) ;
		Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
		TabStop = TRUE ;
	};




    FixedText FT_AMBIENTLIGHT
	{
	    Pos = MAP_APPFONT ( POS_X_0 , POS_Y_AMBIENT_HEAD ) ;
		Size = MAP_APPFONT ( WIDTH_HEAD , HEIGHT_FT ) ;
		Text [ en-US ] = "~Ambient light" ;
	};
	ListBox LB_AMBIENTLIGHT
	{
	    HelpID = "chart2:ListBox:TP_3D_SCENEILLUMINATION:LB_AMBIENTLIGHT";
		Border = TRUE ;
		Pos = MAP_APPFONT ( POS_X_0 , POS_Y_AMBIENT ) ;
		Size = MAP_APPFONT ( WIDTH_LB , HEIGHT_LB ) ;
		TabStop = TRUE ;
		DropDown = TRUE ;
	};
	ImageButton BTN_AMBIENT_COLOR
	{
	    HelpID = "chart2:ImageButton:TP_3D_SCENEILLUMINATION:BTN_AMBIENT_COLOR";
	    Pos = MAP_APPFONT ( POS_X_1 , POS_Y_AMBIENT ) ;
		Size = MAP_APPFONT ( WIDTH_IB , HEIGHT_IB ) ;
		TabStop = TRUE ;
	};
	

	
	Control CTL_LIGHT_PREVIEW
	{
        Border = TRUE ;
        Pos = MAP_APPFONT ( POS_X_2 , POS_Y_PREVIEW ) ;
        Size = MAP_APPFONT ( WIDTH_PREVIEW , HEIGHT_PREVIEW ) ;
		TabStop = TRUE ;
	};
};

String STR_LIGHT_PREVIEW
{
	Text [ en-US ] = "Light Preview" ;
};

