/**************************************************************
 *
 * 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 "dialogs.hrc"
#include "helpids.hrc"

TabDialog RID_XMLSECTP_MACROSEC
{
	HelpID = HID_XMLSEC_TP_MACROSEC ;
	Size = MAP_APPFONT ( TD_WIDTH, TD_HEIGHT ) ;
	OutputSize = TRUE ;
	Closeable = TRUE ;
	Moveable = TRUE ;
	SVLook = TRUE ;

	Text [ en-US ] = "Macro Security" ;
	TabControl 1
	{
		Pos = MAP_APPFONT ( TD_SP_INNERBORDER_LEFT, TD_SP_INNERBORDER_TOP ) ;
		Size = MAP_APPFONT ( TP_WIDTH, TP_HEIGHT+RIDDER_HEIGHT ) ;
		SVLook = TRUE ;
		PageList =
		{
			PageItem
			{
				Identifier = RID_XMLSECTP_SECLEVEL ;
				Text [ en-US ] = "Security Level" ;
			};
			PageItem
			{
				Identifier = RID_XMLSECTP_TRUSTSOURCES ;
				Text [ en-US ] = "Trusted Sources" ;
			};
		};
	};
	OKButton BTN_OK
	{
		Pos = MAP_APPFONT ( MS_COL_H, CV_ROW_A ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		DefButton = TRUE;
	};
	CancelButton BTN_CANCEL
	{
		Pos = MAP_APPFONT ( MS_COL_F, CV_ROW_A ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
	HelpButton BTN_HELP
	{
		Pos = MAP_APPFONT ( MS_COL_D, CV_ROW_A ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
	PushButton BTN_RESET
	{
		Pos = MAP_APPFONT ( MS_COL_B, CV_ROW_A ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Reset" ;
	};
};

TabPage RID_XMLSECTP_SECLEVEL
{
	HelpId = HID_XMLSEC_TP_SECLEVEL ;
	Size = MAP_APPFONT ( TP_WIDTH, TP_HEIGHT ) ;
	OutputSize = TRUE ;
	Hide = TRUE ;
	SVLook = TRUE ;
	FixedLine FL_SECLEVEL
	{
		Pos = MAP_APPFONT ( SL_COL_0, SL_ROW_0 ) ;
		Size = MAP_APPFONT ( SL_COL_3-SL_COL_0, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Hide = TRUE ;
	};
	FixedImage FI_SEC_READONLY
	{
		Pos = MAP_APPFONT ( SL_COL_1 - 7, SL_ROW_0 + 4 ) ;
		Size = MAP_APPFONT ( 6, 6 ) ;
	};
	RadioButton RB_VERYHIGH
	{
		HelpID = "xmlsecurity:RadioButton:RID_XMLSECTP_SECLEVEL:RB_VERYHIGH" ;
		Pos = MAP_APPFONT ( SL_COL_1, SL_ROW_0 ) ;
		Size = MAP_APPFONT ( SL_COL_2-SL_COL_1, RSC_BIG_RADIOBUTTON ) ;
		WordBreak = TRUE;
		Text [ en-US ] = "~Very high.\nOnly macros from trusted file locations are allowed to run. All other macros, regardless whether signed or not, are disabled." ;
	};
	RadioButton RB_HIGH
	{
		HelpID = "xmlsecurity:RadioButton:RID_XMLSECTP_SECLEVEL:RB_HIGH" ;
		Pos = MAP_APPFONT ( SL_COL_1, SL_ROW_1 ) ;
		Size = MAP_APPFONT ( SL_COL_2-SL_COL_1, RSC_BIG_RADIOBUTTON ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "H~igh.\nOnly signed macros from trusted sources are allowed to run. Unsigned macros are disabled." ;
	};
	RadioButton RB_MEDIUM
	{
		HelpID = "xmlsecurity:RadioButton:RID_XMLSECTP_SECLEVEL:RB_MEDIUM" ;
		Pos = MAP_APPFONT ( SL_COL_1, SL_ROW_2 ) ;
		Size = MAP_APPFONT ( SL_COL_2-SL_COL_1, RSC_BIG_RADIOBUTTON ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "~Medium.\nConfirmation required before executing macros from untrusted sources." ;
	};
	RadioButton RB_LOW
	{
		HelpID = "xmlsecurity:RadioButton:RID_XMLSECTP_SECLEVEL:RB_LOW" ;
		Pos = MAP_APPFONT ( SL_COL_1, SL_ROW_3 ) ;
		Size = MAP_APPFONT ( SL_COL_2-SL_COL_1, SL_ROW_4-SL_ROW_3 ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "~Low (not recommended).\nAll macros will be executed without confirmation. Use this setting only if you are certain that all documents that will be opened are safe." ;
	};
};

TabPage RID_XMLSECTP_TRUSTSOURCES
{
	HelpId = HID_XMLSEC_TP_TRUSTSOURCES ;
	Size = MAP_APPFONT ( TP_WIDTH, TP_HEIGHT ) ;
	OutputSize = TRUE ;
	Hide = TRUE ;
	SVLook = TRUE ;
	FixedLine FL_TRUSTCERT
	{
		Pos = MAP_APPFONT ( TS_COL_0, TS_ROW_0 ) ;
		Size = MAP_APPFONT ( TS_COL_8-TS_COL_0, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "Trusted certificates" ;
	};
	FixedImage FI_TRUSTCERT_RO
	{
		Pos = MAP_APPFONT ( TS_COL_1 - 7, TS_ROW_1 ) ;
		Size = MAP_APPFONT ( 6, 6 ) ;
	};
	Control LB_TRUSTCERT
	{
		HelpId = HID_XMLSEC_CTRL_TRUSTSOURCES ;
		Pos = MAP_APPFONT ( TS_COL_1, TS_ROW_1 ) ;
		Size = MAP_APPFONT ( TS_COL_7-TS_COL_1, RSC_CD_TABLISTBOX_HEIGHT ) ;
		SVLook = TRUE ;
		Border = TRUE ;
	};
	String STR_HEADERBAR
	{
		Text [ en-US ] = "Issued to\tIssued by\tExpiration date" ;
	};
	PushButton PB_ADD_TRUSTCERT
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_TRUSTSOURCES:PB_ADD_TRUSTCERT" ;
		Pos = MAP_APPFONT ( TS_COL_2, TS_ROW_2 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Add..." ;
	};
	PushButton PB_VIEW_TRUSTCERT
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_TRUSTSOURCES:PB_VIEW_TRUSTCERT" ;
		Pos = MAP_APPFONT ( TS_COL_4, TS_ROW_2 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "View..." ;
	};
	PushButton PB_REMOVE_TRUSTCERT
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_TRUSTSOURCES:PB_REMOVE_TRUSTCERT" ;
		Pos = MAP_APPFONT ( TS_COL_6, TS_ROW_2 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Remove" ;
	};
	FixedLine FL_TRUSTFILELOC
	{
		Pos = MAP_APPFONT ( TS_COL_0, TS_ROW_3 ) ;
		Size = MAP_APPFONT ( TS_COL_8-TS_COL_0, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "Trusted file locations" ;
	};
	FixedText FI_TRUSTFILELOC
	{
		Pos = MAP_APPFONT ( TS_COL_1, TS_ROW_4 ) ;
		Size = MAP_APPFONT ( TS_COL_7-TS_COL_1, 3*RSC_CD_FIXEDLINE_HEIGHT ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "Document macros are always executed if they have been opened from one of the following locations." ;
	};
	FixedImage FI_TRUSTFILE_RO
	{
		Pos = MAP_APPFONT ( TS_COL_1 - 7, TS_ROW_5 ) ;
		Size = MAP_APPFONT ( 6, 6 ) ;
	};
	ListBox LB_TRUSTFILELOC
	{
		HelpID = "xmlsecurity:ListBox:RID_XMLSECTP_TRUSTSOURCES:LB_TRUSTFILELOC" ;
		Pos = MAP_APPFONT ( TS_COL_1, TS_ROW_5 ) ;
		Size = MAP_APPFONT ( TS_COL_7-TS_COL_1, TS_ROW_6-TS_ROW_5 ) ;
		SVLook = TRUE ;
		Border = TRUE ;
		VScroll = TRUE ;
		Sort = TRUE ;
	};
	PushButton FL_ADD_TRUSTFILELOC
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_TRUSTSOURCES:FL_ADD_TRUSTFILELOC" ;
		Pos = MAP_APPFONT ( TS_COL_4, TS_ROW_7 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Add..." ;
	};
	PushButton FL_REMOVE_TRUSTFILELOC
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_TRUSTSOURCES:FL_REMOVE_TRUSTFILELOC" ;
		Pos = MAP_APPFONT ( TS_COL_6, TS_ROW_7 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Remove" ;
	};
};
String RID_XMLSECTP_READONLY_CONFIG_TIP
{
	Text [ en-US ] = "This setting is protected by the Administrator" ;
};
Image RID_XMLSECTP_LOCK
{
	ImageBitmap = Bitmap
	{
		File = "lock.png" ;
	};
};
Image RID_XMLSECTP_LOCK_HC
{
	ImageBitmap = Bitmap
	{
		File = "lock_hc.png" ;
	};
};

// ********************************************************************** EOF
