Annotation of mstools/ole20/samples/outline/cntrinpl.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2: ** 
                      3: **    OLE 2 Container Sample Code
                      4: **    
                      5: **    cntrinpl.c
                      6: **    
                      7: **    This file contains all interfaces, methods and related support
                      8: **    functions for an In-Place Container application (aka. Visual
                      9: **    Editing). The in-place Container application includes the following
                     10: **    implementation objects: 
                     11: **    
                     12: **    ContainerApp Object
                     13: **      exposed interfaces:
                     14: **          IOleInPlaceFrame
                     15: **    
                     16: **    ContainerDoc Object
                     17: **      support functions only
                     18: **      (ICntrOtl is an SDI app; it doesn't support a Doc level IOleUIWindow)
                     19: **    
                     20: **    ContainerLin Object
                     21: **      exposed interfaces:
                     22: **          IOleInPlaceSite
                     23: **    
                     24: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
                     25: **
                     26: *************************************************************************/
                     27: 
                     28: #include "outline.h"
                     29: 
                     30: OLEDBGDATA
                     31: 
                     32: #if defined( INPLACE_CNTR )
                     33: 
                     34: extern LPOUTLINEAPP             g_lpApp;
                     35: extern BOOL g_fInsideOutContainer;
                     36: extern RECT g_rectNull;
                     37: 
                     38: #define NUM_INPLACE_ACCELS  4
                     39: 
                     40: 
                     41: /*************************************************************************
                     42: ** ContainerApp::IOleInPlaceFrame interface implementation
                     43: *************************************************************************/
                     44: 
                     45: STDMETHODIMP CntrApp_IPFrame_QueryInterface(
                     46:         LPOLEINPLACEFRAME   lpThis,
                     47:         REFIID              riid,
                     48:         LPVOID FAR*         lplpvObj
                     49: )
                     50: {
                     51:     SCODE sc = E_NOINTERFACE;
                     52:     LPCONTAINERAPP lpContainerApp =
                     53:             ((struct COleInPlaceFrameImpl FAR*)lpThis)->lpContainerApp;
                     54: 
                     55:     /* The object should not be able to access the other interfaces
                     56:     ** of our App object by doing QI on this interface.
                     57:     */
                     58:     *lplpvObj = NULL;
                     59:     if (IsEqualIID(riid, &IID_IUnknown) ||
                     60:         IsEqualIID(riid, &IID_IOleWindow) ||
                     61:         IsEqualIID(riid, &IID_IOleInPlaceUIWindow) ||
                     62:         IsEqualIID(riid, &IID_IOleInPlaceFrame)) {
                     63:         OleDbgOut4("CntrApp_IPFrame_QueryInterface: IOleInPlaceFrame* RETURNED\r\n");
                     64:         *lplpvObj = (LPVOID) &lpContainerApp->m_OleInPlaceFrame;
                     65:         OleApp_AddRef((LPOLEAPP)lpContainerApp);
                     66:         sc = S_OK;
                     67:     }
                     68: 
                     69:     OleDbgQueryInterfaceMethod(*lplpvObj);
                     70: 
                     71:     return ResultFromScode(sc);
                     72: }
                     73: 
                     74: 
                     75: STDMETHODIMP_(ULONG) CntrApp_IPFrame_AddRef(LPOLEINPLACEFRAME lpThis)
                     76: {
                     77:     OleDbgAddRefMethod(lpThis, "IOleInPlaceFrame");
                     78: 
                     79:     return OleApp_AddRef((LPOLEAPP)g_lpApp);
                     80: }
                     81: 
                     82: 
                     83: STDMETHODIMP_(ULONG) CntrApp_IPFrame_Release(LPOLEINPLACEFRAME lpThis)
                     84: {
                     85:     OleDbgReleaseMethod(lpThis, "IOleInPlaceFrame");
                     86: 
                     87:     return OleApp_Release((LPOLEAPP)g_lpApp);
                     88: }
                     89: 
                     90: 
                     91: STDMETHODIMP CntrApp_IPFrame_GetWindow(
                     92:     LPOLEINPLACEFRAME   lpThis,
                     93:     HWND FAR*           lphwnd
                     94: )
                     95: {
                     96:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                     97: 
                     98:     OLEDBG_BEGIN2("CntrApp_IPFrame_GetWindow\r\n")
                     99:     *lphwnd = lpOutlineApp->m_hWndApp;
                    100:        OLEDBG_END2
                    101:     return NOERROR;
                    102: }
                    103: 
                    104: STDMETHODIMP CntrApp_IPFrame_ContextSensitiveHelp(
                    105:     LPOLEINPLACEFRAME   lpThis,
                    106:     BOOL                fEnterMode
                    107: )
                    108: {
                    109:     OLEDBG_BEGIN2("CntrApp_IPFrame_ContextSensitiveHelp\r\n")
                    110: 
                    111: #if defined( LATER )
                    112:     LPOLEINPLACEFRAME lpFrame = m_pEItem->m_pAC->GetInPlaceFrame();
                    113:     HRESULT hresult = lpFrame->ContextSensitiveHelp(fEnterMode);
                    114:     lpFrame->Release();
                    115: #endif  // LATER
                    116: 
                    117:        OLEDBG_END2
                    118:     return NOERROR;
                    119: }
                    120: 
                    121: 
                    122: STDMETHODIMP CntrApp_IPFrame_GetBorder(
                    123:     LPOLEINPLACEFRAME   lpThis,
                    124:     LPRECT              lprectBorder
                    125: )
                    126: {
                    127:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                    128: 
                    129:     OLEDBG_BEGIN2("CntrApp_IPFrame_GetBorder\r\n")
                    130: 
                    131:        OutlineApp_GetFrameRect(lpOutlineApp, lprectBorder);
                    132: 
                    133:        OLEDBG_END2
                    134:     return NOERROR;
                    135: }
                    136: 
                    137: 
                    138: STDMETHODIMP CntrApp_IPFrame_RequestBorderSpace(
                    139:     LPOLEINPLACEFRAME   lpThis,
                    140:     LPCBORDERWIDTHS     lpWidths
                    141: )
                    142: {
                    143:     OleDbgOut2("CntrApp_IPFrame_RequestBorderSpace\r\n");
                    144: 
                    145: #if defined( _DEBUG )
                    146:        {
                    147:                /* FOR DEBUGING PURPOSES ONLY -- we will fail to allow to an
                    148:                **    object to get any frame border space for frame tools if
                    149:                **    our own frame tools are poped up in the tool pallet. this
                    150:                **    is NOT recommended UI behavior but it allows us to test
                    151:                **    in the condition when the frame does not give border
                    152:                **    space for the object. an object in this situation must
                    153:                **    then either popup its tools in a floating pallet, do
                    154:                **    without the tools, or fail to in-place activate.
                    155:                */
                    156:                LPCONTAINERAPP lpContainerApp =
                    157:                                ((struct COleInPlaceFrameImpl FAR*)lpThis)->lpContainerApp;
                    158:                LPFRAMETOOLS lpft = OutlineApp_GetFrameTools(
                    159:                                (LPOUTLINEAPP)lpContainerApp);
                    160: 
                    161:                if (lpft->m_ButtonBar.m_nState == BARSTATE_POPUP &&
                    162:                        lpft->m_FormulaBar.m_nState == BARSTATE_POPUP) {
                    163:                        OleDbgOut3(
                    164:                                        "CntrApp_IPFrame_RequestBorderSpace: allow NO SPACE\r\n");
                    165:                        return ResultFromScode(E_FAIL);
                    166:                }
                    167:        }
                    168: #endif // _DEBUG
                    169:                
                    170:     return NOERROR;
                    171: }
                    172: 
                    173: 
                    174: STDMETHODIMP CntrApp_IPFrame_SetBorderSpace(
                    175:     LPOLEINPLACEFRAME   lpThis,
                    176:     LPCBORDERWIDTHS     lpWidths
                    177: )
                    178: {
                    179:     LPCONTAINERAPP lpContainerApp =
                    180:             ((struct COleInPlaceFrameImpl FAR*)lpThis)->lpContainerApp;
                    181: 
                    182:     OLEDBG_BEGIN2("CntrApp_IPFrame_SetBorderSpace\r\n")
                    183: 
                    184:        if (lpWidths == NULL) {
                    185: 
                    186:                /* OLE2NOTE: IOleInPlaceSite::SetBorderSpace(NULL) is called
                    187:                **    when the in-place active object does NOT want any tool
                    188:                **    space. in this situation the in-place container should
                    189:                **    put up its tools.
                    190:                */
                    191:                LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpContainerApp;
                    192:                LPCONTAINERDOC lpContainerDoc;
                    193: 
                    194:                lpContainerDoc =(LPCONTAINERDOC)OutlineApp_GetActiveDoc(lpOutlineApp);
                    195:                ContainerDoc_AddFrameLevelTools(lpContainerDoc);
                    196:        } else {
                    197: 
                    198:                // OLE2NOTE: you could do validation of borderwidths here
                    199: 
                    200: #if defined( _DEBUG )
                    201:                /* FOR DEBUGING PURPOSES ONLY -- we will fail to allow to an
                    202:                **    object to get any frame border space for frame tools if
                    203:                **    our own frame tools are poped up in the tool pallet. this
                    204:                **    is NOT recommended UI behavior but it allows us to test
                    205:                **    in the condition when the frame does not give border
                    206:                **    space for the object. an object in this situation must
                    207:                **    then either popup its tools in a floating pallet, do
                    208:                **    without the tools, or fail to in-place activate.
                    209:                */
                    210:                LPFRAMETOOLS lpft = OutlineApp_GetFrameTools(
                    211:                                (LPOUTLINEAPP)lpContainerApp);
                    212: 
                    213:                if ((lpft->m_ButtonBar.m_nState == BARSTATE_POPUP &&
                    214:                        lpft->m_FormulaBar.m_nState == BARSTATE_POPUP) &&
                    215:                        (lpWidths->top || lpWidths->bottom ||
                    216:                                lpWidths->left || lpWidths->right) ) {
                    217:                        OleDbgOut3("CntrApp_IPFrame_SetBorderSpace: allow NO SPACE\r\n");
                    218:                        OLEDBG_END2
                    219: 
                    220:                        OutlineApp_SetBorderSpace(
                    221:                                        (LPOUTLINEAPP) lpContainerApp,
                    222:                                        (LPBORDERWIDTHS)&g_rectNull
                    223:                        );
                    224:             OLEDBG_END2
                    225:                        return ResultFromScode(E_FAIL);
                    226:                }
                    227: #endif // _DEBUG
                    228: 
                    229:                OutlineApp_SetBorderSpace(
                    230:                                (LPOUTLINEAPP) lpContainerApp,
                    231:                                (LPBORDERWIDTHS)lpWidths
                    232:                );
                    233:        }
                    234:        OLEDBG_END2
                    235:     return NOERROR;
                    236: }
                    237: 
                    238: 
                    239: STDMETHODIMP CntrApp_IPFrame_SetActiveObject(
                    240:     LPOLEINPLACEFRAME           lpThis,
                    241:     LPOLEINPLACEACTIVEOBJECT    lpActiveObject,
                    242:     LPCSTR                      lpszObjName
                    243: )
                    244: {
                    245:     char szTitle[256];
                    246:     LPCONTAINERAPP lpContainerApp =
                    247:             ((struct COleInPlaceFrameImpl FAR*)lpThis)->lpContainerApp;
                    248: 
                    249:     OLEDBG_BEGIN2("CntrApp_IPFrame_SetActiveObject\r\n")
                    250: 
                    251:     if (lpContainerApp->m_lpIPActiveObj)
                    252:         lpContainerApp->m_lpIPActiveObj->lpVtbl->Release(lpContainerApp->m_lpIPActiveObj);
                    253: 
                    254:     if (lpContainerApp->m_lpIPActiveObj = lpActiveObject)
                    255:         lpContainerApp->m_lpIPActiveObj->lpVtbl->AddRef(lpContainerApp->m_lpIPActiveObj);
                    256: 
                    257: #if !defined (MDI_VERSION)
                    258:     // MDI apps will change the document window title..
                    259: 
                    260:     if (lpActiveObject) {
                    261:         lstrcpy (szTitle, lpszObjName);
                    262:         lstrcat (szTitle, " in ");
                    263:         lstrcat (szTitle, g_lpApp->m_lpDoc->m_lpszDocTitle);
                    264:         SetWindowText (g_lpApp->m_hWndApp, szTitle);
                    265: 
                    266:     } else {
                    267:         OutlineDoc_SetTitle(g_lpApp->m_lpDoc);
                    268:     }
                    269: 
                    270: #endif  // !defined (MDI_VERSION)
                    271: 
                    272:        OLEDBG_END2
                    273:     return NOERROR;
                    274: }
                    275: 
                    276: 
                    277: STDMETHODIMP CntrApp_IPFrame_InsertMenus(
                    278:     LPOLEINPLACEFRAME       lpThis,
                    279:     HMENU                   hMenu,
                    280:     LPOLEMENUGROUPWIDTHS    lpMenuWidths
                    281: )
                    282: {
                    283:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                    284:        BOOL    fNoError = TRUE;
                    285: 
                    286:     OLEDBG_BEGIN2("CntrApp_IPFrame_InsertMenus\r\n")
                    287: 
                    288:     fNoError &= AppendMenu(hMenu, MF_POPUP, (UINT)lpContainerApp->m_hMenuFile,
                    289:                                                "&File");
                    290:     fNoError &= AppendMenu(hMenu, MF_POPUP, (UINT)lpContainerApp->m_hMenuView,
                    291:                                                "O&utline");
                    292:        fNoError &= AppendMenu(hMenu, MF_POPUP,(UINT)lpContainerApp->m_hMenuDebug,
                    293:                                                "DbgI&Cntr");
                    294:     lpMenuWidths->width[0] = 1;
                    295:     lpMenuWidths->width[2] = 1;
                    296:     lpMenuWidths->width[4] = 1;
                    297: 
                    298:        OLEDBG_END2
                    299:                
                    300:        return (fNoError ? NOERROR : ResultFromScode(E_FAIL));
                    301: }
                    302: 
                    303: 
                    304: STDMETHODIMP CntrApp_IPFrame_SetMenu(
                    305:     LPOLEINPLACEFRAME   lpThis,
                    306:     HMENU               hMenuShared,
                    307:     HOLEMENU            hOleMenu,
                    308:     HWND                hwndActiveObject
                    309: )
                    310: {
                    311:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                    312:     HMENU   hMenu;
                    313:        HRESULT hrErr;
                    314: 
                    315:     OLEDBG_BEGIN2("CntrApp_IPFrame_InsertMenus\r\n")
                    316: 
                    317:        
                    318:        /* OLE2NOTE: either put up the shared menu (combined menu from
                    319:        **    in-place server and in-place container) or our container's
                    320:        **    normal menu as directed.
                    321:        */
                    322:     if (hOleMenu && hMenuShared)
                    323:         hMenu = hMenuShared;
                    324:        else 
                    325:                hMenu = lpOutlineApp->m_hMenuApp;
                    326: 
                    327:        /* OLE2NOTE: SDI apps put menu on frame by calling SetMenu.
                    328:        **    MDI apps would send WM_MDISETMENU message instead.
                    329:        */
                    330:     SetMenu (lpOutlineApp->m_hWndApp, hMenu);
                    331:     OLEDBG_BEGIN2("OleSetMenuDescriptor called\r\n")
                    332:     hrErr = OleSetMenuDescriptor (hOleMenu, lpOutlineApp->m_hWndApp,
                    333:                     hwndActiveObject, NULL, NULL);
                    334:        OLEDBG_END2
                    335: 
                    336:        OLEDBG_END2
                    337:        return hrErr;
                    338: }
                    339: 
                    340: 
                    341: STDMETHODIMP CntrApp_IPFrame_RemoveMenus(
                    342:     LPOLEINPLACEFRAME   lpThis,
                    343:     HMENU               hMenu
                    344: )
                    345: {
                    346:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                    347:        BOOL fNoError = TRUE;
                    348: 
                    349:     OLEDBG_BEGIN2("CntrApp_IPFrame_RemoveMenus\r\n")
                    350: 
                    351:     /* Remove container group menus */
                    352:        while (GetMenuItemCount(hMenu))
                    353:                fNoError &= RemoveMenu(hMenu, 0, MF_BYPOSITION);
                    354: 
                    355:        OleDbgAssert(fNoError == TRUE);
                    356:        
                    357:        OLEDBG_END2
                    358:                
                    359:     return (fNoError ? NOERROR : ResultFromScode(E_FAIL));
                    360: }
                    361: 
                    362: 
                    363: STDMETHODIMP CntrApp_IPFrame_SetStatusText(
                    364:     LPOLEINPLACEFRAME   lpThis,
                    365:     LPCSTR              lpszStatusText
                    366: )
                    367: {
                    368:     OleDbgOut2("CntrApp_IPFrame_SetStatusText\r\n");
                    369:     
                    370:     // REVIEW: NOT YET IMPLEMENTED
                    371: 
                    372:     return ResultFromScode(E_NOTIMPL);
                    373: }
                    374: 
                    375: 
                    376: STDMETHODIMP CntrApp_IPFrame_EnableModeless(
                    377:     LPOLEINPLACEFRAME   lpThis,
                    378:     BOOL                fEnable
                    379: )
                    380: {
                    381:     return NOERROR;
                    382: }
                    383: 
                    384: 
                    385: STDMETHODIMP CntrApp_IPFrame_TranslateAccelerator(
                    386:     LPOLEINPLACEFRAME   lpThis,
                    387:     LPMSG               lpmsg,
                    388:     WORD                wID
                    389: )
                    390: {
                    391:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                    392:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                    393:     SCODE sc;
                    394: 
                    395:     if (TranslateAccelerator (lpOutlineApp->m_hWndApp,
                    396:                         lpContainerApp->m_hAccelIPCntr, lpmsg))
                    397:         sc = S_OK;
                    398: 
                    399: #if defined (MDI_VERSION)
                    400:     else if (TranslateMDISysAccel(lpOutlineApp->m_hWndMDIClient, lpmsg))
                    401:         sc = S_OK;
                    402: #endif  // MDI_VERSION
                    403: 
                    404:     else
                    405:         sc = S_FALSE;
                    406: 
                    407:     return ResultFromScode(sc);
                    408: }
                    409: 
                    410: 
                    411: 
                    412: /*************************************************************************
                    413: ** ContainerDoc Support Functions
                    414: *************************************************************************/
                    415: 
                    416: 
                    417: /* ContainerDoc_UpdateInPlaceObjectRects
                    418: ** -------------------------------------
                    419: **    Update the PosRect and ClipRect of the currently in-place active
                    420: **    object. if there is no object active in-place, then do nothing.
                    421: **
                    422: **    OLE2NOTE: this function should be called when an action occurs
                    423: **    that changes either the position of the object in the document
                    424: **    (eg. changing document margins changes PosRect) or the clipRect
                    425: **    changes (eg. resizing the document window changes the ClipRect).
                    426: */
                    427: void ContainerDoc_UpdateInPlaceObjectRects(LPCONTAINERDOC lpContainerDoc, int nIndex)
                    428: {
                    429:        LPLINELIST lpLL = &((LPOUTLINEDOC)lpContainerDoc)->m_LineList;
                    430:        int i;
                    431:        LPLINE lpLine;
                    432:     RECT rcClipRect;
                    433: 
                    434:     if (g_fInsideOutContainer) {
                    435: 
                    436:         if (lpContainerDoc->m_cIPActiveObjects) {
                    437: 
                    438:             /* OLE2NOTE: (INSIDE-OUT CONTAINER) we must update the
                    439:             **    PosRect/ClipRect for all in-place active objects
                    440:             **    starting from line "nIndex".
                    441:             */
                    442: 
                    443:             ContainerDoc_GetClipRect(lpContainerDoc, (LPRECT)&rcClipRect);
                    444: 
                    445:             OleDbgOutRect3(
                    446:                     "OutlineDoc_Resize (ClipRect)", (LPRECT)&rcClipRect);
                    447: 
                    448:             for (i = nIndex; i < lpLL->m_nNumLines; i++) {
                    449:                 lpLine=LineList_GetLine(lpLL, i);
                    450: 
                    451:                 if (lpLine && (Line_GetLineType(lpLine)==CONTAINERLINETYPE)) {
                    452:                     LPCONTAINERLINE lpContainerLine = (LPCONTAINERLINE)lpLine;
                    453:                     ContainerLine_UpdateInPlaceObjectRects(
                    454:                             lpContainerLine, &rcClipRect);
                    455:                 }
                    456:             }
                    457:         }
                    458:     }
                    459:     else {
                    460:         /* OLE2NOTE: (OUTSIDE-IN CONTAINER) if there is a currently 
                    461:         **    UIActive object, we must inform it that the
                    462:         **    PosRect/ClipRect has now changed.
                    463:         */
                    464:         LPCONTAINERLINE lpLastUIActiveLine =
                    465:                 lpContainerDoc->m_lpLastUIActiveLine;
                    466:         if (lpLastUIActiveLine && lpLastUIActiveLine->m_fUIActive) {
                    467:             ContainerDoc_GetClipRect(lpContainerDoc, (LPRECT)&rcClipRect);
                    468: 
                    469:             OleDbgOutRect3(
                    470:                     "OutlineDoc_Resize (ClipRect)", (LPRECT)&rcClipRect);
                    471:             ContainerLine_UpdateInPlaceObjectRects(
                    472:                     lpLastUIActiveLine, &rcClipRect);
                    473:         }
                    474:     }
                    475: }
                    476: 
                    477: /* ContainerDoc_IsUIDeactivateNeeded
                    478: ** ---------------------------------
                    479: **    Check if it is necessary to UIDeactivate an in-place active
                    480: **    object upon a mouse LBUTTONDOWN event. The position of the button
                    481: **    down click is given by "pt".
                    482: **    If there is not currently an in-place active line, then
                    483: **    UIDeactivate is NOT needed.
                    484: **    If there is a current in-place active line, then check if the
                    485: **    point position is outside of the object extents on the screen. If
                    486: **    so, then the object should be UIDeactivated, otherwise not.
                    487: */
                    488: BOOL ContainerDoc_IsUIDeactivateNeeded(
                    489:         LPCONTAINERDOC  lpContainerDoc,
                    490:         POINT           pt
                    491: )
                    492: {
                    493:     LPCONTAINERLINE lpUIActiveLine=lpContainerDoc->m_lpLastUIActiveLine;
                    494:     RECT rect;
                    495: 
                    496:     if (! lpUIActiveLine || ! lpUIActiveLine->m_fUIActive)
                    497:         return FALSE;
                    498: 
                    499:     ContainerLine_GetOleObjectRectInPixels(
                    500:             lpUIActiveLine,
                    501:             (LPRECT) &rect
                    502:     );
                    503: 
                    504:     if (! PtInRect((LPRECT) &rect, pt))
                    505:         return TRUE;
                    506: 
                    507:     return FALSE;
                    508: }
                    509: 
                    510: 
                    511: /* ContainerDoc_ShutDownLastInPlaceServerIfNotNeeded
                    512: ** -------------------------------------------------
                    513: **    OLE2NOTE: this function ONLY applies for OUTSIDE-IN containers
                    514: **
                    515: **    If there is a previous in-place active server still running and
                    516: **    this server will not be needed to support the next OLE object
                    517: **    about to be activated, then shut it down.
                    518: **    in this way we manage a policy of having at most one in-place
                    519: **    server running at a time. we do not imediately shut down the
                    520: **    in-place server when the object is UIDeactivated because we want
                    521: **    it to be fast if the server decides to re-activate the object
                    522: **    in-place.
                    523: **
                    524: **    shutting down the server is achieved by forcing the object to
                    525: **    transition from running to loaded by calling IOleObject::Close.
                    526: */
                    527: void ContainerDoc_ShutDownLastInPlaceServerIfNotNeeded(
                    528:         LPCONTAINERDOC          lpContainerDoc,
                    529:         LPCONTAINERLINE         lpNextActiveLine
                    530: )
                    531: {
                    532:     LPCONTAINERLINE lpLastIpActiveLine = lpContainerDoc->m_lpLastIpActiveLine;
                    533:     BOOL fEnableServerShutDown = TRUE;
                    534:     LPMONIKER lpmkLinkSrc;
                    535:     LPMONIKER lpmkLastActiveObj;
                    536:     LPMONIKER lpmkCommonPrefix;
                    537:     LPOLELINK lpOleLink;
                    538:     HRESULT hrErr;
                    539: 
                    540:     /* OLE2NOTE: an inside-out style container can NOT use this scheme
                    541:     **    to shut down in-place servers. it would have to have a more
                    542:     **    sophistocated mechanism by which it keeps track of which
                    543:     **    objects are on screen and which were the last recently used.
                    544:     */
                    545:     if (g_fInsideOutContainer) 
                    546:         return;
                    547: 
                    548:     if (lpLastIpActiveLine != lpNextActiveLine) {
                    549:         if (lpLastIpActiveLine) {
                    550: 
                    551:             /* OLE2NOTE: if the object which is about to be activated is
                    552:             **    actually a link to the OLE object in last activated line,
                    553:             **    then we do NOT want to shut down the last activated
                    554:             **    server because it is about to be used. when activating a
                    555:             **    linked object, the source of the link gets activated.
                    556:             */
                    557:             lpOleLink = (LPOLELINK)ContainerLine_GetOleObject(
                    558:                     lpNextActiveLine,
                    559:                     &IID_IOleLink
                    560:             );
                    561:             if (lpOleLink) {
                    562:                 OLEDBG_BEGIN2("IOleObject::GetSourceMoniker called\r\n")
                    563:                 lpOleLink->lpVtbl->GetSourceMoniker(
                    564:                         lpOleLink,
                    565:                         (LPMONIKER FAR*)&lpmkLinkSrc
                    566:                 );
                    567:                 OLEDBG_END2
                    568: 
                    569:                 if (lpmkLinkSrc) {
                    570:                     lpmkLastActiveObj = ContainerLine_GetFullMoniker(
                    571:                             lpLastIpActiveLine,
                    572:                             GETMONIKER_ONLYIFTHERE
                    573:                     );
                    574:                     if (lpmkLastActiveObj) {
                    575:                         hrErr = lpmkLinkSrc->lpVtbl->CommonPrefixWith(
                    576:                                 lpmkLinkSrc,
                    577:                                 lpmkLastActiveObj,
                    578:                                 &lpmkCommonPrefix
                    579:                                 
                    580:                         );
                    581:                         if (GetScode(hrErr) == MK_S_HIM || 
                    582:                                 GetScode(hrErr) == MK_S_US) {
                    583:                             /* the link source IS to the object
                    584:                             **    contained in the last activated
                    585:                             **    line of the document; disable the
                    586:                             **    attempt to shut down the last
                    587:                             **    running in-place server. 
                    588:                             */
                    589:                             fEnableServerShutDown = FALSE;
                    590:                         }
                    591:                         if (lpmkCommonPrefix) 
                    592:                             OleStdRelease((LPUNKNOWN)lpmkCommonPrefix);
                    593:                         OleStdRelease((LPUNKNOWN)lpmkLastActiveObj);
                    594:                     }
                    595:                     OleStdRelease((LPUNKNOWN)lpmkLinkSrc);
                    596:                 }
                    597:                 OleStdRelease((LPUNKNOWN)lpOleLink);
                    598:             }
                    599: 
                    600:             /* if it is OK to shut down the previous in-place server
                    601:             **    and one is still running, then shut it down. shutting
                    602:             **    down the server is accomplished by forcing the OLE
                    603:             **    object to close. this forces the object to transition
                    604:             **    from running to loaded. if the object is actually
                    605:             **    only loaded then this is a NOP.
                    606:             */
                    607:             if (fEnableServerShutDown &&
                    608:                     lpLastIpActiveLine->m_fIpServerRunning) {
                    609: 
                    610:                 OleDbgOut1("@@@ previous in-place server SHUT DOWN\r\n");
                    611:                 ContainerLine_CloseOleObject(lpLastIpActiveLine);
                    612: 
                    613:                 // we can now forget this last in-place active line.
                    614:                 lpContainerDoc->m_lpLastIpActiveLine = NULL;
                    615:             }
                    616:         }
                    617:     }
                    618: }
                    619: 
                    620: 
                    621: /* ContainerDoc_GetUIActiveWindow
                    622: ** ------------------------------
                    623: **    If there is an UIActive object, then return its HWND.
                    624: */
                    625: HWND ContainerDoc_GetUIActiveWindow(LPCONTAINERDOC lpContainerDoc)
                    626: {
                    627:     return lpContainerDoc->m_hwndUIActiveObj;
                    628: }
                    629: 
                    630: 
                    631: /* ContainerDoc_GetClipRect
                    632: ** ------------------------
                    633: **    Get the ClipRect in client coordinates.
                    634: **
                    635: ** OLE2NOTE: the ClipRect is defined as the maximum window rectangle
                    636: **    that the in-place active object must be clipped to. this
                    637: **    rectangle MUST be described in Client Coordinates of the window
                    638: **    that is used as the Parent of the in-place active object's
                    639: **    window. in our case, the LineList ListBox window is both the
                    640: **    parent of the in-place active object AND defines precisely the
                    641: **    clipping rectangle.
                    642: */
                    643: void ContainerDoc_GetClipRect(
                    644:         LPCONTAINERDOC      lpContainerDoc,
                    645:         LPRECT              lprcClipRect
                    646: )
                    647: {
                    648:     LPLINELIST lpLL = &((LPOUTLINEDOC)lpContainerDoc)->m_LineList;
                    649: 
                    650:     /* OLE2NOTE: the ClipRect can be used to ensure that the in-place
                    651:     **    server does not overwrite areas of the window that the
                    652:     **    container paints into but which should never be overwritten
                    653:     **    (eg. if an app were to paint row and col headings directly in
                    654:     **    the same window that is the parent of the in-place window.
                    655:     **    whenever the window size changes or gets scrolled, in-place
                    656:     **    active object must be informed of the new clip rect. 
                    657:     **    
                    658:     **    normally an app would pass the rect returned from GetClientRect.
                    659:     **    but because CntrOutl uses separate windows for row/column
                    660:     **    headings, status line, formula/tool bars, etc. it is NOT
                    661:     **    necessary to pass a constrained clip rect. Windows standard
                    662:     **    window clipping will automatically take care of all clipping
                    663:     **    that is necessary. thus we can take a short cut of passing an
                    664:     **    "infinite" clip rect, and then we do NOT need to call
                    665:     **    IOleInPlaceObject::SetObjectRects when our document is scrolled.
                    666:     */
                    667: 
                    668:     lprcClipRect->top = 0;
                    669:     lprcClipRect->left = 0;
                    670:     lprcClipRect->right = 32767;
                    671:     lprcClipRect->bottom = 32767;
                    672: }
                    673: 
                    674: 
                    675: /* ContainerDoc_GetTopInPlaceFrame
                    676: ** -------------------------------
                    677: **    returns NON-AddRef'ed pointer to Top In-Place Frame interface
                    678: */
                    679: LPOLEINPLACEFRAME ContainerDoc_GetTopInPlaceFrame(
                    680:         LPCONTAINERDOC      lpContainerDoc
                    681: )
                    682: {
                    683: #if defined( INPLACE_CNTRSVR )
                    684:     return lpContainerDoc->m_lpTopIPFrame;
                    685: #else
                    686:     return (LPOLEINPLACEFRAME)&((LPCONTAINERAPP)g_lpApp)->m_OleInPlaceFrame;
                    687: #endif
                    688: }
                    689: 
                    690: void ContainerDoc_GetSharedMenuHandles(
                    691:         LPCONTAINERDOC  lpContainerDoc,
                    692:         HMENU FAR*      lphSharedMenu,
                    693:         HOLEMENU FAR*   lphOleMenu
                    694: )
                    695: {
                    696: #if defined( INPLACE_CNTRSVR )
                    697:     if (lpContainerDoc->m_DocType == DOCTYPE_EMEBEDDEDOBJECT) {
                    698:         *lphSharedMenu = lpContainerDoc->m_hSharedMenu;
                    699:         *lphOleMenu = lpContainerDoc->m_hOleMenu;
                    700:         return;
                    701:     }
                    702: #endif
                    703: 
                    704:     *lphSharedMenu = NULL;
                    705:     *lphOleMenu = NULL;
                    706: }
                    707: 
                    708: 
                    709: #if defined( USE_FRAMETOOLS )
                    710: void ContainerDoc_RemoveFrameLevelTools(LPCONTAINERDOC lpContainerDoc)
                    711: {
                    712:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerDoc;
                    713:     OleDbgAssert(lpOutlineDoc->m_lpFrameTools != NULL);
                    714: 
                    715:     FrameTools_Enable(lpOutlineDoc->m_lpFrameTools, FALSE);
                    716: }
                    717: #endif
                    718: 
                    719: 
                    720: void ContainerDoc_AddFrameLevelUI(LPCONTAINERDOC lpContainerDoc)
                    721: {
                    722:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerDoc;
                    723:     LPOLEINPLACEFRAME lpTopIPFrame = ContainerDoc_GetTopInPlaceFrame(
                    724:             lpContainerDoc);
                    725:     HMENU           hSharedMenu;            // combined obj/cntr menu
                    726:     HOLEMENU        hOleMenu;               // returned by OleCreateMenuDesc.
                    727: 
                    728:     ContainerDoc_GetSharedMenuHandles(
                    729:             lpContainerDoc,
                    730:             &hSharedMenu,
                    731:             &hOleMenu
                    732:     );
                    733: 
                    734:     lpTopIPFrame->lpVtbl->SetMenu(
                    735:             lpTopIPFrame,
                    736:             hSharedMenu,
                    737:             hOleMenu,
                    738:             lpOutlineDoc->m_hWndDoc
                    739:     );
                    740: 
                    741:     /* OLE2NOTE: even if our app does NOT use FrameTools, we must still
                    742:     **    call IOleInPlaceFrame::SetBorderSpace.
                    743:     */
                    744:     ContainerDoc_AddFrameLevelTools(lpContainerDoc);
                    745: }
                    746: 
                    747: 
                    748: void ContainerDoc_AddFrameLevelTools(LPCONTAINERDOC lpContainerDoc)
                    749: {
                    750:     LPOLEINPLACEFRAME lpTopIPFrame = ContainerDoc_GetTopInPlaceFrame(
                    751:             lpContainerDoc);
                    752:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                    753:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerDoc;
                    754: 
                    755:     OleDbgAssert(lpTopIPFrame != NULL);
                    756: 
                    757: #if defined( USE_FRAMETOOLS )
                    758: 
                    759:     FrameTools_Enable(lpOutlineDoc->m_lpFrameTools, TRUE);
                    760: 
                    761:     FrameTools_NegotiateForSpaceAndShow(
                    762:             lpOutlineDoc->m_lpFrameTools,
                    763:             NULL,
                    764:             lpTopIPFrame
                    765:     );
                    766: 
                    767: #else   // ! USE_FRAMETOOLS
                    768: 
                    769: #if defined( INPLACE_CNTRSVR )
                    770:     if (lpContainerDoc->m_DocType == DOCTYPE_EMBEDDEDOBJECT) {
                    771:         /* this says i do not need space, so the top Frame should
                    772:         **    leave its tools behind
                    773:         */
                    774:         OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace(NULL) called\r\n")
                    775:         lpTopIPFrame->lpVtbl->SetBorderSpace(lpTopIPFrame, NULL);
                    776:         OLEDBG_END2
                    777:         return;
                    778:     }
                    779: #else   // INPLACE_CNTR && ! USE_FRAMETOOLS
                    780: 
                    781:     OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace(0,0,0,0) called\r\n")
                    782:     lpTopIPFrame->lpVtbl->SetBorderSpace(
                    783:             lpTopIPFrame,
                    784:             (LPCBORDERWIDTHS)&g_rectNull
                    785:     );
                    786:     OLEDBG_END2
                    787: 
                    788: #endif  // INPLACE_CNTR && ! USE_FRAMETOOLS
                    789: #endif  // ! USE_FRAMETOOLS
                    790: 
                    791: }
                    792: 
                    793: 
                    794: void ContainerDoc_FrameWindowResized(LPCONTAINERDOC lpContainerDoc)
                    795: {
                    796:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                    797: 
                    798:     if (lpContainerApp->m_lpIPActiveObj) {
                    799:         RECT rcFrameRect;
                    800: 
                    801:         OutlineApp_GetFrameRect(g_lpApp, (LPRECT)&rcFrameRect);
                    802: 
                    803:         OLEDBG_BEGIN2("IOleInPlaceActiveObject::ResizeBorder called\r\n")
                    804:         lpContainerApp->m_lpIPActiveObj->lpVtbl->ResizeBorder(
                    805:                 lpContainerApp->m_lpIPActiveObj,
                    806:                 (LPCRECT)&rcFrameRect,
                    807:                 (LPOLEINPLACEUIWINDOW)&lpContainerApp->m_OleInPlaceFrame,
                    808:                 TRUE    /* fFrameWindow */
                    809:         );
                    810:         OLEDBG_END2
                    811:     }
                    812: 
                    813: #if defined( USE_FRAMETOOLS )
                    814:     else {
                    815:         ContainerDoc_AddFrameLevelTools(lpContainerDoc);
                    816:     }
                    817: #endif
                    818: }
                    819: 
                    820: 
                    821: #if defined( INPLACE_CNTRSVR ) || defined( INPLACE_MDICNTR )
                    822: 
                    823: /* ContainerDoc_GetTopInPlaceDoc
                    824: **    returns NON-AddRef'ed pointer to Top In-Place Doc interface
                    825: */
                    826: LPOLEINPLACEUIWINDOW ContainerDoc_GetTopInPlaceDoc(
                    827:         LPCONTAINERDOC      lpContainerDoc
                    828: )
                    829: {
                    830: #if defined( INPLACE_CNTRSVR )
                    831:     return lpContainerDoc->m_lpTopIPDoc;
                    832: #else
                    833:     return (LPOLEINPLACEUIWINDOW)&lpContainerDoc->m_OleInPlaceDoc;
                    834: #endif
                    835: }
                    836: 
                    837: 
                    838: void ContainerDoc_RemoveDocLevelTools(LPCONTAINERDOC lpContainerDoc);
                    839: {
                    840:     LPOLEINPLACEUIWINDOW lpTopIPDoc = ContainerDoc_GetTopInPlaceDoc(
                    841:             lpContainerDoc);
                    842: 
                    843:     if (lpTopIPDoc && lpContainerDoc->m_fMyToolsOnDoc) {
                    844:         lpContainerDoc->m_fMyToolsOnDoc = FALSE;
                    845: 
                    846:         // if we had doc tools we would HIDE them here;
                    847:         //   but NOT call SetBorderSpace(NULL)
                    848: 
                    849:     }
                    850: }
                    851: 
                    852: void ContainerDoc_AddDocLevelTools(LPCONTAINERDOC lpContainerDoc)
                    853: {
                    854:     LPOLEINPLACEUIWINDOW lpTopIPDoc = ContainerDoc_GetTopInPlaceDoc(
                    855:             lpContainerDoc);
                    856: 
                    857:     if (! lpTopIPDoc)
                    858:         return;
                    859: 
                    860: #if defined( USE_DOCTOOLS )
                    861:     if (lpTopIPDoc && ! lpContainerDoc->m_fMyToolsOnDoc) {
                    862: 
                    863:         /* if we had doc tools we would negotiate for toolbar space at
                    864:         **    doc level and SHOW them.
                    865:         */
                    866: 
                    867:         /* we do NOT have doc level tools, so we just call
                    868:         **    SetBorderSpace() to indicate to the top doc that
                    869:         **    our object does not need tool space.
                    870:         */
                    871: 
                    872:         lpContainerDoc->m_fMyToolsOnDoc = TRUE;
                    873:         return;
                    874:     }
                    875: #else   // ! USE_DOCTOOLS
                    876: 
                    877: #if defined( INPLACE_CNTRSVR )
                    878:     if (lpContainerDoc->m_DocType == DOCTYPE_EMBEDDEDOBJECT) {
                    879:         /* this says i do not need space, so the top doc should
                    880:         **    leave its tools behind
                    881:         */
                    882:         lpTopIPDoc->lpVtbl->SetBorderSpace(lpTopIPDoc, NULL);
                    883:         return;
                    884:     }
                    885: #else
                    886:     lpTopIPDoc->lpVtbl->SetBorderSpace(
                    887:             lpTopIPDoc,
                    888:             (LPCBORDERWIDTHS)&g_rectNull
                    889:     );
                    890: 
                    891: #endif
                    892: #endif  // ! USE_DOCTOOLS
                    893: }
                    894: 
                    895: #endif  // INPLACE_CNTRSVR || INPLACE_MDICNTR
                    896: 
                    897: 
                    898: 
                    899: /*************************************************************************
                    900: ** ContainerLine Support Functions and Interfaces
                    901: *************************************************************************/
                    902: 
                    903: 
                    904: /* ContainerLine_UIDeactivate
                    905: ** --------------------------
                    906: **    tell the OLE object associated with the ContainerLine to 
                    907: **    UIDeactivate. this informs the in-place server to tear down
                    908: **    the UI and window that it put up for the object. it will remove
                    909: **    its active editor menus and any frame and object adornments 
                    910: **    (eg. toolbars, rulers, etc.).
                    911: */
                    912: void ContainerLine_UIDeactivate(LPCONTAINERLINE lpContainerLine)
                    913: {
                    914:     HRESULT hrErr;
                    915: 
                    916:     if (!lpContainerLine || !lpContainerLine->m_fUIActive)
                    917:         return;
                    918: 
                    919:     OLEDBG_BEGIN2("IOleInPlaceObject::UIDeactivate called\r\n")
                    920:     hrErr = lpContainerLine->m_lpOleIPObj->lpVtbl->UIDeactivate(
                    921:                        lpContainerLine->m_lpOleIPObj);
                    922:     OLEDBG_END2
                    923: 
                    924:     if (hrErr != NOERROR) {
                    925:         OleDbgOutHResult("IOleInPlaceObject::UIDeactivate returned", hrErr);
                    926:         return;
                    927:     }
                    928: #if defined( UNDOSUPPORTED )
                    929: 
                    930:     /* OLE2NOTE: an outside-in style container that supports UNDO would
                    931:     **    call IOleObject::DoVerb(OLEIVERB_HIDE) to make the in-place
                    932:     **    object go invisible. when it wants the in-place active object
                    933:     **    to discard its undo state, it would call
                    934:     **    IOleInPlaceObject::InPlaceDeactivate when it wants the object
                    935:     **    to discard its undo state. there is no need for an outside-in
                    936:     **    style container to call
                    937:     **    IOleObject::DoVerb(OLEIVERB_DISCARDUNDOSTATE). if either the
                    938:     **    container or the object do not support UNDO, then the
                    939:     **    container might as well immediately call InPlaceDeactivate
                    940:     **    instead of calling DoVerb(HIDE).
                    941:     **    
                    942:     **    an inside-out style container that supports UNDO would simply
                    943:     **    UIDeactivate the object. it would call
                    944:     **    IOleObject::DoVerb(OLEIVERB_DISCARDUNDOSTATE) when it wants
                    945:     **    the object discard its undo state. it would call
                    946:     **    IOleInPlaceObject::InPlaceDeactivate if it wants the object
                    947:     **    to take down its window. 
                    948:     */
                    949:     if (! g_fInsideOutContainer) {
                    950:         if (lpContainerLine->m_fIpChangesUndoable) {
                    951:             ContainerLine_DoVerb(lpContainerLine,OLEIVERB_HIDE,FALSE,FALSE);
                    952:         } else {
                    953:             lpContainerLine->m_lpOleIPObj->lpVtbl->InPlaceDeactivate(
                    954:                     lpContainerLine->m_lpOleIPObj);
                    955:         }
                    956:         lpContainerLine->m_fIpVisible = FALSE; 
                    957:     }
                    958: #else
                    959: 
                    960: 
                    961:     /* OLE2NOTE: an outside-in style container that does NOT support
                    962:     **    UNDO would immediately tell the UIDeactivated server (UI
                    963:     **    removed) to IOleInPlaceObject::InPlaceDeactivate.
                    964:     **    
                    965:     **    an inside-out style container that does NOT support UNDO
                    966:     **    would call IOleObject::DoVerb(OLEIVERB_DISCARDUNDOSTATE) to
                    967:     **    tell the object to discard its undo state. it would call
                    968:     **    IOleInPlaceObject::InPlaceDeactivate if it wants the object
                    969:     **    to take down its window. 
                    970:     */
                    971: 
                    972:     if (g_fInsideOutContainer) {
                    973: 
                    974:         if (lpContainerLine->m_fInsideOutObj) {
                    975: 
                    976:             if (lpContainerLine->m_fIpChangesUndoable) {
                    977:                 OLEDBG_BEGIN3("ContainerLine_DoVerb(OLEIVERB_DISCARDUNDOSTATE) called!\r\n")
                    978:                 ContainerLine_DoVerb(
                    979:                        lpContainerLine,OLEIVERB_DISCARDUNDOSTATE,FALSE,FALSE);
                    980:                 OLEDBG_END3
                    981:             }
                    982: 
                    983:         } else {    // !fInsideOutObj
                    984: 
                    985:             /* OLE2NOTE: (INSIDEOUT CONTAINER) if the object is not
                    986:             **    registered OLEMISC_ACTIVATEWHENVISIBLE, then we will
                    987:             **    make the object behave in an outside-in manner. since
                    988:             **    we do NOT deal with UNDO we can simply
                    989:             **    InPlaceDeactivate the object. it should NOT be
                    990:             **    allowed to leave its window visible when
                    991:             **    UIDeactivated. 
                    992:             */
                    993:             OLEDBG_BEGIN2("IOleInPlaceObject::InPlaceDeactivate called\r\n")
                    994:             hrErr = lpContainerLine->m_lpOleIPObj->lpVtbl->InPlaceDeactivate(
                    995:                         lpContainerLine->m_lpOleIPObj);
                    996:             OLEDBG_END2
                    997:             if (hrErr != NOERROR) {
                    998:                 OleDbgOutHResult("IOleInPlaceObject::InPlaceDeactivate returned", hrErr);
                    999:             }
                   1000:         }
                   1001:                 
                   1002:     } else { 
                   1003: 
                   1004:         /* OLE2NOTE: (OUTSIDE-IN CONTAINER) since we do NOT deal with
                   1005:         **    UNDO we can simply InPlaceDeactivate the object. it
                   1006:         **    should NOT be allowed to leave its window visible when
                   1007:         **    UIDeactivated. 
                   1008:         */
                   1009:        OLEDBG_BEGIN2("IOleInPlaceObject::InPlaceDeactivate called\r\n")
                   1010:         hrErr = lpContainerLine->m_lpOleIPObj->lpVtbl->InPlaceDeactivate(
                   1011:                 lpContainerLine->m_lpOleIPObj);
                   1012:         OLEDBG_END2
                   1013:         if (hrErr != NOERROR) {
                   1014:             OleDbgOutHResult("IOleInPlaceObject::InPlaceDeactivate returned", hrErr);
                   1015:         }
                   1016:     }
                   1017: 
                   1018: #endif // ! UNDOSUPPORTED 
                   1019: }
                   1020: 
                   1021: 
                   1022: 
                   1023: /* ContainerLine_UpdateInPlaceObjectRects
                   1024: ** -------------------------------------
                   1025: **    Update the PosRect and ClipRect of the given line 
                   1026: **    currently in-place active
                   1027: **    object. if there is no object active in-place, then do nothing.
                   1028: **
                   1029: **    OLE2NOTE: this function should be called when an action occurs
                   1030: **    that changes either the position of the object in the document
                   1031: **    (eg. changing document margins changes PosRect) or the clipRect
                   1032: **    changes (eg. resizing the document window changes the ClipRect).
                   1033: */
                   1034: void ContainerLine_UpdateInPlaceObjectRects(
                   1035:                LPCONTAINERLINE lpContainerLine, 
                   1036:                LPRECT                  lprcClipRect
                   1037: )
                   1038: {
                   1039:        LPCONTAINERDOC lpContainerDoc = lpContainerLine->m_lpDoc;
                   1040:        RECT rcClipRect;
                   1041:     RECT rcPosRect;
                   1042: 
                   1043: 
                   1044:        if (! lpContainerLine->m_fIpActive)
                   1045:                return;
                   1046: 
                   1047:        if (! lprcClipRect) {
                   1048:                ContainerDoc_GetClipRect(lpContainerDoc, (LPRECT)&rcClipRect);
                   1049:                lprcClipRect = (LPRECT)&rcClipRect;
                   1050:        }
                   1051:                                
                   1052:        OleDbgOutRect3("OutlineDoc_Resize (ClipRect)", (LPRECT)&rcClipRect);
                   1053:                                        
                   1054: 
                   1055:        ContainerLine_GetOleObjectRectInPixels(
                   1056:                        lpContainerLine,(LPRECT)&rcPosRect);
                   1057:                
                   1058:        OleDbgOutRect3(
                   1059:                "ContainerLine_UpdateInPlaceObjectRects (PosRect)", (LPRECT)&rcPosRect);
                   1060: 
                   1061:        OLEDBG_BEGIN2("IOleInPlaceObject::SetObjectRects called\r\n")
                   1062:        lpContainerLine->m_lpOleIPObj->lpVtbl->SetObjectRects(
                   1063:                        lpContainerLine->m_lpOleIPObj,
                   1064:                        (LPRECT)&rcPosRect,
                   1065:                        lprcClipRect
                   1066:        );
                   1067:        OLEDBG_END2
                   1068: }
                   1069: 
                   1070: 
                   1071: 
                   1072: /*************************************************************************
                   1073: ** ContainerLine::IOleInPlaceSite interface implementation
                   1074: *************************************************************************/
                   1075: 
                   1076: STDMETHODIMP CntrLine_IPSite_QueryInterface(
                   1077:         LPOLEINPLACESITE    lpThis, 
                   1078:         REFIID              riid,
                   1079:         LPVOID FAR*         lplpvObj
                   1080: )
                   1081: {
                   1082:     LPCONTAINERLINE lpContainerLine = 
                   1083:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1084:     
                   1085:     return ContainerLine_QueryInterface(lpContainerLine, riid, lplpvObj);
                   1086: }
                   1087:     
                   1088: 
                   1089: STDMETHODIMP_(ULONG) CntrLine_IPSite_AddRef(LPOLEINPLACESITE lpThis)
                   1090: {
                   1091:     LPCONTAINERLINE lpContainerLine = 
                   1092:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1093: 
                   1094:     OleDbgAddRefMethod(lpThis, "IOleInPlaceSite");
                   1095: 
                   1096:     return ContainerLine_AddRef(lpContainerLine);
                   1097: }
                   1098: 
                   1099: 
                   1100: STDMETHODIMP_(ULONG) CntrLine_IPSite_Release(LPOLEINPLACESITE lpThis)
                   1101: {
                   1102:     LPCONTAINERLINE lpContainerLine = 
                   1103:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1104: 
                   1105:     OleDbgReleaseMethod(lpThis, "IOleInPlaceSite");
                   1106: 
                   1107:     return ContainerLine_Release(lpContainerLine);
                   1108: }
                   1109: 
                   1110: 
                   1111: STDMETHODIMP CntrLine_IPSite_GetWindow(
                   1112:     LPOLEINPLACESITE    lpThis,     
                   1113:     HWND FAR*           lphwnd
                   1114: )
                   1115: {
                   1116:     LPCONTAINERLINE lpContainerLine = 
                   1117:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1118: 
                   1119:     OleDbgOut2("CntrLine_IPSite_GetWindow\r\n");
                   1120: 
                   1121:     *lphwnd = LineList_GetWindow(&((LPOUTLINEDOC)lpContainerLine->m_lpDoc)->m_LineList);
                   1122:     return NOERROR;
                   1123: }
                   1124: 
                   1125: STDMETHODIMP CntrLine_IPSite_ContextSensitiveHelp(
                   1126:     LPOLEINPLACESITE    lpThis, 
                   1127:     BOOL                fEnterMode
                   1128: )
                   1129: {
                   1130:     OleDbgOut2("CntrLine_IPSite_ContextSensitiveHelp\r\n");
                   1131: 
                   1132: #if defined( LATER )    
                   1133:     LPOLEINPLACEFRAME lpFrame = m_pEItem->m_pAC->GetInPlaceFrame();
                   1134:     HRESULT hrErr = lpFrame->ContextSensitiveHelp(fEnterMode);
                   1135:     lpFrame->Release();
                   1136: #endif  // LATER
                   1137:     return NOERROR;
                   1138: }
                   1139: 
                   1140: STDMETHODIMP CntrLine_IPSite_CanInPlaceActivate(LPOLEINPLACESITE lpThis)
                   1141: {
                   1142:     LPCONTAINERLINE lpContainerLine = 
                   1143:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1144: 
                   1145:     OleDbgOut2("CntrLine_IPSite_CanInPlaceActivate\r\n");
                   1146: 
                   1147:     /* OLE2NOTE: the container can NOT allow in-place activation if it
                   1148:     **    is currently displaying the object as an ICON
                   1149:     **    (DVASPECT_ICON). it can ONLY do in-place activation if it is
                   1150:     **    displaying the DVASPECT_CONTENT of the OLE object.
                   1151:     */
                   1152:     if (lpContainerLine->m_dwDrawAspect == DVASPECT_CONTENT) 
                   1153:         return NOERROR;
                   1154:     else 
                   1155:         return ResultFromScode(S_FALSE);
                   1156: }       
                   1157: 
                   1158: STDMETHODIMP CntrLine_IPSite_OnInPlaceActivate(LPOLEINPLACESITE lpThis)
                   1159: {
                   1160:     LPCONTAINERLINE lpContainerLine = 
                   1161:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1162:     LPCONTAINERDOC lpContainerDoc = lpContainerLine->m_lpDoc;          
                   1163:        SCODE sc = S_OK;
                   1164: 
                   1165:     OLEDBG_BEGIN2("CntrLine_IPSite_OnInPlaceActivate\r\n");
                   1166: 
                   1167:     /* OLE2NOTE: (OUTSIDE-IN CONTAINER) as a policy for managing
                   1168:     **    running in-place servers, we will keep only 1 inplace server
                   1169:     **    active at any given time. so when we start to inp-place activate
                   1170:     **    another line, then we want to shut down the previously
                   1171:     **    activated server. in this way we keep at most one inplace
                   1172:     **    server active at a time. this is NOT a required policy. apps
                   1173:     **    may choose to have a more sophisticated strategy. inside-out
                   1174:     **    containers will HAVE to have a more sophisticated strategy,
                   1175:     **    because they need (at a minimum) to keep all visible object
                   1176:     **    servers running.
                   1177:     **    
                   1178:     **    if the in-place activation is the result of activating a
                   1179:     **    linked object in another container, then we may arrive at
                   1180:     **    this method while another object is currently active.
                   1181:     **    normally, if the object is in-place activated by
                   1182:     **    double-clicking or Edit.<verb> from our own container, then
                   1183:     **    the previous in-place object would have been de-activated in
                   1184:     **    ContainerLine_DoVerb method.
                   1185:     */
                   1186:     if (!g_fInsideOutContainer) {
                   1187:         if (lpContainerDoc->m_lpLastIpActiveLine) {
                   1188:             ContainerDoc_ShutDownLastInPlaceServerIfNotNeeded(
                   1189:                     lpContainerDoc, lpContainerLine);
                   1190:         }
                   1191:         lpContainerDoc->m_lpLastIpActiveLine = lpContainerLine;
                   1192:     }
                   1193: 
                   1194:     lpContainerLine->m_fIpActive        = TRUE;
                   1195:     lpContainerLine->m_fIpVisible       = TRUE; 
                   1196:     lpContainerLine->m_fIpServerRunning = TRUE;
                   1197: 
                   1198:        /* OLE2NOTE: to avoid LRPC problems it is important to cache the
                   1199:        **    IOleInPlaceObject* pointer and NOT to call QueryInterface
                   1200:        **    each time it is needed.
                   1201:        */
                   1202:     lpContainerLine->m_lpOleIPObj = 
                   1203:                (LPOLEINPLACEOBJECT) ContainerLine_GetOleObject (
                   1204:                        lpContainerLine, 
                   1205:             &IID_IOleInPlaceObject
                   1206:     );
                   1207: 
                   1208:     OleDbgAssertSz(
                   1209:                        lpContainerLine->m_lpOleIPObj!=NULL, 
                   1210:                        "OLE object must support IOleInPlaceObject"
                   1211:        );
                   1212:        if (! lpContainerLine->m_lpOleIPObj) 
                   1213:                return ResultFromScode(E_FAIL); // ERROR: refuse to in-place activate
                   1214: 
                   1215:        OLEDBG_END2
                   1216:        
                   1217:        lpContainerLine->m_lpDoc->m_cIPActiveObjects++;                         
                   1218:     return NOERROR;
                   1219: }
                   1220: 
                   1221: 
                   1222: STDMETHODIMP CntrLine_IPSite_OnUIActivate (LPOLEINPLACESITE lpThis)
                   1223: {
                   1224:     LPCONTAINERLINE lpContainerLine = 
                   1225:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1226:     LPCONTAINERDOC lpContainerDoc = lpContainerLine->m_lpDoc;
                   1227:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerLine->m_lpDoc;
                   1228:     LPCONTAINERLINE lpLastUIActiveLine = lpContainerDoc->m_lpLastUIActiveLine;
                   1229:     HWND hWndNewUIActiveObj;
                   1230: 
                   1231:     OLEDBG_BEGIN2("CntrLine_IPSite_OnUIActivate\r\n");
                   1232: 
                   1233:     lpContainerLine->m_fUIActive        = TRUE; 
                   1234:     lpContainerDoc->m_fAddMyUI          = FALSE; 
                   1235:     lpContainerDoc->m_lpLastUIActiveLine = lpContainerLine;
                   1236:        
                   1237:     OLEDBG_BEGIN2("IOleInPlaceObject::GetWindow called\r\n")
                   1238:     lpContainerLine->m_lpOleIPObj->lpVtbl->GetWindow(
                   1239:             lpContainerLine->m_lpOleIPObj, 
                   1240:             (HWND FAR*)&hWndNewUIActiveObj
                   1241:     );
                   1242:     OLEDBG_END2
                   1243: 
                   1244:     if (g_fInsideOutContainer) {
                   1245:         /* OLE2NOTE: (INSIDE-OUT CONTAINER) an inside-out style
                   1246:         **    container must UIDeactivate the previous UIActive object
                   1247:         **    when a new object is going UIActive. since the inside-out
                   1248:         **    objects have their own windows visible, it is possible
                   1249:         **    that a click directly in an another server window will
                   1250:         **    cause it to UIActivate. OnUIActivate is the containers
                   1251:         **    notification that such has occured. it must then
                   1252:         **    UIDeactivate the other because at most one object can be
                   1253:         **    UIActive at a time.
                   1254:         */
                   1255:         if (lpLastUIActiveLine && (lpLastUIActiveLine!=lpContainerLine)) {
                   1256:             ContainerLine_UIDeactivate(lpLastUIActiveLine);
                   1257:                 
                   1258:             // Make sure new UIActive window is on top of all others
                   1259:             SetWindowPos(
                   1260:                     hWndNewUIActiveObj,
                   1261:                     HWND_TOPMOST,
                   1262:                     0,0,0,0,
                   1263:                     SWP_NOMOVE | SWP_NOSIZE
                   1264:             );
                   1265: 
                   1266:             OLEDBG_END2
                   1267:                return NOERROR;                 
                   1268:         }
                   1269:        }                               
                   1270:        
                   1271:     lpContainerDoc->m_hwndUIActiveObj = hWndNewUIActiveObj;
                   1272: 
                   1273: #if defined( USE_FRAMETOOLS )
                   1274:        ContainerDoc_RemoveFrameLevelTools(lpContainerDoc);
                   1275: #endif
                   1276: 
                   1277: #if defined( USE_DOCTOOLS )
                   1278:        ContainerDoc_RemoveDocLevelTools(lpContainerDoc);
                   1279: #endif
                   1280: 
                   1281:     OLEDBG_END2
                   1282:     return NOERROR;
                   1283: }
                   1284: 
                   1285:         
                   1286: STDMETHODIMP CntrLine_IPSite_GetWindowContext(
                   1287:     LPOLEINPLACESITE            lpThis,
                   1288:     LPOLEINPLACEFRAME FAR*      lplpFrame,
                   1289:     LPOLEINPLACEUIWINDOW FAR*   lplpDoc,
                   1290:     LPRECT                      lprcPosRect, 
                   1291:     LPRECT                      lprcClipRect, 
                   1292:     LPOLEINPLACEFRAMEINFO       lpFrameInfo
                   1293: )
                   1294: {
                   1295:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                   1296:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP)g_lpApp;
                   1297:     LPCONTAINERLINE lpContainerLine = 
                   1298:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1299: 
                   1300:     OLEDBG_BEGIN2("CntrLine_IPSite_GetWindowContext\r\n")
                   1301: 
                   1302:        /* OLE2NOTE: The server should fill in the "cb" field so that the
                   1303:        **    container can tell what size structure the server is
                   1304:        **    expecting. this enables this structure to be easily extended
                   1305:        **    in future releases of OLE. the container should check this
                   1306:        **    field so that it doesn't try to use fields that do not exist
                   1307:        **    since the server may be using an old structure definition.
                   1308:        **    Since this is the first release of OLE2.0, the structure is
                   1309:        **    guaranteed to be at least large enough for the current
                   1310:        **    definition of OLEINPLACEFRAMEINFO struct. thus we do NOT need
                   1311:        **    to consider this an error if the server did not fill in this
                   1312:        **    field correctly. this server may have trouble in the future,
                   1313:        **    however, when the structure is extended.
                   1314:        */
                   1315:  //    OleDbgAssert(lpFrameInfo->cb >= sizeof(OLEINPLACEFRAMEINFO));
                   1316: 
                   1317:     *lplpFrame = (LPOLEINPLACEFRAME)&lpContainerApp->m_OleInPlaceFrame;
                   1318:     (*lplpFrame)->lpVtbl->AddRef(*lplpFrame);   // must return AddRef'ed ptr
                   1319: 
                   1320:     // OLE2NOTE: an MDI app would have to provide *lplpDoc
                   1321:     *lplpDoc  = NULL;
                   1322:     
                   1323:     ContainerLine_GetOleObjectRectInPixels(lpContainerLine, lprcPosRect); 
                   1324:        ContainerDoc_GetClipRect(lpContainerLine->m_lpDoc, lprcClipRect);
                   1325:     
                   1326:     OleDbgOutRect3("CntrLine_IPSite_GetWindowContext (PosRect)", lprcPosRect);
                   1327:     OleDbgOutRect3("CntrLine_IPSite_GetWindowContext (ClipRect)",lprcClipRect);
                   1328: 
                   1329:     lpFrameInfo->hwndFrame      = lpOutlineApp->m_hWndApp; 
                   1330: 
                   1331: #if defined( MDI_VERSION )
                   1332:     lpFrameInfo->fMDIApp        = TRUE;
                   1333: #else
                   1334:     lpFrameInfo->fMDIApp        = FALSE;
                   1335: #endif
                   1336: 
                   1337:     lpFrameInfo->haccel         = lpContainerApp->m_hAccelIPCntr;
                   1338:     lpFrameInfo->cAccelEntries  = NUM_INPLACE_ACCELS;
                   1339: 
                   1340:     OLEDBG_END2
                   1341:     return NOERROR;
                   1342: }       
                   1343: 
                   1344: 
                   1345: STDMETHODIMP CntrLine_IPSite_Scroll(
                   1346:     LPOLEINPLACESITE    lpThis,
                   1347:     SIZE                scrollExtent
                   1348: )
                   1349: {
                   1350:     OleDbgOut2("CntrLine_IPSite_Scroll\r\n");
                   1351: 
                   1352:     return ResultFromScode(E_FAIL);
                   1353: }
                   1354: 
                   1355: 
                   1356: STDMETHODIMP CntrLine_IPSite_OnUIDeactivate(
                   1357:     LPOLEINPLACESITE    lpThis,
                   1358:     BOOL                fUndoable
                   1359: )
                   1360: {
                   1361:     LPCONTAINERLINE lpContainerLine = 
                   1362:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1363:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerLine->m_lpDoc;
                   1364:     LPCONTAINERAPP lpContainerApp = (LPCONTAINERAPP) g_lpApp;
                   1365:     LPLINELIST lpLL;
                   1366:     int nIndex;
                   1367:        MSG msg;
                   1368: 
                   1369:     OLEDBG_BEGIN2("CntrLine_IPSite_OnUIDeactivate\r\n")
                   1370: 
                   1371:     lpContainerLine->m_fUIActive = FALSE;
                   1372:     lpContainerLine->m_fIpChangesUndoable = fUndoable;
                   1373:     lpContainerLine->m_lpDoc->m_hwndUIActiveObj = NULL;
                   1374: 
                   1375:        if (lpContainerLine == lpContainerLine->m_lpDoc->m_lpLastUIActiveLine) {
                   1376:        
                   1377:         lpContainerLine->m_lpDoc->m_lpLastUIActiveLine = NULL;
                   1378: 
                   1379:                /* OLE2NOTE: here we look ahead if there is a DBLCLK sitting in our
                   1380:                **    message queue. if so, it could result in in-place activating
                   1381:                **    another object. we want to avoid placing our tools and
                   1382:                **    repainting if immediately another object is going to do the
                   1383:                **    same. SO, if there is a DBLCLK in the queue for this document
                   1384:                **    we will only set the fAddMyUI flag to indicate that this work
                   1385:                **    is still to be done. if another object actually in-place
                   1386:                **    activates then this flag will be cleared in
                   1387:                **    IOleInPlaceSite::OnUIActivate. if it does NOT get cleared,
                   1388:                **    then at the end of processing the DBLCLK message in our
                   1389:                **    OutlineDocWndProc we will put our tools back.
                   1390:                */
                   1391:                if (! PeekMessage(&msg, lpOutlineDoc->m_hWndDoc, 
                   1392:                                WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, 
                   1393:                                PM_NOREMOVE | PM_NOYIELD)) {
                   1394: 
                   1395: #if defined( USE_DOCTOOLS )
                   1396:                        ContainerDoc_AddDocLevelTools(lpContainerLine->m_lpDoc);
                   1397: #endif
                   1398: 
                   1399: #if defined( USE_FRAMETOOLS )
                   1400:                        ContainerDoc_AddFrameLevelUI(lpContainerLine->m_lpDoc);
                   1401: #endif
                   1402:                } else {
                   1403:                        lpContainerLine->m_lpDoc->m_fAddMyUI = TRUE; 
                   1404:                }
                   1405: 
                   1406:                /* OLE2NOTE: we should re-take focus. the in-place server window
                   1407:                **    previously had the focus; this window has just been removed.
                   1408:                */
                   1409:                SetFocus(OutlineDoc_GetWindow((LPOUTLINEDOC)lpContainerLine->m_lpDoc));
                   1410: 
                   1411:                // force the line to redraw to remove in-place active hatch
                   1412:                lpLL = OutlineDoc_GetLineList(lpOutlineDoc);
                   1413:                nIndex = LineList_GetLineIndex(lpLL, (LPLINE)lpContainerLine);
                   1414:                LineList_ForceLineRedraw(lpLL, nIndex, TRUE);
                   1415:        }
                   1416:        
                   1417:     OLEDBG_END2
                   1418:     return NOERROR;
                   1419: }
                   1420: 
                   1421: 
                   1422: STDMETHODIMP CntrLine_IPSite_OnInPlaceDeactivate(LPOLEINPLACESITE lpThis)
                   1423: {
                   1424:     LPCONTAINERLINE lpContainerLine = 
                   1425:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1426: 
                   1427:     OLEDBG_BEGIN2("CntrLine_IPSite_OnInPlaceDeactivate\r\n");
                   1428: 
                   1429:     lpContainerLine->m_fIpActive            = FALSE;
                   1430:     lpContainerLine->m_fIpVisible           = FALSE; 
                   1431:     lpContainerLine->m_fIpChangesUndoable   = FALSE;
                   1432:        
                   1433:        OleStdRelease((LPUNKNOWN) lpContainerLine->m_lpOleIPObj);
                   1434:        lpContainerLine->m_lpOleIPObj = NULL;   
                   1435:        lpContainerLine->m_lpDoc->m_cIPActiveObjects--;                         
                   1436: 
                   1437:        OLEDBG_END2
                   1438:     return NOERROR;
                   1439: }
                   1440: 
                   1441: 
                   1442: STDMETHODIMP CntrLine_IPSite_DiscardUndoState(LPOLEINPLACESITE lpThis)
                   1443: {
                   1444:     OleDbgOut2("CntrLine_IPSite_DiscardUndoState\r\n");
                   1445: 
                   1446:     return NOERROR;
                   1447: }
                   1448: 
                   1449: 
                   1450: STDMETHODIMP CntrLine_IPSite_DeactivateAndUndo(LPOLEINPLACESITE lpThis)
                   1451: {
                   1452:     OleDbgOut2("CntrLine_IPSite_DeactivateAndUndo\r\n");
                   1453: 
                   1454:     return NOERROR;
                   1455: }
                   1456: 
                   1457: 
                   1458: STDMETHODIMP CntrLine_IPSite_OnPosRectChange(
                   1459:     LPOLEINPLACESITE    lpThis,
                   1460:     LPCRECT             lprcPosRect            
                   1461: )
                   1462: {
                   1463:     LPCONTAINERLINE lpContainerLine = 
                   1464:             ((struct COleInPlaceSiteImpl FAR*)lpThis)->lpContainerLine;
                   1465:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpContainerLine->m_lpDoc;
                   1466:        LPSCALEFACTOR lpscale = OutlineDoc_GetScaleFactor(lpOutlineDoc);
                   1467:        LPLINE lpLine = (LPLINE)lpContainerLine;
                   1468:     LPLINELIST lpLL;
                   1469:     int nIndex;
                   1470:        RECT rcClipRect;
                   1471:        RECT rcNewPosRect;
                   1472:        SIZEL sizelPix;
                   1473:        SIZEL sizelHim;
                   1474:        int nIPObjHeight = lprcPosRect->bottom - lprcPosRect->top;
                   1475:        int nIPObjWidth = lprcPosRect->right - lprcPosRect->left;
                   1476: 
                   1477:     OLEDBG_BEGIN2("CntrLine_IPSite_OnPosRectChange\r\n")
                   1478: 
                   1479:     OleDbgOutRect3("CntrLine_IPSite_OnPosRectChange (PosRect --IN)", 
                   1480:                        (LPRECT)lprcPosRect);
                   1481: 
                   1482:        /* OLE2NOTE: if the in-place container does NOT impose any
                   1483:        **    size contraints on its in-place active objects, then it may
                   1484:        **    simply grant the size requested by the object by immediately
                   1485:        **    calling IOleInPlaceObject::SetObjectRects with the
                   1486:        **    lprcPosRect passed by the in-place object.
                   1487:        **    
                   1488:        **    Container Outline, however, imposes a size constraint on its
                   1489:        **    embedded objects (see comment in ContainerLine_UpdateExtent),
                   1490:        **    thus it is necessary to calculate the size that the in-place
                   1491:        **    active object is allowed to be.
                   1492:        */
                   1493: 
                   1494:        /* calculate the new object extents. we can NOT directly ask the
                   1495:        **    object via IOleObject::GetExtent because this method will
                   1496:        **    retreive the extents of the last cached metafile. the cache
                   1497:        **    has not yet been updated by this point. the best we can do is
                   1498:        **    determine the scale factor that the object is operating at
                   1499:        **    and scale the lprcPosRect back to HIMETRIC units.
                   1500:        */
                   1501:        if (lpContainerLine->m_sizeInHimetric.cx > 0 &&
                   1502:                lpContainerLine->m_sizeInHimetric.cy > 0) {
                   1503:                sizelHim.cx = lpLine->m_nWidthInHimetric;
                   1504:                sizelHim.cy = lpLine->m_nHeightInHimetric;
                   1505:                XformSizeInHimetricToPixels(NULL, &sizelHim, &sizelPix);
                   1506:                sizelPix.cx -= 2* LINE_BOUNDARY_WIDTH;
                   1507:                sizelPix.cy -= 2* LINE_BOUNDARY_WIDTH;
                   1508:                sizelHim.cx = lpContainerLine->m_sizeInHimetric.cx * nIPObjWidth / 
                   1509:                                sizelPix.cx;
                   1510:                sizelHim.cy = lpContainerLine->m_sizeInHimetric.cy * nIPObjHeight / 
                   1511:                                sizelPix.cy;
                   1512:                
                   1513:                // Convert size back to 100% zoom
                   1514:                sizelHim.cx = sizelHim.cx * lpscale->dwSxD / lpscale->dwSxN;
                   1515:                sizelHim.cy = sizelHim.cy * lpscale->dwSyD / lpscale->dwSyN;
                   1516:                        
                   1517:        } else {
                   1518:                sizelHim.cx = (long)DEFOBJWIDTH;
                   1519:                sizelHim.cy = (long)DEFOBJHEIGHT;
                   1520:                XformSizeInHimetricToPixels(NULL, &sizelHim, &sizelPix);
                   1521:                sizelHim.cx = sizelHim.cx * nIPObjWidth / sizelPix.cx;
                   1522:                sizelHim.cy = sizelHim.cy * nIPObjHeight / sizelPix.cy;
                   1523:        }
                   1524:        ContainerLine_UpdateExtent(lpContainerLine, &sizelHim);
                   1525:        ContainerLine_GetOleObjectRectInPixels(
                   1526:                        lpContainerLine, (LPRECT)&rcNewPosRect); 
                   1527: 
                   1528:        ContainerDoc_GetClipRect(lpContainerLine->m_lpDoc, (LPRECT)&rcClipRect);
                   1529: 
                   1530:     OleDbgOutRect3("CntrLine_IPSite_OnPosRectChange (PosRect --OUT)", 
                   1531:                        (LPRECT)&rcNewPosRect);
                   1532:     OleDbgOutRect3("CntrLine_IPSite_OnPosRectChange (ClipRect--OUT)", 
                   1533:             (LPRECT)&rcClipRect);
                   1534: 
                   1535:     OLEDBG_BEGIN2("IOleInPlaceObject::SetObjectRects called\r\n")
                   1536:     lpContainerLine->m_lpOleIPObj->lpVtbl->SetObjectRects(
                   1537:             lpContainerLine->m_lpOleIPObj, 
                   1538:             (LPRECT)&rcNewPosRect, 
                   1539:             (LPRECT)&rcClipRect
                   1540:     );
                   1541:     OLEDBG_END2
                   1542: 
                   1543:     lpLL = OutlineDoc_GetLineList(lpOutlineDoc);
                   1544:     nIndex = LineList_GetLineIndex(lpLL, (LPLINE)lpContainerLine);
                   1545:        ContainerDoc_UpdateInPlaceObjectRects(lpContainerLine->m_lpDoc, nIndex);
                   1546: 
                   1547:     OLEDBG_END2
                   1548:     return NOERROR;
                   1549: }
                   1550: 
                   1551: 
                   1552: #endif // INPLACE_CNTR
                   1553: 
                   1554: 

unix.superglobalmegacorp.com

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