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