/*
 * Notepad (notepad.rc)
 *
 * Copyright 1997 Marcel Baur <mbaur@g26.ethz.ch>
 */

#include "windows.h"
#include "main.h"
 
#define CONCAT(a, b) CONCAT1(a, b)
#define CONCAT1(a, b) a##b

/* 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,     GRAYED
   MENUITEM MENU_EDIT_COPY,             NP_EDIT_COPY,    GRAYED
   MENUITEM MENU_EDIT_PASTE,            NP_EDIT_PASTE,   GRAYED
   MENUITEM MENU_EDIT_DELETE,           NP_EDIT_DELETE,  GRAYED
   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                            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                            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                            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                            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 ADDSTRING(str) ADDSTRING1(LANGUAGE_NUMBER, IDS_ ## str) STRING_ ## str
#define ADDSTRING1(langnum, ids) ADDSTRING2(langnum, ids)
#define ADDSTRING2(langnum, ids) 0x ## langnum ## ids

#define STRINGIFY(str) STRINGIFY1(str)
#define STRINGIFY1(str) #str

#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(NOTFOUND)
ADDSTRING(OUT_OF_MEMORY)
ADDSTRING(UNTITLED)
}
