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



#ifndef DBAUI_USERADMIN_HRC
#include "UserAdmin.hrc"
#endif
#ifndef _DBU_DLG_HRC_
#include "dbu_dlg.hrc"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif

#define WINDOW_SIZE_X 260
#define WINDOW_SIZE_Y 185

TabPage TAB_PAGE_USERADMIN
{
	SVLook		= TRUE ;
	HelpId		= HID_TAB_PAGE_USERADMIN ;
	Size		= MAP_APPFONT ( WINDOW_SIZE_X, WINDOW_SIZE_Y ) ;
	Hide = TRUE ;

	FixedLine FL_USER
	{
		Pos					= MAP_APPFONT ( 6, 3 ) ;
		Size				= MAP_APPFONT ( WINDOW_SIZE_X - 8, 8) ;
		Text [ en-US ]	= "User selection" ;
	};

	FixedText FT_USER
	{
		Pos					= MAP_APPFONT ( 12, 14 ) ;
		Size				= MAP_APPFONT ( 90, 10 ) ;
		Text [ en-US ]	= "Us~er:" ;
	};

	ListBox LB_USER
	{
		Border				= TRUE ;
		Pos					= MAP_APPFONT ( 108, 13) ;
		Size				= MAP_APPFONT ( 105, 97 ) ;
		TabStop				= TRUE ;
		HScroll				= TRUE ;
		Sort				= TRUE ;
		DropDown			= TRUE ;
		HelpId				= HID_TAB_PAGE_LBUSER ;
	};


	PushButton PB_NEWUSER
	{
		Pos					= MAP_APPFONT ( 12, 29 ) ;
		Size				= MAP_APPFONT ( 70, 14 ) ;
		TabStop				= TRUE ;
		DefButton			= TRUE ;
		HelpId				= HID_TAB_PAGE_PBUSER ;
		Text [ en-US ] = "~Add User..." ;
	};

	PushButton PB_CHANGEPWD
	{
		Pos					= MAP_APPFONT ( 95, 29 ) ;
		Size				= MAP_APPFONT ( 70, 14 ) ;
		TabStop				= TRUE ;
		DefButton			= TRUE ;
		HelpId				= HID_TAB_PAGE_PBCHGPWD ;
		Text [ en-US ] = "Change ~Password..." ;
	};

	PushButton PB_DELETEUSER
	{
		Pos					= MAP_APPFONT ( WINDOW_SIZE_X - 82, 29 ) ;
		Size				= MAP_APPFONT ( 70, 14 ) ;
		TabStop				= TRUE ;
		DefButton			= TRUE ;
		HelpId				= HID_TAB_PAGE_PBUSERDELETE ;
		Text [ en-US ] = "~Delete User..." ;
	};

	FixedLine FL_TABLE_GRANTS
	{
		Pos					= MAP_APPFONT ( 6, 52 ) ;
		Size				= MAP_APPFONT ( WINDOW_SIZE_X - 8, 8) ;
		Text [ en-US ] = "Access rights for selected user" ;
	};

	Control CTRL_TABLE_GRANTS
	{
		Pos					= MAP_APPFONT ( 12, 63 ) ;
		Size				= MAP_APPFONT ( WINDOW_SIZE_X - 22, WINDOW_SIZE_Y - 75 ) ;
		Border				= TRUE ;
		TabStop				= TRUE ;
		HelpId				= HID_TAB_PAGE_TBLGRANTS ;
	};
};

QueryBox QUERY_USERADMIN_DELETE_USER
{
	Buttons = WB_YES_NO ;
	Message [ en-US ] = "Do you really want to delete the user?" ;
};

String STR_USERADMIN_NOT_AVAILABLE
{
	Text [ en-US ] = "The database does not support user administration." ;
};

#define EDIT_SIZE_X		50
#define FT_SIZE_X		90
#define WIN_X			220
#define WIN_Y			72

ModalDialog DLG_PASSWORD
{
	HelpId = HID_DLG_PASSWORD ;
	Border = TRUE ;
	Moveable = TRUE ;
	OutputSize = TRUE ;
	SVLook = TRUE ;
	Size = MAP_APPFONT ( WIN_X, WIN_Y ) ;

	FixedLine FL_USER
	{
		Pos = MAP_APPFONT ( 3, 3 ) ;
		Size = MAP_APPFONT ( WIN_X - 3 - 6 - 6 - 50, 8 ) ;
		Text [ en-US ] = "User \"$name$: $\"" ;
	};

	FixedText FT_OLDPASSWORD
	{
		Pos = MAP_APPFONT ( 6, 17 ) ;
		Size = MAP_APPFONT ( FT_SIZE_X, 10 ) ;
		Text [ en-US ] = "Old p~assword" ;
	};
	Edit ED_OLDPASSWORD
	{
		HelpID = "dbaccess:Edit:DLG_PASSWORD:ED_OLDPASSWORD" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12 + FT_SIZE_X, 16 ) ;
		Size = MAP_APPFONT ( EDIT_SIZE_X, 12 ) ;
		PassWord = TRUE ;
	};

	FixedText FT_PASSWORD
	{
		Pos = MAP_APPFONT ( 6, 35 ) ;
		Size = MAP_APPFONT ( FT_SIZE_X, 10 ) ;
		Text [ en-US ] = "~Password" ;
	};
	Edit ED_PASSWORD
	{
		HelpID = "dbaccess:Edit:DLG_PASSWORD:ED_PASSWORD" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12 + FT_SIZE_X, 34 ) ;
		Size = MAP_APPFONT ( EDIT_SIZE_X, 12 ) ;
		PassWord = TRUE ;
	};
	FixedText FT_PASSWORD_REPEAT
	{
		Pos = MAP_APPFONT ( 6, 52 ) ;
		Size = MAP_APPFONT ( FT_SIZE_X, 10 ) ;
		Text [ en-US ] = "~Confirm password" ;
	};
	Edit ED_PASSWORD_REPEAT
	{
		HelpID = "dbaccess:Edit:DLG_PASSWORD:ED_PASSWORD_REPEAT" ;
		Border = TRUE ;
		Pos = MAP_APPFONT ( 12 + FT_SIZE_X, 51 ) ;
		Size = MAP_APPFONT ( EDIT_SIZE_X, 12 ) ;
		PassWord = TRUE ;
	};

	OKButton BTN_PASSWORD_OK
	{
		Pos = MAP_APPFONT ( WIN_X - 56, 6 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
		DefButton = TRUE ;
	};
	CancelButton BTN_PASSWORD_CANCEL
	{
		Pos = MAP_APPFONT ( WIN_X - 56, 23 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	HelpButton BTN_PASSWORD_HELP
	{
		Pos = MAP_APPFONT ( WIN_X - 56, 43 ) ;
		Size = MAP_APPFONT ( 50, 14 ) ;
	};
	Text [ en-US ] = "Change Password" ;
};

String STR_ERROR_PASSWORDS_NOT_IDENTICAL
{
	Text [ en-US ] = "The passwords do not match. Please enter the password again." ;
};

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