/*
 * Help Viewer
 *
 * Copyright 1996 Ulrich Schmid
 *
 * 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
 */

/* Menu */

CONCAT(MENU_, LANGUAGE_ID) MENU
{
 POPUP MENU_FILE {
   MENUITEM MENU_FILE_OPEN,             WH_OPEN
   MENUITEM SEPARATOR   
   MENUITEM MENU_FILE_PRINT,            WH_PRINT
   MENUITEM MENU_FILE_PRINTER_SETUP,    WH_PRINTER_SETUP
   MENUITEM SEPARATOR   
   MENUITEM MENU_FILE_EXIT,             WH_EXIT
 }
 POPUP MENU_EDIT {
   MENUITEM MENU_EDIT_COPY_DIALOG,      WH_COPY_DIALOG
   MENUITEM SEPARATOR   
   MENUITEM MENU_EDIT_ANNOTATE,         WH_ANNOTATE
 }
 POPUP MENU_BOOKMARK {
   MENUITEM MENU_BOOKMARK_DEFINE,       WH_BOOKMARK_DEFINE
 }
 POPUP MENU_HELP {
   MENUITEM MENU_HELP_ON_HELP,          WH_HELP_ON_HELP
   MENUITEM MENU_HELP_ON_TOP,           WH_HELP_ON_TOP
   MENUITEM SEPARATOR   
   MENUITEM MENU_HELP_INFO,             WH_ABOUT
#ifdef WINELIB
   MENUITEM MENU_HELP_ABOUT_WINE,       WH_ABOUT_WINE
#endif
 }
}

/* Dialogs */

CONCAT(DIALOG_TEST_, LANGUAGE_ID) DIALOG 0, 0, 150, 22
STYLE DS_MODALFRAME
CAPTION "Macro Test"
{
GROUPBOX      "",   IDIGNORE,   4, 4, 102, 12
EDITTEXT            99,         5, 7, 100,  8
DEFPUSHBUTTON "OK", IDOK,     110, 5, 35,  12
}

/* Strings */

#define STRING_LANGUAGE_ID        STRINGIFY(LANGUAGE_ID)

STRINGTABLE
{
ADDSTRING(LANGUAGE_ID)
ADDSTRING(WINE_HELP)
ADDSTRING(ERROR)
ADDSTRING(WARNING)
ADDSTRING(INFO)
ADDSTRING(NOT_IMPLEMENTED)
ADDSTRING(HLPFILE_ERROR_s)
ADDSTRING(CONTENTS)
ADDSTRING(SEARCH)
ADDSTRING(BACK)
ADDSTRING(HISTORY)
ADDSTRING(ALL_FILES)
ADDSTRING(HELP_FILES_HLP)
}


/* Undefine all language-specific strings */

#undef LANGUAGE_ID
#undef LANGUAGE_NUMBER

#undef MENU_FILE
#undef MENU_FILE_OPEN
#undef MENU_FILE_PRINT
#undef MENU_FILE_PRINTER_SETUP
#undef MENU_FILE_EXIT
#undef MENU_EDIT
#undef MENU_EDIT_COPY_DIALOG
#undef MENU_EDIT_ANNOTATE
#undef MENU_BOOKMARK
#undef MENU_BOOKMARK_DEFINE
#undef MENU_HELP
#undef MENU_HELP_ON_HELP
#undef MENU_HELP_ON_TOP
#undef MENU_HELP_INFO
#undef MENU_HELP_ABOUT_WINE

#undef STRING_LANGUAGE_ID
#undef STRING_WINE_HELP
#undef STRING_ERROR
#undef STRING_WARNING
#undef STRING_INFO
#undef STRING_NOT_IMPLEMENTED
#undef STRING_HLPFILE_ERROR_s
#undef STRING_CONTENTS
#undef STRING_SEARCH
#undef STRING_BACK
#undef STRING_HISTORY
#undef STRING_ALL_FILES
#undef STRING_HELP_FILES_HLP

