/****************************************************************************/
/* */
/* Copyright (C) 1987-1996 Microsoft Corp. */
/* All Rights Reserved */
/* */
/****************************************************************************/
/****************************** Module Header *******************************
* Module Name: menucmd.c
*
* Contains routines to dispatch the menu commands.
*
* History:
*
****************************************************************************/
#include "imagedit.h"
#include "dialogs.h"
#include "ids.h"
#include <direct.h>
#include <string.h>
STATICFN INT GetHelpContext(INT idSubject, PHELPMAP phmap);
/************************************************************************
* InitMenu
*
* This function grays/enables and checks/unchecks the menu items
* appropriately for the given state.
*
* Arguments:
* HMENU hMenu - The menu handle.
*
* History:
*
************************************************************************/
VOID InitMenu(
HMENU hMenu)
{
BOOL fEnable;
INT i;
MyEnableMenuItem(hMenu, MENU_FILE_SAVE, fImageDirty || fFileDirty);
MyEnableMenuItem(hMenu, MENU_FILE_SAVEAS, gpImageHead);
MyEnableMenuItem(hMenu, MENU_FILE_LOADCOLORS, gnColors != 2);
MyEnableMenuItem(hMenu, MENU_FILE_SAVECOLORS, gnColors != 2);
/*
* Only enable the option to restore the default colors if this
* is not a monochrome palette and at least one of the colors
* has been changed.
*/
fEnable = FALSE;
if (gnColors != 2) {
for (i = 0; i < COLORSMAX; i++) {
if (gargbColor[i] != gargbDefaultColor[i]) {
fEnable = TRUE;
break;
}
}
}
MyEnableMenuItem(hMenu, MENU_FILE_DEFAULTCOLORS, fEnable);
MyEnableMenuItem(hMenu, MENU_EDIT_UNDO, ghbmUndo);
MyEnableMenuItem(hMenu, MENU_EDIT_RESTORE,
gpImageCur && gpImageCur->DIBPtr && fImageDirty);
MyEnableMenuItem(hMenu, MENU_EDIT_COPY, gpImageCur);
MyEnableMenuItem(hMenu, MENU_EDIT_PASTE,
gpImageCur && IsClipboardFormatAvailable(CF_BITMAP));
MyEnableMenuItem(hMenu, MENU_EDIT_CLEAR, gpImageCur);
/*
* We can add new images if the current image is not a bitmap,
* and we have possible new images to add, and there is a current
* file being edited. This last case is checked by looking to
* see that there is either a current file name, or there is a
* current image (the case for new files).
*/
MyEnableMenuItem(hMenu, MENU_EDIT_NEWIMAGE,
giType != FT_BITMAP &&
((giType == FT_ICON) ?
(gnImages < gnIconDevices) : (gnImages < gnCursorDevices)) &&
(gpImageCur || gpszFileName));
MyEnableMenuItem(hMenu, MENU_EDIT_SELECTIMAGE,
giType != FT_BITMAP && gnImages > 0);
MyEnableMenuItem(hMenu, MENU_EDIT_DELETEIMAGE,
giType != FT_BITMAP && gnImages > 0);
MyCheckMenuItem(hMenu, MENU_OPTIONS_GRID, gfGrid);
MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH2, gnBrushSize == 2);
MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH3, gnBrushSize == 3);
MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH4, gnBrushSize == 4);
MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH5, gnBrushSize == 5);
MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWCOLOR, gfShowColor);
MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWVIEW, gfShowView);
MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWTOOLBOX, gfShowToolbox);
}
/************************************************************************
* MenuCmd
*
* Dispatches all the menu commands.
*
* Arguments:
*
* History:
*
************************************************************************/
VOID MenuCmd(
INT item)
{
switch (item) {
/*
* File menu ----------------------------------------------------
*/
case MENU_FILE_OPEN:
if (VerifySaveFile())
OpenAFile();
break;
case MENU_FILE_NEW:
if (VerifySaveFile()) {
if (DlgBox(DID_RESOURCETYPE,
(WNDPROC)ResourceTypeDlgProc) == IDOK) {
/*
* Clear out the current resource.
*/
ClearResource();
if (iNewFileType == FT_BITMAP)
DlgBox(DID_BITMAPSIZE, (WNDPROC)BitmapSizeDlgProc);
else
ImageNewDialog(iNewFileType);
}
}
break;
case MENU_FILE_SAVE:
SaveFile(FALSE);
break;
case MENU_FILE_SAVEAS:
SaveFile(TRUE);
break;
case MENU_FILE_LOADCOLORS:
LoadColorFile();
break;
case MENU_FILE_SAVECOLORS:
SaveColorFile();
break;
case MENU_FILE_DEFAULTCOLORS:
RestoreDefaultColors();
break;
case MENU_FILE_EXIT:
SendMessage(ghwndMain, WM_SYSCOMMAND, SC_CLOSE, 0L);
break;
/*
* Edit menu ----------------------------------------------------
*/
case MENU_EDIT_UNDO:
ImageUndo();
break;
case MENU_EDIT_RESTORE:
/*
* Reopen the most recently retained image (without
* prompting for a save).
*/
ImageOpen2(gpImageCur);
break;
case MENU_EDIT_COPY:
CopyImageClip();
break;
case MENU_EDIT_PASTE:
PasteImageClip();
break;
case MENU_EDIT_CLEAR:
ImageUpdateUndo();
ImageDCClear();
ViewUpdate();
break;
case MENU_EDIT_NEWIMAGE:
ImageNewDialog(giType);
break;
case MENU_EDIT_SELECTIMAGE:
ImageSelectDialog();
break;
case MENU_EDIT_DELETEIMAGE:
ImageDelete();
break;
/*
* Options menu -------------------------------------------------
*/
case MENU_OPTIONS_GRID:
/*
* Toggle the grid state.
*/
gfGrid ^= TRUE;
/*
* Repaint the workspace window to show/remove the grid.
*/
WorkUpdate();
break;
case MENU_OPTIONS_BRUSH2:
case MENU_OPTIONS_BRUSH3:
case MENU_OPTIONS_BRUSH4:
case MENU_OPTIONS_BRUSH5:
switch (item) {
case MENU_OPTIONS_BRUSH2:
gnBrushSize = 2;
break;
case MENU_OPTIONS_BRUSH3:
gnBrushSize = 3;
break;
case MENU_OPTIONS_BRUSH4:
gnBrushSize = 4;
break;
case MENU_OPTIONS_BRUSH5:
gnBrushSize = 5;
break;
}
break;
case MENU_OPTIONS_SHOWCOLOR:
/*
* Toggle the state of the color palette.
*/
gfShowColor = gfShowColor ? FALSE : TRUE;
ColorShow(gfShowColor);
break;
case MENU_OPTIONS_SHOWVIEW:
/*
* Toggle the state of the view window.
*/
gfShowView = gfShowView ? FALSE : TRUE;
ViewShow(gfShowView);
break;
case MENU_OPTIONS_SHOWTOOLBOX:
/*
* Toggle the state of the Toolbox.
*/
gfShowToolbox = gfShowToolbox ? FALSE : TRUE;
ToolboxShow(gfShowToolbox);
break;
/*
* Help menu ----------------------------------------------------
*/
case MENU_HELP_CONTENTS:
WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L);
break;
case MENU_HELP_SEARCH:
/*
* Tell winhelp to be sure this app's help file is current,
* then invoke a search with an empty starting key.
*/
WinHelp(ghwndMain, gszHelpFile, HELP_FORCEFILE, 0);
WinHelp(ghwndMain, gszHelpFile, HELP_PARTIALKEY, (DWORD)(LPSTR)"");
break;
case MENU_HELP_ABOUT:
DlgBox(DID_ABOUT, (WNDPROC)AboutDlgProc);
break;
/*
* Hidden menu commands (accessed by accelerators) --------------
*/
case MENU_HIDDEN_TOCOLORPAL:
if (IsWindowVisible(ghwndColor))
SetFocus(ghwndColor);
break;
case MENU_HIDDEN_TOVIEW:
if (IsWindowVisible(ghwndView))
SetFocus(ghwndView);
break;
case MENU_HIDDEN_TOTOOLBOX:
if (IsWindowVisible(ghwndToolbox))
SetFocus(ghwndToolbox);
break;
case MENU_HIDDEN_TOPROPBAR:
SetFocus(ghwndPropBar);
break;
}
}
/************************************************************************
* MsgFilterHookFunc
*
* This is the exported message filter function that is hooked into
* the message stream for detecting the pressing of the F1 key, at
* which time it calls up the appropriate help.
*
* Arguments:
*
* History:
*
************************************************************************/
DWORD APIENTRY MsgFilterHookFunc(
INT nCode,
WPARAM wParam,
LPMSG lpMsg)
{
if ((nCode == MSGF_MENU || nCode == MSGF_DIALOGBOX) &&
(lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1)) {
/*
* Display help.
*/
ShowHelp((nCode == MSGF_MENU) ? TRUE : FALSE);
/*
* Tell Windows to swallow this message.
*/
return 1;
}
return DefHookProc(nCode, wParam, (LONG)lpMsg, &ghhkMsgFilter);
}
/************************************************************************
* ShowHelp
*
* This function is called when the user has requested help. It will
* look at the menu state (if fMenuHelp is TRUE) or which dialog
* is currently up to determine the help topic, then it calls WinHelp.
*
* Arguments:
* BOOL fMenuHelp - TRUE if this help is for a menu (help was requested
* in the menu modal loop). If FALSE, general help
* or help for a dialog is assumed.
*
* History:
*
************************************************************************/
VOID ShowHelp(
BOOL fMenuHelp)
{
INT nHelpContext = 0;
HWND hwndFocus;
if (fMenuHelp) {
nHelpContext = GetHelpContext(gMenuSelected, gahmapMenu);
}
else {
/*
* Look for help for the current dialog.
*/
if (gidCurrentDlg) {
nHelpContext = GetHelpContext(gidCurrentDlg, gahmapDialog);
}
else {
/*
* There is no current dialog. Is the window with the
* focus a control on the Properties Bar?
*/
if ((hwndFocus = GetFocus()) && IsChild(ghwndPropBar, hwndFocus))
nHelpContext = GetHelpContext(DID_PROPBAR, gahmapDialog);
}
}
/*
* If there is help context, display it. Otherwise display
* the Contents screen.
*/
if (nHelpContext)
WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, nHelpContext);
else
WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L);
}
/************************************************************************
* GetHelpContext
*
* This function takes a subject and returns its matching help
* context id from the given HELPMAP table.
*
* Arguments:
* INT idSubject - ID of the subject to find the help context for.
* PHELPMAP phmap - The help map table. It is assumed that the
* last entry in the table has a NULL subject id.
*
* History:
*
************************************************************************/
STATICFN INT GetHelpContext(
INT idSubject,
PHELPMAP phmap)
{
while (phmap->idSubject) {
if (phmap->idSubject == idSubject)
return phmap->HelpContext;
phmap++;
}
return 0;
}
/************************************************************************
* AboutDlgProc
*
* This is the About Box dialog procedure.
*
* History:
*
************************************************************************/
DIALOGPROC AboutDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
{
CHAR szVersion[CCHTEXTMAX];
strcpy(szVersion, ids(IDS_VERSION));
strcat(szVersion, ids(IDS_VERSIONMINOR));
#ifdef DBG
strcat(szVersion, " (debug)");
#endif
SetDlgItemText(hwnd, DID_ABOUTVERSION, szVersion);
CenterWindow(hwnd);
}
return TRUE;
case WM_COMMAND:
EndDialog(hwnd, IDOK);
return TRUE;
default:
return FALSE;
}
}