/*
 *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
 *  Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 *
 * 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 "notepad_res.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "&File" {
  MENUITEM "&New\tCtrl+N",      CMD_NEW
  MENUITEM "&Open...\tCtrl+O",  CMD_OPEN
  MENUITEM "&Save\tCtrl+S",     CMD_SAVE
  MENUITEM "Save &as...",       CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Print...\tCtrl+P",            CMD_PRINT
  MENUITEM "Page Se&tup...",    CMD_PAGE_SETUP
  MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "E&xit",             CMD_EXIT
 }
POPUP "&Edit" {
  MENUITEM "&Undo\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "Cu&t\tCtrl+X",      CMD_CUT
  MENUITEM "&Copy\tCtrl+C",     CMD_COPY
  MENUITEM "&Paste\tCtrl+V",    CMD_PASTE
  MENUITEM "&Delete\tDel",      CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Select &all\tCtrl+A",       CMD_SELECT_ALL
  MENUITEM "&Time/Date\tF5",    CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Wrap long lines",  CMD_WRAP
  MENUITEM "&Font...",          CMD_FONT
 }
POPUP "&Search" {
  MENUITEM "&Search...\tCtrl+F",   CMD_SEARCH
  MENUITEM "&Search next\tF3",  CMD_SEARCH_NEXT
  MENUITEM "&Replace...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Help" {
  MENUITEM "&Contents\tF1",     CMD_HELP_CONTENTS
  MENUITEM "&About Notepad",    CMD_HELP_ABOUT_NOTEPAD
 }
}

STRINGTABLE
{
STRING_PAGESETUP_HEADERVALUE,   "#msgctxt#do not translate#&f"
STRING_PAGESETUP_FOOTERVALUE,   "Page &p"

STRING_NOTEPAD,                                 "Notepad"
STRING_ERROR,                                   "ERROR"

STRING_UNTITLED,                                "Untitled"

STRING_ALL_FILES,                               "All files (*.*)"
STRING_TEXT_FILES_TXT,                  "Text files (*.txt)"

STRING_DOESNOTEXIST,                            "File '%s' does not exist.\n\n\
Do you want to create a new file?"
STRING_NOTSAVED,                                "File '%s' has been modified.\n\n\
Would you like to save the changes?"
STRING_NOTFOUND,                                        "'%s' could not be found."

STRING_UNICODE_LE,     "Unicode (UTF-16)"
STRING_UNICODE_BE,     "Unicode (UTF-16 big-endian)"
STRING_UTF8,           "Unicode (UTF-8)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "%1\n\
This file contains Unicode characters which will be lost if\n\
you save this file in the %2 encoding.\n\
To keep these characters, click Cancel, and then select\n\
one of the Unicode options in the Encoding drop down list.\n\
Continue?"
}

DIALOG_PAGESETUP DIALOG 0, 0, 240, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Page Setup"
{
LTEXT    "&Header:",  0x140,  10, 07, 68, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   78,  5,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Footer:",  0x142,   10, 24, 68, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   78, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "Margins (millimeters)",      0x144,     10, 43,178, 45
LTEXT    "&Left:",        0x145,   20, 55, 39, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     59, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Top:",         0x148,    20, 73, 39, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      59, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Right:",       0x14B, 107, 55, 39, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   148, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Bottom:",      0x14E, 107, 73, 39, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  148, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         IDOK,                   195,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Cancel",     IDCANCEL,               195, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Help",       IDHELP,                195, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Encoding:", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 53,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

ID_ACCEL ACCELERATORS
{
    "#msgctxt#accelerator Select All#^A", CMD_SELECT_ALL
    "#msgctxt#accelerator Copy#^C", CMD_COPY
    "#msgctxt#accelerator Find#^F", CMD_SEARCH
    "#msgctxt#accelerator Replace#^H", CMD_REPLACE
    "#msgctxt#accelerator New#^N", CMD_NEW
    "#msgctxt#accelerator Open#^O", CMD_OPEN
    "#msgctxt#accelerator Print#^P", CMD_PRINT
    "#msgctxt#accelerator Save#^S", CMD_SAVE
    "#msgctxt#accelerator Paste#^V", CMD_PASTE
    "#msgctxt#accelerator Cut#^X", CMD_CUT
    "#msgctxt#accelerator Undo#^Z", CMD_UNDO
    VK_BACK, CMD_UNDO, VIRTKEY, ALT
    VK_F1, CMD_HELP_CONTENTS, VIRTKEY
    VK_F3, CMD_SEARCH_NEXT, VIRTKEY
    VK_F5, CMD_TIME_DATE, VIRTKEY
    VK_INSERT, CMD_COPY, VIRTKEY, CONTROL
    VK_INSERT, CMD_PASTE, VIRTKEY, SHIFT
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

/* @makedep: notepad.ico */
IDI_NOTEPAD ICON "notepad.ico"
