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

#pragma makedep po

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 and %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,  "The size of the screen buffer must be greater than or equal to the size of the window."

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, 109
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Options"
FONT 8, "MS Shell Dlg"
{
        GROUPBOX "Cursor size", -1, 5, 5, 70, 54, 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 "Command history", -1, 80, 5, 120, 54, BS_GROUPBOX
        LTEXT "&Buffer size:", -1, 84, 20, 70, 10
        EDITTEXT IDC_OPT_HIST_SIZE, 154, 18, 40, 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 duplicates", IDC_OPT_HIST_NODOUBLE, 84, 36, 100, 10, WS_TABSTOP|BS_MULTILINE

        GROUPBOX "Popup menu", -1, 5, 61, 70, 42, BS_GROUPBOX
        AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 9, 74, 60, 10, WS_TABSTOP
        AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 9, 86, 60, 10, WS_TABSTOP

        GROUPBOX "Console", -1, 80, 61, 120, 42, BS_GROUPBOX
        AUTOCHECKBOX "&Quick Edit mode", IDC_OPT_QUICK_EDIT, 84, 74, 100, 10, WS_TABSTOP
        AUTOCHECKBOX "&Insert mode", IDC_OPT_INSERT_MODE, 84, 86, 100, 10, WS_TABSTOP
}

IDD_FONT DIALOG 36, 24, 140, 109
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, 109
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, 60, 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
}
