/**************************************************************
 * 
 * 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 [ en-US ] = "";
	};
	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 );
	};
};

