/**************************************************************
 * 
 * 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 "treeopt.hrc"
#include <cuires.hrc>
#include "helpid.hrc"
#include <svx/dialogs.hrc>

#define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }

ModalDialog RID_OFADLG_OPTIONS_TREE
{
	HelpID = HID_OFADLG_OPTIONS_TREE;
	Moveable = TRUE ;
	OutputSize = TRUE ;
	SVLook = TRUE ;

	Size = MAP_APPFONT ( COL_12 , ROW_5 ) ;
	Text [ en-US ] = "Options";

	OKButton PB_OK
	{
		Pos = MAP_APPFONT ( COL_4, ROW_3 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH , RSC_CD_PUSHBUTTON_HEIGHT ) ;
		TabStop = TRUE ;
		DefButton = TRUE;
	};
	CancelButton PB_CANCEL
	{
		Pos = MAP_APPFONT ( COL_6, ROW_3 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH , RSC_CD_PUSHBUTTON_HEIGHT ) ;
		TabStop = TRUE ;
	};
	HelpButton PB_HELP
	{
		Pos = MAP_APPFONT ( COL_8, ROW_3 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH , RSC_CD_PUSHBUTTON_HEIGHT ) ;
		TabStop = TRUE ;
	};
	PushButton PB_BACK
	{
	    HelpID = "cui:PushButton:RID_OFADLG_OPTIONS_TREE:PB_BACK";
		Pos = MAP_APPFONT ( COL_10, ROW_3 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH , RSC_CD_PUSHBUTTON_HEIGHT ) ;
		TabStop = TRUE ;
		Text [ en-US ] = "~Back" ;
	};
	//TreeListBox
	Control TLB_PAGES
	{
		Pos = MAP_APPFONT ( COL_1, ROW_1 ) ;
		Size = MAP_APPFONT ( (COL_2-COL_1), (ROW_4-ROW_1) );
		TabStop = TRUE ;
		Border = TRUE;
	};
	Control FB_BORDER
	{
		Pos = MAP_APPFONT ( COL_3, ROW_1 ) ;
		Size = MAP_APPFONT ( WIDTH_PAGEFRAME, HEIGHT_PAGEFRAME ) ;
		Hide = TRUE;
	};
    FixedImage IMG_HELP
	{
        Pos = MAP_APPFONT ( COL_3_1, ROW_1_1 ) ;
        Size = MAP_APPFONT ( WIDTH_IMG_HELP, HEIGHT_IMG_HELP ) ;
		Hide = TRUE;
	};
    FixedText FT_PAGE_TITLE
	{
        Pos = MAP_APPFONT ( COL_3_3, ROW_1_2 ) ;
		Size = MAP_APPFONT ( (COL_3_5-COL_3_3), 15 ) ;
		Hide = TRUE;
	};
	FixedLine FL_LINE_1
	{
        Pos = MAP_APPFONT ( COL_3_1 , ROW_1_3 ) ;
        Size = MAP_APPFONT ( (COL_3_5-COL_3_1), 1 ) ;
		Comment = "Trennlinie" ;
		Hide = TRUE;
	};
	FixedText FT_HELPTEXT
	{
        Pos = MAP_APPFONT ( COL_3_3, ROW_1_4 ) ;
        Size = MAP_APPFONT ( (COL_3_5-COL_3_3), (HEIGHT_PAGEFRAME-ROW_1_4-1) ) ;
		WordBreak = TRUE;
		Hide = TRUE;
	};
    String ST_LOAD_ERROR
	{
		Text [ en-US ] = "The selected module could not be loaded.";
	};
	StringArray STR_HELPTEXTS
	{
		ItemList [ en-US ] =
		{
			< "This dialog is used to define general settings when working with %PRODUCTNAME. Enter your personal data, the defaults to be used when saving documents, and paths to important files. These settings will be saved automatically and used in later sessions as well."; SID_GENERAL_OPTIONS; > ;
			< "This is where you make settings concerning language and writing aids for your work with %PRODUCTNAME."; SID_LANGUAGE_OPTIONS; > ;
			< "This is where you configure %PRODUCTNAME for the Internet. You can define search engines or save your proxy settings." ; SID_INET_DLG; > ;
			< "This is where you specify various settings for text documents. These settings determine how your text documents are handled in %PRODUCTNAME and are valid for all new %PRODUCTNAME Writer documents. You can also define a few settings for the active text document if you save it afterwards." ; SID_SW_EDITOPTIONS; > ;
			< "This is where you define the basic settings for %PRODUCTNAME documents in HTML format. For example, you decide which contents should be displayed on the screen or printed, how the pages are scrolled on the screen, in which color keywords are highlighted in the source text and much more." ; SID_SW_ONLINEOPTIONS; > ;
			< "This is where you define various global settings for spreadsheets. For example, you can define which contents should be displayed and in which direction the cursor will move after you enter data in a cell. You also define sort lists, the number of the decimal places displayed, etc." ; SID_SC_EDITOPTIONS; > ;
			< "This is where you define the settings that apply to all newly saved presentations. Among other things, you decide which contents are displayed on the slides, which default unit of measure is used, if and how grid alignment is used, and if notes and handouts are always printed." ; SID_SD_EDITOPTIONS; > ;
			< "This is where you define the settings for drawing documents. Among other things, you determine which contents are displayed on the pages, which scale is used, if and how grid alignment is used, and which contents are printed by default." ; SID_SD_GRAPHIC_OPTIONS; > ;
			< "This is where you select the print format and print options for all newly saved formula documents. These options take effect when you want to print a formula directly from %PRODUCTNAME Math." ; SID_SM_EDITOPTIONS; > ;
			< "This is where you specify general default settings for your %PRODUCTNAME Charts. Set the colors you want for all new charts." ; SID_SCH_EDITOPTIONS; > ;
			< "This is where you define general settings for accessing external data sources."; SID_SB_STARBASEOPTIONS; > ;
			< "This is where you define general settings for opening and saving documents in external formats. You can control the behavior of macros or OLE objects in Microsoft Office documents or define settings for HTML documents." ; SID_FILTER_DLG; > ;
		};
	};
	Bitmap BMP_ROOT_CLOSED
	{
		File = "plus.bmp" ;
	};
	Bitmap BMP_ROOT_OPENED
	{
		File = "minus.bmp" ;
	};
};

Resource RID_OFADLG_OPTIONS_TREE_PAGES
{
	StringArray SID_GENERAL_OPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME" ; 0; > ;
			< "User Data" ;  RID_SFXPAGE_GENERAL; > ;
			< "General" ;  OFA_TP_MISC; > ;
			< "Memory" ; OFA_TP_MEMORY; > ;
			< "View" ; OFA_TP_VIEW ; > ;
			< "Print" ; RID_SFXPAGE_PRINTOPTIONS; > ;
			< "Paths" ;  RID_SFXPAGE_PATH; > ;
			< "Colors" ;  RID_SVXPAGE_COLOR; > ;
	        < "Fonts" ; RID_SVX_FONT_SUBSTITUTION ; > ;
			< "Security" ; RID_SVXPAGE_INET_SECURITY ; > ;
	        < "Appearance" ;        RID_SVXPAGE_COLORCONFIG        ; > ;
	        < "Accessibility" ; RID_SVXPAGE_ACCESSIBILITYCONFIG ; > ;
            < "Java" ; RID_SVXPAGE_OPTIONS_JAVA ; > ;
	        < "Network Identity" ; RID_SVXPAGE_SSO ; > ;
            < "Online Update" ; RID_SVXPAGE_ONLINEUPDATE ; > ;
            < "" ; RID_SVXPAGE_IMPROVEMENT ; > ;
        };
	};
    StringArray SID_LANGUAGE_OPTIONS
	{
		ItemList [ en-US ] =
		{
			< "Language Settings" ; 0; > ;
			< "Languages"; OFA_TP_LANGUAGES; > ;
			< "Writing Aids" ; RID_SFXPAGE_LINGU; > ;
			< "Searching in Japanese" ;  RID_SVXPAGE_JSEARCH_OPTIONS; > ;
			< "Asian Layout" ;  RID_SVXPAGE_ASIAN_LAYOUT; > ;
			< "Complex Text Layout" ;  RID_SVXPAGE_OPTIONS_CTL; >;
		};
	};
    StringArray SID_INET_DLG
	{
		//modified by jmeng begin
		ItemList [ en-US ] =
		{
			< "Internet" ; 0; > ;
			< "Proxy" ;  RID_SVXPAGE_INET_PROXY; > ;
			< "Search" ;  RID_SVXPAGE_INET_SEARCH; > ;
			< "E-mail" ;  RID_SVXPAGE_INET_MAIL; > ;
		};
		//modified by jmeng end
	};
    StringArray SID_SW_EDITOPTIONS
	{
        ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Writer" ; 0; > ;
			< "General" ;     RID_SW_TP_OPTLOAD_PAGE   ; > ;
			< "View" ;       RID_SW_TP_CONTENT_OPT   ;> ;
			< "Formatting Aids" ;        RID_SW_TP_OPTSHDWCRSR    ; > ;
			< "Grid" ;        RID_SVXPAGE_GRID        ; > ;
			< "Basic Fonts (Western)" ;RID_SW_TP_STD_FONT       ; > ;
			< "Basic Fonts (Asian)" ;RID_SW_TP_STD_FONT_CJK       ; > ;
	        < "Basic Fonts (CTL)" ;      RID_SW_TP_STD_FONT_CTL       ; > ;
	        < "Print" ;       RID_SW_TP_OPTPRINT_PAGE  ; > ;
			< "Table" ;  		RID_SW_TP_OPTTABLE_PAGE  ; > ;
			< "Changes" ;    RID_SW_TP_REDLINE_OPT    ; > ;
            < "Compatibility" ; RID_SW_TP_OPTCOMPATIBILITY_PAGE    ; > ;
            < "AutoCaption" ; RID_SW_TP_OPTCAPTION_PAGE ; > ;
            < "Mail Merge E-mail" ; RID_SW_TP_MAILCONFIG ; >;
        };
	};
    StringArray SID_SW_ONLINEOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Writer/Web" ; 0; > ;
			< "View" ;       RID_SW_TP_HTML_CONTENT_OPT      ;> ;
			< "Formatting Aids" ;        RID_SW_TP_HTML_OPTSHDWCRSR    ; > ;
			< "Grid" ;        RID_SW_TP_HTML_OPTGRID_PAGE ; > ;
			< "Print" ;  		RID_SW_TP_HTML_OPTPRINT_PAGE  ; > ;
			< "Table" ;  		RID_SW_TP_HTML_OPTTABLE_PAGE  ; > ;
			< "Background" ;  	RID_SW_TP_BACKGROUND  ; > ;
		};
	};
	StringArray SID_SM_EDITOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Math" ; 0; > ;
			< "Settings" ; SID_SM_TP_PRINTOPTIONS;> ;
		};
	};
	StringArray SID_SC_EDITOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Calc" ; 0; > ;
			< "General" ;			SID_SC_TP_LAYOUT			;> ;
			< "View" ;			SID_SC_TP_CONTENT			;> ;
			< "International" ;		RID_OFA_TP_INTERNATIONAL	;> ;
			< "Calculate" ;			SID_SC_TP_CALC				;> ;
			< "Sort Lists" ;		SID_SC_TP_USERLISTS			;> ;
			< "Changes" ;		SID_SC_TP_CHANGES			;> ;
			< "Grid" ;			SID_SC_TP_GRID				;> ;
			< "Print" ;			RID_SC_TP_PRINT				;> ;
		};
	};
	StringArray SID_SD_EDITOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Impress" ; 0; > ;
			< "General";			SID_SI_TP_MISC					; > ;
			< "View" ;			SID_SI_TP_CONTENTS				; > ;
			< "Grid" ;			SID_SI_TP_SNAP					; > ;
			< "Print" ;			SID_SI_TP_PRINT					; > ;
		};
	};
	StringArray SID_SD_GRAPHIC_OPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Draw" ; 0; > ;
			< "General" ;			SID_SD_TP_MISC				; > ;
			< "View" ;			SID_SD_TP_CONTENTS			; > ;
			< "Grid" ;			SID_SD_TP_SNAP				; > ;
			< "Print" ; 	 		SID_SD_TP_PRINT				; > ;
		};
	};
	StringArray SID_SCH_EDITOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "Charts" ; 0; > ;
			< "Default Colors" ; 	 	RID_OPTPAGE_CHART_DEFCOLORS ; > ;
		};
	};
	StringArray SID_FILTER_DLG
	{
		ItemList [ en-US ] =
		{
				< "Load/Save" ; 0; > ;
			< "General" ;  RID_SFXPAGE_SAVE; > ;
			< "VBA Properties" ;  SID_OPTFILTER_MSOFFICE; > ;
			< "Microsoft Office" ;  RID_OFAPAGE_MSFILTEROPT2; > ;
			< "HTML Compatibility" ; RID_OFAPAGE_HTMLOPT ; > ;
		};
	};
	StringArray SID_SB_STARBASEOPTIONS
	{
		ItemList [ en-US ] =
		{
			< "%PRODUCTNAME Base" ; 0; > ;
			< "Connections" ; SID_SB_CONNECTIONPOOLING; > ;
			< "Databases" ; SID_SB_DBREGISTEROPTIONS; > ;
		};
	};
};
String RID_RIDER_SLL_SITE
{
	Text [ en-US ] = "Site certificates" ;
};
String RID_RIDER_SLL_PERSONAL
{
	Text [ en-US ] = "Personal certificates" ;
};

#define MASK_COL    MaskColor = Color { Red = 0xFF00; Green = 0x0000; Blue = 0xFF00; } ;
#define IMGLST_IDLST \
    IdList = {                      \
        SID_GENERAL_OPTIONS;        \
        SID_LANGUAGE_OPTIONS;       \
        SID_INET_DLG;               \
        SID_SW_EDITOPTIONS;         \
        SID_SW_ONLINEOPTIONS;       \
        SID_SC_EDITOPTIONS;         \
        SID_SD_EDITOPTIONS;         \
        SID_SD_GRAPHIC_OPTIONS;     \
        SID_SM_EDITOPTIONS;         \
        SID_SCH_EDITOPTIONS;        \
        SID_SB_STARBASEOPTIONS;     \
        SID_FILTER_DLG;             \
    };                              \
    IdCount = {                     \
        12;                         \
    };

ImageList RID_IMGLIST_TREEOPT
{
    Prefix = "tr";
    MASK_COL
    IMGLST_IDLST
};

ImageList RID_IMGLIST_TREEOPT_HC
{
    Prefix = "trh";
    MASK_COL
    IMGLST_IDLST
};

