File:  [WindowsNT SDKs] / mstools / ole20 / samples / outline / outlapp.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:24:38 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntsdk-jul-1993, HEAD
Microsoft Windows NT Build 511 (SDK Final Release) 07-24-1993

/*************************************************************************
** 
**    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 hMenuLine = GetSubMenu(lpOutlineApp->m_hMenuApp, 2);
        HMENU hMenuName = GetSubMenu(lpOutlineApp->m_hMenuApp, 3);
        HMENU hMenuHelp = GetSubMenu(lpOutlineApp->m_hMenuApp, 4);
        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(hMenuLine, "Create, edit, and indent lines");
        AssignPopupMessage(hMenuName, "Create, edit, delete and goto names");
        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() neeed 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));
#elif defined( OLE_CNTR )
    lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(CONTAINERDOC));
#else 
    lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(OUTLINEDOC));
#endif  

    if (! OleDbgVerifySz(lpOutlineDoc != NULL, "Error allocating OutlineDoc"))
        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 

    if (! OleDbgVerifySz(lpOutlineName != NULL, "Error allocating Name"))
        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;
    BOOL fStatus = TRUE;

    if (! OutlineDoc_CheckSaveChanges(lpOutlineApp->m_lpDoc, OLECLOSE_PROMPTSAVE))
        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;

    if (!PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg)) {
        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;
    PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg);
    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;

    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 (GetSaveFileName((LPOPENFILENAME)&ofn)) {

#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)
{
    DialogBox(
            lpOutlineApp->m_hInst, 
            (LPSTR)"About", 
            OutlineApp_GetFrameWindow(lpOutlineApp),
            (DLGPROC)AboutDlgProc
    );
}


/* 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 fResult;
    
    OLEDBG_BEGIN2("OutlineApp_CloseAllDocsAndExitCommand\r\n")

#if defined( OLE_VERSION )
    // Call OLE specific version of this function
    fResult = OleApp_CloseAllDocsAndExitCommand((LPOLEAPP)lpOutlineApp);

#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)) {
    
        OleDbgAssertSz(
                lpOutlineApp->m_lpDoc==NULL,
                "Closed doc NOT properly destroyed"
        );

        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  
    
    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);
#elif defined( USE_FRAMETOOLS )
    if (lpOutlineDoc) 
        OutlineDoc_AddFrameLevelTools(lpOutlineDoc);
#else 
    OutlineApp_ResizeClientArea(lpOutlineApp);
#endif

#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_GetStatusWindow
 * --------------------------
 *
 * Return the status bar window handle.
 */
HWND OutlineApp_GetStatusWindow(LPOUTLINEAPP lpOutlineApp)
{
    return lpOutlineApp->m_hWndStatusBar;
}


/* 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)) 
        MessageBox(hWndFrame, lpszErrMsg, NULL, MB_ICONEXCLAMATION | MB_OK);
}


#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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.