|
|
/*************************************************************************
** ** OLE 2 Sample Code ** ** main.c ** ** This file contains initialization functions which are WinMain, ** WndProc, and OutlineApp_InitalizeMenu. ** ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved ** *************************************************************************/
#include "outline.h"
#if defined( USE_STATUSBAR )
#include "status.h"
#endif
#if !defined( WIN32 )
#if defined( USE_CTL3D )
#include "ctl3d.h"
#endif // USE_CTL3D
#endif // !WIN32
#include "initguid.h" // forces our GUIDs to be initialized
#include "defguid.h"
// OLETEST driver window handler
HWND g_hwndDriver;
#if defined( OLE_CNTR )
//*************************************************************************
#if defined( INPLACE_CNTR )
OLEDBGDATA_MAIN("ICNTR") #else
OLEDBGDATA_MAIN("CNTR") #endif
CONTAINERAPP g_OutlineApp; // Global App object maintains app instance state
/* Global interface Vtbl's
* OLE2NOTE: we only need one copy of each Vtbl. When an object which * exposes an interface is instantiated, its lpVtbl is intialized * to point to one of these global Vtbl's. */ IUnknownVtbl g_OleApp_UnknownVtbl; IClassFactoryVtbl g_OleApp_ClassFactoryVtbl; IMessageFilterVtbl g_OleApp_MessageFilterVtbl;
IUnknownVtbl g_OleDoc_UnknownVtbl; IPersistFileVtbl g_OleDoc_PersistFileVtbl; IOleItemContainerVtbl g_OleDoc_OleItemContainerVtbl; IExternalConnectionVtbl g_OleDoc_ExternalConnectionVtbl; IDataObjectVtbl g_OleDoc_DataObjectVtbl;
#if defined( USE_DRAGDROP )
IDropSourceVtbl g_OleDoc_DropSourceVtbl; IDropTargetVtbl g_OleDoc_DropTargetVtbl; #endif // USE_DRAGDROP
IOleUILinkContainerVtbl g_CntrDoc_OleUILinkContainerVtbl;
IOleClientSiteVtbl g_CntrLine_UnknownVtbl; IOleClientSiteVtbl g_CntrLine_OleClientSiteVtbl; IAdviseSinkVtbl g_CntrLine_AdviseSinkVtbl;
#if defined( INPLACE_CNTR )
IOleInPlaceSiteVtbl g_CntrLine_OleInPlaceSiteVtbl; IOleInPlaceFrameVtbl g_CntrApp_OleInPlaceFrameVtbl; BOOL g_fInsideOutContainer = FALSE; // default to outside-in activation
#endif // INPLACE_CNTR
//*************************************************************************
#endif // OLE_CNTR
#if defined( OLE_SERVER )
//*************************************************************************
#if defined( INPLACE_SVR )
OLEDBGDATA_MAIN("ISVR") #else
OLEDBGDATA_MAIN("SVR") #endif
SERVERAPP g_OutlineApp; // Global App object maintains app instance state
/* Global interface Vtbl's
* OLE2NOTE: we only need one copy of each Vtbl. When an object which * exposes an interface is instantiated, its lpVtbl is intialized * to point to one of these global Vtbl's. */ IUnknownVtbl g_OleApp_UnknownVtbl; IClassFactoryVtbl g_OleApp_ClassFactoryVtbl; IMessageFilterVtbl g_OleApp_MessageFilterVtbl;
IUnknownVtbl g_OleDoc_UnknownVtbl; IPersistFileVtbl g_OleDoc_PersistFileVtbl; IOleItemContainerVtbl g_OleDoc_OleItemContainerVtbl; IExternalConnectionVtbl g_OleDoc_ExternalConnectionVtbl; IDataObjectVtbl g_OleDoc_DataObjectVtbl;
#if defined( USE_DRAGDROP )
IDropSourceVtbl g_OleDoc_DropSourceVtbl; IDropTargetVtbl g_OleDoc_DropTargetVtbl; #endif // USE_DRAGDROP
IOleObjectVtbl g_SvrDoc_OleObjectVtbl; IPersistStorageVtbl g_SvrDoc_PersistStorageVtbl;
#if defined( SVR_TREATAS )
IStdMarshalInfoVtbl g_SvrDoc_StdMarshalInfoVtbl; #endif // SVR_TREATAS
#if defined( INPLACE_SVR )
IOleInPlaceObjectVtbl g_SvrDoc_OleInPlaceObjectVtbl; IOleInPlaceActiveObjectVtbl g_SvrDoc_OleInPlaceActiveObjectVtbl; #endif // INPLACE_SVR
IUnknownVtbl g_PseudoObj_UnknownVtbl; IOleObjectVtbl g_PseudoObj_OleObjectVtbl; IDataObjectVtbl g_PseudoObj_DataObjectVtbl;
//*************************************************************************
#endif // OLE_SVR
#if !defined( OLE_VERSION )
OLEDBGDATA_MAIN("OUTL") OUTLINEAPP g_OutlineApp; // Global App object maintains app instance state
#endif
LPOUTLINEAPP g_lpApp=(LPOUTLINEAPP)&g_OutlineApp; // ptr to global app obj
RECT g_rectNull = {0, 0, 0, 0}; UINT g_uMsgHelp = 0; // help msg from ole2ui dialogs
BOOL g_fAppActive = FALSE;
/* WinMain
** ------- ** Main routine for the Windows application. */ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp; MSG msg; /* MSG structure to store your messages */ LPSTR pszTemp;
#if defined( OLE_VERSION )
/* OLE2NOTE: it is recommended that all OLE applications to set
** their message queue size to 96. this improves the capacity ** and performance of OLE's LRPC mechanism. */ int cMsg = 96; // recommend msg queue size for OLE
while (cMsg && ! SetMessageQueue(cMsg)) // take largest size we can get.
cMsg -= 8; if (! cMsg) return -1; // ERROR: we got no message queue
#endif
#if defined( USE_CTL3D )
Ctl3dRegister(hInstance); Ctl3dAutoSubclass(hInstance); #endif
if(! hPrevInstance) { /* register window classes if first instance of application */ if(! OutlineApp_InitApplication(lpOutlineApp, hInstance)) return 0; }
/* Create App Frame window */ if (! OutlineApp_InitInstance(lpOutlineApp, hInstance, nCmdShow)) return 0;
if( (pszTemp = strstr(lpszCmdLine, "-driver")) ) { //we were launched by the test driver
g_hwndDriver = (HWND)strtoul(pszTemp+8, &lpszCmdLine, 10); } else { g_hwndDriver = NULL; }
if (! OutlineApp_ParseCmdLine(lpOutlineApp, lpszCmdLine, nCmdShow)) return 0;
lpOutlineApp->m_hAccelApp = LoadAccelerators(hInstance, APPACCEL); lpOutlineApp->m_hAccelFocusEdit = LoadAccelerators(hInstance, FB_EDIT_ACCEL); lpOutlineApp->m_hAccel = lpOutlineApp->m_hAccelApp; lpOutlineApp->m_hWndAccelTarget = lpOutlineApp->m_hWndApp;
if( g_hwndDriver ) { PostMessage(g_hwndDriver, WM_TESTREG, (WPARAM)lpOutlineApp->m_hWndApp, 0); }
// Main message loop
while(GetMessage(&msg, NULL, 0, 0)) { /* Until WM_QUIT message */ if(!MyTranslateAccelerator(&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
#if defined( OLE_VERSION )
OleApp_TerminateApplication((LPOLEAPP)lpOutlineApp); #else
/* OLE2NOTE: CoInitialize() is called in OutlineApp_InitInstance
** and therefore we need to uninitialize it when exit. */ CoUninitialize(); #endif
#if defined( USE_CTL3D )
Ctl3dUnregister(hInstance); #endif
return msg.wParam;
} /* End of WinMain */
BOOL MyTranslateAccelerator(LPMSG lpmsg) { // if it's not a keystroke it can not be an accelerator
if (lpmsg->message < WM_KEYFIRST || lpmsg->message > WM_KEYLAST) return FALSE;
if (g_lpApp->m_hWndAccelTarget && TranslateAccelerator(g_lpApp->m_hWndAccelTarget, g_lpApp->m_hAccel,lpmsg)) return TRUE;
#if defined( INPLACE_SVR )
/* OLE2NOTE: if we are in-place active and we did not translate the
** accelerator, we need to give the top-level (frame) in-place ** container a chance to translate the accelerator. ** we ONLY need to call OleTranslateAccelerator API if the ** message is a keyboard message. otherwise it is harmless but ** unnecessary. ** ** NOTE: even a in-place server that does NOT have any ** Accelerators must still call OleTranslateAccelerator for all ** keyboard messages so that the server's OWN menu mneumonics ** (eg. &Edit -- Alt-e) function properly. ** ** NOTE: an in-place server MUST check that the accelerator is ** NOT one of its own accelerators BEFORE calling ** OleTranslateAccelerator which tries to see if it is a ** container accelerator. if this is a server accelerator that ** was not translateed because the associated menu command was ** disabled, we MUST NOT call OleTranslateAccelerator. The ** IsAccelerator helper API has been added to assist with this ** check. */ if (g_OutlineApp.m_lpIPData && !IsAccelerator(g_lpApp->m_hAccel, GetAccelItemCount(g_lpApp->m_hAccel), lpmsg,NULL) && OleTranslateAccelerator(g_OutlineApp.m_lpIPData->lpFrame, (LPOLEINPLACEFRAMEINFO)&g_OutlineApp.m_lpIPData->frameInfo, lpmsg) == NOERROR) { return TRUE; } #endif
return FALSE; }
/************************************************************************/ /* */ /* Main Window Procedure */ /* */ /* This procedure provides service routines for the Windows events */ /* (messages) that Windows sends to the window, as well as the user */ /* initiated events (messages) that are generated when the user selects */ /* the action bar and pulldown menu controls or the corresponding */ /* keyboard accelerators. */ /* */ /************************************************************************/
LRESULT FAR PASCAL AppWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)GetWindowLong(hWnd, 0); LPOUTLINEDOC lpOutlineDoc = NULL; #if defined( OLE_VERSION )
LPOLEAPP lpOleApp = (LPOLEAPP)lpOutlineApp; #endif
#if defined( OLE_CNTR )
LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)lpOutlineApp; #endif
HWND hWndDoc = NULL;
#if defined( USE_FRAMETOOLS )
LPFRAMETOOLS lptb = OutlineApp_GetFrameTools(lpOutlineApp); #endif
if (lpOutlineApp) { lpOutlineDoc = OutlineApp_GetActiveDoc(lpOutlineApp);
if (lpOutlineDoc) hWndDoc = OutlineDoc_GetWindow(lpOutlineDoc); }
switch (Message) { case WM_TEST1: StartClipboardTest1(lpOutlineApp); break; case WM_TEST2: ContinueClipboardTest1(lpOutlineApp); break; case WM_COMMAND: { #ifdef WIN32
WORD wID = LOWORD(wParam); #else
WORD wID = wParam; #endif
#if defined( INPLACE_CNTR )
LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc; LPOLEDOC lpOleDoc = (LPOLEDOC)lpOutlineDoc;
/* OLE2NOTE: see context sensitive help technote (CSHELP.DOC)
** m_fMenuHelpMode flag is set when F1 is pressed when a ** menu item is selected. this flag is set in ** IOleInPlaceFrame::ContextSensitveHelp method. ** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. this flag is set in ** IOleInPlaceSite::ContextSensitiveHelp method. ** if either of these flags are set then the WM_COMMAND ** message is received then, the corresponding command ** should NOT executed; help can be given (if desired). ** also the context sensitve help mode should be exited. ** the two different cases have their own way to exit ** the mode (please refer to the technote). */ if (lpOleDoc && (lpContainerApp->m_fMenuHelpMode||lpOleDoc->m_fCSHelpMode) && (wID > IDM_FILE) /* min wID for app command */ && (wID!=IDM_FB_EDIT) /* special wID to control FormulaBar */ ) {
if ((lpContainerApp->m_fMenuHelpMode)) { LPOLEINPLACEACTIVEOBJECT lpIPActiveObj = lpContainerApp->m_lpIPActiveObj;
lpContainerApp->m_fMenuHelpMode = FALSE;
// inform the in-place active object that we handled the
// menu help mode (F1) selection.
if (lpIPActiveObj) { OLEDBG_BEGIN2("IOleInPlaceActiveObject::ContextSensitiveHelp(FALSE) called\r\n") lpIPActiveObj->lpVtbl->ContextSensitiveHelp( lpIPActiveObj, FALSE); OLEDBG_END2 } }
if ((lpOleDoc->m_fCSHelpMode)) { LPOLEINPLACEOBJECT lpIPObj; LPCONTAINERLINE lpLastIpActiveLine = lpContainerDoc->m_lpLastIpActiveLine;
lpOleDoc->m_fCSHelpMode = FALSE;
/* inform immediate in-place container parent and,
** if we were a container/server, immediate ** in-place object children that we handled the ** context sensitive help mode. */ if (lpLastIpActiveLine && (lpIPObj=lpLastIpActiveLine->m_lpOleIPObj)!=NULL){ OLEDBG_BEGIN2("IOleInPlaceObject::ContextSensitiveHelp(FALSE) called\r\n") lpIPObj->lpVtbl->ContextSensitiveHelp(lpIPObj, FALSE); OLEDBG_END2 } }
// if we provided help, we would do it here...
// remove context sensitive help cursor
SetCursor(LoadCursor(NULL,IDC_ARROW)); return 0L; } #endif // INPLACE_CNTR
switch (wID) {
case IDM_F_NEW: OleDbgIndent(-2); // Reset debug output indent level
OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_NewCommand\r\n") OutlineApp_NewCommand(lpOutlineApp); OLEDBG_END3
#if defined( OLE_CNTR )
/* OLE2NOTE: this call will attempt to recover
** resources by unloading DLL's that were loaded ** by OLE and are no longer being used. it is a ** good idea to call this API now and then if ** your app tends to run for a long time. ** otherwise these DLL's will be unloaded when ** the app exits. some apps may want to call ** this as part of idle-time processing. this ** call is optional. */ OLEDBG_BEGIN2("CoFreeUnusedLibraries called\r\n") CoFreeUnusedLibraries(); OLEDBG_END2 #endif
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons( OutlineApp_GetActiveDoc(lpOutlineApp)); #endif
break;
case IDM_F_OPEN: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_OpenCommand\r\n") OutlineApp_OpenCommand(lpOutlineApp); OLEDBG_END3
#if defined( OLE_CNTR )
/* OLE2NOTE: this call will attempt to recover
** resources by unloading DLL's that were loaded ** by OLE and are no longer being used. it is a ** good idea to call this API now and then if ** your app tends to run for a long time. ** otherwise these DLL's will be unloaded when ** the app exits. some apps may want to call ** this as part of idle-time processing. this ** call is optional. */ OLEDBG_BEGIN2("CoFreeUnusedLibraries called\r\n") CoFreeUnusedLibraries(); OLEDBG_END2 #endif
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons( OutlineApp_GetActiveDoc(lpOutlineApp)); #endif
break;
case IDM_F_SAVE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_SaveCommand\r\n") OutlineApp_SaveCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_F_SAVEAS: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_SaveAsCommand\r\n") OutlineApp_SaveAsCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_F_PRINT: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_PrintCommand\r\n") OutlineApp_PrintCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_F_PRINTERSETUP: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_PrinterSetupCommand\r\n") OutlineApp_PrinterSetupCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_F_EXIT: SendMessage(hWnd, WM_CLOSE, 0, 0L); break;
case IDM_H_ABOUT: OutlineApp_AboutCommand(lpOutlineApp); break;
#if defined( INPLACE_CNTR )
case IDM_ESCAPE: { /* ESCAPE key pressed */ LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc;
/* OLE2NOTE: The standard OLE 2.0 UI convention
** is to have ESCAPE key exit in-place ** activation (ie. UIDeactivate). If ** possible it is recommended for both ** in-place servers AND in-place containers ** to take responsibility to handle the ** ESCAPE key accelerator. The server has ** the first crack at handling accelerator ** keys and normally the server should do ** the UIDeactivation. It is a good idea for ** in-place containers, in order to ** guarantee consistent behavior, to also ** handle the ESCAPE key and UIDeactivate ** the object in case the object does not do ** it itself. normally this should be ** unnecessary. */ if (lpContainerDoc->m_lpLastUIActiveLine && lpContainerDoc->m_lpLastUIActiveLine->m_fUIActive) { ContainerLine_UIDeactivate( lpContainerDoc->m_lpLastUIActiveLine); } break; } #endif // INPLACE_CNTR
default: // forward message to document window
if (hWndDoc) { return DocWndProc(hWndDoc, Message,wParam,lParam); } }
break; /* End of WM_COMMAND */ }
case WM_INITMENU: OutlineApp_InitMenu(lpOutlineApp, lpOutlineDoc, (HMENU)wParam); break;
#if defined( OLE_VERSION )
/* OLE2NOTE: WM_INITMENUPOPUP is trapped primarily for the Edit
** menu. We didn't update the Edit menu until it is popped ** up to avoid the overheads of the OLE calls which are ** required to initialize some Edit menu items. */ case WM_INITMENUPOPUP: { HMENU hMenuEdit = GetSubMenu(lpOutlineApp->m_hMenuApp, 1); #if defined( INPLACE_CNTR )
LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc;
/* OLE2NOTE: we must check if there is an object currently
** in-place UIActive. if so, then our edit menu is not ** on the menu; we do not want to bother updating the ** edit menu when it is not even there. */ if (lpContainerDoc && lpContainerDoc->m_lpLastUIActiveLine && lpContainerDoc->m_lpLastUIActiveLine->m_fUIActive) break; // an object is in-place UI active
#endif
if ((HMENU)wParam == hMenuEdit && (LOWORD(lParam) == POS_EDITMENU) && OleDoc_GetUpdateEditMenuFlag((LPOLEDOC)lpOutlineDoc)) { OleApp_UpdateEditMenu(lpOleApp, lpOutlineDoc, hMenuEdit); } break; } #endif // OLE_VERSION
case WM_SIZE: if (wParam != SIZE_MINIMIZED) OutlineApp_ResizeWindows(lpOutlineApp); break;
case WM_ACTIVATEAPP: #if defined (OLE_CNTR)
if (g_fAppActive = (BOOL) wParam) OleApp_QueryNewPalette(lpOleApp); #endif
#if defined( INPLACE_CNTR )
{ BOOL fActivate = (BOOL)wParam; LPOLEINPLACEACTIVEOBJECT lpIPActiveObj = lpContainerApp->m_lpIPActiveObj;
/* OLE2NOTE: the in-place container MUST inform the
** inner most in-place active object (this is NOT ** necessarily our immediate child if there are ** nested levels of embedding) of the WM_ACTIVATEAPP ** status. */ if (lpIPActiveObj) { #if defined( _DEBUG )
OLEDBG_BEGIN2((fActivate ? "IOleInPlaceActiveObject::OnFrameWindowActivate(TRUE) called\r\n" : "IOleInPlaceActiveObject::OnFrameWindowActivate(FALSE) called\r\n")) #endif // _DEUBG
lpIPActiveObj->lpVtbl->OnFrameWindowActivate( lpIPActiveObj, fActivate); OLEDBG_END2 } }
#endif // INPLACE_CNTR
// OLE2NOTE: We can't call OutlineDoc_UpdateFrameToolButtons
// right away which
// would generate some OLE calls and eventually
// WM_ACTIVATEAPP and a loop was formed. Therefore, we
// should delay the frame tool initialization until
// WM_ACTIVATEAPP is finished by posting a message
// to ourselves.
// we want to ignore the WM_ACTIVATEAPP that comes
// as we bring up a modal dialog.
/* Update enable/disable state of buttons in toolbar */ if (wParam #if defined( OLE_VERSION )
&& lpOleApp->m_cModalDlgActive == 0 #endif
) { PostMessage(hWnd, WM_U_INITFRAMETOOLS, 0, 0L); } return 0L;
case WM_SETFOCUS: SetFocus(hWndDoc); break;
#if defined( OLE_CNTR )
case WM_QUERYNEWPALETTE: if (!g_fAppActive) return 0L;
return OleApp_QueryNewPalette(lpOleApp);
case WM_PALETTECHANGED: { HWND hWndPalChg = (HWND) wParam; static BOOL fInPaletteChanged = FALSE;
if (fInPaletteChanged) // Guard against recursion
return 0L;
fInPaletteChanged = TRUE;
if (hWnd != hWndPalChg) wSelectPalette(hWnd, lpOleApp->m_hStdPal,TRUE/*fBackground*/);
#if defined( INPLACE_CNTR )
/* OLE2NOTE: always forward the WM_PALETTECHANGED message (via
** SendMessage) to any in-place objects that currently have ** their window visible. this gives these objects the chance ** to select their palettes. this is ** REQUIRED by all in-place containers independent of ** whether they use color palettes themselves--their objects ** may use color palettes. ** (see ContainerDoc_ForwardPaletteChangedMsg for more info) */ if (lpOutlineDoc){ ContainerDoc_ForwardPaletteChangedMsg( (LPCONTAINERDOC)lpOutlineDoc, hWndPalChg); } #endif // INPLACE_CNTR
fInPaletteChanged = FALSE; return 0L; } #endif // OLE_CNTR
case WM_DESTROY: PostQuitMessage(0); break;
case WM_CLOSE: /* close the window */
/* Close all active documents. if successful, then exit */ OleDbgOutNoPrefix2("\r\n");
OutlineApp_CloseAllDocsAndExitCommand(lpOutlineApp, FALSE); break;
case WM_QUERYENDSESSION: { #if defined( OLE_CNTR )
/* OLE2NOTE: we are not able to make OLE LRPC calls when
** WM_QUERYENDSESSION is recieved (this is a ** SendMessage). this means, for example, that we are ** NOT able to ask objects to save. thus the most we can ** do is ask the user if he wants to exit with ** discarding changes or else abort shutting down. */
int nResponse = MessageBox( hWnd, "Discard changes?", APPNAME, MB_ICONQUESTION | MB_OKCANCEL ); if(nResponse == IDOK) return 1L; /* can terminate */
#endif
#if defined( OLE_SERVER )
/* OLE2NOTE: an embedded object should never prompt whether
** it should be saved (according the OLE 2.0 User ** Model). therefore, an embedded object will never ** complain that it needs to be saved. it will always ** allow the QueryEndSession to proceed. */ if (lpOutlineApp->m_lpDoc->m_docInitType == DOCTYPE_EMBEDDED) return 1L; /* can terminate */ else #endif
{ /* this is not an embedded object; it is a user
** document. we will prompt if the user wants to ** save the document now in WM_QUERYENDSESSION. if ** the user cancels then that would abort the ** shutdown. if the user does not abort, then later ** in WM_ENDSESSION the document will be actually ** closed. ** ** Because this is an SDI app, there is only one ** document. An MDI would need to loop through all ** open documents. */ DWORD dwSaveOption = OLECLOSE_PROMPTSAVE; if (OutlineDoc_CheckSaveChanges( lpOutlineApp->m_lpDoc, &dwSaveOption)) return 1L; /* can terminate */ }
/* else: can't terminate now */
break; }
#if defined( OLE_VERSION)
case WM_ENDSESSION: { BOOL fEndSession = (BOOL)wParam;
if (fEndSession) { OutlineApp_CloseAllDocsAndExitCommand(lpOutlineApp, TRUE); return 0L; } } break; #endif // OLE_VERSION
#if defined( USE_STATUSBAR )
case WM_MENUSELECT: { LPSTR lpszMessage; #ifdef WIN32
UINT fuFlags = (UINT)HIWORD(wParam); UINT uItem = (UINT)LOWORD(wParam); #else
UINT fuFlags = (UINT)LOWORD(lParam); UINT uItem = (UINT)wParam; #endif
if (uItem == 0 && fuFlags == (UINT)-1) { GetControlMessage(STATUS_READY, &lpszMessage); OutlineApp_SetStatusText(lpOutlineApp, lpszMessage); } else if (fuFlags & MF_POPUP) { #ifdef WIN32
HMENU hMainMenu = (HMENU)lParam; HMENU hPopupMenu = GetSubMenu(hMainMenu,uItem); #else
HMENU hPopupMenu = (HMENU)wParam; #endif
GetPopupMessage(hPopupMenu, &lpszMessage); OutlineApp_SetStatusText(lpOutlineApp, lpszMessage); } else if (fuFlags & MF_SYSMENU) { GetSysMenuMessage(uItem, &lpszMessage); OutlineApp_SetStatusText(lpOutlineApp, lpszMessage); } else if (uItem != 0) { // Command Item
GetItemMessage(uItem, &lpszMessage); OutlineApp_SetStatusText(lpOutlineApp, lpszMessage); } else { GetControlMessage(STATUS_BLANK, &lpszMessage); OutlineApp_SetStatusText(lpOutlineApp, lpszMessage); } break; } #endif // USE_STATUSBAR
#if defined( USE_FRAMETOOLS )
case WM_U_INITFRAMETOOLS: OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); break; #endif
default: /* For any message for which you don't specifically provide a */ /* service routine, you should return the message to Windows */ /* for default message processing. */
return DefWindowProc(hWnd, Message, wParam, lParam); }
return (LRESULT)0; } /* End of AppWndProc */
/************************************************************************/ /* */ /* Document Window Procedure */ /* */ /* The Document Window is the parent of the OwnerDraw Listbox which */ /* maintains the list of lines in the current document. This window */ /* receives the ownerdraw callback messages from the list box. */ /************************************************************************/
LRESULT FAR PASCAL DocWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp; LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)GetWindowLong(hWnd, 0); LPLINELIST lpLL = OutlineDoc_GetLineList(lpOutlineDoc); LPSCALEFACTOR lpscale = OutlineDoc_GetScaleFactor(lpOutlineDoc);
#if defined( OLE_VERSION )
LPOLEAPP lpOleApp = (LPOLEAPP)lpOutlineApp; LPOLEDOC lpOleDoc = (LPOLEDOC)lpOutlineDoc; #if defined( OLE_CNTR )
LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc; #endif
#if defined( OLE_SERVER )
LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc; #endif
#if defined( INPLACE_CNTR )
LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)lpOutlineApp; #endif
#endif // OLE_VERSION
switch(Message) {
#if defined( INPLACE_SVR )
/* OLE2NOTE: ISVROTL doesn't use color palettes. The inplace objects
** that use color palettes must implement the following ** lines of code. ** case WM_QUERYNEWPALETTE: return wSelectPalette(hWnd, hPal, FALSE); // foreground
case WM_PALETTECHANGED: if (hWnd != (HWND) wParam) wSelectPalette(hWnd, hPal, TRUE); // background
break; ** ** ** */ #endif
case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT lpmis = ((LPMEASUREITEMSTRUCT)lParam);
switch (wParam) { case IDC_LINELIST: { HDC hDC = LineList_GetDC(lpLL); UINT uHeight;
uHeight=Line_GetHeightInHimetric((LPLINE)lpmis->itemData); uHeight = XformHeightInHimetricToPixels(hDC, uHeight); uHeight = (UINT) (uHeight * lpscale->dwSyN / lpscale->dwSyD);
if (uHeight >LISTBOX_HEIGHT_LIMIT) uHeight = LISTBOX_HEIGHT_LIMIT;
lpmis->itemHeight = uHeight; LineList_ReleaseDC(lpLL, hDC); break; }
case IDC_NAMETABLE: { // NOTE: NameTable is never made visible. do nothing.
break; }
#if defined( USE_HEADING )
case IDC_ROWHEADING: { UINT uHeight;
uHeight = LOWORD(lpmis->itemData); uHeight = (UINT) (uHeight * lpscale->dwSyN / lpscale->dwSyD); if (uHeight >LISTBOX_HEIGHT_LIMIT) uHeight = LISTBOX_HEIGHT_LIMIT; lpmis->itemHeight = uHeight; break; }
case IDC_COLHEADING: { UINT uHeight;
uHeight = LOWORD(lpmis->itemData); uHeight = (UINT) (uHeight * lpscale->dwSyN / lpscale->dwSyD); if (uHeight > LISTBOX_HEIGHT_LIMIT) uHeight = LISTBOX_HEIGHT_LIMIT; lpmis->itemHeight = uHeight; break; } #endif // USE_HEADING
} return (LRESULT)TRUE; }
case WM_DRAWITEM: { LPDRAWITEMSTRUCT lpdis = ((LPDRAWITEMSTRUCT)lParam);
switch (lpdis->CtlID) {
case IDC_LINELIST: { RECT rcClient; RECT rcDevice; HWND hWndLL = LineList_GetWindow(lpLL); LPLINE lpLine = (LPLINE)lpdis->itemData;
// NOTE: When itemID == -1, the listbox is empty.
// We are supposed to draw focus rect only
// But it is not done in this app. If this line is
// removed, the app will crash in Line_DrawToScreen
// because of invalid lpLine.
if (lpdis->itemID == -1) break;
GetClientRect(hWndLL, &rcClient);
rcDevice = lpdis->rcItem;
// shift the item rect to account for horizontal scrolling
rcDevice.left += rcClient.right - lpdis->rcItem.right;
#if defined( OLE_CNTR )
/* we need to remember the horizontal scroll offset
** needed for the in-place object's window. ** (this is specific to ICNTROTL) */ if(lpdis->itemAction & ODA_DRAWENTIRE) { if (Line_GetLineType(lpLine) == CONTAINERLINETYPE) ((LPCONTAINERLINE)lpLine)->m_nHorizScrollShift = rcDevice.left; } #endif // OLE_CNTR
// shift rect for left margin
rcDevice.left += (int)(XformWidthInHimetricToPixels(NULL, LOWORD(OutlineDoc_GetMargin(lpOutlineDoc))) * lpscale->dwSxN / lpscale->dwSxD);
rcDevice.right = rcDevice.left + (int)(XformWidthInHimetricToPixels(lpdis->hDC, Line_GetWidthInHimetric(lpLine)) * lpscale->dwSxN / lpscale->dwSxD);
Line_DrawToScreen( lpLine, lpdis->hDC, &lpdis->rcItem, lpdis->itemAction, lpdis->itemState, &rcDevice );
#if defined( USE_FRAMETOOLS )
if (lpdis->itemState & ODS_FOCUS) OutlineDoc_SetFormulaBarEditText(lpOutlineDoc,lpLine); #endif
break; } case IDC_NAMETABLE: { // NOTE: NameTable is never made visible. do nothing
break; }
#if defined( USE_HEADING )
case IDC_ROWHEADING: { LPHEADING lphead;
// Last dummy item shouldn't be drawn
if (lpdis->itemID == (UINT)LineList_GetCount(lpLL)) break;
// only DrawEntire need be trapped as window is disabled
if (lpdis->itemAction == ODA_DRAWENTIRE) { lphead = OutlineDoc_GetHeading(lpOutlineDoc); Heading_RH_Draw(lphead, lpdis); } break; }
case IDC_COLHEADING: { RECT rect; RECT rcDevice; RECT rcLogical; LPHEADING lphead;
// only DrawEntire need be trapped as window is disabled
if (lpdis->itemAction == ODA_DRAWENTIRE) { lphead = OutlineDoc_GetHeading(lpOutlineDoc); GetClientRect(lpdis->hwndItem, &rect);
rcDevice = lpdis->rcItem;
// shift the item rect to account for
// horizontal scrolling
rcDevice.left = -(rcDevice.right - rect.right);
// shift rect for left margin
rcDevice.left += (int)(XformWidthInHimetricToPixels( NULL, LOWORD(OutlineDoc_GetMargin(lpOutlineDoc))) * lpscale->dwSxN / lpscale->dwSxD);
rcDevice.right = rcDevice.left + (int)lpscale->dwSxN; rcLogical.left = 0; rcLogical.bottom = 0; rcLogical.right = (int)lpscale->dwSxD; rcLogical.top = LOWORD(lpdis->itemData);
Heading_CH_Draw(lphead, lpdis, &rcDevice, &rcLogical); } break; } #endif // USE_HEADING
} return (LRESULT)TRUE; }
case WM_SETFOCUS: if (lpLL) SetFocus(LineList_GetWindow(lpLL)); break;
#if !defined( OLE_VERSION )
case WM_RENDERFORMAT: { LPOUTLINEDOC lpClipboardDoc = lpOutlineApp->m_lpClipboardDoc; if (lpClipboardDoc) OutlineDoc_RenderFormat(lpClipboardDoc, wParam);
break; } case WM_RENDERALLFORMATS: { LPOUTLINEDOC lpClipboardDoc = lpOutlineApp->m_lpClipboardDoc; if (lpClipboardDoc) OutlineDoc_RenderAllFormats(lpClipboardDoc);
break; } case WM_DESTROYCLIPBOARD: if (g_lpApp->m_lpClipboardDoc) { OutlineDoc_Destroy(g_lpApp->m_lpClipboardDoc); g_lpApp->m_lpClipboardDoc = NULL; } break;
#endif // OLE_VERSION
#if defined( OLE_CNTR )
case WM_U_UPDATEOBJECTEXTENT: { /* Update the extents of any OLE object that is marked that
** its size may have changed. when an ** IAdviseSink::OnViewChange notification is received, ** the corresponding ContainerLine is marked ** (m_fDoGetExtent==TRUE) and a message ** (WM_U_UPDATEOBJECTEXTENT) is posted to the document ** indicating that there are dirty objects. */ ContainerDoc_UpdateExtentOfAllOleObjects(lpContainerDoc); break; } #endif // OLE_CNTR
#if defined( INPLACE_SVR ) || defined( INPLACE_CNTR )
/* OLE2NOTE: Any window that is used during in-place activation
** must handle the WM_SETCURSOR message or else the cursor ** of the in-place parent will be used. if WM_SETCURSOR is ** not handled, then DefWindowProc sends the message to the ** window's parent. ** ** see context sensitive help technote (CSHELP.DOC). ** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. ** if this flag is set then the context sensitive help ** cursor should be shown. */ case WM_SETCURSOR: if (lpOleDoc->m_fCSHelpMode) SetCursor(UICursorLoad(IDC_CONTEXTHELP)); else SetCursor(LoadCursor(NULL, IDC_ARROW) ); return (LRESULT)TRUE; #endif // INPLACE_SVR || INPLACE_CNTR
#if defined( INPLACE_SVR )
/* OLE2NOTE: when the in-place active, our in-place server
** document window (passed to IOleInPlaceFrame::SetMenu) ** will receive the WM_INITMENU and WM_INITMENUPOPUP messages. */ case WM_INITMENU: OutlineApp_InitMenu(lpOutlineApp, lpOutlineDoc, (HMENU)wParam); break;
/* OLE2NOTE: WM_INITMENUPOPUP is trapped primarily for the Edit
** menu. We didn't update the Edit menu until it is popped ** up to avoid the overheads of the OLE calls which are ** required to initialize some Edit menu items. */ case WM_INITMENUPOPUP: { HMENU hMenuEdit = GetSubMenu(lpOutlineApp->m_hMenuApp, 1); if ((HMENU)wParam == hMenuEdit && (LOWORD(lParam) == POS_EDITMENU) && OleDoc_GetUpdateEditMenuFlag((LPOLEDOC)lpOutlineDoc)) { OleApp_UpdateEditMenu( (LPOLEAPP)lpOutlineApp, lpOutlineDoc, hMenuEdit); } break; } #endif // INPLACE_SVR
#if defined( INPLACE_SVR ) && defined( USE_STATUSBAR )
/* OLE2NOTE: when the server is in-place active the
** WM_MENUSELECT message is sent to the object's window and ** not the server app's frame window. processing this ** message allows there in-place server to give status bar ** help text for menu commands. */ case WM_MENUSELECT: { LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOleDoc; LPSTR lpszMessage; #ifdef WIN32
UINT fuFlags = (UINT)HIWORD(wParam); UINT uItem = (UINT)LOWORD(wParam); #else
UINT fuFlags = (UINT)LOWORD(lParam); UINT uItem = (UINT)wParam; #endif
if (uItem == 0 && fuFlags == (UINT)-1) { GetControlMessage(STATUS_READY, &lpszMessage); ServerDoc_SetStatusText(lpServerDoc, lpszMessage); } else if (fuFlags & MF_POPUP) { #ifdef WIN32
HMENU hMainMenu = (HMENU)lParam; HMENU hPopupMenu = GetSubMenu(hMainMenu,uItem); #else
HMENU hPopupMenu = (HMENU)wParam; #endif
GetPopupMessage(hPopupMenu, &lpszMessage); ServerDoc_SetStatusText(lpServerDoc, lpszMessage); } else if (uItem != 0) { // Command Item
GetItemMessage(uItem, &lpszMessage); ServerDoc_SetStatusText(lpServerDoc, lpszMessage); } else { GetControlMessage(STATUS_BLANK, &lpszMessage); ServerDoc_SetStatusText(lpServerDoc, lpszMessage); } break; } #endif // INPLACE_SVR && USE_STATUSBAR
#if defined( INPLACE_SVR ) && defined( USE_FRAMETOOLS )
case WM_U_INITFRAMETOOLS: OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); break; #endif // INPLACE_SVR && USE_FRAMETOOLS
case WM_COMMAND: { #ifdef WIN32
WORD wNotifyCode = HIWORD(wParam); WORD wID = LOWORD(wParam); HWND hwndCtl = (HWND) lParam; #else
WORD wNotifyCode = HIWORD(lParam); WORD wID = wParam; HWND hwndCtl = (HWND) LOWORD(lParam); #endif
#if defined( INPLACE_SVR )
/* OLE2NOTE: see context sensitive help technote (CSHELP.DOC)
** m_fMenuHelpMode flag is set when F1 is pressed when a ** menu item is selected. this flag is set in ** IOleInPlaceActiveObject::ContextSensitveHelp method. ** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. this flag is set in ** IOleInPlaceObject::ContextSensitiveHelp method. ** if either of these flags are set then the WM_COMMAND ** message is received then, the corresponding command ** should NOT executed; help can be given (if desired). ** also the context sensitve help mode should be exited. ** the two different cases have their own way to exit ** the mode (please refer to the technote). */ if (lpOleDoc && (lpServerDoc->m_fMenuHelpMode||lpOleDoc->m_fCSHelpMode) && (wID > IDM_FILE) /* min wID for app command */ && (wID!=IDM_FB_EDIT) /* special wID to control FormulaBar */ ) {
if ((lpServerDoc->m_fMenuHelpMode)) { LPOLEINPLACEFRAME lpFrame;
lpServerDoc->m_fMenuHelpMode = FALSE;
// inform top-level frame that we handled the
// menu help mode (F1) selection.
if (lpServerDoc->m_lpIPData && (lpFrame=lpServerDoc->m_lpIPData->lpFrame)!=NULL){ OLEDBG_BEGIN2("IOleInPlaceFrame::ContextSensitiveHelp(FALSE) called\r\n") lpFrame->lpVtbl->ContextSensitiveHelp(lpFrame, FALSE); OLEDBG_END2 } }
if ((lpOleDoc->m_fCSHelpMode)) { LPOLEINPLACESITE lpSite;
lpOleDoc->m_fCSHelpMode = FALSE;
/* inform immediate in-place container parent and,
** if we were a container/server, immediate ** in-place object children that we handled the ** context sensitive help mode. */ if (lpServerDoc->m_lpIPData && (lpSite=lpServerDoc->m_lpIPData->lpSite) !=NULL) { OLEDBG_BEGIN2("IOleInPlaceSite::ContextSensitiveHelp(FALSE) called\r\n") lpSite->lpVtbl->ContextSensitiveHelp(lpSite, FALSE); OLEDBG_END2 } }
// if we provided help, we would do it here...
// remove context sensitive help cursor
SetCursor(LoadCursor(NULL,IDC_ARROW)); return 0L; } #endif // INPLACE_SVR
#if defined( INPLACE_CNTR )
/* OLE2NOTE: see context sensitive help technote (CSHELP.DOC)
** m_fMenuHelpMode flag is set when F1 is pressed when a ** menu item is selected. this flag is set in ** IOleInPlaceFrame::ContextSensitveHelp method. ** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. this flag is set in ** IOleInPlaceSite::ContextSensitiveHelp method. ** if either of these flags are set then the WM_COMMAND ** message is received then, the corresponding command ** should NOT executed; help can be given (if desired). ** also the context sensitve help mode should be exited. ** the two different cases have their own way to exit ** the mode (please refer to the technote). */ if (lpOleDoc && (lpContainerApp->m_fMenuHelpMode||lpOleDoc->m_fCSHelpMode) && (wID > IDM_FILE) /* min wID for app command */ && (wID!=IDM_FB_EDIT) /* special wID to control FormulaBar */ ) {
if ((lpContainerApp->m_fMenuHelpMode)) { LPOLEINPLACEACTIVEOBJECT lpIPActiveObj = lpContainerApp->m_lpIPActiveObj;
lpContainerApp->m_fMenuHelpMode = FALSE;
// inform the in-place active object that we handled the
// menu help mode (F1) selection.
if (lpIPActiveObj) { OLEDBG_BEGIN2("IOleInPlaceActiveObject::ContextSensitiveHelp(FALSE) called\r\n") lpIPActiveObj->lpVtbl->ContextSensitiveHelp( lpIPActiveObj, FALSE); OLEDBG_END2 } }
if ((lpOleDoc->m_fCSHelpMode)) { LPOLEINPLACEOBJECT lpIPObj; LPCONTAINERLINE lpLastIpActiveLine = lpContainerDoc->m_lpLastIpActiveLine;
lpOleDoc->m_fCSHelpMode = FALSE;
/* inform immediate in-place container parent and,
** if we were a container/server, immediate ** in-place object children that we handled the ** context sensitive help mode. */ if (lpLastIpActiveLine && (lpIPObj=lpLastIpActiveLine->m_lpOleIPObj)!=NULL){ OLEDBG_BEGIN2("IOleInPlaceObject::ContextSensitiveHelp(FALSE) called\r\n") lpIPObj->lpVtbl->ContextSensitiveHelp(lpIPObj, FALSE); OLEDBG_END2 } }
// if we provided help, we would do it here...
// remove context sensitive help cursor
SetCursor(LoadCursor(NULL,IDC_ARROW)); return 0L; } #endif // INPLACE_CNTR
switch (wID) {
/*********************************************************
** File new, open, save and print as well as Help about ** are duplicated in this switch statement and they are ** used to trap the message from the toolbar ** *********************************************************/
case IDM_F_NEW: OleDbgIndent(-2); // Reset debug output indent level
OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_NewCommand\r\n") OutlineApp_NewCommand(lpOutlineApp); OLEDBG_END3
#if defined( OLE_CNTR )
/* OLE2NOTE: this call will attempt to recover
** resources by unloading DLL's that were loaded ** by OLE and are no longer being used. it is a ** good idea to call this API now and then if ** your app tends to run for a long time. ** otherwise these DLL's will be unloaded when ** the app exits. some apps may want to call ** this as part of idle-time processing. this ** call is optional. */ OLEDBG_BEGIN2("CoFreeUnusedLibraries called\r\n") CoFreeUnusedLibraries(); OLEDBG_END2 #endif
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons( OutlineApp_GetActiveDoc(lpOutlineApp)); #endif
break;
case IDM_F_OPEN: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_OpenCommand\r\n") OutlineApp_OpenCommand(lpOutlineApp); OLEDBG_END3
#if defined( OLE_CNTR )
/* OLE2NOTE: this call will attempt to recover
** resources by unloading DLL's that were loaded ** by OLE and are no longer being used. it is a ** good idea to call this API now and then if ** your app tends to run for a long time. ** otherwise these DLL's will be unloaded when ** the app exits. some apps may want to call ** this as part of idle-time processing. this ** call is optional. */ OLEDBG_BEGIN2("CoFreeUnusedLibraries called\r\n") CoFreeUnusedLibraries(); OLEDBG_END2 #endif
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons( OutlineApp_GetActiveDoc(lpOutlineApp)); #endif
break;
case IDM_F_SAVE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_SaveCommand\r\n") OutlineApp_SaveCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_F_PRINT: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineApp_PrintCommand\r\n") OutlineApp_PrintCommand(lpOutlineApp); OLEDBG_END3 break;
case IDM_E_UNDO: // SORRY. NOT IMPLEMENTED
break;
case IDM_E_CUT: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_CutCommand\r\n") OutlineDoc_CutCommand(lpOutlineDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
case IDM_E_COPY: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_CopyCommand\r\n") OutlineDoc_CopyCommand(lpOutlineDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
case IDM_E_PASTE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_PasteCommand\r\n") OutlineDoc_PasteCommand(lpOutlineDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
#if defined( OLE_VERSION )
case IDM_E_PASTESPECIAL: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OleDoc_PasteSpecialCommand\r\n") OleDoc_PasteSpecialCommand((LPOLEDOC)lpOutlineDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
#endif // OLE_VERSION
case IDM_E_CLEAR: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_ClearCommand\r\n") OutlineDoc_ClearCommand(lpOutlineDoc); OLEDBG_END3
#if defined( OLE_CNTR )
/* OLE2NOTE: this call will attempt to recover
** resources by unloading DLL's that were loaded ** by OLE and are no longer being used. it is a ** good idea to call this API now and then if ** your app tends to run for a long time. ** otherwise these DLL's will be unloaded when ** the app exits. some apps may want to call ** this as part of idle-time processing. this ** call is optional. */ OLEDBG_BEGIN2("CoFreeUnusedLibraries called\r\n") CoFreeUnusedLibraries(); OLEDBG_END2 #endif
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
case IDM_L_ADDLINE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_AddTextLineCommand\r\n") OutlineDoc_AddTextLineCommand(lpOutlineDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); SetFocus(LineList_GetWindow(lpLL)); #endif
break;
case IDM_L_EDITLINE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_EditLineCommand\r\n") OutlineDoc_EditLineCommand(lpOutlineDoc); OLEDBG_END3 SetFocus(LineList_GetWindow(lpLL)); break;
case IDM_L_INDENTLINE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_IndentCommand\r\n") OutlineDoc_IndentCommand(lpOutlineDoc); OLEDBG_END3 break;
case IDM_L_UNINDENTLINE: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_UnindentCommand\r\n") OutlineDoc_UnindentCommand(lpOutlineDoc); OLEDBG_END3 break;
case IDM_L_SETLINEHEIGHT: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_SetLineHeight\r\n") OutlineDoc_SetLineHeightCommand(lpOutlineDoc); OLEDBG_END3 break;
case IDM_E_SELECTALL: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_SelectAllCommand\r\n") OutlineDoc_SelectAllCommand(lpOutlineDoc); OLEDBG_END3 break;
#if defined( OLE_CNTR )
case IDM_E_INSERTOBJECT: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("ContainerDoc_InsertOleObjectCommand\r\n") ContainerDoc_InsertOleObjectCommand(lpContainerDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
case IDM_E_EDITLINKS: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("ContainerDoc_EditLinksCommand\r\n") ContainerDoc_EditLinksCommand(lpContainerDoc); OLEDBG_END3 break;
case IDM_E_CONVERTVERB: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("ContainerDoc_ConvertCommand\r\n") ContainerDoc_ConvertCommand( lpContainerDoc, FALSE /*fMustActivate*/); OLEDBG_END3 break;
case IDM_E_PASTELINK: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("ContainerDoc_PasteLinkCommand\r\n") ContainerDoc_PasteLinkCommand(lpContainerDoc); OLEDBG_END3
#if defined( USE_FRAMETOOLS )
OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); #endif
break;
#endif // OLE_CNTR
case IDM_N_DEFINENAME: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_DefineNameCommand\r\n") OutlineDoc_DefineNameCommand(lpOutlineDoc); OLEDBG_END3 break;
case IDM_N_GOTONAME: OleDbgOutNoPrefix2("\r\n");
OLEDBG_BEGIN3("OutlineDoc_GotoNameCommand\r\n") OutlineDoc_GotoNameCommand(lpOutlineDoc); OLEDBG_END3 break;
#if defined( USE_FRAMETOOLS )
case IDM_O_BB_TOP: FrameTools_BB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_TOP); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_BB_BOTTOM: FrameTools_BB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_BOTTOM); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_BB_POPUP: FrameTools_BB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_POPUP); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_BB_HIDE: FrameTools_BB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_HIDE); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_FB_TOP: FrameTools_FB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_TOP); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_FB_BOTTOM: FrameTools_FB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_BOTTOM); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_O_FB_POPUP: FrameTools_FB_SetState( lpOutlineDoc->m_lpFrameTools, BARSTATE_POPUP); OutlineDoc_AddFrameLevelTools(lpOutlineDoc); break;
case IDM_FB_EDIT:
switch (wNotifyCode) { case EN_SETFOCUS: OutlineDoc_SetFormulaBarEditFocus( lpOutlineDoc, TRUE); OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); break;
case EN_KILLFOCUS: OutlineDoc_SetFormulaBarEditFocus( lpOutlineDoc, FALSE); OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc); break; } break;
case IDM_FB_CANCEL:
SetFocus(hWnd); break;
case IDM_F2: SendMessage(hWnd, WM_COMMAND, (WPARAM)IDM_FB_EDIT, MAKELONG(0, EN_SETFOCUS)); break; #endif // USE_FRAMETOOLS
case IDM_ESCAPE: /* ESCAPE key pressed */
#if defined( USE_FRAMETOOLS )
if (OutlineDoc_IsEditFocusInFormulaBar(lpOutlineDoc)) SendMessage( hWnd, WM_COMMAND,(WPARAM)IDM_FB_CANCEL,(LPARAM)0); #endif // USE_FRAMETOOLS
#if defined( INPLACE_SVR )
else { LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc;
/* OLE2NOTE: The standard OLE 2.0 UI convention
** is to have ESCAPE key exit in-place ** activation (ie. UIDeactivate). If ** possible it is recommended for both ** in-place servers AND in-place containers ** to take responsibility to handle the ** ESCAPE key accelerator. The server has ** the first crack at handling accelerator ** keys and normally the server should do ** the UIDeactivation. */ if (lpServerDoc->m_fUIActive) { SvrDoc_IPObj_UIDeactivate( (LPOLEINPLACEOBJECT)& lpServerDoc->m_OleInPlaceObject); } } #endif // INPLACE_SVR
break;
#if defined( USE_HEADING )
case IDC_BUTTON: if (wNotifyCode == BN_CLICKED) { SendMessage(hWnd, WM_COMMAND, IDM_E_SELECTALL, 0L); SetFocus(hWnd); } break;
case IDM_O_HEAD_SHOW: OutlineDoc_ShowHeading(lpOutlineDoc, TRUE); break;
case IDM_O_HEAD_HIDE: OutlineDoc_ShowHeading(lpOutlineDoc, FALSE); break; #endif // USE_HEADING
#if defined( OLE_CNTR )
case IDM_O_SHOWOBJECT: { LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc; BOOL fShowObject;
fShowObject = !ContainerDoc_GetShowObjectFlag( lpContainerDoc); ContainerDoc_SetShowObjectFlag( lpContainerDoc, fShowObject); LineList_ForceRedraw(lpLL, TRUE);
break; } #endif // OLE_CNTR
#if !defined( OLE_CNTR )
// Container does not allow zoom factors > 100%
case IDM_V_ZOOM_400: case IDM_V_ZOOM_300: case IDM_V_ZOOM_200: #endif // !OLE_CNTR
case IDM_V_ZOOM_100: case IDM_V_ZOOM_75: case IDM_V_ZOOM_50: case IDM_V_ZOOM_25: OutlineDoc_SetCurrentZoomCommand(lpOutlineDoc, wID); break;
case IDM_V_SETMARGIN_0: case IDM_V_SETMARGIN_1: case IDM_V_SETMARGIN_2: case IDM_V_SETMARGIN_3: case IDM_V_SETMARGIN_4: OutlineDoc_SetCurrentMarginCommand(lpOutlineDoc, wID); break;
case IDM_V_ADDTOP_1: case IDM_V_ADDTOP_2: case IDM_V_ADDTOP_3: case IDM_V_ADDTOP_4: { UINT nHeightInHimetric;
switch (wID) { case IDM_V_ADDTOP_1: nHeightInHimetric = 1000; break;
case IDM_V_ADDTOP_2: nHeightInHimetric = 2000; break;
case IDM_V_ADDTOP_3: nHeightInHimetric = 3000; break;
case IDM_V_ADDTOP_4: nHeightInHimetric = 4000; break; }
OutlineDoc_AddTopLineCommand( lpOutlineDoc, nHeightInHimetric); break; }
case IDM_H_ABOUT: OutlineApp_AboutCommand(lpOutlineApp); break;
case IDM_D_DEBUGLEVEL: SetDebugLevelCommand(); break;
#if defined( OLE_VERSION )
case IDM_D_INSTALLMSGFILTER: InstallMessageFilterCommand(); break;
case IDM_D_REJECTINCOMING: RejectIncomingCommand(); break; #endif // OLE_VERSION
#if defined( INPLACE_CNTR )
case IDM_D_INSIDEOUT: g_fInsideOutContainer = !g_fInsideOutContainer;
// force all object to unload so they can start new
// activation behavior.
ContainerDoc_UnloadAllOleObjectsOfClass( (LPCONTAINERDOC)lpOutlineDoc, &CLSID_NULL, OLECLOSE_SAVEIFDIRTY ); OutlineDoc_ForceRedraw(lpOutlineDoc, TRUE); break; #endif // INPLACE_CNTR
#if defined( OLE_CNTR )
case IDC_LINELIST: {
if (wNotifyCode == LBN_DBLCLK) {
/* OLE2NOTE: a container should execute the
** OLEIVERB_PRIMARY verb on an OLE object ** when the user DBLCLK's the object. */ int nIndex = LineList_GetFocusLineIndex(lpLL); LPLINE lpLine = LineList_GetLine(lpLL, nIndex);
if (lpLine && Line_GetLineType(lpLine)==CONTAINERLINETYPE) { MSG msg;
_fmemset((LPMSG)&msg,0,sizeof(msg)); msg.hwnd = hWnd; msg.message = Message; msg.wParam = wParam; msg.lParam = lParam;
ContainerLine_DoVerb( (LPCONTAINERLINE)lpLine, OLEIVERB_PRIMARY, (LPMSG)&msg, TRUE, TRUE ); }
#if defined( INPLACE_CNTR )
{ // BEGIN BLOCK
LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC) lpOutlineDoc; if (lpContainerDoc->m_fAddMyUI) { /* OLE2NOTE: fAddMyUI is TRUE when
** there was previously an in-place ** active object which got ** UIDeactivated as a result of this ** DBLCLK AND the DBLCLK did NOT ** result in in-place activating ** another object. ** (see IOleInPlaceSite::OnUIActivate and ** IOleInPlaceSite::OnUIDeactivate ** methods). */
/* OLE2NOTE: You need to generate
** QueryNewPalette only if you own ** the top level frame (ie. you are ** a top-level inplace container). */
OleApp_QueryNewPalette((LPOLEAPP)g_lpApp);
#if defined( USE_DOCTOOLS )
ContainerDoc_AddDocLevelTools(lpContainerDoc); #endif
#if defined( USE_FRAMETOOLS )
ContainerDoc_AddFrameLevelUI(lpContainerDoc); #endif
lpContainerDoc->m_fAddMyUI = FALSE; } } // END BLOCK
#endif // INPLACE_CNTR
} break; } #endif // OLE_CNTR
default:
#if defined( OLE_CNTR )
if (wID >= IDM_E_OBJECTVERBMIN) {
OleDbgOutNoPrefix2("\r\n"); OLEDBG_BEGIN3("ContainerDoc_ContainerLineDoVerbCommand\r\n") ContainerDoc_ContainerLineDoVerbCommand( (LPCONTAINERDOC)lpOutlineDoc, (LONG)(wID-IDM_E_OBJECTVERBMIN) ); OLEDBG_END3 break; } #endif // OLE_CNTR
return DefWindowProc(hWnd, Message, wParam, lParam); }
break; /* End of WM_COMMAND */ } default:
if (Message == g_uMsgHelp) { /* Handle OLE2UI dialog's help messages.
** We get the hDlg of the dialog that called us in the wParam ** and the dialog type in the LOWORD of the lParam, ** so we pass this along to our help function. */ OutlineDoc_DialogHelp((HWND)wParam, LOWORD(lParam)); break; }
/* For any message for which you don't specifically provide a */ /* service routine, you should return the message to Windows */ /* for default message processing. */ return DefWindowProc(hWnd, Message, wParam, lParam); }
return (LRESULT)0;
} /* End of DocWndProc */
//***********************************************************************
//*
//* LineListWndProc() Drag and Drop Listbox Window Proc Sub-Class
//*
//* Sub Class the Ownerdraw list box in order to activate the drag drop.
//***********************************************************************
LRESULT FAR PASCAL LineListWndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam ) { HWND hwndParent = GetParent ( hWnd ); LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp; LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC) GetWindowLong( hwndParent, 0 ); LPLINELIST lpLL = OutlineDoc_GetLineList(lpOutlineDoc);
#if defined( OLE_VERSION )
LPOLEAPP lpOleApp = (LPOLEAPP)lpOutlineApp; LPOLEDOC lpOleDoc = (LPOLEDOC)lpOutlineDoc; #endif // OLE_VERSION
#if defined( INPLACE_SVR )
LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc; static BOOL fUIActivateClick = FALSE; static BOOL fInWinPosChged = FALSE; #endif // INPLACE_SVR
#if defined( INPLACE_CNTR )
LPCONTAINERAPP lpContainerApp=(LPCONTAINERAPP)lpOutlineApp; LPCONTAINERDOC lpContainerDoc=(LPCONTAINERDOC)lpOutlineDoc; #endif // INPLACE_CNTR
switch (Message) {
case WM_KILLFOCUS: /* OLE2NOTE: when our window looses focus we
** should not display any active selection */ #if defined( INPLACE_CNTR )
if (! lpContainerApp->m_fPendingUIDeactivate) #endif // INPLACE_CNTR
LineList_RemoveSel(lpLL); break;
case WM_SETFOCUS:
#if defined( INPLACE_CNTR )
{ HWND hWndObj=ContainerDoc_GetUIActiveWindow(lpContainerDoc);
/* OLE2NOTE: if there is a UIActive in-place object, we must
** forward focus to its window as long as there is ** not a pending UIDeactivate. if the mouse is ** clicked outside of the object and the object is ** about to be deactivated then we do NOT want to ** forward focus to the object. we do NOT want it to ** restore its selection feedback. */ if (lpContainerApp->m_fPendingUIDeactivate) break; else if (hWndObj) { SetFocus(hWndObj); break; // do not restore containers selection state
} } #endif // INPLACE_CNTR
/* OLE2NOTE: when our window gains focus we
** should restore the previous selection */ LineList_RestoreSel(lpLL);
break;
#if defined( INPLACE_SVR )
case WM_MOUSEACTIVATE: { if (lpServerDoc->m_fInPlaceActive && !lpServerDoc->m_fUIActive) { fUIActivateClick = TRUE; }; break; }
#endif // INPLACE_SVR
#if defined( USE_FRAMETOOLS )
case WM_CHAR: { OutlineDoc_SetFormulaBarEditFocus(lpOutlineDoc, TRUE); FrameTools_FB_SetEditText(lpOutlineDoc->m_lpFrameTools, NULL); FrameTools_FB_SendMessage( lpOutlineDoc->m_lpFrameTools, IDM_FB_EDIT, Message, wParam, lParam );
return (LRESULT)0; // don't do default listbox processing
} #endif // USE_FRAMETOOLS
#if defined( INPLACE_CNTR )
case WM_VSCROLL: { if (wParam == SB_ENDSCROLL) { /* OLE2NOTE: after scrolling finishes, update position of
** in-place visible windows. ** (ICNTROTL specific) we first let the ListBox ** perform it normal processing with the EndScroll ** message. also we let the ListBox handle all other ** scroll messages. */ LRESULT lResult = CallWindowProc( (WNDPROC)lpOutlineApp->m_ListBoxWndProc, hWnd, Message, wParam, lParam ); ContainerDoc_UpdateInPlaceObjectRects(lpContainerDoc, 0); return lResult; }
break; } #endif // INPLACR_CNTR
#if defined( USE_HEADING )
case WM_HSCROLL: { LPHEADING lphead = OutlineDoc_GetHeading(lpOutlineDoc);
Heading_CH_SendMessage(lphead, Message, wParam, lParam);
break; }
/* NOTE: WM_PAINT trapped in order to track vertical scrolling
** that has taken place so the row headings can be ** coordinated with the LineList. we wanted to trap instead ** but it is not generated from scrolling without using ** scroll bar (e.g. use keyboard). */ case WM_PAINT: { Heading_RH_Scroll(OutlineDoc_GetHeading(lpOutlineDoc), hWnd); break; }
#endif // USE_HEADING
case WM_LBUTTONUP: {
#if defined( USE_DRAGDROP )
if (lpOleDoc->m_fPendingDrag) { /* ButtonUP came BEFORE distance/time threshholds were
** exceeded. clear fPendingDrag state. */ ReleaseCapture(); KillTimer(hWnd, 1); lpOleDoc->m_fPendingDrag = FALSE; } #endif // USE_DRAGDROP
#if defined( INPLACE_SVR )
if (fUIActivateClick) { fUIActivateClick = FALSE; ServerDoc_UIActivate((LPSERVERDOC) lpOleDoc); } #endif // INPLACE_SVR
#if defined( INPLACE_CNTR )
{ /* check if a UIDeactivate is pending.
** (see comment in WM_LBUTTONDOWN) */ if ( lpContainerApp->m_fPendingUIDeactivate ) { ContainerLine_UIDeactivate( lpContainerDoc->m_lpLastUIActiveLine);
lpContainerApp->m_fPendingUIDeactivate = FALSE; } } #endif // INPLACE_CNTR
break; }
case WM_LBUTTONDOWN: { POINT pt;
pt.x = (int)(short)LOWORD (lParam ); pt.y = (int)(short)HIWORD (lParam );
#if defined( INPLACE_SVR ) || defined( INPLACE_CNTR )
/* OLE2NOTE: see context sensitive help technote (CSHELP.DOC)
** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. ** if this flag is set then the button click should not ** cause any action. if the application implements a ** help system, then context sensitive help should be ** given for the location clicked by the user. */ if (lpOleDoc->m_fCSHelpMode) { return (LRESULT)0; // eat the button click because we do
// not give any help.
} #endif // INPLACE_SVR || INPLACE_CNTR
#if defined( INPLACE_CNTR )
{ /* OLE2NOTE: both inside-out and outside-in style
** containers must check if the mouse click is ** outside of the current UIActive object (if ** any). If so, then set the flag indicating that ** there is a pending UIDeactivate needed. We do NOT ** want to do it now, ** because that would result in un-wanted movement of ** the data on the screen as frame adornments (eg. ** toolbar) and/or object adornments (eg. ruler) would ** be removed from the screen. we want to defer the ** UIDeactivate till the mouse up event. The listbox's ** default processing captures the mouse on button down ** so that it is sure to get the button up message. ** ** SPECIAL NOTE: there is potential interaction here ** with Drag/Drop. if this button down event actually ** starts a Drag/Drop operation, then OLE does the mouse ** capture. in this situation we will NOT get our button ** up event. we must instead perform the UIDeactivate ** when the drop operation finishes */ lpContainerApp->m_fPendingUIDeactivate = ContainerDoc_IsUIDeactivateNeeded(lpContainerDoc, pt); } #endif // INPLACE_CNTR
#if defined( USE_DRAGDROP )
/* OLE2NOTE: check if this is a button down on the region
** that is a handle to start a drag operation. for us, ** this this the top/bottom border of the selection. ** do NOT want to start a drag immediately; we want to ** wait until the mouse moves a certain threshold. if ** LButtonUp comes before mouse move to start drag, then ** the fPendingDrag state is cleared. we must capture ** the mouse to ensure the modal state is handled ** properly. */ if ( OleDoc_QueryDrag(lpOleDoc, pt.y) ) { lpOleDoc->m_fPendingDrag = TRUE; lpOleDoc->m_ptButDown = pt; SetTimer(hWnd, 1, lpOleApp->m_nDragDelay, NULL); SetCapture(hWnd);
/* We do NOT want to do the listbox's default
** processing which would be to capture the mouse ** and enter a modal multiple selection state until ** a mouse up occurs. we have just finished a modal ** drag/drop operation where OLE has captured the ** mouse. thus by now the mouse up has already occured. */
return (LRESULT)0; // don't do default listbox processing
} #endif // USE_DRAGDROP
break; }
case WM_MOUSEMOVE: {
#if defined( USE_DRAGDROP )
int x = (int)(short)LOWORD (lParam ); int y = (int)(short)HIWORD (lParam ); POINT pt = lpOleDoc->m_ptButDown; int nDragMinDist = lpOleApp->m_nDragMinDist;
if (lpOleDoc->m_fPendingDrag) {
if (! ( ((pt.x - nDragMinDist) <= x) && (x <= (pt.x + nDragMinDist)) && ((pt.y - nDragMinDist) <= y) && (y <= (pt.y + nDragMinDist)) ) ) {
DWORD dwEffect;
// mouse moved beyond threshhold to start drag
ReleaseCapture(); KillTimer(hWnd, 1); lpOleDoc->m_fPendingDrag = FALSE;
// perform the modal drag/drop operation.
dwEffect = OleDoc_DoDragDrop( lpOleDoc );
#if defined( INPLACE_CNTR )
{ /* if necessary UIDeactive the in-place object.
** this applies to outside-in style ** container only. ** (see comment above) */ if (lpContainerApp->m_fPendingUIDeactivate) { lpContainerApp->m_fPendingUIDeactivate = FALSE;
// do not UIDeactivate if drag/drop was canceled
if (dwEffect != DROPEFFECT_NONE) ContainerLine_UIDeactivate( lpContainerDoc->m_lpLastUIActiveLine ); } } #endif // INPLACE_CNTR
return (LRESULT)0; // don't do default listbox process
} else { /* cursor did not move from initial mouse down
** (pending drag) point. */ return (LRESULT)0; // don't do default listbox process
} }
#endif // USE_DRAGDROP
#if defined( INPLACE_CNTR )
{ // BEGIN BLOCK
if (lpContainerDoc->m_fAddMyUI) { /* OLE2NOTE: fAddMyUI is TRUE when
** there was previously an in-place ** active object which got ** UIDeactivated as a result of a ** DBLCLK AND the DBLCLK did NOT ** result in in-place activating ** another object. ** (see IOleInPlaceSite::OnUIActivate and ** IOleInPlaceSite::OnUIDeactivate ** methods). */ #if defined( USE_DOCTOOLS )
ContainerDoc_AddDocLevelTools(lpContainerDoc); #endif
#if defined( USE_FRAMETOOLS )
ContainerDoc_AddFrameLevelUI(lpContainerDoc); #endif
lpContainerDoc->m_fAddMyUI = FALSE; } } // END BLOCK
#endif // INPLACE_CNTR
break; }
#if defined( USE_DRAGDROP )
case WM_TIMER: { DWORD dwEffect;
// drag time delay threshhold exceeded -- start drag
ReleaseCapture(); KillTimer(hWnd, 1); lpOleDoc->m_fPendingDrag = FALSE;
// perform the modal drag/drop operation.
dwEffect = OleDoc_DoDragDrop( lpOleDoc );
#if defined( INPLACE_CNTR )
/* if necessary UIDeactive the in-place object.
** this applies to outside-in style ** container only. ** (see comment above) */ if (lpContainerApp->m_fPendingUIDeactivate) { lpContainerApp->m_fPendingUIDeactivate = FALSE;
// do not UIDeactivate if drag/drop was canceled
if (dwEffect != DROPEFFECT_NONE) ContainerLine_UIDeactivate( lpContainerDoc->m_lpLastUIActiveLine); } #endif // INPLACE_CNTR
break; } #endif // USE_DRAGDROP
case WM_SETCURSOR: { RECT rc; POINT ptCursor; #if defined( INPLACE_SVR ) || defined( INPLACE_CNTR )
/* OLE2NOTE: see context sensitive help technote (CSHELP.DOC)
** m_fCSHelpMode flag is set when SHIFT-F1 context ** sensitive help is entered. ** if this flag is set then the context sensitive help ** cursor should be shown. */ if (lpOleDoc->m_fCSHelpMode) { SetCursor(UICursorLoad(IDC_CONTEXTHELP)); return (LRESULT)TRUE; } #endif // INPLACE_SVR || INPLACE_CNTR
GetCursorPos((POINT FAR*)&ptCursor); ScreenToClient(hWnd, (POINT FAR*)&ptCursor); GetClientRect(hWnd, (LPRECT)&rc);
// use arrow cursor if in scroll bar
if (! PtInRect((LPRECT)&rc, ptCursor) ) SetCursor(LoadCursor(NULL, IDC_ARROW) );
#if defined( USE_DRAGDROP )
// use arrow cursor if on drag handle (top/bottom of selection)
else if ( OleDoc_QueryDrag ( lpOleDoc, ptCursor.y) ) SetCursor(LoadCursor(NULL, IDC_ARROW) ); #endif // USE_DRAGDROP
else SetCursor(lpOutlineApp->m_hcursorSelCur);
return (LRESULT)TRUE; }
#if defined( INPLACE_SVR )
/* The handling of WM_WINDOWPOSCHANGED message is ISVROTL
** application specific. The nature of the owner-draw list ** box used by the ISVROTL application causes a recursive ** call to this message in some situations when in-place ** active. in order not to crash this recursive call must be ** guarded. */ case WM_WINDOWPOSCHANGED: { WINDOWPOS FAR* lpWinPos = (WINDOWPOS FAR*) lParam; LRESULT lResult;
// guard against recursive call
if (fInWinPosChged) return (LRESULT)0;
fInWinPosChged = TRUE; lResult = CallWindowProc( (WNDPROC)lpOutlineApp->m_ListBoxWndProc, hWnd, Message, wParam, lParam ); fInWinPosChged = FALSE;
return lResult; } #endif // INPLACE_SVR
}
return CallWindowProc( (WNDPROC)lpOutlineApp->m_ListBoxWndProc, hWnd, Message, wParam, lParam );
}
// Utility function to count the number of accelerator items in an
// accelerator table. A number of OLE APIs need this count, so
// this can be quite handy.
// (code shamelessly stolen from the Microsoft Foundation Classes)
int GetAccelItemCount(HACCEL hAccel) { #if defined( WIN32 )
return CopyAcceleratorTable(hAccel, NULL, 0); #else
#pragma pack(1)
typedef struct tagACCELERATOR { BYTE fFlags; WORD wEvent; WORD wID; } ACCELERATOR; #pragma pack()
// attempt to lock down the accelerator resource
ACCELERATOR FAR* pAccel; int cAccelItems = 1; if (hAccel == NULL || (pAccel = (ACCELERATOR FAR*)LockResource((HGLOBAL)hAccel)) == NULL) { // NULL accerator table or LockResource failed on the HACCEL,
// no accelerators
return 0; } // otherwise, count them -- last entry in accel table has 0x80 bit set
while ((pAccel->fFlags & 0x80) == 0) { ++cAccelItems; ++pAccel; } UnlockResource((HGLOBAL)hAccel); return cAccelItems; #endif
}
|