/**************************************************************
 *
 * 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_XMLSECDLG_CERTCHOOSER
{
	HelpId = HID_XMLSEC_DLG_CERTCHOOSER;
	Size = MAP_APPFONT ( CS_WIDTH, CS_HEIGHT ) ;
	OutputSize = TRUE ;
	Closeable = TRUE ;
	Moveable = TRUE ;
	SVLook = TRUE ;

	Text [ en-US ] = "Select Certificate" ;

	FixedText FT_HINT_SELECT
	{
		Pos = MAP_APPFONT ( CS_COL_0, CS_ROW_0 ) ;
		Size = MAP_APPFONT ( CS_COL_2-CS_COL_0, RSC_CD_FIXEDTEXT_HEIGHT ) ;
		Text [ en-US ] = "Select the certificate you want to use for signing" ;
	};
	Control LB_SIGNATURES
	{
		HelpId = HID_XMLSEC_CTRL_CHOOSESIGNATURES ;
		Pos = MAP_APPFONT ( CS_COL_0, CS_ROW_1 ) ;
		Size = MAP_APPFONT ( CS_LB_WIDTH, CS_ROW_2-CS_ROW_1 ) ;
		SVLook = TRUE ;
		Border = TRUE ;
	};
	String STR_HEADERBAR
	{
		Text [ en-US ] = "Issued to\tIssued by\tExpiration date" ;
	};
	PushButton BTN_VIEWCERT
	{
		HelpID = "xmlsecurity:PushButton:RID_XMLSECDLG_CERTCHOOSER:BTN_VIEWCERT" ;
		Pos = MAP_APPFONT ( CS_COL_1, CS_ROW_3 ) ;
		Size = MAP_APPFONT ( CS_COL_2-CS_COL_1, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		Text [ en-US ] = "View Certificate..." ;
	};
	FixedLine FL_BOTTOM_SEP
	{
		Pos = MAP_APPFONT ( 0, DLGS_BOTTOM_FL_Y( CS_HEIGHT ) ) ;
		Size = MAP_APPFONT ( CS_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
	};
	OKButton BTN_OK
	{
		DefButton = TRUE ;
		Pos = MAP_APPFONT ( DLGS_BOTTOM_OK_X( CS_WIDTH ), DLGS_BOTTOM_BTN_Y( CS_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
	CancelButton BTN_CANCEL
	{
		Pos = MAP_APPFONT ( DLGS_BOTTOM_CANCEL_X( CS_WIDTH ), DLGS_BOTTOM_BTN_Y( CS_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
	HelpButton BTN_HELP
	{
		Pos = MAP_APPFONT ( DLGS_BOTTOM_HELP_X( CS_WIDTH ), DLGS_BOTTOM_BTN_Y( CS_HEIGHT ) ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
};

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