/*
 * Copyright 2001 Eric Pouech
 *
 * 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 "wineconsole_res.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
BEGIN
IDS_EDIT,		"&Edit"
IDS_DEFAULT,		"Set &Defaults"
IDS_PROPERTIES,		"&Properties"
IDS_MARK,		"&Mark"
IDS_COPY,		"&Copy"
IDS_PASTE,		"&Paste"
IDS_SELECTALL,		"&Select all"
IDS_SCROLL,		"Sc&roll"
IDS_SEARCH,		"S&earch"
IDS_FNT_DISPLAY,	"Each character is %1!u! pixels wide on %2!u! pixels high"
IDS_FNT_PREVIEW,	"This is a test"
IDS_DLG_TIT_DEFAULT,    "Setup - Default settings"
IDS_DLG_TIT_CURRENT,    "Setup - Current settings"
IDS_DLG_TIT_ERROR,	"Configuration error"
IDS_DLG_ERR_SBWINSIZE,	"Screen buffer size must be greater or equal to the window's one"

IDS_CMD_INVALID_EVENT_ID   "wineconsole: Couldn't parse event id\n"
IDS_CMD_INVALID_BACKEND    "wineconsole: Invalid backend\n"
IDS_CMD_INVALID_OPTION     "wineconsole: Unrecognized command line option\n"
IDS_CMD_ABOUT              "Starts a program in a Wine console\n"
IDS_CMD_LAUNCH_FAILED      "wineconsole: Starting program %s failed.\nThe command is invalid.\n"

IDS_USAGE_HEADER           "\nUsage:\n  wineconsole [options] <command>\n\nOptions:\n"
IDS_USAGE_BACKEND          "  --backend={user|curses}  Choosing user will spawn a new window, curses will\n\
\                           try to setup the current terminal as a Wine console.\n"
IDS_USAGE_COMMAND          "  <command>                The Wine program to launch in the console.\n"
IDS_USAGE_FOOTER           "\nExample:\n  wineconsole cmd\nStarts the Wine command prompt in a Wine console.\n\n"

END

IDD_OPTION DIALOG 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Options"
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Cursor size", -1, 5, 5, 65, 56, BS_GROUPBOX
	AUTORADIOBUTTON "&Small", IDC_OPT_CURSOR_SMALL, 9, 18, 50, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Medium", IDC_OPT_CURSOR_MEDIUM, 9, 30, 50, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Large", IDC_OPT_CURSOR_LARGE, 9, 42, 50, 10, WS_TABSTOP

	GROUPBOX "Control", -1, 75, 5, 125, 56, BS_GROUPBOX
	LTEXT "Popup menu", -1, 79, 18, 50, 18
	AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 138, 18, 60, 10, WS_TABSTOP
	AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 138, 30, 60, 10, WS_TABSTOP
	LTEXT "Quick edit", -1, 79, 42, 50, 18
	AUTOCHECKBOX "&enable", IDC_OPT_QUICK_EDIT, 138, 42, 60, 10, WS_TABSTOP

	GROUPBOX "Command history", -1, 5, 63, 195, 40, BS_GROUPBOX
	LTEXT "&Number of recalled commands :", -1, 9, 75, 78, 18
	EDITTEXT IDC_OPT_HIST_SIZE, 87, 77, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	AUTOCHECKBOX "&Remove doubles", IDC_OPT_HIST_NODOUBLE, 125, 75, 60, 18, WS_TABSTOP|BS_MULTILINE
}

IDD_FONT DIALOG 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Font"
FONT 8, "MS Shell Dlg"
{
	LTEXT "&Font", -1, 5, 5, 50, 8
	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
	LTEXT "&Color", -1, 100, 5, 50, 8
	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
	LTEXT "&Size", -1, 158, 5, 40, 8
	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
	LTEXT "", IDC_FNT_FONT_INFO, 128, 73, 80, 27
}

IDD_CONFIG DIALOG 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Configuration"
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Buffer zone", -1, 10, 11, 100, 42, BS_GROUPBOX
	LTEXT "&Width :", -1, 14, 25, 54, 9
	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "&Height :", -1, 14, 39, 54, 9
	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "Window size", -1, 10, 55, 100, 42
	LTEXT "W&idth :", -1, 14, 69, 54, 9
	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "H&eight :", -1, 14, 83, 54, 9
	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "End of program", -1, 115, 11, 85, 42, BS_GROUPBOX
	AUTOCHECKBOX "&Close console", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP

	GROUPBOX "Edition", -1, 115, 55, 85, 42
	COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 75, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
}

IDD_SAVE_SETTINGS DIALOG 20, 20, 210, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Console parameters"
FONT 8, "MS Shell Dlg"
{
	AUTORADIOBUTTON "Retain these settings for later sessions", IDC_SAV_SAVE, 10, 8, 200, 10, WS_TABSTOP
	AUTORADIOBUTTON "Modify only current session", IDC_SAV_SESSION, 10, 22, 200, 10, WS_TABSTOP

        DEFPUSHBUTTON "OK", IDOK, 100, 43, 50, 14
	PUSHBUTTON "Cancel", IDCANCEL, 155, 43, 50, 14
}
