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.
267 lines
7.4 KiB
267 lines
7.4 KiB
#include "precomp.h"
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Windows Cardfile - Written by Mark Cliggett */
|
|
/* (c) Copyright Microsoft Corp. 1985, 1994 - All Rights Reserved */
|
|
/* */
|
|
/* OLE - Insert New Object support */
|
|
/************************************************************************/
|
|
|
|
NOEXPORT int NEAR InitClassNamesList(
|
|
HWND hwndList);
|
|
|
|
NOEXPORT BOOL NEAR CreateObjectInDoc(
|
|
PCARD pCard,
|
|
TCHAR szClass[]);
|
|
|
|
NOEXPORT BOOL NEAR ServerNameFromClass(
|
|
TCHAR szClass[],
|
|
TCHAR szServer[]);
|
|
|
|
NOEXPORT BOOL NEAR GetSelectedClassName(
|
|
HWND hwndList,
|
|
TCHAR szSelectedClass[]);
|
|
/* set to FALSE at the beginning of Insertobject,
|
|
* set to TRUE in Ole CallBack function on OLE_SAVE/OLE_CHANGE,
|
|
* If FALSE when OLE_CLOSE received, then delete the Object(server closed without
|
|
* updating the embedded object).
|
|
*/
|
|
BOOL fInsertComplete=TRUE;
|
|
|
|
// Class name picked up from dialog
|
|
static TCHAR szClassName[KEYNAMESIZE];
|
|
|
|
void InsertObject(
|
|
void)
|
|
{
|
|
int Result;
|
|
|
|
if (EditMode == I_TEXT)
|
|
return;
|
|
|
|
Result = DialogBox( hIndexInstance,
|
|
(LPTSTR) MAKEINTRESOURCE(DLGINSERTOBJECT),
|
|
hIndexWnd,
|
|
(WNDPROC) InsertObjectDlgProc);
|
|
|
|
if (Result == -1)
|
|
return; /* probably error msg , out of mem */
|
|
else if (Result == 0 || szClassName[0] == 0)
|
|
return; /* dlg cancelled */
|
|
|
|
PicSaveUndo(&CurCard);
|
|
CreateObjectInDoc(&CurCard, szClassName);
|
|
}
|
|
|
|
/* Insert New... dialog */
|
|
int FAR PASCAL InsertObjectDlgProc(
|
|
HWND hDlg,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
HWND hwndList;
|
|
|
|
switch (msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
*szClassName = (TCHAR) 0;
|
|
hwndList = GetDlgItem(hDlg, IDD_LISTBOX);
|
|
if (!InitClassNamesList(hwndList))
|
|
{
|
|
TCHAR szMsg[50];
|
|
|
|
LoadString(hIndexInstance, IDS_NOOLESERVERS, szMsg, CharSizeOf(szMsg));
|
|
MessageBox(hIndexWnd, szMsg, szCardfile, MB_OK );
|
|
EndDialog(hDlg, FALSE);
|
|
}
|
|
SendMessage(hwndList, LB_SETCURSEL, 0, 0L);
|
|
SetFocus(hwndList);
|
|
return FALSE;
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDD_LISTBOX:
|
|
#if !defined(WIN32)
|
|
if (HIWORD(lParam) != LBN_DBLCLK)
|
|
#else
|
|
if (HIWORD(wParam) != LBN_DBLCLK)
|
|
#endif
|
|
break;
|
|
/* fall through */
|
|
case IDOK:
|
|
hwndList = GetDlgItem(hDlg, IDD_LISTBOX);
|
|
if (!GetSelectedClassName(hwndList, szClassName))
|
|
EndDialog(hDlg, FALSE); /* error, similar to Cancel dlg */
|
|
else
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// do something to get rid of warnings
|
|
#ifndef OLE_20
|
|
#define OLECHAR CHAR
|
|
#else
|
|
#define OLECHAR TCHAR
|
|
#endif
|
|
|
|
NOEXPORT BOOL NEAR CreateObjectInDoc(
|
|
PCARD pCard,
|
|
TCHAR szClass[])
|
|
{
|
|
LPOLEOBJECT lpObject;
|
|
OBJECTTYPE otObject;
|
|
WORD fOleErrRet;
|
|
OLECHAR szOleClass[KEYNAMESIZE]; // class name in ascii for ole
|
|
|
|
//
|
|
// Convert class name to ascii if we need to
|
|
//
|
|
|
|
#ifndef OLE_20
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szClass,
|
|
-1, // api calculates length
|
|
szOleClass,
|
|
sizeof(szOleClass),
|
|
NULL,
|
|
NULL );
|
|
#else
|
|
lstrcpy( szOleClass, szClass );
|
|
#endif
|
|
|
|
#ifndef OLE_20
|
|
wsprintfA (szObjectName, szObjFormat, idObjectMax + 1);
|
|
#else
|
|
wsprintfW (szObjectName, szObjFormat, idObjectMax + 1);
|
|
#endif
|
|
|
|
fInsertComplete = FALSE;
|
|
if (fOleErrRet = OleError(
|
|
OleCreate(szPStdFile,
|
|
lpclient,
|
|
szOleClass,
|
|
lhcdoc,
|
|
szObjectName,
|
|
&lpObject,
|
|
olerender_draw,
|
|
0)))
|
|
{
|
|
if (fOleErrRet == FOLEERROR_NOTGIVEN)
|
|
ErrorMessage(E_CREATEOBJECTFAILED);
|
|
return FALSE;
|
|
}
|
|
else
|
|
otObject = EMBEDDED;
|
|
|
|
DoSetHostNames(lpObject, otObject);
|
|
|
|
if (lpObject)
|
|
{
|
|
if (pCard->lpObject)
|
|
PicDelete(pCard);
|
|
pCard->lpObject = lpObject;
|
|
pCard->otObject = otObject;
|
|
pCard->idObject = idObjectMax++;
|
|
CurCardHead.flags |= FDIRTY;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* InitClassNamesList() - Fills the list box with possible server names. */
|
|
NOEXPORT int NEAR InitClassNamesList(
|
|
HWND hwndList)
|
|
{
|
|
TCHAR szClass[KEYNAMESIZE];
|
|
TCHAR szServer[KEYNAMESIZE];
|
|
HKEY hkeyRoot;
|
|
int i;
|
|
|
|
if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hkeyRoot))
|
|
return FALSE;
|
|
|
|
SendMessage(hwndList, LB_RESETCONTENT, 0, 0L);
|
|
for (i = 0; !RegEnumKey(HKEY_CLASSES_ROOT, i, szClass, KEYNAMESIZE); i++)
|
|
{
|
|
if (ServerNameFromClass(szClass, szServer))
|
|
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)szServer);
|
|
}
|
|
|
|
RegCloseKey(hkeyRoot);
|
|
return SendMessage(hwndList, LB_GETCOUNT, 0, 0L);
|
|
}
|
|
|
|
/* for a given classname, it returns the server name if one exists.
|
|
* returns TRUE on success, FALSE if given classname is not a server */
|
|
NOEXPORT BOOL NEAR ServerNameFromClass(
|
|
TCHAR szClass[],
|
|
TCHAR szServer[])
|
|
{
|
|
DWORD dwSize = KEYNAMESIZE;
|
|
HKEY hkeyTemp = NULL;
|
|
TCHAR szExec[KEYNAMESIZE];
|
|
int Result;
|
|
|
|
if (*szClass != TEXT('.')) /* Not default extension... */
|
|
{
|
|
/* See if this class really refers to a server */
|
|
wsprintf(szExec, TEXT("%s\\protocol\\StdFileEditing\\server"), (LPTSTR)szClass);
|
|
if (!RegOpenKey(HKEY_CLASSES_ROOT, szExec, &hkeyTemp))
|
|
{
|
|
/* get the class name string */
|
|
Result = RegQueryValue(HKEY_CLASSES_ROOT, szClass, szServer, (LONG FAR *)&dwSize);
|
|
RegCloseKey(hkeyTemp);
|
|
if (Result == 0)
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* GetSelectedClassName() - Returns the class id from the listbox.
|
|
*/
|
|
NOEXPORT BOOL NEAR GetSelectedClassName(
|
|
HWND hwndList,
|
|
TCHAR szSelectedClass[])
|
|
{
|
|
TCHAR szKey[KEYNAMESIZE];
|
|
TCHAR szClass[KEYNAMESIZE];
|
|
TCHAR szServer[KEYNAMESIZE];
|
|
int i;
|
|
int Sel;
|
|
HKEY hkeyRoot;
|
|
|
|
if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hkeyRoot))
|
|
return FALSE;
|
|
|
|
Sel = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0L);
|
|
SendMessage(hwndList, LB_GETTEXT, Sel, (LPARAM)szKey);
|
|
|
|
for (i = 0;
|
|
!RegEnumKey(HKEY_CLASSES_ROOT, i, szClass, KEYNAMESIZE); i++)
|
|
{
|
|
if (ServerNameFromClass(szClass, szServer) && /* if it is a server */
|
|
lstrcmp(szServer, szKey) == 0) /* and it is the one we want */
|
|
{
|
|
lstrcpy(szSelectedClass, szClass);
|
|
RegCloseKey(hkeyRoot);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkeyRoot);
|
|
return FALSE;
|
|
}
|