/*
 * Top level resource file for Credentials UI
 *
 * Copyright 2007 Robert Shearman (for CodeWeavers)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "credui_resources.h"

#pragma makedep po

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
{
    IDS_TITLEFORMAT     "Connect to %s"
    IDS_MESSAGEFORMAT   "Connecting to %s"
    IDS_INCORRECTPASSWORDTITLE  "Logon unsuccessful"
    IDS_INCORRECTPASSWORD       "Make sure that your user name\nand password are correct."
    IDS_CAPSLOCKONTITLE "Caps Lock is On"
    IDS_CAPSLOCKON      "Having Caps Lock on may cause you to enter your password incorrectly.\n\nPress the Caps Lock key on your keyboard to turn off Caps Lock before\nentering your password."
}

IDD_CREDDIALOG DIALOG  0, 0, 213, 149
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
BEGIN
    CONTROL         IDB_BANNER,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&User name:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Password:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Remember my password",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "OK",IDOK,97,128,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,156,128,50,14
END

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

/* @makedep: banner.bmp */
IDB_BANNER BITMAP banner.bmp
