/*
 *  Notepad (notepad.rc)
 *
 *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* Main Menu */

CONCAT(MENU_, LANGUAGE_ID) MENU
{
 POPUP MENU_FILE {
   MENUITEM MENU_FILE_NEW,              NP_FILE_NEW 
   MENUITEM MENU_FILE_OPEN,             NP_FILE_OPEN
   MENUITEM MENU_FILE_SAVE,             NP_FILE_SAVE
   MENUITEM MENU_FILE_SAVEAS,           NP_FILE_SAVEAS
   MENUITEM MENU_FILE_PRINT,            NP_FILE_PRINT
   MENUITEM MENU_FILE_PAGESETUP,        NP_FILE_PAGESETUP
   MENUITEM MENU_FILE_PRINTSETUP,       NP_FILE_PRINTSETUP
   MENUITEM SEPARATOR   
   MENUITEM MENU_FILE_EXIT,             NP_FILE_EXIT
 }
 POPUP MENU_EDIT {
   MENUITEM MENU_EDIT_UNDO,             NP_EDIT_UNDO
   MENUITEM SEPARATOR
   MENUITEM MENU_EDIT_CUT,              NP_EDIT_CUT
   MENUITEM MENU_EDIT_COPY,             NP_EDIT_COPY
   MENUITEM MENU_EDIT_PASTE,            NP_EDIT_PASTE
   MENUITEM MENU_EDIT_DELETE,           NP_EDIT_DELETE
   MENUITEM SEPARATOR
   MENUITEM MENU_EDIT_SELECTALL,        NP_EDIT_SELECTALL
   MENUITEM MENU_EDIT_TIMEDATE,         NP_EDIT_TIMEDATE
   MENUITEM SEPARATOR
   MENUITEM MENU_EDIT_WRAP,             NP_EDIT_WRAP
 }
 POPUP MENU_SEARCH {
   MENUITEM MENU_SEARCH_SEARCH,         NP_SEARCH_SEARCH
   MENUITEM MENU_SEARCH_NEXT,           NP_SEARCH_NEXT
 }
 POPUP MENU_LANGUAGE {
   /* Dummy item, will be removed */
   MENUITEM SEPARATOR
 }
 POPUP MENU_HELP {
   MENUITEM MENU_HELP_CONTENTS,         NP_HELP_CONTENTS
   MENUITEM MENU_HELP_SEARCH,           NP_HELP_SEARCH
   MENUITEM MENU_HELP_HELP_ON_HELP,     NP_HELP_ON_HELP
   MENUITEM SEPARATOR

    POPUP MENU_INFO {
      MENUITEM MENU_INFO_LICENSE,          NP_HELP_LICENSE
      MENUITEM MENU_INFO_NO_WARRANTY,      NP_HELP_NO_WARRANTY
      MENUITEM MENU_INFO_ABOUT_WINE,       NP_HELP_ABOUT_WINE
    }
 }
 
}

/* Dialog `Page setup' */

CONCAT(DIALOG_PAGESETUP_, LANGUAGE_ID) DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "Helv"
CAPTION DIALOG_PAGESETUP_CAPTION
{
LTEXT    DIALOG_PAGESETUP_HEAD,  NP_PAGESETUP_HEAD_TXT,   10, 07, 40, 15
EDITTEXT                         NP_PAGESETUP_HEAD,       60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    DIALOG_PAGESETUP_TAIL,  NP_PAGESETUP_TAIL_TXT,   10, 24, 40, 15
EDITTEXT                         NP_PAGESETUP_TAIL,       60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX DIALOG_PAGESETUP_MARGIN,      NP_PAGESETUP_MARGIN,     10, 43,160, 45
LTEXT    DIALOG_PAGESETUP_LEFT,        NP_PAGESETUP_LEFT_TXT,   20, 55, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/   NP_PAGESETUP_LEFT,       50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    DIALOG_PAGESETUP_TOP,         NP_PAGESETUP_TOP_TXT,    20, 73, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/    NP_PAGESETUP_TOP,        50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    DIALOG_PAGESETUP_RIGHT,       NP_PAGESETUP_RIGHT_TXT, 100, 55, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/  NP_PAGESETUP_RIGHT,     130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    DIALOG_PAGESETUP_BOTTOM,      NP_PAGESETUP_BOTTOM_TXT,100, 73, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ NP_PAGESETUP_BOTTOM,    130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP


DEFPUSHBUTTON DIALOG_OK,         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    DIALOG_CANCEL,     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    DIALOG_HELP,       NP_HELP,                180, 39, 40, 15, WS_TABSTOP
}


/* Strings */

#define STRING_LANGUAGE_ID        STRINGIFY(LANGUAGE_ID)
#define STRING_LANGUAGE_MENU_ITEM LANGUAGE_MENU_ITEM

STRINGTABLE
{
ADDSTRING(LANGUAGE_ID)
ADDSTRING(LANGUAGE_MENU_ITEM)
ADDSTRING(NOTEPAD)
ADDSTRING(TEXT_FILES_TXT)
ADDSTRING(ALL_FILES)
ADDSTRING(ERROR)
ADDSTRING(WARNING)
ADDSTRING(INFO)
ADDSTRING(TOOLARGE)
ADDSTRING(NOTEXT)
ADDSTRING(DOESNOTEXIST)
ADDSTRING(NOTSAVED)
ADDSTRING(NOTFOUND)
ADDSTRING(OUT_OF_MEMORY)
ADDSTRING(UNTITLED)
ADDSTRING(PAGESETUP_HEADERVALUE)
ADDSTRING(PAGESETUP_FOOTERVALUE)
ADDSTRING(PAGESETUP_LEFTVALUE)
ADDSTRING(PAGESETUP_RIGHTVALUE)
ADDSTRING(PAGESETUP_TOPVALUE)
ADDSTRING(PAGESETUP_BOTTOMVALUE)
}


/* Undefine all language-specific strings */

#undef LANGUAGE_ID
#undef LANGUAGE_NUMBER
#undef LANGUAGE_MENU_ITEM

#undef MENU_FILE
#undef MENU_FILE_NEW
#undef MENU_FILE_OPEN
#undef MENU_FILE_SAVE
#undef MENU_FILE_SAVEAS
#undef MENU_FILE_PRINT
#undef MENU_FILE_PAGESETUP
#undef MENU_FILE_PRINTSETUP
#undef MENU_FILE_EXIT
#undef MENU_EDIT
#undef MENU_EDIT_UNDO
#undef MENU_EDIT_CUT
#undef MENU_EDIT_COPY
#undef MENU_EDIT_PASTE
#undef MENU_EDIT_DELETE
#undef MENU_EDIT_SELECTALL
#undef MENU_EDIT_TIMEDATE
#undef MENU_EDIT_WRAP
#undef MENU_SEARCH
#undef MENU_SEARCH_SEARCH
#undef MENU_SEARCH_NEXT
#undef MENU_LANGUAGE
#undef MENU_HELP
#undef MENU_HELP_CONTENTS
#undef MENU_HELP_SEARCH
#undef MENU_HELP_HELP_ON_HELP
#undef MENU_INFO
#undef MENU_INFO_LICENSE
#undef MENU_INFO_NO_WARRANTY
#undef MENU_INFO_ABOUT_WINE

#undef DIALOG_OK
#undef DIALOG_CANCEL
#undef DIALOG_BROWSE
#undef DIALOG_HELP
#undef DIALOG_PAGESETUP_CAPTION
#undef DIALOG_PAGESETUP_HEAD
#undef DIALOG_PAGESETUP_TAIL
#undef DIALOG_PAGESETUP_MARGIN
#undef DIALOG_PAGESETUP_LEFT
#undef DIALOG_PAGESETUP_RIGHT
#undef DIALOG_PAGESETUP_TOP
#undef DIALOG_PAGESETUP_BOTTOM

#undef STRING_LANGUAGE_ID
#undef STRING_LANGUAGE_MENU_ITEM
#undef STRING_PAGESETUP_HEADERVALUE
#undef STRING_PAGESETUP_FOOTERVALUE
#undef STRING_PAGESETUP_LEFTVALUE
#undef STRING_PAGESETUP_RIGHTVALUE
#undef STRING_PAGESETUP_TOPVALUE
#undef STRING_PAGESETUP_BOTTOMVALUE
#undef STRING_NOTEPAD
#undef STRING_ERROR
#undef STRING_WARNING
#undef STRING_INFO
#undef STRING_UNTITLED
#undef STRING_ALL_FILES
#undef STRING_TEXT_FILES_TXT
#undef STRING_TOOLARGE
#undef STRING_NOTEXT
#undef STRING_DOESNOTEXIST
#undef STRING_NOTSAVED
#undef STRING_NOTFOUND
#undef STRING_OUT_OF_MEMORY

