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



#define __RSC

#ifndef UUI_IDS_HRC
#include <ids.hrc>
#endif
#ifndef UUI_MASTERPASSCRTDLG_HRC
#include <masterpasscrtdlg.hrc>
#endif

ModalDialog DLG_UUI_MASTERPASSWORD_CRT
{
	HelpId = HID_DLG_MASTERPASSWORD_CRT ;
	Border = TRUE ;
	Moveable = TRUE ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( DLG_WIDTH, DLG_HEIGHT ) ;
	Text [ en-US ] = "Set Master Password" ;
	FixedText FT_INFOTEXT
	{
		Pos = MAP_APPFONT ( COL_0, ROW_0 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, 7*RSC_CD_FIXEDTEXT_HEIGHT ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "Passwords for web connections are protected by a master password. You will be asked to enter it once per session, if %PRODUCTNAME retrieves a password from the protected password list." ;
	};
	FixedLine FL_INFOTEXT
	{
		Pos = MAP_APPFONT ( 0, ROW_1 ) ;
		Size = MAP_APPFONT ( DLG_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
	};
	FixedText FT_MASTERPASSWORD_CRT
	{
		Pos = MAP_APPFONT ( COL_0, ROW_2 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "~Enter password" ;
	};
	Edit ED_MASTERPASSWORD_CRT
	{
		HelpID = "uui:Edit:DLG_UUI_MASTERPASSWORD_CRT:ED_MASTERPASSWORD_CRT" ;
		Pos = MAP_APPFONT ( COL_0, ROW_3 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, RSC_CD_TEXTBOX_HEIGHT ) ;
		Border = TRUE ;
		PassWord = TRUE ;
	};
	FixedText FT_MASTERPASSWORD_REPEAT
	{
		Pos = MAP_APPFONT ( COL_0, ROW_4 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
		Text [ en-US ] = "~Reenter password" ;
	};
	Edit ED_MASTERPASSWORD_REPEAT
	{
		HelpID = "uui:Edit:DLG_UUI_MASTERPASSWORD_CRT:ED_MASTERPASSWORD_REPEAT" ;
		Pos = MAP_APPFONT ( COL_0, ROW_5 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, RSC_CD_TEXTBOX_HEIGHT ) ;
		Border = TRUE ;
		PassWord = TRUE ;
	};
	FixedText FT_CAUTIONTEXT
	{
		Pos = MAP_APPFONT ( COL_0, ROW_6 ) ;
		Size = MAP_APPFONT ( CTRL_WIDTH, 8*RSC_CD_FIXEDTEXT_HEIGHT ) ;
		WordBreak = TRUE ;
		Text [ en-US ] = "Caution: If you forget the master password, you will be unable to access any of the information protected by it. Passwords are case-sensitive." ;
	};
	FixedLine FL_CAUTIONTEXT
	{
		Pos = MAP_APPFONT ( 0, ROW_7 ) ;
		Size = MAP_APPFONT ( DLG_WIDTH, RSC_CD_FIXEDLINE_HEIGHT ) ;
	};
	HelpButton BTN_MASTERPASSCRT_HELP
	{
		Pos = MAP_APPFONT ( COL_0, ROW_8 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
	OKButton BTN_MASTERPASSCRT_OK
	{
		Pos = MAP_APPFONT ( COL_1, ROW_8 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
		DefButton = TRUE ;
	};
	CancelButton BTN_MASTERPASSCRT_CANCEL
	{
		Pos = MAP_APPFONT ( COL_2, ROW_8 ) ;
		Size = MAP_APPFONT ( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ) ;
	};
};

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