/*************************************************************************
**
** OLE 2 Sample Code
**
** outlapp.c
**
** This file contains OutlineApp functions.
**
** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
**
*************************************************************************/
#include "outline.h"
#if defined( USE_STATUSBAR )
#include "status.h"
#endif
#if !defined( WIN32 )
#include <print.h>
#endif
OLEDBGDATA
extern LPOUTLINEAPP g_lpApp;
extern RECT g_rectNull;
// REVIEW: should use string resource for messages
char ErrMsgClass[] = "Can't register window classes!";
char ErrMsgFrame[] = "Can't create Frame Window!";
char ErrMsgPrinting[] = "Can't access printer!";
/* OutlineApp_InitApplication
** --------------------------
** Sets up the class data structures and does a one-time
** initialization of the app by registering the window classes.
** Returns TRUE if initialization is successful
** FALSE otherwise
*/
BOOL OutlineApp_InitApplication(LPOUTLINEAPP lpOutlineApp, HINSTANCE hInst)
{
WNDCLASS wndclass;
// REVIEW: should load msg strings from string resource
/* Register the app frame class */
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW;
wndclass.lpfnWndProc = AppWndProc;
/* Extra storage for Class and Window objects */
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = sizeof(LPOUTLINEAPP); /* to store lpApp */
wndclass.hInstance = hInst;
wndclass.hIcon = LoadIcon(hInst, APPICON);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
/* Create brush for erasing background */
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclass.lpszMenuName = APPMENU; /* Menu Name is App Name */
wndclass.lpszClassName = APPWNDCLASS; /* Class Name is App Name */
if(! RegisterClass(&wndclass)) {
OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgFrame);
return FALSE;
}
/* Register the document window class */
wndclass.style = CS_BYTEALIGNWINDOW;
wndclass.lpfnWndProc = DocWndProc;
wndclass.hIcon = NULL;
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = DOCWNDCLASS;
wndclass.cbWndExtra = sizeof(LPOUTLINEDOC); /* to store lpDoc */
if(! RegisterClass(&wndclass)) {
OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgClass);
return FALSE;
}
#if defined( USE_STATUSBAR )
if (! RegisterStatusClass(hInst))
return FALSE;
#endif
#if defined( USE_FRAMETOOLS )
if (! FrameToolsRegisterClass(hInst)) {
return FALSE;
}
#endif
#if defined( INPLACE_SVR )
// We should only register the hatch window class
// in the UI Library once per application.
RegisterHatchWindowClass(hInst);
#endif
return TRUE;
}
/* OutlineApp_InitInstance
* -----------------------
*
* Performs a per-instance initialization of app.
* This method creates the frame window.
*
* RETURNS : TRUE - If initialization was successful.
* FALSE - otherwise.
*/
BOOL OutlineApp_InitInstance(LPOUTLINEAPP lpOutlineApp, HINSTANCE hInst, int nCmdShow)
{
lpOutlineApp->m_hInst = hInst;
/* create application's Frame window */
lpOutlineApp->m_hWndApp = CreateWindow(
APPWNDCLASS, /* Window class name */
APPNAME, /* initial Window title */
WS_OVERLAPPEDWINDOW|
WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, /* Use default X, Y */
CW_USEDEFAULT, 0, /* Use default X, Y */
HWND_DESKTOP, /* Parent window's handle */
NULL, /* Default to Class Menu */
hInst, /* Instance of window */
NULL /* Create struct for WM_CREATE */
);
if(! lpOutlineApp->m_hWndApp) {
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgFrame);
return FALSE;
}
SetWindowLong(lpOutlineApp->m_hWndApp, 0, (LONG) lpOutlineApp);
/* defer creating the user's SDI document until we parse the cmd line. */
lpOutlineApp->m_lpDoc = NULL;
/* Initialize clipboard.
*/
lpOutlineApp->m_lpClipboardDoc = NULL;
if(!(lpOutlineApp->m_cfOutline = RegisterClipboardFormat(OUTLINEDOCFORMAT))) {
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, "Can't register clipboard format!");
return FALSE;
}
/* init the standard font to be used for drawing/printing text
* request a Roman style True Type font of the desired size
*/
lpOutlineApp->m_hStdFont = CreateFont(
-DEFFONTSIZE,
0,0,0,0,0,0,0,0,
OUT_TT_PRECIS, // use TrueType
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
VARIABLE_PITCH | FF_ROMAN,
DEFFONTFACE
);
// Load special cursor for selection of Lines in ListBox.
lpOutlineApp->m_hcursorSelCur = LoadCursor ( hInst, "SelCur" );
/* init the Print Dialog structure */
_fmemset((LPVOID)&lpOutlineApp->m_PrintDlg,0,sizeof(PRINTDLG));
lpOutlineApp->m_PrintDlg.lStructSize = sizeof(PRINTDLG);
lpOutlineApp->m_PrintDlg.hDevMode = NULL;
lpOutlineApp->m_PrintDlg.hDevNames = NULL;
lpOutlineApp->m_PrintDlg.Flags = PD_RETURNDC | PD_NOSELECTION | PD_NOPAGENUMS |
PD_HIDEPRINTTOFILE;
lpOutlineApp->m_PrintDlg.nCopies = 1;
lpOutlineApp->m_PrintDlg.hwndOwner = lpOutlineApp->m_hWndApp;
#if defined( USE_STATUSBAR )
lpOutlineApp->m_hWndStatusBar = CreateStatusWindow(lpOutlineApp->m_hWndApp, hInst);
if (! lpOutlineApp->m_hWndStatusBar)
return FALSE;
lpOutlineApp->m_hMenuApp = GetMenu(lpOutlineApp->m_hWndApp);
/* setup status messages for the application menus */
{
HMENU hMenuFile = GetSubMenu(lpOutlineApp->m_hMenuApp, 0);
HMENU hMenuEdit = GetSubMenu(lpOutlineApp->m_hMenuApp, 1);
HMENU hMenuOutline = GetSubMenu(lpOutlineApp->m_hMenuApp, 2);
HMENU hMenuLine = GetSubMenu(lpOutlineApp->m_hMenuApp, 3);
HMENU hMenuName = GetSubMenu(lpOutlineApp->m_hMenuApp, 4);
HMENU hMenuOptions = GetSubMenu(lpOutlineApp->m_hMenuApp, 5);
HMENU hMenuDebug = GetSubMenu(lpOutlineApp->m_hMenuApp, 6);
HMENU hMenuHelp = GetSubMenu(lpOutlineApp->m_hMenuApp, 7);
HMENU hMenuSys = GetSystemMenu(lpOutlineApp->m_hWndApp, FALSE);
AssignPopupMessage(hMenuFile, "Create, open, save, print outlines or quit application");
AssignPopupMessage(hMenuEdit, "Cut, copy, paste or clear selection");
AssignPopupMessage(hMenuOutline, "Set zoom and margins");
AssignPopupMessage(hMenuLine, "Create, edit, and indent lines");
AssignPopupMessage(hMenuName, "Create, edit, delete and goto names");
AssignPopupMessage(hMenuOptions, "Modify tools, row/col headings, display options");
AssignPopupMessage(hMenuDebug, "Set debug trace level and other debug options");
AssignPopupMessage(hMenuHelp, "Get help on using the application");
AssignPopupMessage(hMenuSys,"Move, size or close application window");
}
#endif
#if defined ( USE_FRAMETOOLS ) || defined ( INPLACE_CNTR )
lpOutlineApp->m_FrameToolWidths = g_rectNull;
#endif // USE_FRAMETOOLS || INPLACE_CNTR
#if defined( USE_FRAMETOOLS )
if (! FrameTools_Init(&lpOutlineApp->m_frametools,
lpOutlineApp->m_hWndApp, lpOutlineApp->m_hInst))
return FALSE;
#endif
#if defined( OLE_VERSION )
/* OLE2NOTE: perform initialization required for OLE */
if (! OleApp_InitInstance((LPOLEAPP)lpOutlineApp, hInst, nCmdShow))
return FALSE;
#else
/* OLE2NOTE: Although no OLE call is made in the base outline,
** OLE memory allocator is used and thus CoInitialize() needs to
** be called.
*/
{
HRESULT hrErr;
hrErr = CoInitialize(NULL);
if (hrErr != NOERROR) {
OutlineApp_ErrorMessage(lpOutlineApp,
"CoInitialize initialization failed!");
return FALSE;
}
}
#endif
return TRUE;
}
/* OutlineApp_ParseCmdLine
* -----------------------
*
* Parse the command line for any execution flags/arguments.
*/
BOOL OutlineApp_ParseCmdLine(LPOUTLINEAPP lpOutlineApp, LPSTR lpszCmdLine, int nCmdShow)
{
#if defined( OLE_VERSION )
// Call OLE version of this function instead
return OleApp_ParseCmdLine((LPOLEAPP)lpOutlineApp,lpszCmdLine,nCmdShow);
#else
BOOL fStatus = TRUE;
char szFileName[256]; /* buffer for filename in command line */
szFileName[0] = '\0';
ParseCmdLine(lpszCmdLine, NULL, (LPSTR)szFileName);
if(*szFileName) {
// allocate a new document
lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
if (! lpOutlineApp->m_lpDoc) goto error;
// open the specified file
if (! OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, szFileName))
goto error;
} else {
// create a new document
lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
if (! lpOutlineApp->m_lpDoc) goto error;
// set the doc to an (Untitled) doc.
if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
goto error;
}
// position and size the new doc window
OutlineApp_ResizeWindows(lpOutlineApp);
OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc);
// show main app window
ShowWindow(lpOutlineApp->m_hWndApp, nCmdShow);
UpdateWindow(lpOutlineApp->m_hWndApp);
return TRUE;
error:
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
if (lpOutlineApp->m_lpDoc) {
OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);
lpOutlineApp->m_lpDoc = NULL;
}
return FALSE;
#endif
}
/* OutlineApp_InitMenu
* -------------------
*
* Enable or Disable menu items depending on the state of
* the appliation
*/
void OutlineApp_InitMenu(LPOUTLINEAPP lpOutlineApp, LPOUTLINEDOC lpOutlineDoc, HMENU hMenu)
{
WORD status;
static UINT uCurrentZoom = (UINT)-1;
static UINT uCurrentMargin = (UINT)-1;
static UINT uBBState = (UINT)-1;
static UINT uFBState = (UINT)-1;
if (!lpOutlineApp || !lpOutlineDoc || !hMenu)
return;
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_UNDO, MF_GRAYED);
status = (WORD)(OutlineDoc_GetLineCount(lpOutlineDoc) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_CUT ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_COPY ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_CLEAR ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_SELECTALL ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_EDITLINE ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_INDENTLINE ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_UNINDENTLINE ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_SETLINEHEIGHT ,status);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_N_DEFINENAME ,status);
status = (WORD)(OutlineDoc_GetNameCount(lpOutlineDoc) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_N_GOTONAME, status);
if (uCurrentZoom != (UINT)-1)
CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentZoom, MF_UNCHECKED);
uCurrentZoom = OutlineDoc_GetCurrentZoomMenuCheck(lpOutlineDoc);
CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentZoom, MF_CHECKED);
if (uCurrentMargin != (UINT)-1)
CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentMargin, MF_UNCHECKED);
uCurrentMargin = OutlineDoc_GetCurrentMarginMenuCheck(lpOutlineDoc);
CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentMargin, MF_CHECKED);
#if defined( USE_FRAMETOOLS )
if (uBBState != (UINT)-1)
CheckMenuItem(lpOutlineApp->m_hMenuApp, uBBState, MF_UNCHECKED);
if (lpOutlineDoc->m_lpFrameTools) {
switch (FrameTools_BB_GetState(lpOutlineDoc->m_lpFrameTools)) {
case BARSTATE_TOP:
uBBState = IDM_O_BB_TOP;
break;
case BARSTATE_BOTTOM:
uBBState = IDM_O_BB_BOTTOM;
break;
case BARSTATE_POPUP:
uBBState = IDM_O_BB_POPUP;
break;
case BARSTATE_HIDE:
uBBState = IDM_O_BB_HIDE;
break;
}
CheckMenuItem(lpOutlineApp->m_hMenuApp, uBBState, MF_CHECKED);
}
if (uFBState != (UINT)-1)
CheckMenuItem(lpOutlineApp->m_hMenuApp, uFBState, MF_UNCHECKED);
if (lpOutlineDoc->m_lpFrameTools) {
switch (FrameTools_FB_GetState(lpOutlineDoc->m_lpFrameTools)) {
case BARSTATE_TOP:
uFBState = IDM_O_FB_TOP;
break;
case BARSTATE_BOTTOM:
uFBState = IDM_O_FB_BOTTOM;
break;
case BARSTATE_POPUP:
uFBState = IDM_O_FB_POPUP;
break;
}
CheckMenuItem(lpOutlineApp->m_hMenuApp, uFBState, MF_CHECKED);
}
#endif // USE_FRAMETOOLS
#if defined( OLE_VERSION )
/* OLE2NOTE: perform OLE specific menu initialization.
** the OLE versions use the OleGetClipboard mechanism for
** clipboard handling. thus, they determine if the Paste and
** PasteSpecial commands should be enabled in an OLE specific
** manner.
** (Container only) build the OLE object verb menu if necessary.
*/
OleApp_InitMenu(
(LPOLEAPP)lpOutlineApp,
(LPOLEDOC)lpOutlineDoc,
lpOutlineApp->m_hMenuApp
);
/* OLE2NOTE: To avoid the overhead of initializing the Edit menu,
** we do it only when it is popped up. Thus we just set a flag
** in the OleDoc saying that the Edit menu needs to be updated
** but we don't do it immediately
*/
OleDoc_SetUpdateEditMenuFlag((LPOLEDOC)lpOutlineDoc, TRUE);
#else
// Base Outline version uses standard Windows clipboard handling
if(IsClipboardFormatAvailable(lpOutlineApp->m_cfOutline) ||
IsClipboardFormatAvailable(CF_TEXT))
status = MF_ENABLED;
else
status = MF_GRAYED;
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_PASTE, status);
#endif
#if defined( USE_FRAMETOOLS )
if (! OutlineDoc_IsEditFocusInFormulaBar(lpOutlineDoc)) {
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_ADDLINE, MF_GRAYED);
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_EDITLINE, MF_GRAYED);
}
else
EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_ADDLINE, MF_ENABLED);
#endif // USE_FRAMETOOLS
}
/* OutlineApp_GetWindow
* --------------------
*
* Get the window handle of the application frame.
*/
HWND OutlineApp_GetWindow(LPOUTLINEAPP lpOutlineApp)
{
if (!lpOutlineApp)
return NULL;
return lpOutlineApp->m_hWndApp;
}
/* OutlineApp_GetFrameWindow
** -------------------------
** Gets the current frame window to use as a parent to any dialogs
** this app uses.
**
** OLE2NOTE: normally this is simply the main hWnd of the app. but,
** if the app is currently supporting an in-place server document,
** then the frame window of the top in-place container must be used.
*/
HWND OutlineApp_GetFrameWindow(LPOUTLINEAPP lpOutlineApp)
{
HWND hWndApp = OutlineApp_GetWindow(lpOutlineApp);
#if defined( INPLACE_SVR )
LPSERVERDOC lpServerDoc =
(LPSERVERDOC)OutlineApp_GetActiveDoc(lpOutlineApp);
if (lpServerDoc && lpServerDoc->m_fUIActive)
return lpServerDoc->m_lpIPData->frameInfo.hwndFrame;
#endif
return hWndApp;
}
/* OutlineApp_GetInstance
* ----------------------
*
* Get the process instance of the application.
*/
HINSTANCE OutlineApp_GetInstance(LPOUTLINEAPP lpOutlineApp)
{
if (!lpOutlineApp)
return NULL;
return lpOutlineApp->m_hInst;
}
/* OutlineApp_CreateDoc
* --------------------
*
* Allocate a new document of the appropriate type.
* OutlineApp --> creates OutlineDoc type documents
*
* Returns lpOutlineDoc for successful, NULL if error.
*/
LPOUTLINEDOC OutlineApp_CreateDoc(
LPOUTLINEAPP lpOutlineApp,
BOOL fDataTransferDoc
)
{
LPOUTLINEDOC lpOutlineDoc;
OLEDBG_BEGIN3("OutlineApp_CreateDoc\r\n")
#if defined( OLE_SERVER )
lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(SERVERDOC));
_fmemset(lpOutlineDoc, 0, sizeof(SERVERDOC));
#endif
#if defined( OLE_CNTR )
lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(CONTAINERDOC));
_fmemset(lpOutlineDoc, 0, sizeof(CONTAINERDOC));
#endif
#if !defined( OLE_VERSION )
lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(OUTLINEDOC));
_fmemset(lpOutlineDoc, 0, sizeof(OUTLINEDOC));
#endif
OleDbgAssertSz(lpOutlineDoc != NULL, "Error allocating OutlineDoc");
if (lpOutlineDoc == NULL)
return NULL;
// initialize new document
if (! OutlineDoc_Init(lpOutlineDoc, fDataTransferDoc))
goto error;
OLEDBG_END3
return lpOutlineDoc;
error:
if (lpOutlineDoc)
Delete(lpOutlineDoc);
OLEDBG_END3
return NULL;
}
/* OutlineApp_CreateName
* ---------------------
*
* Allocate a new Name of the appropriate type.
* OutlineApp --> creates standard OutlineName type names.
* ServerApp --> creates enhanced SeverName type names.
*
* Returns lpOutlineName for successful, NULL if error.
*/
LPOUTLINENAME OutlineApp_CreateName(LPOUTLINEAPP lpOutlineApp)
{
LPOUTLINENAME lpOutlineName;
#if defined( OLE_SERVER )
lpOutlineName = (LPOUTLINENAME)New((DWORD)sizeof(SERVERNAME));
#else
lpOutlineName = (LPOUTLINENAME)New((DWORD)sizeof(OUTLINENAME));
#endif
OleDbgAssertSz(lpOutlineName != NULL, "Error allocating Name");
if (lpOutlineName == NULL)
return NULL;
#if defined( OLE_SERVER )
_fmemset((LPVOID)lpOutlineName,0,sizeof(SERVERNAME));
#else
_fmemset((LPVOID)lpOutlineName,0,sizeof(OUTLINENAME));
#endif
return lpOutlineName;
}
/* OutlineApp_DocUnlockApp
** -----------------------
** Forget all references to a closed document.
*/
void OutlineApp_DocUnlockApp(LPOUTLINEAPP lpOutlineApp, LPOUTLINEDOC lpOutlineDoc)
{
/* forget pointers to destroyed document */
if (lpOutlineApp->m_lpDoc == lpOutlineDoc)
lpOutlineApp->m_lpDoc = NULL;
else if (lpOutlineApp->m_lpClipboardDoc == lpOutlineDoc)
lpOutlineApp->m_lpClipboardDoc = NULL;
#if defined( OLE_VERSION )
/* OLE2NOTE: when there are no open documents and the app is not
** under the control of the user then revoke our ClassFactory to
** enable the app to shut down.
**
** NOTE: data transfer documents (non-user documents) do NOT
** hold the app alive. therefore they do not Lock the app.
*/
if (! lpOutlineDoc->m_fDataTransferDoc)
OleApp_DocUnlockApp((LPOLEAPP)lpOutlineApp, lpOutlineDoc);
#endif
}
/* OutlineApp_NewCommand
* ---------------------
*
* Start a new untitled document (File.New command).
*/
void OutlineApp_NewCommand(LPOUTLINEAPP lpOutlineApp)
{
#if defined( OLE_VERSION )
// Call OLE version of this function instead
OleApp_NewCommand((LPOLEAPP)lpOutlineApp);
#else
LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
if (! OutlineDoc_Close(lpOutlineDoc, OLECLOSE_PROMPTSAVE))
return;
OleDbgAssertSz(lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
if (! lpOutlineApp->m_lpDoc) goto error;
// set the doc to an (Untitled) doc.
if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
goto error;
// position and size the new doc window
OutlineApp_ResizeWindows(lpOutlineApp);
OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc); // calls OleDoc_Lock
return;
error:
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
if (lpOutlineApp->m_lpDoc) {
OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);
lpOutlineApp->m_lpDoc = NULL;
}
return;
#endif
}
/* OutlineApp_OpenCommand
* ----------------------
*
* Load a document from file (File.Open command).
*/
void OutlineApp_OpenCommand(LPOUTLINEAPP lpOutlineApp)
{
#if defined( OLE_VERSION )
// Call OLE version of this function instead
OleApp_OpenCommand((LPOLEAPP)lpOutlineApp);
#else
OPENFILENAME ofn;
char szFilter[]=APPFILENAMEFILTER;
char szFileName[256];
UINT i;
DWORD dwSaveOption = OLECLOSE_PROMPTSAVE;
BOOL fStatus = TRUE;
if (! OutlineDoc_CheckSaveChanges(lpOutlineApp->m_lpDoc, &dwSaveOption))
return; // abort opening new doc
for(i=0; szFilter[i]; i++)
if(szFilter[i]=='|') szFilter[i]='\0';
_fmemset((LPOPENFILENAME)&ofn,0,sizeof(OPENFILENAME));
szFileName[0]='\0';
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=lpOutlineApp->m_hWndApp;
ofn.lpstrFilter=(LPSTR)szFilter;
ofn.lpstrFile=(LPSTR)szFileName;
ofn.nMaxFile=sizeof(szFileName);
ofn.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt=DEFEXTENSION;
if(! GetOpenFileName((LPOPENFILENAME)&ofn))
return; // user canceled file open dialog
OutlineDoc_Close(lpOutlineApp->m_lpDoc, OLECLOSE_NOSAVE);
OleDbgAssertSz(lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
if (! lpOutlineApp->m_lpDoc) goto error;
fStatus=OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, (LPSTR)szFileName);
if (! fStatus) {
// loading the doc failed; create an untitled instead
OutlineDoc_Destroy(lpOutlineApp->m_lpDoc); // destroy unused doc
lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
if (! lpOutlineApp->m_lpDoc) goto error;
if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
goto error;
}
// position and size the new doc window
OutlineApp_ResizeWindows(lpOutlineApp);
OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc);
return;
error:
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
if (lpOutlineApp->m_lpDoc) {
OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);
lpOutlineApp->m_lpDoc = NULL;
}
return;
#endif
}
/* OutlineApp_PrintCommand
* -----------------------
*
* Print the document
*/
void OutlineApp_PrintCommand(LPOUTLINEAPP lpOutlineApp)
{
LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
HDC hDC=NULL;
BOOL fMustDeleteDC = FALSE;
BOOL fStatus;
#if defined( OLE_VERSION )
OleApp_PreModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
fStatus = PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg);
#if defined( OLE_VERSION )
OleApp_PostModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
if (!fStatus) {
if (!CommDlgExtendedError()) { // Cancel button pressed
return;
}
}
else {
hDC = OutlineApp_GetPrinterDC(lpOutlineApp);
if (hDC) {
#if defined( OLE_VERSION )
/* OLE2NOTE: while we are printing we do NOT want to
** receive any OnDataChange notifications or other OLE
** interface calls which could disturb the printing of
** the document. we will temporarily reply
** SERVERCALL_RETRYLATER
*/
OleApp_RejectInComingCalls((LPOLEAPP)lpOutlineApp, TRUE);
#endif
OutlineDoc_Print(lpOutlineDoc, hDC);
DeleteDC(hDC);
#if defined( OLE_VERSION )
// re-enable LRPC calls
OleApp_RejectInComingCalls((LPOLEAPP)lpOutlineApp, FALSE);
#endif
return; // Printing completed
}
}
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgPrinting);
}
/* OutlineApp_PrinterSetupCommand
* ------------------------------
*
* Setup a different printer for printing
*/
void OutlineApp_PrinterSetupCommand(LPOUTLINEAPP lpOutlineApp)
{
DWORD FlagSave;
FlagSave = lpOutlineApp->m_PrintDlg.Flags;
lpOutlineApp->m_PrintDlg.Flags |= PD_PRINTSETUP;
#if defined( OLE_VERSION )
OleApp_PreModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg);
#if defined( OLE_VERSION )
OleApp_PostModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
lpOutlineApp->m_PrintDlg.Flags = FlagSave;
}
/*
* FUNCTION : OutlineApp_GetPrinterDC ()
*
* PURPOSE : Creates a printer display context for the printer
*
* RETURNS : HDC - A handle to printer DC.
*/
HDC OutlineApp_GetPrinterDC(LPOUTLINEAPP lpApp)
{
HDC hDC;
LPDEVMODE lpDevMode = NULL;
LPDEVNAMES lpDevNames;
LPSTR lpszDriverName;
LPSTR lpszDeviceName;
LPSTR lpszPortName;
if(lpApp->m_PrintDlg.hDC) {
hDC = lpApp->m_PrintDlg.hDC;
} else {
if(! lpApp->m_PrintDlg.hDevNames)
return(NULL);
lpDevNames = (LPDEVNAMES)GlobalLock(lpApp->m_PrintDlg.hDevNames);
lpszDriverName = (LPSTR)lpDevNames + lpDevNames->wDriverOffset;
lpszDeviceName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset;
lpszPortName = (LPSTR)lpDevNames + lpDevNames->wOutputOffset;
GlobalUnlock(lpApp->m_PrintDlg.hDevNames);
if(lpApp->m_PrintDlg.hDevMode)
lpDevMode = (LPDEVMODE)GlobalLock(lpApp->m_PrintDlg.hDevMode);
#if defined( WIN32 )
hDC = CreateDC(
lpszDriverName,
lpszDeviceName,
lpszPortName,
(CONST DEVMODE FAR*)lpDevMode);
#else
hDC = CreateDC(
lpszDriverName,
lpszDeviceName,
lpszPortName,
(LPSTR)lpDevMode);
#endif
if(lpApp->m_PrintDlg.hDevMode && lpDevMode)
GlobalUnlock(lpApp->m_PrintDlg.hDevMode);
}
return(hDC);
}
/* OutlineApp_SaveCommand
* ----------------------
*
* Save the document with same name. If no name exists, prompt the user
* for a name (via SaveAsCommand)
*
* Parameters:
*
* Returns:
* TRUE if succesfully
* FALSE if failed or aborted
*/
BOOL OutlineApp_SaveCommand(LPOUTLINEAPP lpOutlineApp)
{
LPOUTLINEDOC lpOutlineDoc = OutlineApp_GetActiveDoc(lpOutlineApp);
if(lpOutlineDoc->m_docInitType == DOCTYPE_NEW) /* file with no name */
return OutlineApp_SaveAsCommand(lpOutlineApp);
if(OutlineDoc_IsModified(lpOutlineDoc)) {
#if defined( OLE_SERVER )
if (lpOutlineDoc->m_docInitType == DOCTYPE_EMBEDDED) {
LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc;
HRESULT hrErr;
/* OLE2NOTE: if the document is an embedded object, then
** the "File.Save" command is changed to "File.Update".
** in order to update our container, we must ask our
** container to save us.
*/
OleDbgAssert(lpServerDoc->m_lpOleClientSite != NULL);
OLEDBG_BEGIN2("IOleClientSite::SaveObject called\r\n")
hrErr = lpServerDoc->m_lpOleClientSite->lpVtbl->SaveObject(
lpServerDoc->m_lpOleClientSite
);
OLEDBG_END2
if (hrErr != NOERROR) {
OleDbgOutHResult("IOleClientSite::SaveObject returned",hrErr);
return FALSE;
}
} else
// document is file-base user document, save it to its file.
#endif // OLE_SERVER
(void)OutlineDoc_SaveToFile(
lpOutlineDoc,
NULL,
lpOutlineDoc->m_cfSaveFormat,
TRUE
);
}
return TRUE;
}
/* OutlineApp_SaveAsCommand
* ------------------------
*
* Save the document as another name
*
* Parameters:
*
* Returns:
* TRUE if saved successful
* FALSE if failed or aborted
*/
BOOL OutlineApp_SaveAsCommand(LPOUTLINEAPP lpOutlineApp)
{
LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
OPENFILENAME ofn;
char szFilter[]=APPFILENAMEFILTER;
char szFileName[256]="";
int i;
UINT uFormat;
BOOL fNoError = TRUE;
BOOL fRemember = TRUE;
BOOL fStatus;
for(i=0; szFilter[i]; i++)
if(szFilter[i]=='|') szFilter[i]='\0';
_fmemset((LPOPENFILENAME)&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=lpOutlineDoc->m_hWndDoc;
ofn.lpstrFilter=(LPSTR)szFilter;
ofn.lpstrFile=(LPSTR)szFileName;
ofn.nMaxFile=sizeof(szFileName);
ofn.Flags=OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
ofn.lpstrDefExt=DEFEXTENSION;
#if defined( OLE_VERSION )
OleApp_PreModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
fStatus = GetSaveFileName((LPOPENFILENAME)&ofn);
#if defined( OLE_VERSION )
OleApp_PostModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
if (fStatus) {
#if defined( OLE_CNTR )
// determine which file type the user selected.
switch (ofn.nFilterIndex) {
case 1:
uFormat = ((LPCONTAINERAPP)lpOutlineApp)->m_cfCntrOutl;
break;
case 2:
uFormat = lpOutlineApp->m_cfOutline;
break;
default:
uFormat = ((LPCONTAINERAPP)lpOutlineApp)->m_cfCntrOutl;
break;
}
#else
uFormat = lpOutlineApp->m_cfOutline;
#endif
#if defined( OLE_SERVER )
/* OLE2NOTE: if the document is an embedded object, then the
** File.SaveAs command is changed to File.SaveCopyAs. with the
** Save Copy As operation, the document does NOT remember the
** saved file as the associated file for the document.
*/
if (lpOutlineDoc->m_docInitType == DOCTYPE_EMBEDDED)
fRemember = FALSE;
#endif
(void)OutlineDoc_SaveToFile(
lpOutlineDoc,
szFileName,
uFormat,
fRemember
);
}
else
fNoError = FALSE;
return fNoError;
}
/* OutlineApp_AboutCommand
* -----------------------
*
* Show the About dialog box
*/
void OutlineApp_AboutCommand(LPOUTLINEAPP lpOutlineApp)
{
#if defined( OLE_VERSION )
OleApp_PreModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
DialogBox(
lpOutlineApp->m_hInst,
(LPSTR)"About",
OutlineApp_GetFrameWindow(lpOutlineApp),
(DLGPROC)AboutDlgProc
);
#if defined( OLE_VERSION )
OleApp_PostModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
}
/* OutlineApp_CloseAllDocsAndExitCommand
* -------------------------------------
*
* Close all active documents and exit the app.
* Because this is an SDI, there is only one document
* If the doc was modified, prompt the user if he wants to save it.
*
* Returns:
* TRUE if the app is successfully closed
* FALSE if failed or aborted
*/
BOOL OutlineApp_CloseAllDocsAndExitCommand(
LPOUTLINEAPP lpOutlineApp,
BOOL fForceEndSession
)
{
BOOL fResult;
OLEDBG_BEGIN2("OutlineApp_CloseAllDocsAndExitCommand\r\n")
#if defined( OLE_VERSION )
// Call OLE specific version of this function
fResult = OleApp_CloseAllDocsAndExitCommand(
(LPOLEAPP)lpOutlineApp, fForceEndSession);
#else
/* Because this is an SDI app, there is only one document.
** Close the doc. if it is successfully closed and the app will
** not automatically exit, then also exit the app.
** if this were an MDI app, we would loop through and close all
** open MDI child documents.
*/
if (OutlineDoc_Close(lpOutlineApp->m_lpDoc, OLECLOSE_PROMPTSAVE)) {
#if defined( _DEBUG )
OleDbgAssertSz(
lpOutlineApp->m_lpDoc==NULL,
"Closed doc NOT properly destroyed"
);
#endif
OutlineApp_Destroy(lpOutlineApp);
fResult = TRUE;
} // else User Canceled shutdown
else
fResult = FALSE;
#endif
OLEDBG_END2
return fResult;
}
/* OutlineApp_Destroy
* ------------------
*
* Destroy all data structures used by the app and force the
* app to shut down. This should be called after all documents have
* been closed.
*/
void OutlineApp_Destroy(LPOUTLINEAPP lpOutlineApp)
{
OLEDBG_BEGIN3("OutlineApp_Destroy\r\n");
#if defined( OLE_VERSION )
/* OLE2NOTE: perform processing required for OLE */
OleApp_Destroy((LPOLEAPP)lpOutlineApp);
#endif
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
DestroyCursor(lpOutlineApp->m_hcursorSelCur);
#if defined( USE_FRAMETOOLS )
FrameTools_Destroy(&lpOutlineApp->m_frametools);
#endif
if (lpOutlineApp->m_hStdFont)
DeleteObject(lpOutlineApp->m_hStdFont);
if(lpOutlineApp->m_PrintDlg.hDevMode)
GlobalFree(lpOutlineApp->m_PrintDlg.hDevMode);
if(lpOutlineApp->m_PrintDlg.hDevNames)
GlobalFree(lpOutlineApp->m_PrintDlg.hDevNames);
#if defined( USE_STATUSBAR )
if(lpOutlineApp->m_hWndStatusBar) {
DestroyStatusWindow(lpOutlineApp->m_hWndStatusBar);
lpOutlineApp->m_hWndStatusBar = NULL;
}
#endif
OutlineApp_DestroyWindow(lpOutlineApp);
OleDbgOut1("@@@@ APP DESTROYED\r\n");
OLEDBG_END3
}
/* OutlineApp_DestroyWindow
* ------------------------
*
* Destroy all windows created by the App.
*/
void OutlineApp_DestroyWindow(LPOUTLINEAPP lpOutlineApp)
{
HWND hWndApp = lpOutlineApp->m_hWndApp;
if(hWndApp) {
lpOutlineApp->m_hWndApp = NULL;
lpOutlineApp->m_hWndAccelTarget = NULL;
DestroyWindow(hWndApp); /* Quit the app */
}
}
/* OutlineApp_GetFrameRect
** -----------------------
** Get the rectangle of the app frame window EXCLUDING space for the
** status line.
**
** OLE2NOTE: this is the rectangle that an in-place container can
** offer to an in-place active object from which to get frame tool
** space.
*/
void OutlineApp_GetFrameRect(LPOUTLINEAPP lpOutlineApp, LPRECT lprcFrameRect)
{
GetClientRect(lpOutlineApp->m_hWndApp, lprcFrameRect);
#if defined( USE_STATUSBAR )
lprcFrameRect->bottom -= STATUS_HEIGHT;
#endif
}
/* OutlineApp_GetClientAreaRect
** ----------------------------
** Get the rectangle of the app frame window EXCLUDING space for the
** status line AND EXCLUDING space for any frame-level tools.
**
** OLE2NOTE: this is the rectangle that an in-place container gives
** to its in-place active object as the lpClipRect in
** IOleInPlaceSite::GetWindowContext.
*/
void OutlineApp_GetClientAreaRect(
LPOUTLINEAPP lpOutlineApp,
LPRECT lprcClientAreaRect
)
{
OutlineApp_GetFrameRect(lpOutlineApp, lprcClientAreaRect);
/* if the app either uses frame-level tools itself or, as in-place
** container, is prepared to allow an in-place active object to
** have space for tools, then it must subtract away the space
** required for the tools.
*/
#if defined ( USE_FRAMETOOLS ) || defined ( INPLACE_CNTR )
lprcClientAreaRect->top += lpOutlineApp->m_FrameToolWidths.top;
lprcClientAreaRect->left += lpOutlineApp->m_FrameToolWidths.left;
lprcClientAreaRect->right -= lpOutlineApp->m_FrameToolWidths.right;
lprcClientAreaRect->bottom -= lpOutlineApp->m_FrameToolWidths.bottom;
#endif // USE_FRAMETOOLS || INPLACE_CNTR
}
/* OutlineApp_GetStatusLineRect
** ----------------------------
** Get the rectangle required for the status line.
**
** OLE2NOTE: the top frame-level in-place container displays its
** status line even when an object is active in-place.
*/
void OutlineApp_GetStatusLineRect(
LPOUTLINEAPP lpOutlineApp,
LPRECT lprcStatusLineRect
)
{
RECT rcFrameRect;
GetClientRect(lpOutlineApp->m_hWndApp, (LPRECT)&rcFrameRect);
lprcStatusLineRect->left = rcFrameRect.left;
lprcStatusLineRect->top = rcFrameRect.bottom - STATUS_HEIGHT;
lprcStatusLineRect->right = rcFrameRect.right;
lprcStatusLineRect->bottom = rcFrameRect.bottom;
}
/* OutlineApp_ResizeWindows
* ------------------------
*
* Changes the size and position of the SDI document and tool windows.
* Normally called on a WM_SIZE message.
*
* Currently the app supports a status bar and a single SDI document window.
* In the future it will have a formula bar and possibly multiple MDI
* document windows.
*
* CUSTOMIZATION: Change positions of windows.
*/
void OutlineApp_ResizeWindows(LPOUTLINEAPP lpOutlineApp)
{
LPOUTLINEDOC lpOutlineDoc = OutlineApp_GetActiveDoc(lpOutlineApp);
RECT rcStatusLineRect;
if (! lpOutlineApp)
return;
#if defined( INPLACE_CNTR )
if (lpOutlineDoc)
ContainerDoc_FrameWindowResized((LPCONTAINERDOC)lpOutlineDoc);
#else
#if defined( USE_FRAMETOOLS )
if (lpOutlineDoc)
OutlineDoc_AddFrameLevelTools(lpOutlineDoc);
#else
OutlineApp_ResizeClientArea(lpOutlineApp);
#endif // ! USE_FRAMETOOLS
#endif // ! INPLACE_CNTR
#if defined( USE_STATUSBAR )
if (lpOutlineApp->m_hWndStatusBar) {
OutlineApp_GetStatusLineRect(lpOutlineApp, (LPRECT)&rcStatusLineRect);
MoveWindow(
lpOutlineApp->m_hWndStatusBar,
rcStatusLineRect.left,
rcStatusLineRect.top,
rcStatusLineRect.right - rcStatusLineRect.left,
rcStatusLineRect.bottom - rcStatusLineRect.top,
TRUE /* fRepaint */
);
}
#endif // USE_STATUSBAR
}
#if defined( USE_FRAMETOOLS ) || defined( INPLACE_CNTR )
void OutlineApp_SetBorderSpace(
LPOUTLINEAPP lpOutlineApp,
LPBORDERWIDTHS lpBorderWidths
)
{
lpOutlineApp->m_FrameToolWidths = *lpBorderWidths;
OutlineApp_ResizeClientArea(lpOutlineApp);
}
#endif // USE_FRAMETOOLS || INPLACE_CNTR
void OutlineApp_ResizeClientArea(LPOUTLINEAPP lpOutlineApp)
{
RECT rcClientAreaRect;
#if defined( MDI_VERSION )
// Resize MDI Client Area Window here
#else
if (lpOutlineApp->m_lpDoc) {
OutlineApp_GetClientAreaRect(
lpOutlineApp, (LPRECT)&rcClientAreaRect);
OutlineDoc_Resize(lpOutlineApp->m_lpDoc,
(LPRECT)&rcClientAreaRect);
}
#endif
}
/* OutlineApp_GetActiveDoc
* -----------------------
*
* Return the document in focus. For SDI, the same (only one) document is
* always returned.
*/
LPOUTLINEDOC OutlineApp_GetActiveDoc(LPOUTLINEAPP lpOutlineApp)
{
return lpOutlineApp->m_lpDoc;
}
/* OutlineApp_GetMenu
* ------------------
*
* Return the menu handle of the app
*/
HMENU OutlineApp_GetMenu(LPOUTLINEAPP lpOutlineApp)
{
if (!lpOutlineApp) {
return NULL;
}
return lpOutlineApp->m_hMenuApp;
}
#if defined( USE_FRAMETOOLS )
/* OutlineApp_GetFrameTools
* ---------------------
*
* Return the pointer to the toolbar object
*/
LPFRAMETOOLS OutlineApp_GetFrameTools(LPOUTLINEAPP lpOutlineApp)
{
return (LPFRAMETOOLS)&lpOutlineApp->m_frametools;
}
#endif
/* OutlineApp_SetStatusText
* ------------------------
*
* Show the given string in the status line
*/
void OutlineApp_SetStatusText(LPOUTLINEAPP lpOutlineApp, LPSTR lpszMessage)
{
SetStatusText(lpOutlineApp->m_hWndStatusBar, lpszMessage);
}
/* OutlineApp_GetActiveFont
* ------------------------
*
* Return the font used by the application
*/
HFONT OutlineApp_GetActiveFont(LPOUTLINEAPP lpOutlineApp)
{
return lpOutlineApp->m_hStdFont;
}
/* OutlineApp_GetAppName
* ---------------------
*
* Retrieve the application name
*/
void OutlineApp_GetAppName(LPOUTLINEAPP lpOutlineApp, LPSTR lpszAppName)
{
lstrcpy(lpszAppName, APPNAME);
}
/* OutlineApp_GetAppVersionNo
* --------------------------
*
* Get the version number (major and minor) of the application
*/
void OutlineApp_GetAppVersionNo(LPOUTLINEAPP lpOutlineApp, int narrAppVersionNo[])
{
narrAppVersionNo[0] = APPMAJORVERSIONNO;
narrAppVersionNo[1] = APPMINORVERSIONNO;
}
/* OutlineApp_VersionNoCheck
* -------------------------
*
* Check if the version stamp read from a file is compatible
* with the current instance of the application.
* returns TRUE if the file can be read, else FALSE.
*/
BOOL OutlineApp_VersionNoCheck(LPOUTLINEAPP lpOutlineApp, LPSTR lpszFormatName, int narrAppVersionNo[])
{
#if defined( OLE_CNTR )
/* ContainerApp accepts both CF_OUTLINE and CF_CONTAINEROUTLINE formats */
if (lstrcmp(lpszFormatName, CONTAINERDOCFORMAT) != 0 &&
lstrcmp(lpszFormatName, OUTLINEDOCFORMAT) != 0) {
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(
lpOutlineApp,
"File is either corrupted or not of proper type."
);
return FALSE;
}
#else
/* OutlineApp accepts CF_OUTLINE format only */
if (lstrcmp(lpszFormatName, OUTLINEDOCFORMAT) != 0) {
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(
lpOutlineApp,
"File is either corrupted or not of proper type."
);
return FALSE;
}
#endif
if (narrAppVersionNo[0] < APPMAJORVERSIONNO) {
// REVIEW: should load string from string resource
OutlineApp_ErrorMessage(
lpOutlineApp,
"File was created by an older version; it can not be read."
);
return FALSE;
}
return TRUE;
}
/* OutlineApp_ErrorMessage
* -----------------------
*
* Display an error message box
*/
void OutlineApp_ErrorMessage(LPOUTLINEAPP lpOutlineApp, LPSTR lpszErrMsg)
{
HWND hWndFrame = OutlineApp_GetFrameWindow(lpOutlineApp);
// OLE2NOTE: only put up user message boxes if app is visible
if (IsWindowVisible(hWndFrame)) {
#if defined( OLE_VERSION )
OleApp_PreModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
MessageBox(hWndFrame, lpszErrMsg, NULL, MB_ICONEXCLAMATION | MB_OK);
#if defined( OLE_VERSION )
OleApp_PostModalDialog(
(LPOLEAPP)lpOutlineApp, (LPOLEDOC)lpOutlineApp->m_lpDoc);
#endif
}
}
#if defined( USE_FRAMETOOLS )
/* OutlineApp_SetFormulaBarAccel
* -----------------------------
*
* Set accelerator table based on state of formula bar.
*/
void OutlineApp_SetFormulaBarAccel(
LPOUTLINEAPP lpOutlineApp,
BOOL fEditFocus
)
{
if (fEditFocus)
lpOutlineApp->m_hAccel = lpOutlineApp->m_hAccelFocusEdit;
else
lpOutlineApp->m_hAccel = lpOutlineApp->m_hAccelApp;
}
#endif // USE_FRAMETOOLS
/* OutlineApp_ForceRedraw
* ----------------------
*
* Force the Application window to repaint.
*/
void OutlineApp_ForceRedraw(LPOUTLINEAPP lpOutlineApp, BOOL fErase)
{
if (!lpOutlineApp)
return;
InvalidateRect(lpOutlineApp->m_hWndApp, NULL, fErase);
}