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