/*
 *  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, 60,12
  COMBOBOX IDC_OFN_ENCCOMBO, 63,0, 150,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

ID_ACCEL ACCELERATORS
{
    "#msgctxt#accelerator Select All#A", CMD_SELECT_ALL, VIRTKEY, CONTROL
    "#msgctxt#accelerator Copy#C", CMD_COPY, VIRTKEY, CONTROL
    "#msgctxt#accelerator Find#F", CMD_SEARCH, VIRTKEY, CONTROL
    "#msgctxt#accelerator Replace#H", CMD_REPLACE, VIRTKEY, CONTROL
    "#msgctxt#accelerator New#N", CMD_NEW, VIRTKEY, CONTROL
    "#msgctxt#accelerator Open#O", CMD_OPEN, VIRTKEY, CONTROL
    "#msgctxt#accelerator Print#P", CMD_PRINT, VIRTKEY, CONTROL
    "#msgctxt#accelerator Save#S", CMD_SAVE, VIRTKEY, CONTROL
    "#msgctxt#accelerator Paste#V", CMD_PASTE, VIRTKEY, CONTROL
    "#msgctxt#accelerator Cut#X", CMD_CUT, VIRTKEY, CONTROL
    "#msgctxt#accelerator Undo#Z", CMD_UNDO, VIRTKEY, CONTROL
    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"
