/**************************************************************
 *
 * 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"

ModalDialog RID_XMLSECTP_MACROWARN
{
	HelpId = HID_XMLSEC_TP_MACROWARN ;
	Size = MAP_APPFONT ( MW_WIDTH, MW_HEIGHT ) ;
	OutputSize = TRUE ;
	Closeable = TRUE ;
	Moveable = TRUE ;
	SVLook = TRUE ;

	Text [ en-US ] = "Security Warning" ;

	FixedText FI_DOCNAME
	{
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_0 ) ;
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_1, 3*RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Wordbreak = TRUE ;
		Text = "" ;
	};
	FixedText FI_DESCR1A
	{
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_1 ) ;
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_1, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Wordbreak = TRUE ;
		Text [ en-US ] = "The document contains document macros signed by:" ;
	};
	FixedText FI_DESCR1B
	{
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_1 ) ;
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_1, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Wordbreak = TRUE ;
		Text [ en-US ] = "The document contains document macros." ;
	};
	FixedText FI_SIGNS
	{
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_2 );
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_2, MW_ROW_3-MW_ROW_2 );
		Wordbreak = TRUE;
		Text [ en-US ] = "" ;
	};
	PushButton PB_VIEWSIGNS
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_MACROWARN:PB_VIEWSIGNS" ;
		Pos = MAP_APPFONT ( MW_COL_3, MW_ROW_2 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "View Signatures..." ;
	};
	FixedText FI_DESCR2
	{
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_3 ) ;
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_1, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Wordbreak = TRUE ;
		Text [ en-US ] = "Macros may contain viruses. Disabling macros for a document is always safe. If you disable macros you may lose functionality provided by the document macros." ;
	};
	CheckBox CB_ALWAYSTRUST
	{
		HelpID = "xmlsecurity:CheckBox:RID_XMLSECTP_MACROWARN:CB_ALWAYSTRUST" ;
		Pos = MAP_APPFONT ( MW_COL_1, MW_ROW_4 ) ;
		Size = MAP_APPFONT ( MW_COL_4-MW_COL_1, RSC_CD_CHECKBOX_HEIGHT ) ;
		Text [ en-US ] = "Always trust macros from this source" ;
	};
	FixedLine FL_BOTTOM_SEP
	{
		Pos = MAP_APPFONT ( 0, DLGS_BOTTOM_FL_Y( MW_HEIGHT ) ) ;
		Size = MAP_APPFONT ( MW_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
	};
	PushButton PB_ENABLE
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECTP_MACROWARN:PB_ENABLE" ;
		Pos = MAP_APPFONT ( DLGS_BOTTOM_OK_X( MW_WIDTH ), DLGS_BOTTOM_BTN_Y( MW_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Enable Macros" ;
	};
	CancelButton PB_DISABLE
	{
		Pos = MAP_APPFONT ( DLGS_BOTTOM_CANCEL_X( MW_WIDTH ), DLGS_BOTTOM_BTN_Y( MW_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "Disable Macros" ;
	};
	HelpButton BTN_HELP
	{
		Pos = MAP_APPFONT ( DLGS_BOTTOM_HELP_X( MW_WIDTH ), DLGS_BOTTOM_BTN_Y( MW_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
};

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