mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
356 lines
12 KiB
356 lines
12 KiB
#include "precomp.h"
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Windows Cardfile - Written by Mark Cliggett */
|
|
/* (c) Copyright Microsoft Corp. 1985, 1994 - All Rights Reserved */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
void NEAR PASCAL MakeMenuString(TCHAR *szCtrl, TCHAR *szMenuStr, TCHAR *szVerb, TCHAR *szClass, TCHAR *szObject);
|
|
|
|
/* Position of the Edit.Object menu. Have to deal with this BY_POSITION
|
|
* since it can be either be a Popup/Menuitem.
|
|
*/
|
|
#define MENUPOS_EDITOBJECT 14
|
|
|
|
NOEXPORT int GetKeyCount(
|
|
HKEY hKeyVerb);
|
|
|
|
NOEXPORT BOOL FixEditObject(
|
|
HMENU hEditMenu);
|
|
|
|
void DisableEditObject(
|
|
HMENU hEditMenu);
|
|
|
|
void UpdateMenu(
|
|
void)
|
|
{
|
|
HMENU hMenu;
|
|
|
|
hMenu = GetMenu(hIndexWnd);
|
|
|
|
CheckMenuItem(hMenu, I_TEXT, EditMode == I_TEXT ? MF_CHECKED : MF_UNCHECKED);
|
|
CheckMenuItem(hMenu, I_OBJECT, EditMode == I_OBJECT ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
if (CardPhone == CCARDFILE)
|
|
{
|
|
if ((EditMode == I_TEXT) && SendMessage(hEditWnd, EM_CANUNDO, 0, 0L))
|
|
EnableMenuItem(hMenu, UNDO, MF_ENABLED);
|
|
else
|
|
EnableMenuItem(hMenu, UNDO, MF_GRAYED);
|
|
|
|
EnableMenuItem(hMenu, I_TEXT, MF_ENABLED);
|
|
EnableMenuItem(hMenu, I_OBJECT, MF_ENABLED);
|
|
EnableMenuItem(hMenu, RESTORE, MF_ENABLED);
|
|
EnableMenuItem(hMenu, FIND, hDlgFind? MF_GRAYED: MF_ENABLED);
|
|
if (szSearch[0] != 0 && !hDlgFind)
|
|
EnableMenuItem(hMenu, FINDNEXT, MF_ENABLED);
|
|
else
|
|
EnableMenuItem(hMenu, FINDNEXT, MF_GRAYED);
|
|
EnableMenuItem(hMenu, PRINT, fCanPrint ? MF_ENABLED : MF_GRAYED);
|
|
#ifdef JAPAN //KKBUGFIX // added 18 Aug. 1992 by Hiraisi (in Japan)
|
|
EnableMenuItem(hMenu, PRINTALL, fCanPrint ? MF_ENABLED : MF_GRAYED);
|
|
#endif
|
|
OleMenuItemFix(hMenu, EditMode); /* Also does Cut/Copy/Paste */
|
|
|
|
// EnableMenuItem(hMenu, GOTO, MF_ENABLED);
|
|
}
|
|
else
|
|
{
|
|
/* all of these don't apply to list mode */
|
|
|
|
EnableMenuItem(hMenu, UNDO, MF_GRAYED);
|
|
EnableMenuItem(hMenu, I_TEXT, MF_GRAYED);
|
|
EnableMenuItem(hMenu, I_OBJECT, MF_GRAYED);
|
|
EnableMenuItem(hMenu, RESTORE, MF_GRAYED);
|
|
EnableMenuItem(hMenu, CUT, MF_GRAYED);
|
|
EnableMenuItem(hMenu, COPY, MF_GRAYED);
|
|
EnableMenuItem(hMenu, PASTE, MF_GRAYED);
|
|
EnableMenuItem(hMenu, PASTELINK, MF_GRAYED);
|
|
EnableMenuItem(hMenu, IDM_PASTESPECIAL, MF_GRAYED);
|
|
EnableMenuItem(hMenu, IDM_INSERTOBJECT, MF_GRAYED);
|
|
// EnableMenuItem(hMenu, GOTO, MF_GRAYED);
|
|
EnableMenuItem(hMenu, FIND, MF_GRAYED);
|
|
EnableMenuItem(hMenu, FINDNEXT, MF_GRAYED);
|
|
EnableMenuItem(hMenu, PRINT, MF_GRAYED);
|
|
#ifdef JAPAN //KKBUGFIX // added 18 Aug. 1992 by Hiraisi (in Japan)
|
|
EnableMenuItem(hMenu, PRINTALL, MF_GRAYED);
|
|
#endif
|
|
EnableMenuItem(hMenu, LINKSDIALOG, MF_GRAYED);
|
|
DisableEditObject(GetSubMenu(hMenu, 1));
|
|
EnableMenuItem(hMenu, EDITOBJECT, MF_GRAYED);
|
|
}
|
|
}
|
|
|
|
void DisableEditObject(
|
|
HMENU hEditMenu)
|
|
{
|
|
TCHAR szObject[25];
|
|
|
|
LoadString(hIndexInstance, IDS_OBJECTCMD, szObject, CharSizeOf(szObject));
|
|
DeleteMenu(hEditMenu, MENUPOS_EDITOBJECT, MF_BYPOSITION);
|
|
InsertMenu(hEditMenu, MENUPOS_EDITOBJECT, MF_BYPOSITION, EDITOBJECT, szObject);
|
|
EnableMenuItem(hEditMenu, MENUPOS_EDITOBJECT, MF_GRAYED|MF_BYPOSITION);
|
|
}
|
|
|
|
/* Depending on the current mode, enable or disable menu items */
|
|
void OleMenuItemFix(
|
|
HMENU hMenu,
|
|
int Mode)
|
|
{
|
|
int wFmt;
|
|
int mfPaste = MF_GRAYED, mfPasteLink = MF_GRAYED, mfCutCopy;
|
|
DWORD lSelection;
|
|
HMENU hEditMenu;
|
|
|
|
hEditMenu = GetSubMenu(hMenu, 1); /* handle to Edit popup */
|
|
if (Mode == I_TEXT)
|
|
{
|
|
lSelection = SendMessage(hEditWnd, EM_GETSEL, 0, 0L);
|
|
mfCutCopy = (HIWORD(lSelection) == LOWORD(lSelection))
|
|
? MF_GRAYED : MF_ENABLED;
|
|
|
|
#ifdef UNICODE
|
|
mfPaste = IsClipboardFormatAvailable(CF_UNICODETEXT) ? MF_ENABLED : MF_GRAYED;
|
|
#else
|
|
mfPaste = IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED;
|
|
#endif
|
|
EnableMenuItem(hMenu, LINKSDIALOG, MF_GRAYED);
|
|
EnableMenuItem(hMenu, IDM_INSERTOBJECT, MF_GRAYED);
|
|
DisableEditObject(hEditMenu);
|
|
}
|
|
else
|
|
{
|
|
mfCutCopy = (CurCard.lpObject) ? MF_ENABLED : MF_GRAYED;
|
|
if (lpObjectUndo)
|
|
EnableMenuItem(hMenu, UNDO, MF_ENABLED);
|
|
|
|
if (fOLE)
|
|
{
|
|
if (OleQueryCreateFromClip(szPStdFile, olerender_draw, 0) == OLE_OK ||
|
|
OleQueryCreateFromClip(szPStatic, olerender_draw, 0) == OLE_OK)
|
|
mfPaste = MF_ENABLED;
|
|
|
|
if (OleQueryLinkFromClip(szPStdFile, olerender_draw, 0) == OLE_OK)
|
|
mfPasteLink = MF_ENABLED;
|
|
|
|
/* Enable Links..., only for a linked object */
|
|
EnableMenuItem(hMenu, LINKSDIALOG,
|
|
(CurCard.lpObject && (CurCard.otObject == LINK)) ?
|
|
MF_ENABLED : MF_GRAYED);
|
|
|
|
if (FixEditObject(hEditMenu))
|
|
EnableMenuItem(hMenu, MENUPOS_EDITOBJECT, MF_ENABLED|MF_BYPOSITION);
|
|
else
|
|
DisableEditObject(hEditMenu);
|
|
EnableMenuItem(hMenu, IDM_INSERTOBJECT, MF_ENABLED);
|
|
}
|
|
else
|
|
{
|
|
if (OpenClipboard(hIndexWnd))
|
|
{
|
|
wFmt = 0;
|
|
while (wFmt = EnumClipboardFormats(wFmt))
|
|
{
|
|
if (wFmt == CF_BITMAP)
|
|
mfPaste = MF_ENABLED;
|
|
}
|
|
CloseClipboard();
|
|
}
|
|
EnableMenuItem(hMenu, LINKSDIALOG, MF_GRAYED);
|
|
DisableEditObject(hEditMenu);
|
|
EnableMenuItem(hMenu, IDM_INSERTOBJECT, MF_GRAYED);
|
|
}
|
|
}
|
|
|
|
EnableMenuItem(hMenu, PASTELINK, mfPasteLink);
|
|
EnableMenuItem(hMenu, PASTE, mfPaste);
|
|
if (fOLE && EditMode == I_OBJECT &&
|
|
(mfPaste == MF_ENABLED || mfPasteLink == MF_ENABLED))
|
|
EnableMenuItem(hMenu, IDM_PASTESPECIAL, MF_ENABLED);
|
|
else
|
|
EnableMenuItem(hMenu, IDM_PASTESPECIAL, MF_GRAYED);
|
|
|
|
EnableMenuItem(hMenu, CUT, mfCutCopy);
|
|
EnableMenuItem(hMenu, COPY, mfCutCopy);
|
|
}
|
|
|
|
/* Enumerate the given key and return key count */
|
|
NOEXPORT int GetKeyCount(
|
|
HKEY hKeyVerb)
|
|
{
|
|
int i;
|
|
TCHAR szKey[KEYNAMESIZE];
|
|
|
|
for (i = 0; !RegEnumKey(hKeyVerb, i, szKey, KEYNAMESIZE); i++)
|
|
continue;
|
|
return i;
|
|
}
|
|
|
|
/*
|
|
* Fix the Edit.Object menu item
|
|
* return TRUE on success,FALSE on failure.
|
|
*
|
|
* For the given class name, get all the verbs.
|
|
* If (only one verb)
|
|
* if (Edit is the only verb)
|
|
* Put "<Obj Name> &Object" in the menu item.
|
|
* else
|
|
* Put "<Verb> <Obj Name> &Object" in the menu item.
|
|
* else
|
|
* Put a Popup menu "<Obj Name> &Object" with all the verbs
|
|
*/
|
|
NOEXPORT BOOL FixEditObject(
|
|
HMENU hEditMenu)
|
|
{
|
|
HKEY hKeyVerb;
|
|
TCHAR szObject[25];
|
|
TCHAR szVerbPath[4*KEYNAMESIZE], /* full path for the verb */
|
|
szShortVerb[KEYNAMESIZE], /* verb, short form */
|
|
szVerb[KEYNAMESIZE], /* verb, long form */
|
|
szClass[KEYNAMESIZE], /* class name for the object */
|
|
szShortClass[KEYNAMESIZE], /* short name of class */
|
|
szMenuStr[100];
|
|
DWORD dwSize = KEYNAMESIZE;
|
|
HANDLE hData=NULL, hPopupNew;
|
|
LPTSTR lpstrData;
|
|
int VerbCount, i;
|
|
TCHAR szWordOrder2[10], szWordOrder3[10];
|
|
|
|
/* If no object exists or if the object is STATIC disable Edit.Object */
|
|
if (!CurCard.lpObject || CurCard.otObject == STATIC)
|
|
return FALSE;
|
|
if (OLE_OK != OleGetData(
|
|
CurCard.lpObject,
|
|
(OLECLIPFORMAT)(CurCard.otObject == LINK ? vcfLink : vcfOwnerLink),
|
|
&hData))
|
|
{
|
|
ErrorMessage(E_GET_FROM_CLIPBOARD_FAILED);
|
|
return FALSE;
|
|
}
|
|
|
|
LoadString(hIndexInstance, IDS_PopupVerbs, szWordOrder2, CharSizeOf(szWordOrder2));
|
|
LoadString(hIndexInstance, IDS_SingleVerb, szWordOrder3, CharSizeOf(szWordOrder3));
|
|
|
|
/* Both link formats are: "szClass0szDocument0szItem00" */
|
|
|
|
/* Get the full class name for user to see in menu */
|
|
if (lpstrData = GlobalLock(hData))
|
|
{
|
|
/* OleGetData returns ASCII! convert to unicode */
|
|
MultiByteToWideChar( CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
(LPCSTR) lpstrData,
|
|
lstrlen(lpstrData),
|
|
szShortClass,
|
|
CharSizeOf(szShortClass) );
|
|
if(RegQueryValue(HKEY_CLASSES_ROOT,szShortClass,szClass,(LONG*)&dwSize))
|
|
lstrcpy(szClass, szShortClass); /* be content with the short name */
|
|
GlobalUnlock(hData);
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
LoadString(hIndexInstance, IDS_OBJECTCMD, szObject, CharSizeOf(szObject));
|
|
/* Get a handle to the Verb key */
|
|
wsprintf(szVerbPath, TEXT("%s\\protocol\\StdFileEditing\\verb"), szShortClass );
|
|
if (!RegOpenKey(HKEY_CLASSES_ROOT, szVerbPath, &hKeyVerb))
|
|
{
|
|
VerbCount = GetKeyCount(hKeyVerb);
|
|
}
|
|
else
|
|
{
|
|
VerbCount = 0; /* failed to get verb key */
|
|
hKeyVerb = NULL; /* Bug 10660: Don't call RegCloseKey() if failed */
|
|
}
|
|
|
|
/* Delete existing menu item at Edit.Object */
|
|
DeleteMenu(hEditMenu, MENUPOS_EDITOBJECT, MF_BYPOSITION);
|
|
|
|
/* Build the new Edit.Object menu */
|
|
if (VerbCount <= 1) /* only one verb or no verbs */
|
|
{
|
|
if (hKeyVerb)
|
|
{
|
|
dwSize = KEYNAMESIZE;
|
|
lstrcpy(szShortVerb, TEXT("0"));
|
|
if (RegQueryValue(hKeyVerb, szShortVerb, szVerb, (LONG FAR *)&dwSize))
|
|
{ /* assume Edit if we can't get the verb */
|
|
LoadString(hIndexInstance, IDS_Edit, szVerb, CharSizeOf(szVerb));
|
|
}
|
|
}
|
|
else /* couldn't get verb from data base default: Edit */
|
|
{
|
|
LoadString(hIndexInstance, IDS_Edit, szVerb, CharSizeOf(szVerb));
|
|
}
|
|
|
|
/* Show "<Verb> <Obj Name> &Object" */
|
|
MakeMenuString(szWordOrder3, szMenuStr, szVerb, szClass, szObject);
|
|
InsertMenu(hEditMenu, MENUPOS_EDITOBJECT, MF_BYPOSITION, OLE_VERB, szMenuStr);
|
|
}
|
|
else /* multiple verbs, create a Popup */
|
|
{
|
|
hPopupNew = CreatePopupMenu();
|
|
/* add the verbs to the Edit.Object popup menu
|
|
* Assuming verbs start from zero - 0,1...*/
|
|
for (i = 0; ;i++)
|
|
{
|
|
wsprintf(szShortVerb, TEXT("%d"), i);
|
|
dwSize = KEYNAMESIZE;
|
|
/* Bug 16440: Pass in szVerb, don't put in an & and pass in
|
|
* szVerb+1. Don't change case of returned string.
|
|
* 2 November 1991 Clark R. Cyr
|
|
*/
|
|
if (!RegQueryValue(hKeyVerb, szShortVerb, szVerb, (LONG FAR *)&dwSize))
|
|
{
|
|
AppendMenu(hPopupNew, MF_BYCOMMAND, OLE_VERB+i, szVerb);
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
MakeMenuString(szWordOrder2, szMenuStr, NULL, szClass, szObject);
|
|
InsertMenu(hEditMenu, MENUPOS_EDITOBJECT, MF_BYPOSITION | MF_POPUP,
|
|
(UINT)hPopupNew, szMenuStr);
|
|
}
|
|
if (hKeyVerb)
|
|
RegCloseKey(hKeyVerb);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void NEAR PASCAL MakeMenuString(TCHAR *szCtrl, TCHAR *szMenuStr, TCHAR *szVerb, TCHAR *szClass, TCHAR *szObject)
|
|
{
|
|
TCHAR *pStr;
|
|
register TCHAR c;
|
|
|
|
while (c = *szCtrl++)
|
|
{
|
|
switch(c)
|
|
{
|
|
case TEXT('c'): // class
|
|
case TEXT('C'): // class
|
|
pStr = szClass;
|
|
break;
|
|
case TEXT('v'): // class
|
|
case TEXT('V'): // class
|
|
pStr = szVerb;
|
|
break;
|
|
case TEXT('o'): // object
|
|
case TEXT('O'): // object
|
|
pStr = szObject;
|
|
break;
|
|
default:
|
|
*szMenuStr++ = c;
|
|
*szMenuStr = TEXT('\0'); // just in case
|
|
continue;
|
|
}
|
|
|
|
if (pStr) // should always be true
|
|
{
|
|
lstrcpy(szMenuStr,pStr);
|
|
szMenuStr += lstrlen(pStr); // point to '\0'
|
|
}
|
|
}
|
|
}
|