Annotation of mstools/ole20/samples/outline/outlapp.c, revision 1.1

1.1     ! root        1: /*************************************************************************
        !             2: ** 
        !             3: **    OLE 2 Sample Code
        !             4: **    
        !             5: **    outlapp.c
        !             6: **    
        !             7: **    This file contains OutlineApp functions.
        !             8: **    
        !             9: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
        !            10: **
        !            11: *************************************************************************/
        !            12:     
        !            13: #include "outline.h"
        !            14: 
        !            15: #if defined( USE_STATUSBAR )
        !            16: #include "status.h"
        !            17: #endif  
        !            18: 
        !            19: #if !defined( WIN32 )
        !            20: #include <print.h>
        !            21: #endif
        !            22: 
        !            23: OLEDBGDATA
        !            24: 
        !            25: extern LPOUTLINEAPP g_lpApp;
        !            26: extern RECT g_rectNull;
        !            27: 
        !            28: // REVIEW: should use string resource for messages
        !            29: char ErrMsgClass[] = "Can't register window classes!";
        !            30: char ErrMsgFrame[] = "Can't create Frame Window!";
        !            31: char ErrMsgPrinting[] = "Can't access printer!";
        !            32: 
        !            33: 
        !            34: /* OutlineApp_InitApplication
        !            35: ** --------------------------
        !            36: ** Sets up the class data structures and does a one-time
        !            37: **      initialization of the app by registering the window classes.
        !            38: **      Returns TRUE if initialization is successful
        !            39: **              FALSE otherwise
        !            40: */
        !            41: 
        !            42: BOOL OutlineApp_InitApplication(LPOUTLINEAPP lpOutlineApp, HINSTANCE hInst)
        !            43: {
        !            44:     WNDCLASS    wndclass;
        !            45: 
        !            46:     // REVIEW: should load msg strings from string resource
        !            47: 
        !            48:     /* Register the app frame class */
        !            49:     wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW;
        !            50:     wndclass.lpfnWndProc = AppWndProc;
        !            51:     /* Extra storage for Class and Window objects */
        !            52:     wndclass.cbClsExtra = 0;
        !            53:     wndclass.cbWndExtra = sizeof(LPOUTLINEAPP); /* to store lpApp */
        !            54:     wndclass.hInstance = hInst;
        !            55:     wndclass.hIcon = LoadIcon(hInst, APPICON);
        !            56:     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        !            57:     /* Create brush for erasing background */
        !            58:     wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        !            59:     wndclass.lpszMenuName = APPMENU;     /* Menu Name is App Name */
        !            60:     wndclass.lpszClassName = APPWNDCLASS; /* Class Name is App Name */
        !            61: 
        !            62:     if(! RegisterClass(&wndclass)) {
        !            63:         OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgFrame);
        !            64:         return FALSE;
        !            65:     }
        !            66: 
        !            67:     /* Register the document window class */
        !            68:     wndclass.style = CS_BYTEALIGNWINDOW;    
        !            69:     wndclass.lpfnWndProc = DocWndProc;
        !            70:     wndclass.hIcon = NULL;
        !            71:     wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        !            72:     wndclass.lpszMenuName = NULL;
        !            73:     wndclass.lpszClassName = DOCWNDCLASS;
        !            74:     wndclass.cbWndExtra = sizeof(LPOUTLINEDOC); /* to store lpDoc */
        !            75:     if(! RegisterClass(&wndclass)) {
        !            76:         OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgClass);
        !            77:         return FALSE;
        !            78:     }
        !            79: 
        !            80: #if defined( USE_STATUSBAR )
        !            81:     if (! RegisterStatusClass(hInst))
        !            82:         return FALSE;
        !            83: #endif  
        !            84: 
        !            85: #if defined( USE_FRAMETOOLS )
        !            86:     if (! FrameToolsRegisterClass(hInst)) {
        !            87:         return FALSE;
        !            88:     }
        !            89: #endif
        !            90: 
        !            91: #if defined( INPLACE_SVR )
        !            92:     // We should only register the hatch window class
        !            93:     // in the UI Library once per application.
        !            94:     RegisterHatchWindowClass(hInst);
        !            95:     
        !            96: #endif
        !            97: 
        !            98:     return TRUE;
        !            99: }
        !           100: 
        !           101: 
        !           102: /* OutlineApp_InitInstance
        !           103:  * -----------------------
        !           104:  *
        !           105:  *  Performs a per-instance initialization of app.
        !           106:  *  This method creates the frame window.
        !           107:  *
        !           108:  *  RETURNS    : TRUE  - If initialization was successful.
        !           109:  *               FALSE - otherwise.
        !           110:  */
        !           111: 
        !           112: BOOL OutlineApp_InitInstance(LPOUTLINEAPP lpOutlineApp, HINSTANCE hInst, int nCmdShow)
        !           113: {
        !           114:     lpOutlineApp->m_hInst = hInst;
        !           115: 
        !           116:     /* create application's Frame window */
        !           117:     lpOutlineApp->m_hWndApp = CreateWindow(
        !           118:             APPWNDCLASS,             /* Window class name */
        !           119:             APPNAME,                 /* initial Window title */
        !           120:             WS_OVERLAPPEDWINDOW|
        !           121:             WS_CLIPCHILDREN,
        !           122:             CW_USEDEFAULT, 0,        /* Use default X, Y            */
        !           123:             CW_USEDEFAULT, 0,        /* Use default X, Y            */
        !           124:             HWND_DESKTOP,            /* Parent window's handle      */
        !           125:             NULL,                    /* Default to Class Menu       */
        !           126:             hInst,                   /* Instance of window          */
        !           127:             NULL                     /* Create struct for WM_CREATE */
        !           128:     );
        !           129: 
        !           130:     if(! lpOutlineApp->m_hWndApp) {
        !           131:         // REVIEW: should load string from string resource
        !           132:         OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgFrame);
        !           133:         return FALSE;
        !           134:     }
        !           135: 
        !           136:     SetWindowLong(lpOutlineApp->m_hWndApp, 0, (LONG) lpOutlineApp);     
        !           137: 
        !           138:     /* defer creating the user's SDI document until we parse the cmd line. */
        !           139:     lpOutlineApp->m_lpDoc = NULL;    
        !           140:     
        !           141:     /* Initialize clipboard. 
        !           142:     */
        !           143:     lpOutlineApp->m_lpClipboardDoc = NULL;
        !           144:     if(!(lpOutlineApp->m_cfOutline = RegisterClipboardFormat(OUTLINEDOCFORMAT))) {
        !           145:         // REVIEW: should load string from string resource
        !           146:         OutlineApp_ErrorMessage(lpOutlineApp, "Can't register clipboard format!");
        !           147:         return FALSE;
        !           148:     }
        !           149: 
        !           150:     /* init the standard font to be used for drawing/printing text 
        !           151:     *       request a Roman style True Type font of the desired size
        !           152:     */
        !           153:     lpOutlineApp->m_hStdFont = CreateFont(
        !           154:             -DEFFONTSIZE,
        !           155:             0,0,0,0,0,0,0,0,
        !           156:             OUT_TT_PRECIS,      // use TrueType
        !           157:             CLIP_DEFAULT_PRECIS,
        !           158:             DEFAULT_QUALITY,
        !           159:             VARIABLE_PITCH | FF_ROMAN,
        !           160:             DEFFONTFACE
        !           161:     );
        !           162: 
        !           163:     // Load special cursor for selection of Lines in ListBox.
        !           164:     lpOutlineApp->m_hcursorSelCur = LoadCursor ( hInst, "SelCur" );
        !           165: 
        !           166:     /* init the Print Dialog structure */
        !           167:     _fmemset((LPVOID)&lpOutlineApp->m_PrintDlg,0,sizeof(PRINTDLG));
        !           168:     lpOutlineApp->m_PrintDlg.lStructSize = sizeof(PRINTDLG);
        !           169:     lpOutlineApp->m_PrintDlg.hDevMode = NULL;
        !           170:     lpOutlineApp->m_PrintDlg.hDevNames = NULL;
        !           171:     lpOutlineApp->m_PrintDlg.Flags = PD_RETURNDC | PD_NOSELECTION | PD_NOPAGENUMS | 
        !           172:                     PD_HIDEPRINTTOFILE;
        !           173:     lpOutlineApp->m_PrintDlg.nCopies = 1;
        !           174:     lpOutlineApp->m_PrintDlg.hwndOwner = lpOutlineApp->m_hWndApp;
        !           175: 
        !           176: #if defined( USE_STATUSBAR )
        !           177:     lpOutlineApp->m_hWndStatusBar = CreateStatusWindow(lpOutlineApp->m_hWndApp, hInst);
        !           178:     if (! lpOutlineApp->m_hWndStatusBar)
        !           179:         return FALSE;
        !           180: 
        !           181:     lpOutlineApp->m_hMenuApp = GetMenu(lpOutlineApp->m_hWndApp);
        !           182: 
        !           183:     /* setup status messages for the application menus */
        !           184:     {
        !           185:         HMENU hMenuFile = GetSubMenu(lpOutlineApp->m_hMenuApp, 0);
        !           186:         HMENU hMenuEdit = GetSubMenu(lpOutlineApp->m_hMenuApp, 1);
        !           187:         HMENU hMenuLine = GetSubMenu(lpOutlineApp->m_hMenuApp, 2);
        !           188:         HMENU hMenuName = GetSubMenu(lpOutlineApp->m_hMenuApp, 3);
        !           189:         HMENU hMenuHelp = GetSubMenu(lpOutlineApp->m_hMenuApp, 4);
        !           190:         HMENU hMenuSys = GetSystemMenu(lpOutlineApp->m_hWndApp, FALSE);
        !           191:         
        !           192:         AssignPopupMessage(hMenuFile, "Create, open, save, print outlines or quit application");
        !           193:         AssignPopupMessage(hMenuEdit, "Cut, copy, paste or clear selection");
        !           194:         AssignPopupMessage(hMenuLine, "Create, edit, and indent lines");
        !           195:         AssignPopupMessage(hMenuName, "Create, edit, delete and goto names");
        !           196:         AssignPopupMessage(hMenuHelp, "Get help on using the application");
        !           197:         AssignPopupMessage(hMenuSys,"Move, size or close application window");
        !           198:     }
        !           199: #endif  
        !           200: 
        !           201: #if defined ( USE_FRAMETOOLS ) || defined ( INPLACE_CNTR )
        !           202:     lpOutlineApp->m_FrameToolWidths = g_rectNull;
        !           203: #endif  // USE_FRAMETOOLS || INPLACE_CNTR
        !           204: 
        !           205: #if defined( USE_FRAMETOOLS )
        !           206:     if (! FrameTools_Init(&lpOutlineApp->m_frametools, 
        !           207:             lpOutlineApp->m_hWndApp, lpOutlineApp->m_hInst))
        !           208:         return FALSE;
        !           209: #endif
        !           210: 
        !           211: #if defined( OLE_VERSION )
        !           212: 
        !           213:     /* OLE2NOTE: perform initialization required for OLE */
        !           214:     if (! OleApp_InitInstance((LPOLEAPP)lpOutlineApp, hInst, nCmdShow)) 
        !           215:         return FALSE;
        !           216: #else 
        !           217:        /* OLE2NOTE: Although no OLE call is made in the base outline,
        !           218:        **    OLE memory allocator is used and thus CoInitialize() neeed to
        !           219:        **    be called 
        !           220:        */
        !           221:        {
        !           222:                HRESULT hrErr;
        !           223:                
        !           224:                hrErr = CoInitialize(NULL);
        !           225:                if (hrErr != NOERROR) {
        !           226:                        OutlineApp_ErrorMessage(lpOutlineApp,
        !           227:                                        "CoInitialize initialization failed!");
        !           228:                        return FALSE;
        !           229:                }
        !           230:        }
        !           231: #endif
        !           232: 
        !           233:     return TRUE;
        !           234: }
        !           235: 
        !           236: 
        !           237: /* OutlineApp_ParseCmdLine
        !           238:  * -----------------------
        !           239:  *
        !           240:  * Parse the command line for any execution flags/arguments.
        !           241:  */
        !           242: BOOL OutlineApp_ParseCmdLine(LPOUTLINEAPP lpOutlineApp, LPSTR lpszCmdLine, int nCmdShow)
        !           243: {
        !           244: 
        !           245: #if defined( OLE_VERSION )
        !           246:     // Call OLE version of this function instead
        !           247:     return OleApp_ParseCmdLine((LPOLEAPP)lpOutlineApp,lpszCmdLine,nCmdShow);
        !           248: 
        !           249: #else   
        !           250: 
        !           251:     BOOL fStatus = TRUE;
        !           252:     char szFileName[256];   /* buffer for filename in command line */
        !           253:     
        !           254:     szFileName[0] = '\0';
        !           255:     ParseCmdLine(lpszCmdLine, NULL, (LPSTR)szFileName); 
        !           256: 
        !           257:     if(*szFileName) {
        !           258:         // allocate a new document
        !           259:         lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           260:         if (! lpOutlineApp->m_lpDoc) goto error;
        !           261: 
        !           262:         // open the specified file
        !           263:         if (! OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, szFileName))
        !           264:             goto error;
        !           265:     } else {
        !           266:         // create a new document
        !           267:         lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           268:         if (! lpOutlineApp->m_lpDoc) goto error;
        !           269: 
        !           270:         // set the doc to an (Untitled) doc.
        !           271:         if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !           272:             goto error;
        !           273:     }
        !           274: 
        !           275:     // position and size the new doc window
        !           276:     OutlineApp_ResizeWindows(lpOutlineApp);
        !           277:     OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc);
        !           278: 
        !           279:     // show main app window
        !           280:     ShowWindow(lpOutlineApp->m_hWndApp, nCmdShow);
        !           281:     UpdateWindow(lpOutlineApp->m_hWndApp);
        !           282: 
        !           283:     return TRUE;
        !           284:     
        !           285: error:
        !           286:     // REVIEW: should load string from string resource
        !           287:     OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
        !           288: 
        !           289:     if (lpOutlineApp->m_lpDoc) {
        !           290:         OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);  
        !           291:         lpOutlineApp->m_lpDoc = NULL;
        !           292:     }
        !           293: 
        !           294:     return FALSE;
        !           295: 
        !           296: #endif  
        !           297: }
        !           298: 
        !           299: 
        !           300: /* OutlineApp_InitMenu
        !           301:  * -------------------
        !           302:  *
        !           303:  *      Enable or Disable menu items depending on the state of 
        !           304:  * the appliation
        !           305:  */
        !           306: void OutlineApp_InitMenu(LPOUTLINEAPP lpOutlineApp, LPOUTLINEDOC lpOutlineDoc, HMENU hMenu)
        !           307: {
        !           308:     WORD status;
        !           309:     static UINT     uCurrentZoom = (UINT)-1;
        !           310:     static UINT     uCurrentMargin = (UINT)-1;
        !           311:     static UINT     uBBState = (UINT)-1;
        !           312:     static UINT     uFBState = (UINT)-1;
        !           313:     
        !           314:     if (!lpOutlineApp || !lpOutlineDoc || !hMenu)
        !           315:         return;
        !           316: 
        !           317:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_UNDO, MF_GRAYED);
        !           318:     
        !           319:     status = (WORD)(OutlineDoc_GetLineCount(lpOutlineDoc) ? MF_ENABLED : MF_GRAYED);
        !           320: 
        !           321:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_CUT ,status);
        !           322:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_COPY ,status);
        !           323:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_CLEAR ,status);
        !           324:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_SELECTALL ,status);
        !           325: 
        !           326:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_EDITLINE ,status);
        !           327:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_INDENTLINE ,status);
        !           328:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_UNINDENTLINE ,status);
        !           329:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_SETLINEHEIGHT ,status);
        !           330: 
        !           331:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_N_DEFINENAME ,status);
        !           332:     
        !           333:     status = (WORD)(OutlineDoc_GetNameCount(lpOutlineDoc) ? MF_ENABLED : MF_GRAYED);
        !           334: 
        !           335:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_N_GOTONAME, status);
        !           336:     
        !           337:     if (uCurrentZoom != (UINT)-1) 
        !           338:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentZoom, MF_UNCHECKED);
        !           339:     uCurrentZoom = OutlineDoc_GetCurrentZoomMenuCheck(lpOutlineDoc);
        !           340:     CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentZoom, MF_CHECKED);
        !           341: 
        !           342:     if (uCurrentMargin != (UINT)-1) 
        !           343:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentMargin, MF_UNCHECKED);
        !           344:     uCurrentMargin = OutlineDoc_GetCurrentMarginMenuCheck(lpOutlineDoc);
        !           345:     CheckMenuItem(lpOutlineApp->m_hMenuApp, uCurrentMargin, MF_CHECKED);
        !           346: 
        !           347: #if defined( USE_FRAMETOOLS )
        !           348:     if (uBBState != (UINT)-1) 
        !           349:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uBBState, MF_UNCHECKED);
        !           350:     if (lpOutlineDoc->m_lpFrameTools) {
        !           351:         switch (FrameTools_BB_GetState(lpOutlineDoc->m_lpFrameTools)) {
        !           352:             case BARSTATE_TOP:
        !           353:                 uBBState = IDM_O_BB_TOP;
        !           354:                 break;
        !           355:             case BARSTATE_BOTTOM:
        !           356:                 uBBState = IDM_O_BB_BOTTOM;
        !           357:                 break;
        !           358:             case BARSTATE_POPUP:
        !           359:                 uBBState = IDM_O_BB_POPUP;
        !           360:                 break;
        !           361:             case BARSTATE_HIDE:
        !           362:                 uBBState = IDM_O_BB_HIDE;
        !           363:                 break;
        !           364:         }        
        !           365:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uBBState, MF_CHECKED);
        !           366:     }
        !           367: 
        !           368:     if (uFBState != (UINT)-1) 
        !           369:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uFBState, MF_UNCHECKED);
        !           370:     if (lpOutlineDoc->m_lpFrameTools) {
        !           371:         switch (FrameTools_FB_GetState(lpOutlineDoc->m_lpFrameTools)) {
        !           372:             case BARSTATE_TOP:
        !           373:                 uFBState = IDM_O_FB_TOP;
        !           374:                 break;
        !           375:             case BARSTATE_BOTTOM:
        !           376:                 uFBState = IDM_O_FB_BOTTOM;
        !           377:                 break;
        !           378:             case BARSTATE_POPUP:
        !           379:                 uFBState = IDM_O_FB_POPUP;
        !           380:                 break;
        !           381:         }        
        !           382:         CheckMenuItem(lpOutlineApp->m_hMenuApp, uFBState, MF_CHECKED);
        !           383:     }
        !           384: #endif  // USE_FRAMETOOLS
        !           385: 
        !           386: #if defined( OLE_VERSION )
        !           387:     /* OLE2NOTE: perform OLE specific menu initialization.
        !           388:     **    the OLE versions use the OleGetClipboard mechanism for
        !           389:     **    clipboard handling. thus, they determine if the Paste and
        !           390:     **    PasteSpecial commands should be enabled in an OLE specific
        !           391:     **    manner.
        !           392:     **    (Container only) build the OLE object verb menu if necessary.
        !           393:     */
        !           394:     OleApp_InitMenu(
        !           395:             (LPOLEAPP)lpOutlineApp, 
        !           396:             (LPOLEDOC)lpOutlineDoc,
        !           397:             lpOutlineApp->m_hMenuApp
        !           398:     );
        !           399: 
        !           400:     /* OLE2NOTE: To avoid the overhead of initializing the Edit menu,
        !           401:     **    we do it only when it is popped up. Thus we just set a flag 
        !           402:     **    in the OleDoc saying that the Edit menu needs to be updated
        !           403:     **    but we don't do it immediately 
        !           404:     */
        !           405:     OleDoc_SetUpdateEditMenuFlag((LPOLEDOC)lpOutlineDoc, TRUE); 
        !           406:     
        !           407: #else 
        !           408:     // Base Outline version uses standard Windows clipboard handling
        !           409:     if(IsClipboardFormatAvailable(lpOutlineApp->m_cfOutline) || 
        !           410:        IsClipboardFormatAvailable(CF_TEXT))
        !           411:         status = MF_ENABLED;
        !           412:     else 
        !           413:         status = MF_GRAYED;
        !           414:     EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_E_PASTE, status);
        !           415: 
        !           416: #endif
        !           417: 
        !           418: #if defined( USE_FRAMETOOLS )
        !           419:     if (! OutlineDoc_IsEditFocusInFormulaBar(lpOutlineDoc)) {
        !           420:         EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_ADDLINE, MF_GRAYED);
        !           421:         EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_EDITLINE, MF_GRAYED);
        !           422:     }
        !           423:     else 
        !           424:         EnableMenuItem(lpOutlineApp->m_hMenuApp, IDM_L_ADDLINE, MF_ENABLED);
        !           425:     
        !           426: #endif      // USE_FRAMETOOLS
        !           427: 
        !           428: }
        !           429: 
        !           430: 
        !           431: /* OutlineApp_GetWindow
        !           432:  * --------------------
        !           433:  *
        !           434:  *      Get the window handle of the application frame.
        !           435:  */
        !           436: HWND OutlineApp_GetWindow(LPOUTLINEAPP lpOutlineApp)
        !           437: {
        !           438:     if (!lpOutlineApp) 
        !           439:         return NULL;
        !           440:     
        !           441:     return lpOutlineApp->m_hWndApp;
        !           442: }
        !           443: 
        !           444: 
        !           445: /* OutlineApp_GetFrameWindow
        !           446: ** -------------------------
        !           447: **    Gets the current frame window to use as a parent to any dialogs
        !           448: **    this app uses.  
        !           449: **    
        !           450: **    OLE2NOTE: normally this is simply the main hWnd of the app. but,
        !           451: **    if the app is currently supporting an in-place server document,
        !           452: **    then the frame window of the top in-place container must be used.
        !           453: */
        !           454: HWND OutlineApp_GetFrameWindow(LPOUTLINEAPP lpOutlineApp)
        !           455: {         
        !           456:     HWND hWndApp = OutlineApp_GetWindow(lpOutlineApp);
        !           457: 
        !           458: #if defined( INPLACE_SVR )
        !           459:     LPSERVERDOC lpServerDoc = 
        !           460:             (LPSERVERDOC)OutlineApp_GetActiveDoc(lpOutlineApp);
        !           461:     if (lpServerDoc && lpServerDoc->m_fUIActive) 
        !           462:         return lpServerDoc->m_lpIPData->frameInfo.hwndFrame;
        !           463: #endif
        !           464: 
        !           465:     return hWndApp;
        !           466: }
        !           467: 
        !           468: 
        !           469: /* OutlineApp_GetInstance
        !           470:  * ----------------------
        !           471:  *
        !           472:  *      Get the process instance of the application.
        !           473:  */
        !           474: HINSTANCE OutlineApp_GetInstance(LPOUTLINEAPP lpOutlineApp)
        !           475: {
        !           476:     if (!lpOutlineApp) 
        !           477:         return NULL;
        !           478:     
        !           479:     return lpOutlineApp->m_hInst;
        !           480: }
        !           481: 
        !           482: 
        !           483: /* OutlineApp_CreateDoc
        !           484:  * --------------------
        !           485:  *
        !           486:  * Allocate a new document of the appropriate type.
        !           487:  *  OutlineApp  --> creates OutlineDoc type documents
        !           488:  *
        !           489:  *      Returns lpOutlineDoc for successful, NULL if error.
        !           490:  */
        !           491: LPOUTLINEDOC OutlineApp_CreateDoc(
        !           492:         LPOUTLINEAPP    lpOutlineApp, 
        !           493:         BOOL            fDataTransferDoc
        !           494: )
        !           495: {
        !           496:     LPOUTLINEDOC lpOutlineDoc;
        !           497: 
        !           498:     OLEDBG_BEGIN3("OutlineApp_CreateDoc\r\n")
        !           499:     
        !           500: #if defined( OLE_SERVER )
        !           501:     lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(SERVERDOC));
        !           502: #elif defined( OLE_CNTR )
        !           503:     lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(CONTAINERDOC));
        !           504: #else 
        !           505:     lpOutlineDoc = (LPOUTLINEDOC)New((DWORD)sizeof(OUTLINEDOC));
        !           506: #endif  
        !           507: 
        !           508:     if (! OleDbgVerifySz(lpOutlineDoc != NULL, "Error allocating OutlineDoc"))
        !           509:         return NULL;
        !           510: 
        !           511:     // initialize new document
        !           512:     if (! OutlineDoc_Init(lpOutlineDoc, fDataTransferDoc))
        !           513:         goto error;
        !           514: 
        !           515:     OLEDBG_END3
        !           516:     return lpOutlineDoc;
        !           517:     
        !           518: error:
        !           519:     if (lpOutlineDoc) 
        !           520:         Delete(lpOutlineDoc);
        !           521: 
        !           522:     OLEDBG_END3
        !           523:     return NULL;
        !           524: }
        !           525: 
        !           526: 
        !           527: /* OutlineApp_CreateName
        !           528:  * ---------------------
        !           529:  *
        !           530:  * Allocate a new Name of the appropriate type. 
        !           531:  *  OutlineApp --> creates standard OutlineName type names.
        !           532:  *  ServerApp  --> creates enhanced SeverName type names.
        !           533:  *
        !           534:  *      Returns lpOutlineName for successful, NULL if error.
        !           535:  */
        !           536: LPOUTLINENAME OutlineApp_CreateName(LPOUTLINEAPP lpOutlineApp)
        !           537: {
        !           538:     LPOUTLINENAME lpOutlineName;
        !           539:     
        !           540: #if defined( OLE_SERVER )
        !           541:     lpOutlineName = (LPOUTLINENAME)New((DWORD)sizeof(SERVERNAME));
        !           542: #else 
        !           543:     lpOutlineName = (LPOUTLINENAME)New((DWORD)sizeof(OUTLINENAME));
        !           544: #endif 
        !           545: 
        !           546:     if (! OleDbgVerifySz(lpOutlineName != NULL, "Error allocating Name"))
        !           547:         return NULL;
        !           548: 
        !           549: #if defined( OLE_SERVER )
        !           550:     _fmemset((LPVOID)lpOutlineName,0,sizeof(SERVERNAME));
        !           551: #else 
        !           552:     _fmemset((LPVOID)lpOutlineName,0,sizeof(OUTLINENAME));
        !           553: #endif 
        !           554: 
        !           555:     return lpOutlineName;
        !           556: }
        !           557: 
        !           558: 
        !           559: /* OutlineApp_DocUnlockApp
        !           560: ** -----------------------
        !           561: **    Forget all references to a closed document.
        !           562: */
        !           563: void OutlineApp_DocUnlockApp(LPOUTLINEAPP lpOutlineApp, LPOUTLINEDOC lpOutlineDoc)
        !           564: {
        !           565:     /* forget pointers to destroyed document */
        !           566:     if (lpOutlineApp->m_lpDoc == lpOutlineDoc) 
        !           567:         lpOutlineApp->m_lpDoc = NULL;
        !           568:     else if (lpOutlineApp->m_lpClipboardDoc == lpOutlineDoc) 
        !           569:         lpOutlineApp->m_lpClipboardDoc = NULL;
        !           570: 
        !           571: #if defined( OLE_VERSION )
        !           572:     /* OLE2NOTE: when there are no open documents and the app is not
        !           573:     **    under the control of the user then revoke our ClassFactory to
        !           574:     **    enable the app to shut down.
        !           575:     **    
        !           576:     **    NOTE: data transfer documents (non-user documents) do NOT
        !           577:     **    hold the app alive. therefore they do not Lock the app.
        !           578:     */
        !           579:     if (! lpOutlineDoc->m_fDataTransferDoc)
        !           580:         OleApp_DocUnlockApp((LPOLEAPP)lpOutlineApp, lpOutlineDoc);
        !           581: #endif  
        !           582: }
        !           583: 
        !           584: 
        !           585: /* OutlineApp_NewCommand
        !           586:  * ---------------------
        !           587:  *
        !           588:  *  Start a new untitled document (File.New command).
        !           589:  */
        !           590: void OutlineApp_NewCommand(LPOUTLINEAPP lpOutlineApp)
        !           591: {
        !           592: #if defined( OLE_VERSION )
        !           593:     // Call OLE version of this function instead
        !           594:     OleApp_NewCommand((LPOLEAPP)lpOutlineApp);
        !           595: 
        !           596: #else   
        !           597: 
        !           598:     LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
        !           599: 
        !           600:     if (! OutlineDoc_Close(lpOutlineDoc, OLECLOSE_PROMPTSAVE)) 
        !           601:         return;
        !           602: 
        !           603:     OleDbgAssertSz(lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
        !           604: 
        !           605:     lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           606:     if (! lpOutlineApp->m_lpDoc) goto error;
        !           607: 
        !           608:     // set the doc to an (Untitled) doc.
        !           609:     if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !           610:         goto error;
        !           611: 
        !           612:     // position and size the new doc window
        !           613:     OutlineApp_ResizeWindows(lpOutlineApp);
        !           614:     OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc); // calls OleDoc_Lock
        !           615: 
        !           616:     return;
        !           617:     
        !           618: error:
        !           619:     // REVIEW: should load string from string resource
        !           620:     OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
        !           621: 
        !           622:     if (lpOutlineApp->m_lpDoc) {
        !           623:         OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);  
        !           624:         lpOutlineApp->m_lpDoc = NULL;
        !           625:     }
        !           626: 
        !           627:     return;
        !           628: 
        !           629: #endif  
        !           630: }
        !           631: 
        !           632: 
        !           633: /* OutlineApp_OpenCommand
        !           634:  * ----------------------
        !           635:  *
        !           636:  *  Load a document from file (File.Open command).
        !           637:  */
        !           638: void OutlineApp_OpenCommand(LPOUTLINEAPP lpOutlineApp)
        !           639: {
        !           640: #if defined( OLE_VERSION )
        !           641:     // Call OLE version of this function instead
        !           642:     OleApp_OpenCommand((LPOLEAPP)lpOutlineApp);
        !           643: 
        !           644: #else   
        !           645: 
        !           646:     OPENFILENAME ofn;
        !           647:     char szFilter[]=APPFILENAMEFILTER;
        !           648:     char szFileName[256];
        !           649:     UINT i;
        !           650:     BOOL fStatus = TRUE;
        !           651: 
        !           652:     if (! OutlineDoc_CheckSaveChanges(lpOutlineApp->m_lpDoc, OLECLOSE_PROMPTSAVE))
        !           653:         return;           // abort opening new doc
        !           654: 
        !           655:     for(i=0; szFilter[i]; i++)
        !           656:         if(szFilter[i]=='|') szFilter[i]='\0';
        !           657: 
        !           658:     _fmemset((LPOPENFILENAME)&ofn,0,sizeof(OPENFILENAME));
        !           659: 
        !           660:     szFileName[0]='\0';
        !           661: 
        !           662:     ofn.lStructSize=sizeof(OPENFILENAME);
        !           663:     ofn.hwndOwner=lpOutlineApp->m_hWndApp;
        !           664:     ofn.lpstrFilter=(LPSTR)szFilter;
        !           665:     ofn.lpstrFile=(LPSTR)szFileName;
        !           666:     ofn.nMaxFile=sizeof(szFileName);
        !           667:     ofn.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
        !           668:     ofn.lpstrDefExt=DEFEXTENSION;
        !           669: 
        !           670:     if(! GetOpenFileName((LPOPENFILENAME)&ofn)) 
        !           671:         return;         // user canceled file open dialog
        !           672: 
        !           673:     OutlineDoc_Close(lpOutlineApp->m_lpDoc, OLECLOSE_NOSAVE);
        !           674:     OleDbgAssertSz(
        !           675:             lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
        !           676: 
        !           677:     lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           678:     if (! lpOutlineApp->m_lpDoc) goto error;
        !           679: 
        !           680:     fStatus=OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, (LPSTR)szFileName);
        !           681: 
        !           682:     if (! fStatus) {
        !           683:         // loading the doc failed; create an untitled instead
        !           684:         OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);  // destroy unused doc
        !           685:         lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           686:         if (! lpOutlineApp->m_lpDoc) goto error;
        !           687:         if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !           688:             goto error;
        !           689:     }
        !           690: 
        !           691:     // position and size the new doc window
        !           692:     OutlineApp_ResizeWindows(lpOutlineApp);
        !           693:     OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc);
        !           694: 
        !           695:     return;
        !           696: 
        !           697: error:
        !           698:     // REVIEW: should load string from string resource
        !           699:     OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
        !           700: 
        !           701:     if (lpOutlineApp->m_lpDoc) {
        !           702:         OutlineDoc_Destroy(lpOutlineApp->m_lpDoc);  
        !           703:         lpOutlineApp->m_lpDoc = NULL;
        !           704:     }
        !           705: 
        !           706:     return;
        !           707: 
        !           708: #endif 
        !           709: }
        !           710: 
        !           711: 
        !           712: /* OutlineApp_PrintCommand
        !           713:  * -----------------------
        !           714:  *
        !           715:  *      Print the document
        !           716:  */
        !           717: void OutlineApp_PrintCommand(LPOUTLINEAPP lpOutlineApp)
        !           718: {
        !           719:     LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
        !           720:     HDC hDC=NULL;
        !           721:     BOOL    fMustDeleteDC = FALSE;
        !           722: 
        !           723:     if (!PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg)) {
        !           724:         if (!CommDlgExtendedError()) {      // Cancel button pressed
        !           725:             return;
        !           726:         }
        !           727:     }
        !           728:     else {
        !           729:         hDC = OutlineApp_GetPrinterDC(lpOutlineApp);
        !           730:         if (hDC) {
        !           731:             
        !           732: #if defined( OLE_VERSION )
        !           733:             /* OLE2NOTE: while we are printing we do NOT want to
        !           734:             **    receive any OnDataChange notifications or other OLE
        !           735:             **    interface calls which could disturb the printing of
        !           736:             **    the document. we will temporarily reply
        !           737:             **    SERVERCALL_RETRYLATER
        !           738:             */
        !           739:             OleApp_RejectInComingCalls((LPOLEAPP)lpOutlineApp, TRUE);
        !           740: #endif      
        !           741: 
        !           742:             OutlineDoc_Print(lpOutlineDoc, hDC);   
        !           743:             DeleteDC(hDC);
        !           744:             
        !           745: #if defined( OLE_VERSION )
        !           746:             // re-enable LRPC calls
        !           747:             OleApp_RejectInComingCalls((LPOLEAPP)lpOutlineApp, FALSE);
        !           748: #endif      
        !           749:             
        !           750:             return;                         // Printing completed
        !           751:         }
        !           752:     }
        !           753: 
        !           754:     // REVIEW: should load string from string resource
        !           755:     OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgPrinting);
        !           756: }
        !           757: 
        !           758: 
        !           759: /* OutlineApp_PrinterSetupCommand
        !           760:  * ------------------------------
        !           761:  *
        !           762:  *      Setup a different printer for printing
        !           763:  */
        !           764: void OutlineApp_PrinterSetupCommand(LPOUTLINEAPP lpOutlineApp)
        !           765: {
        !           766:     DWORD FlagSave;
        !           767: 
        !           768:     FlagSave = lpOutlineApp->m_PrintDlg.Flags;
        !           769:     lpOutlineApp->m_PrintDlg.Flags |= PD_PRINTSETUP;
        !           770:     PrintDlg((LPPRINTDLG)&lpOutlineApp->m_PrintDlg);
        !           771:     lpOutlineApp->m_PrintDlg.Flags = FlagSave;
        !           772: }
        !           773: 
        !           774: /*
        !           775:  *  FUNCTION   : OutlineApp_GetPrinterDC ()
        !           776:  * 
        !           777:  *  PURPOSE    : Creates a printer display context for the printer
        !           778:  * 
        !           779:  *  RETURNS    : HDC   - A handle to printer DC.
        !           780:  */
        !           781: HDC OutlineApp_GetPrinterDC(LPOUTLINEAPP lpApp)
        !           782: {
        !           783: 
        !           784:     HDC         hDC;
        !           785:     LPDEVMODE   lpDevMode = NULL;
        !           786:     LPDEVNAMES  lpDevNames;
        !           787:     LPSTR       lpszDriverName;
        !           788:     LPSTR       lpszDeviceName;
        !           789:     LPSTR       lpszPortName;
        !           790: 
        !           791:     if(lpApp->m_PrintDlg.hDC) {
        !           792:         hDC = lpApp->m_PrintDlg.hDC;
        !           793:     } else {
        !           794:         if(! lpApp->m_PrintDlg.hDevNames) 
        !           795:             return(NULL);
        !           796:         lpDevNames = (LPDEVNAMES)GlobalLock(lpApp->m_PrintDlg.hDevNames);
        !           797:         lpszDriverName = (LPSTR)lpDevNames + lpDevNames->wDriverOffset;
        !           798:         lpszDeviceName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset;
        !           799:         lpszPortName   = (LPSTR)lpDevNames + lpDevNames->wOutputOffset;
        !           800:         GlobalUnlock(lpApp->m_PrintDlg.hDevNames);
        !           801: 
        !           802:         if(lpApp->m_PrintDlg.hDevMode)
        !           803:             lpDevMode = (LPDEVMODE)GlobalLock(lpApp->m_PrintDlg.hDevMode);
        !           804: #if defined( WIN32 )
        !           805:         hDC = CreateDC(
        !           806:                 lpszDriverName, 
        !           807:                 lpszDeviceName,
        !           808:                 lpszPortName,
        !           809:                 (CONST DEVMODE FAR*)lpDevMode);
        !           810: #else 
        !           811:         hDC = CreateDC(
        !           812:                 lpszDriverName, 
        !           813:                 lpszDeviceName,
        !           814:                 lpszPortName,
        !           815:                 (LPSTR)lpDevMode);
        !           816: #endif
        !           817: 
        !           818:         if(lpApp->m_PrintDlg.hDevMode && lpDevMode)
        !           819:             GlobalUnlock(lpApp->m_PrintDlg.hDevMode);    
        !           820:     }
        !           821: 
        !           822:     return(hDC);
        !           823: }
        !           824: 
        !           825: 
        !           826: /* OutlineApp_SaveCommand
        !           827:  * ----------------------
        !           828:  *
        !           829:  *      Save the document with same name. If no name exists, prompt the user
        !           830:  *      for a name (via SaveAsCommand)
        !           831:  *
        !           832:  *  Parameters:
        !           833:  *
        !           834:  *  Returns:
        !           835:  *      TRUE    if succesfully
        !           836:  *      FALSE   if failed or aborted
        !           837:  */
        !           838: BOOL OutlineApp_SaveCommand(LPOUTLINEAPP lpOutlineApp)
        !           839: {
        !           840:     LPOUTLINEDOC lpOutlineDoc = OutlineApp_GetActiveDoc(lpOutlineApp);
        !           841: 
        !           842:     if(lpOutlineDoc->m_docInitType == DOCTYPE_NEW)  /* file with no name */
        !           843:         return OutlineApp_SaveAsCommand(lpOutlineApp);
        !           844: 
        !           845: 
        !           846:     if(OutlineDoc_IsModified(lpOutlineDoc)) {
        !           847: 
        !           848: #if defined( OLE_SERVER )
        !           849: 
        !           850:         if (lpOutlineDoc->m_docInitType == DOCTYPE_EMBEDDED) {
        !           851:             LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc;
        !           852:             HRESULT hrErr;
        !           853: 
        !           854:             /* OLE2NOTE: if the document is an embedded object, then
        !           855:             **    the "File.Save" command is changed to "File.Update".
        !           856:             **    in order to update our container, we must ask our
        !           857:             **    container to save us.
        !           858:             */
        !           859:             OleDbgAssert(lpServerDoc->m_lpOleClientSite != NULL);
        !           860:             OLEDBG_BEGIN2("IOleClientSite::SaveObject called\r\n")
        !           861:             hrErr = lpServerDoc->m_lpOleClientSite->lpVtbl->SaveObject(
        !           862:                     lpServerDoc->m_lpOleClientSite
        !           863:             );
        !           864:             OLEDBG_END2
        !           865: 
        !           866:             if (hrErr != NOERROR) {
        !           867:                 OleDbgOutHResult("IOleClientSite::SaveObject returned",hrErr);
        !           868:                 return FALSE;
        !           869:             }
        !           870:         } else 
        !           871:             // document is file-base user document, save it to its file.
        !           872: 
        !           873: #endif      // OLE_SERVER
        !           874: 
        !           875:         (void)OutlineDoc_SaveToFile(
        !           876:                 lpOutlineDoc, 
        !           877:                 NULL, 
        !           878:                 lpOutlineDoc->m_cfSaveFormat, 
        !           879:                 TRUE
        !           880:         );
        !           881:     }
        !           882:     
        !           883:     return TRUE;
        !           884: }
        !           885: 
        !           886: 
        !           887: /* OutlineApp_SaveAsCommand
        !           888:  * ------------------------
        !           889:  *
        !           890:  *      Save the document as another name
        !           891:  *
        !           892:  *  Parameters:
        !           893:  *
        !           894:  *  Returns:
        !           895:  *      TRUE    if saved successful
        !           896:  *      FALSE   if failed or aborted
        !           897:  */
        !           898: BOOL OutlineApp_SaveAsCommand(LPOUTLINEAPP lpOutlineApp)
        !           899: {
        !           900:     LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
        !           901:     OPENFILENAME ofn;
        !           902:     char szFilter[]=APPFILENAMEFILTER;
        !           903:     char szFileName[256]="";
        !           904:     int i;
        !           905:     UINT uFormat;
        !           906:     BOOL fNoError = TRUE;
        !           907:     BOOL fRemember = TRUE;
        !           908: 
        !           909:     for(i=0; szFilter[i]; i++)
        !           910:         if(szFilter[i]=='|') szFilter[i]='\0';
        !           911: 
        !           912:     _fmemset((LPOPENFILENAME)&ofn,0,sizeof(OPENFILENAME));
        !           913: 
        !           914:     ofn.lStructSize=sizeof(OPENFILENAME);
        !           915:     ofn.hwndOwner=lpOutlineDoc->m_hWndDoc;
        !           916:     ofn.lpstrFilter=(LPSTR)szFilter;
        !           917:     ofn.lpstrFile=(LPSTR)szFileName;
        !           918:     ofn.nMaxFile=sizeof(szFileName);
        !           919: 
        !           920:     ofn.Flags=OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
        !           921:     ofn.lpstrDefExt=DEFEXTENSION;
        !           922: 
        !           923:     if (GetSaveFileName((LPOPENFILENAME)&ofn)) {
        !           924: 
        !           925: #if defined( OLE_CNTR )
        !           926:         // determine which file type the user selected.
        !           927:         switch (ofn.nFilterIndex) {
        !           928:             case 1:
        !           929:                 uFormat = ((LPCONTAINERAPP)lpOutlineApp)->m_cfCntrOutl;
        !           930:                 break;
        !           931:             case 2:
        !           932:                 uFormat = lpOutlineApp->m_cfOutline;
        !           933:                 break;
        !           934:             default:
        !           935:                 uFormat = ((LPCONTAINERAPP)lpOutlineApp)->m_cfCntrOutl;
        !           936:                 break;
        !           937:         }
        !           938: #else 
        !           939:         uFormat = lpOutlineApp->m_cfOutline;
        !           940: #endif      
        !           941: 
        !           942: #if defined( OLE_SERVER )
        !           943:         /* OLE2NOTE: if the document is an embedded object, then the
        !           944:         **    File.SaveAs command is changed to File.SaveCopyAs. with the
        !           945:         **    Save Copy As operation, the document does NOT remember the
        !           946:         **    saved file as the associated file for the document.
        !           947:         */
        !           948:         if (lpOutlineDoc->m_docInitType == DOCTYPE_EMBEDDED) 
        !           949:             fRemember = FALSE;
        !           950: #endif 
        !           951: 
        !           952:         (void)OutlineDoc_SaveToFile(
        !           953:                 lpOutlineDoc, 
        !           954:                 szFileName, 
        !           955:                 uFormat,
        !           956:                 fRemember
        !           957:         );
        !           958:     
        !           959:     } 
        !           960:     else
        !           961:         fNoError = FALSE;
        !           962:     
        !           963:     return fNoError;
        !           964: 
        !           965: }
        !           966: 
        !           967: 
        !           968: /* OutlineApp_AboutCommand
        !           969:  * -----------------------
        !           970:  *
        !           971:  *      Show the About dialog box
        !           972:  */
        !           973: void OutlineApp_AboutCommand(LPOUTLINEAPP lpOutlineApp)
        !           974: {
        !           975:     DialogBox(
        !           976:             lpOutlineApp->m_hInst, 
        !           977:             (LPSTR)"About", 
        !           978:             OutlineApp_GetFrameWindow(lpOutlineApp),
        !           979:             (DLGPROC)AboutDlgProc
        !           980:     );
        !           981: }
        !           982: 
        !           983: 
        !           984: /* OutlineApp_CloseAllDocsAndExitCommand
        !           985:  * -------------------------------------
        !           986:  *
        !           987:  *  Close all active documents and exit the app. 
        !           988:  *  Because this is an SDI, there is only one document
        !           989:  *  If the doc was modified, prompt the user if he wants to save it.
        !           990:  *
        !           991:  *  Returns:
        !           992:  *      TRUE if the app is successfully closed
        !           993:  *      FALSE if failed or aborted
        !           994:  */
        !           995: BOOL OutlineApp_CloseAllDocsAndExitCommand(LPOUTLINEAPP lpOutlineApp)
        !           996: {
        !           997:     BOOL fResult;
        !           998:     
        !           999:     OLEDBG_BEGIN2("OutlineApp_CloseAllDocsAndExitCommand\r\n")
        !          1000: 
        !          1001: #if defined( OLE_VERSION )
        !          1002:     // Call OLE specific version of this function
        !          1003:     fResult = OleApp_CloseAllDocsAndExitCommand((LPOLEAPP)lpOutlineApp);
        !          1004: 
        !          1005: #else 
        !          1006: 
        !          1007:     /* Because this is an SDI app, there is only one document.
        !          1008:     ** Close the doc. if it is successfully closed and the app will
        !          1009:     ** not automatically exit, then also exit the app.
        !          1010:     ** if this were an MDI app, we would loop through and close all
        !          1011:     ** open MDI child documents.
        !          1012:     */
        !          1013:     if (OutlineDoc_Close(lpOutlineApp->m_lpDoc, OLECLOSE_PROMPTSAVE)) {
        !          1014:     
        !          1015:         OleDbgAssertSz(
        !          1016:                 lpOutlineApp->m_lpDoc==NULL,
        !          1017:                 "Closed doc NOT properly destroyed"
        !          1018:         );
        !          1019: 
        !          1020:         OutlineApp_Destroy(lpOutlineApp);
        !          1021:         fResult = TRUE;
        !          1022: 
        !          1023:     } // else User Canceled shutdown
        !          1024:     else
        !          1025:         fResult = FALSE;
        !          1026:     
        !          1027: #endif  
        !          1028: 
        !          1029:     OLEDBG_END2
        !          1030:         
        !          1031:     return fResult;
        !          1032: }
        !          1033: 
        !          1034: 
        !          1035: /* OutlineApp_Destroy
        !          1036:  * ------------------
        !          1037:  *
        !          1038:  *      Destroy all data structures used by the app and force the 
        !          1039:  * app to shut down. This should be called after all documents have 
        !          1040:  * been closed.
        !          1041:  */
        !          1042: void OutlineApp_Destroy(LPOUTLINEAPP lpOutlineApp)
        !          1043: {
        !          1044:     OLEDBG_BEGIN3("OutlineApp_Destroy\r\n");
        !          1045: 
        !          1046: #if defined( OLE_VERSION )
        !          1047:     /* OLE2NOTE: perform processing required for OLE */
        !          1048:     OleApp_Destroy((LPOLEAPP)lpOutlineApp);
        !          1049: #endif
        !          1050: 
        !          1051:     SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
        !          1052:     DestroyCursor(lpOutlineApp->m_hcursorSelCur);
        !          1053: 
        !          1054: #if defined( USE_FRAMETOOLS )
        !          1055:     FrameTools_Destroy(&lpOutlineApp->m_frametools);
        !          1056: #endif  
        !          1057:     
        !          1058:     DeleteObject(lpOutlineApp->m_hStdFont);
        !          1059:     if(lpOutlineApp->m_PrintDlg.hDevMode)
        !          1060:         GlobalFree(lpOutlineApp->m_PrintDlg.hDevMode);
        !          1061:     if(lpOutlineApp->m_PrintDlg.hDevNames)
        !          1062:         GlobalFree(lpOutlineApp->m_PrintDlg.hDevNames);
        !          1063: 
        !          1064: #if defined( USE_STATUSBAR )
        !          1065:     if(lpOutlineApp->m_hWndStatusBar) {
        !          1066:         DestroyStatusWindow(lpOutlineApp->m_hWndStatusBar);
        !          1067:         lpOutlineApp->m_hWndStatusBar = NULL;
        !          1068:     }
        !          1069: #endif 
        !          1070: 
        !          1071:     OutlineApp_DestroyWindow(lpOutlineApp);
        !          1072: 
        !          1073:     OleDbgOut1("@@@@ APP DESTROYED\r\n");
        !          1074:     
        !          1075:     OLEDBG_END3
        !          1076: }
        !          1077: 
        !          1078: 
        !          1079: /* OutlineApp_DestroyWindow
        !          1080:  * ------------------------
        !          1081:  *
        !          1082:  *  Destroy all windows created by the App.
        !          1083:  */
        !          1084: void OutlineApp_DestroyWindow(LPOUTLINEAPP lpOutlineApp)
        !          1085: {
        !          1086:     HWND hWndApp = lpOutlineApp->m_hWndApp;
        !          1087: 
        !          1088:     if(hWndApp) {
        !          1089:         lpOutlineApp->m_hWndApp = NULL;
        !          1090:         lpOutlineApp->m_hWndAccelTarget = NULL;
        !          1091:         DestroyWindow(hWndApp);  /* Quit the app */
        !          1092:     }
        !          1093: }
        !          1094: 
        !          1095: 
        !          1096: /* OutlineApp_GetFrameRect
        !          1097: ** -----------------------
        !          1098: **    Get the rectangle of the app frame window EXCLUDING space for the
        !          1099: **    status line.
        !          1100: **    
        !          1101: **    OLE2NOTE: this is the rectangle that an in-place container can
        !          1102: **    offer to an in-place active object from which to get frame tool
        !          1103: **    space. 
        !          1104: */
        !          1105: void OutlineApp_GetFrameRect(LPOUTLINEAPP lpOutlineApp, LPRECT lprcFrameRect)
        !          1106: {
        !          1107:     GetClientRect(lpOutlineApp->m_hWndApp, lprcFrameRect);
        !          1108: 
        !          1109: #if defined( USE_STATUSBAR )
        !          1110:     lprcFrameRect->bottom -= STATUS_HEIGHT;
        !          1111: #endif 
        !          1112: 
        !          1113: }
        !          1114: 
        !          1115: 
        !          1116: /* OutlineApp_GetClientAreaRect
        !          1117: ** ----------------------------
        !          1118: **    Get the rectangle of the app frame window EXCLUDING space for the
        !          1119: **    status line AND EXCLUDING space for any frame-level tools.
        !          1120: **    
        !          1121: **    OLE2NOTE: this is the rectangle that an in-place container gives
        !          1122: **    to its in-place active object as the lpClipRect in
        !          1123: **    IOleInPlaceSite::GetWindowContext. 
        !          1124: */
        !          1125: void OutlineApp_GetClientAreaRect(
        !          1126:         LPOUTLINEAPP        lpOutlineApp, 
        !          1127:         LPRECT              lprcClientAreaRect
        !          1128: )
        !          1129: {
        !          1130:     OutlineApp_GetFrameRect(lpOutlineApp, lprcClientAreaRect);
        !          1131: 
        !          1132:     /* if the app either uses frame-level tools itself or, as in-place
        !          1133:     **    container, is prepared to allow an in-place active object to
        !          1134:     **    have space for tools, then it must subtract away the space
        !          1135:     **    required for the tools.
        !          1136:     */
        !          1137: #if defined ( USE_FRAMETOOLS ) || defined ( INPLACE_CNTR )
        !          1138: 
        !          1139:     lprcClientAreaRect->top    += lpOutlineApp->m_FrameToolWidths.top;
        !          1140:     lprcClientAreaRect->left   += lpOutlineApp->m_FrameToolWidths.left;
        !          1141:     lprcClientAreaRect->right  -= lpOutlineApp->m_FrameToolWidths.right;
        !          1142:     lprcClientAreaRect->bottom -= lpOutlineApp->m_FrameToolWidths.bottom;
        !          1143: #endif  // USE_FRAMETOOLS || INPLACE_CNTR
        !          1144: 
        !          1145: }
        !          1146: 
        !          1147: 
        !          1148: /* OutlineApp_GetStatusLineRect
        !          1149: ** ----------------------------
        !          1150: **    Get the rectangle required for the status line.
        !          1151: **    
        !          1152: **    OLE2NOTE: the top frame-level in-place container displays its
        !          1153: **    status line even when an object is active in-place.
        !          1154: */
        !          1155: void OutlineApp_GetStatusLineRect(
        !          1156:         LPOUTLINEAPP        lpOutlineApp, 
        !          1157:         LPRECT              lprcStatusLineRect
        !          1158: )
        !          1159: {   
        !          1160:     RECT rcFrameRect;
        !          1161:     GetClientRect(lpOutlineApp->m_hWndApp, (LPRECT)&rcFrameRect);
        !          1162:     lprcStatusLineRect->left    = rcFrameRect.left;
        !          1163:     lprcStatusLineRect->top     = rcFrameRect.bottom - STATUS_HEIGHT;
        !          1164:     lprcStatusLineRect->right   = rcFrameRect.right;
        !          1165:     lprcStatusLineRect->bottom  = rcFrameRect.bottom;
        !          1166: }
        !          1167: 
        !          1168: 
        !          1169: /* OutlineApp_ResizeWindows
        !          1170:  * ------------------------
        !          1171:  *
        !          1172:  * Changes the size and position of the SDI document and tool windows.
        !          1173:  * Normally called on a WM_SIZE message.
        !          1174:  *
        !          1175:  * Currently the app supports a status bar and a single SDI document window.
        !          1176:  * In the future it will have a formula bar and possibly multiple MDI
        !          1177:  * document windows.
        !          1178:  *
        !          1179:  * CUSTOMIZATION: Change positions of windows.
        !          1180:  */
        !          1181: void OutlineApp_ResizeWindows(LPOUTLINEAPP lpOutlineApp)
        !          1182: {
        !          1183:     LPOUTLINEDOC lpOutlineDoc = OutlineApp_GetActiveDoc(lpOutlineApp);
        !          1184:     RECT rcStatusLineRect;
        !          1185: 
        !          1186:     if (! lpOutlineApp) 
        !          1187:         return;
        !          1188: 
        !          1189: #if defined( INPLACE_CNTR )
        !          1190:     if (lpOutlineDoc) 
        !          1191:         ContainerDoc_FrameWindowResized((LPCONTAINERDOC)lpOutlineDoc);
        !          1192: #elif defined( USE_FRAMETOOLS )
        !          1193:     if (lpOutlineDoc) 
        !          1194:         OutlineDoc_AddFrameLevelTools(lpOutlineDoc);
        !          1195: #else 
        !          1196:     OutlineApp_ResizeClientArea(lpOutlineApp);
        !          1197: #endif
        !          1198: 
        !          1199: #if defined( USE_STATUSBAR )
        !          1200:     if (lpOutlineApp->m_hWndStatusBar) {
        !          1201:         OutlineApp_GetStatusLineRect(lpOutlineApp, (LPRECT)&rcStatusLineRect);
        !          1202:         MoveWindow(
        !          1203:                 lpOutlineApp->m_hWndStatusBar, 
        !          1204:                 rcStatusLineRect.left,
        !          1205:                 rcStatusLineRect.top,
        !          1206:                 rcStatusLineRect.right - rcStatusLineRect.left,
        !          1207:                 rcStatusLineRect.bottom - rcStatusLineRect.top,
        !          1208:                 TRUE    /* fRepaint */
        !          1209:             );
        !          1210:     }
        !          1211: #endif  // USE_STATUSBAR
        !          1212: }
        !          1213: 
        !          1214: 
        !          1215: #if defined( USE_FRAMETOOLS ) || defined( INPLACE_CNTR )
        !          1216: 
        !          1217: void OutlineApp_SetBorderSpace(
        !          1218:         LPOUTLINEAPP        lpOutlineApp, 
        !          1219:         LPBORDERWIDTHS      lpBorderWidths
        !          1220: )
        !          1221: {
        !          1222:     lpOutlineApp->m_FrameToolWidths = *lpBorderWidths;
        !          1223:     OutlineApp_ResizeClientArea(lpOutlineApp);
        !          1224: }
        !          1225: #endif  // USE_FRAMETOOLS || INPLACE_CNTR
        !          1226: 
        !          1227: 
        !          1228: void OutlineApp_ResizeClientArea(LPOUTLINEAPP lpOutlineApp)
        !          1229: {
        !          1230:     RECT rcClientAreaRect;
        !          1231: 
        !          1232: #if defined( MDI_VERSION )
        !          1233:     
        !          1234:     // Resize MDI Client Area Window here
        !          1235: 
        !          1236: #else 
        !          1237: 
        !          1238:     if (lpOutlineApp->m_lpDoc) {
        !          1239:             OutlineApp_GetClientAreaRect(
        !          1240:                     lpOutlineApp, (LPRECT)&rcClientAreaRect);
        !          1241:             OutlineDoc_Resize(lpOutlineApp->m_lpDoc, 
        !          1242:                     (LPRECT)&rcClientAreaRect);
        !          1243:     }
        !          1244: 
        !          1245: #endif
        !          1246: 
        !          1247: }
        !          1248: 
        !          1249: 
        !          1250: /* OutlineApp_GetActiveDoc
        !          1251:  * -----------------------
        !          1252:  *
        !          1253:  * Return the document in focus. For SDI, the same (only one) document is
        !          1254:  * always returned.
        !          1255:  */
        !          1256: LPOUTLINEDOC OutlineApp_GetActiveDoc(LPOUTLINEAPP lpOutlineApp)
        !          1257: {
        !          1258:     return lpOutlineApp->m_lpDoc;
        !          1259: }
        !          1260: 
        !          1261: /* OutlineApp_GetMenu
        !          1262:  * ------------------
        !          1263:  *
        !          1264:  * Return the menu handle of the app
        !          1265:  */
        !          1266: HMENU OutlineApp_GetMenu(LPOUTLINEAPP lpOutlineApp)
        !          1267: {
        !          1268:     if (!lpOutlineApp) {
        !          1269:         return NULL;
        !          1270:     }
        !          1271:     
        !          1272:     return lpOutlineApp->m_hMenuApp;
        !          1273: }
        !          1274: 
        !          1275: 
        !          1276: #if defined( USE_FRAMETOOLS )
        !          1277: 
        !          1278: /* OutlineApp_GetFrameTools
        !          1279:  * ---------------------
        !          1280:  *
        !          1281:  * Return the pointer to the toolbar object
        !          1282:  */
        !          1283: LPFRAMETOOLS OutlineApp_GetFrameTools(LPOUTLINEAPP lpOutlineApp)
        !          1284: {
        !          1285:     return (LPFRAMETOOLS)&lpOutlineApp->m_frametools;
        !          1286: }
        !          1287: #endif
        !          1288: 
        !          1289: 
        !          1290: /* OutlineApp_GetStatusWindow
        !          1291:  * --------------------------
        !          1292:  *
        !          1293:  * Return the status bar window handle.
        !          1294:  */
        !          1295: HWND OutlineApp_GetStatusWindow(LPOUTLINEAPP lpOutlineApp)
        !          1296: {
        !          1297:     return lpOutlineApp->m_hWndStatusBar;
        !          1298: }
        !          1299: 
        !          1300: 
        !          1301: /* OutlineApp_GetActiveFont
        !          1302:  * ------------------------
        !          1303:  * 
        !          1304:  *      Return the font used by the application
        !          1305:  */
        !          1306: HFONT OutlineApp_GetActiveFont(LPOUTLINEAPP lpOutlineApp)
        !          1307: {
        !          1308:     return lpOutlineApp->m_hStdFont;
        !          1309: }
        !          1310: 
        !          1311: 
        !          1312: /* OutlineApp_GetAppName
        !          1313:  * ---------------------
        !          1314:  *
        !          1315:  *      Retrieve the application name
        !          1316:  */
        !          1317: void OutlineApp_GetAppName(LPOUTLINEAPP lpOutlineApp, LPSTR lpszAppName)
        !          1318: {
        !          1319:     lstrcpy(lpszAppName, APPNAME);
        !          1320: }
        !          1321: 
        !          1322: 
        !          1323: /* OutlineApp_GetAppVersionNo
        !          1324:  * --------------------------
        !          1325:  *
        !          1326:  *      Get the version number (major and minor) of the application
        !          1327:  */
        !          1328: void OutlineApp_GetAppVersionNo(LPOUTLINEAPP lpOutlineApp, int narrAppVersionNo[])
        !          1329: {
        !          1330:     narrAppVersionNo[0] = APPMAJORVERSIONNO;
        !          1331:     narrAppVersionNo[1] = APPMINORVERSIONNO;
        !          1332: }
        !          1333: 
        !          1334: 
        !          1335: /* OutlineApp_VersionNoCheck
        !          1336:  * -------------------------
        !          1337:  *
        !          1338:  *      Check if the version stamp read from a file is compatible 
        !          1339:  *      with the current instance of the application.
        !          1340:  *      returns TRUE if the file can be read, else FALSE.
        !          1341:  */
        !          1342: BOOL OutlineApp_VersionNoCheck(LPOUTLINEAPP lpOutlineApp, LPSTR lpszFormatName, int narrAppVersionNo[])
        !          1343: {
        !          1344: #if defined( OLE_CNTR )
        !          1345: 
        !          1346:     /* ContainerApp accepts both CF_OUTLINE and CF_CONTAINEROUTLINE formats */
        !          1347:     if (lstrcmp(lpszFormatName, CONTAINERDOCFORMAT) != 0 &&
        !          1348:         lstrcmp(lpszFormatName, OUTLINEDOCFORMAT) != 0) {
        !          1349:         // REVIEW: should load string from string resource
        !          1350:         OutlineApp_ErrorMessage(
        !          1351:                 lpOutlineApp, 
        !          1352:                 "File is either corrupted or not of proper type."
        !          1353:             );
        !          1354:         return FALSE;
        !          1355:     }
        !          1356: 
        !          1357: #else 
        !          1358: 
        !          1359:     /* OutlineApp accepts CF_OUTLINE format only */
        !          1360:     if (lstrcmp(lpszFormatName, OUTLINEDOCFORMAT) != 0) {
        !          1361:         // REVIEW: should load string from string resource
        !          1362:         OutlineApp_ErrorMessage(
        !          1363:                 lpOutlineApp, 
        !          1364:                 "File is either corrupted or not of proper type."
        !          1365:             );
        !          1366:         return FALSE;
        !          1367:     }
        !          1368: #endif
        !          1369: 
        !          1370:     if (narrAppVersionNo[0] < APPMAJORVERSIONNO) {
        !          1371:         // REVIEW: should load string from string resource
        !          1372:         OutlineApp_ErrorMessage(
        !          1373:                 lpOutlineApp, 
        !          1374:                 "File was created by an older version; it can not be read."
        !          1375:             );
        !          1376:         return FALSE;
        !          1377:     }
        !          1378: 
        !          1379:     return TRUE;
        !          1380: }
        !          1381: 
        !          1382: 
        !          1383: /* OutlineApp_ErrorMessage
        !          1384:  * -----------------------
        !          1385:  *
        !          1386:  *      Display an error message box
        !          1387:  */
        !          1388: void OutlineApp_ErrorMessage(LPOUTLINEAPP lpOutlineApp, LPSTR lpszErrMsg)
        !          1389: {
        !          1390:     HWND hWndFrame = OutlineApp_GetFrameWindow(lpOutlineApp);
        !          1391:     
        !          1392:     // OLE2NOTE: only put up user message boxes if app is visible
        !          1393:     if (IsWindowVisible(hWndFrame)) 
        !          1394:         MessageBox(hWndFrame, lpszErrMsg, NULL, MB_ICONEXCLAMATION | MB_OK);
        !          1395: }
        !          1396: 
        !          1397: 
        !          1398: #if defined( USE_FRAMETOOLS )
        !          1399: 
        !          1400: /* OutlineApp_SetFormulaBarAccel
        !          1401:  * -----------------------------
        !          1402:  *
        !          1403:  *  Set accelerator table based on state of formula bar.
        !          1404:  */
        !          1405: void OutlineApp_SetFormulaBarAccel(
        !          1406:         LPOUTLINEAPP            lpOutlineApp, 
        !          1407:         BOOL                    fEditFocus
        !          1408: )
        !          1409: {
        !          1410:     if (fEditFocus) 
        !          1411:         lpOutlineApp->m_hAccel = lpOutlineApp->m_hAccelFocusEdit;
        !          1412:     else
        !          1413:         lpOutlineApp->m_hAccel = lpOutlineApp->m_hAccelApp;
        !          1414: }
        !          1415: 
        !          1416: #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.