/*
 * Program Manager
 *
 * Copyright 1996 Ulrich Schmid
 * Copyright 2002 Sylvain Petreolle
 *
 * 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 "winuser.h"
#include "progman.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "&File" {
   MENUITEM "&New...",              PM_NEW
   MENUITEM "O&pen\tEnter",             PM_OPEN
   MENUITEM "&Move...\tF7",             PM_MOVE,      GRAYED
   MENUITEM "&Copy...\tF8",             PM_COPY,      GRAYED
   MENUITEM "&Delete\tDel",             PM_DELETE
   MENUITEM "&Properties\tAlt+Enter",   PM_ATTRIBUTES
   MENUITEM SEPARATOR
   MENUITEM "&Execute...",          PM_EXECUTE
   MENUITEM SEPARATOR
   MENUITEM "E&xit Windows",            PM_EXIT
 }
 POPUP "&Options" {
   MENUITEM "&Arrange automatically",  PM_AUTO_ARRANGE
   MENUITEM "&Minimize on run",    PM_MIN_ON_RUN
   MENUITEM "&Save settings on exit", PM_SAVE_SETTINGS
 }
 POPUP "&Windows" {
   MENUITEM "&Overlapped\tShift+F5",       PM_OVERLAP
   MENUITEM "&Side by side\tShift+F4",  PM_SIDE_BY_SIDE
   MENUITEM "&Arrange Icons",       PM_ARRANGE
 }
 
POPUP "&Help" {
   MENUITEM "&Contents\tF1",            PM_CONTENTS
   MENUITEM "&About Program Manager",   PM_ABOUT_WINE
 }
}

STRINGTABLE
{
IDS_PROGRAM_MANAGER,		"Program Manager"
IDS_ERROR,			"ERROR"
IDS_WARNING,			"WARNING"
IDS_INFO,			"Information"
IDS_DELETE,			"Delete"
IDS_DELETE_GROUP_s,		"Delete group `%s'?"
IDS_DELETE_PROGRAM_s,		"Delete program `%s'?"
IDS_NOT_IMPLEMENTED,		"Not implemented"
IDS_FILE_READ_ERROR_s,		"Error reading `%s'."
IDS_FILE_WRITE_ERROR_s,		"Error writing `%s'."
IDS_GRPFILE_READ_ERROR_s,	"\
The group file `%s' cannot be opened.\n\
Should it be tried further on?"
IDS_OUT_OF_MEMORY,		"Out of memory."
IDS_WINHELP_ERROR,		"Help not available."
IDS_UNKNOWN_FEATURE_s,		"Unknown feature in %s"
IDS_FILE_NOT_OVERWRITTEN_s,	"File `%s' exists. Not overwritten."
IDS_SAVE_GROUP_AS_s,		"Save group as `%s to prevent overwriting original files."
IDS_NO_HOT_KEY,			"#msgctxt#hotkey#None"
IDS_ALL_FILES,			"All files (*.*)"
IDS_PROGRAMS,			"Programs"
IDS_LIBRARIES_DLL,		"Libraries (*.dll)"
IDS_SYMBOL_FILES,		"Icon files"
IDS_SYMBOLS_ICO,		"Icons (*.ico)"
}

ACCEL ACCELERATORS
{
VK_F1,     PM_CONTENTS, VIRTKEY
VK_RETURN, PM_ATTRIBUTES, VIRTKEY, ALT
}
