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

1.1       root        1: /*************************************************************************
                      2: ** 
                      3: **    OLE 2 Server Sample Code
                      4: **    
                      5: **    svrinpl.c
                      6: **    
                      7: **    This file contains all interfaces, methods and related support
                      8: **    functions for an In-Place Object (Server) application (aka. Visual
                      9: **    Editing). The in-place Object application includes the following
                     10: **    implementation objects: 
                     11: **    
                     12: **    ServerDoc Object
                     13: **      exposed interfaces:
                     14: **          IOleInPlaceObject
                     15: **          IOleInPlaceActiveObject
                     16: **    
                     17: **    ServerApp Object
                     18: **      exposed interfaces:
                     19: **          IUnknown
                     20: **    
                     21: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
                     22: **
                     23: *************************************************************************/
                     24: 
                     25: 
                     26: #include "outline.h"
                     27: 
                     28: OLEDBGDATA
                     29: 
                     30: extern LPOUTLINEAPP             g_lpApp;
                     31: 
                     32: 
                     33: #if defined( INPLACE_SVR )
                     34: 
                     35: /* OLE2NOTE: the object should compose a string that is used by
                     36: **    in-place containers to be used for the window titles. this string
                     37: **    is passed to the container application via
                     38: **    IOleInPlaceUIWindow::SetActiveObject. the string should have the
                     39: **    following form:
                     40: **          <application name> - <object short type name>
                     41: **    SDI containers can use the string directly to display in the
                     42: **    frame window title. the container would concatenate the string 
                     43: **    " in <container doc name>".
                     44: **    an MDI container with the MDI child window maximized can do the
                     45: **    same as the SDI container. an MDI container with the MDI child
                     46: **    windows NOT maximized can look for the " - " in the string from
                     47: **    the object. the first part of the string (app name) would be put
                     48: **    as the frame window title; the second part would be composed with
                     49: **    " in <container doc name>" and used as the MDI child window
                     50: **    title. 
                     51: */
                     52: 
                     53: // REVIEW: should use string resource for messages
                     54: char g_szIPObjectTitle[] = APPNAME " - " SHORTUSERTYPENAME;
                     55: 
                     56: extern RECT g_rectNull;
                     57: 
                     58: 
                     59: 
                     60: /*************************************************************************
                     61: ** ServerDoc::IOleInPlaceObject interface implementation
                     62: *************************************************************************/
                     63: 
                     64: // IOleInPlaceObject::QueryInterface method
                     65: 
                     66: STDMETHODIMP SvrDoc_IPObj_QueryInterface(
                     67:         LPOLEINPLACEOBJECT  lpThis,
                     68:         REFIID              riid,
                     69:         LPVOID FAR *        lplpvObj
                     70: )
                     71: {
                     72:     LPSERVERDOC lpServerDoc =
                     73:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                     74: 
                     75:     return OleDoc_QueryInterface((LPOLEDOC)lpServerDoc, riid, lplpvObj);
                     76: }
                     77: 
                     78: 
                     79: // IOleInPlaceObject::AddRef method
                     80: 
                     81: STDMETHODIMP_(ULONG) SvrDoc_IPObj_AddRef(LPOLEINPLACEOBJECT lpThis)
                     82: {
                     83:     LPSERVERDOC lpServerDoc =
                     84:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                     85: 
                     86:     OleDbgAddRefMethod(lpThis, "IOleInPlaceObject");
                     87: 
                     88:     return OleDoc_AddRef((LPOLEDOC)lpServerDoc);
                     89: }
                     90: 
                     91: 
                     92: // IOleInPlaceObject::Release method
                     93: 
                     94: STDMETHODIMP_(ULONG) SvrDoc_IPObj_Release(LPOLEINPLACEOBJECT lpThis)
                     95: {
                     96:     LPSERVERDOC lpServerDoc =
                     97:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                     98:     
                     99:     OleDbgReleaseMethod(lpThis, "IOleInPlaceObject");
                    100: 
                    101:     return OleDoc_Release((LPOLEDOC)lpServerDoc);
                    102: }
                    103: 
                    104: 
                    105: // IOleInPlaceObject::GetWindow method
                    106: 
                    107: STDMETHODIMP SvrDoc_IPObj_GetWindow(
                    108:         LPOLEINPLACEOBJECT  lpThis,
                    109:         HWND FAR*           lphwnd
                    110: )
                    111: {
                    112:     LPSERVERDOC lpServerDoc =
                    113:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    114: 
                    115:     OLEDBG_BEGIN2("SvrDoc_IPObj_GetWindow\r\n")
                    116: 
                    117:     *lphwnd = ((LPOUTLINEDOC)lpServerDoc)->m_hWndDoc;
                    118: 
                    119:     OLEDBG_END2
                    120:     return S_OK;
                    121: }
                    122: 
                    123: 
                    124: // IOleInPlaceObject::ContextSensitiveHelp method
                    125: 
                    126: STDMETHODIMP SvrDoc_IPObj_ContextSensitiveHelp(
                    127:         LPOLEINPLACEOBJECT  lpThis,
                    128:         BOOL                fEnable
                    129: )
                    130: {
                    131:     LPSERVERDOC lpServerDoc =
                    132:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    133: 
                    134:     OLEDBG_BEGIN2("SvrDoc_IPObj_ContextSensitiveHelp\r\n")
                    135: 
                    136:     lpServerDoc->m_lpIPData->fInCSHelpMode = fEnable;
                    137: 
                    138:     OLEDBG_END2
                    139:     return S_OK;
                    140: }
                    141: 
                    142: 
                    143: // IOleInPlaceObject::InPlaceDeactivate method
                    144: 
                    145: STDMETHODIMP SvrDoc_IPObj_InPlaceDeactivate(LPOLEINPLACEOBJECT lpThis)
                    146: {
                    147:     LPSERVERDOC lpServerDoc =
                    148:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    149:     HRESULT hrErr;
                    150: 
                    151:     OLEDBG_BEGIN2("SvrDoc_IPObj_InPlaceDeactivate\r\n")
                    152: 
                    153:     hrErr = ServerDoc_DoInPlaceDeactivate(lpServerDoc);
                    154: 
                    155:     OLEDBG_END2
                    156:     return hrErr;
                    157: }
                    158: 
                    159: 
                    160: // IOleInPlaceObject::UIDeactivate method
                    161: 
                    162: STDMETHODIMP SvrDoc_IPObj_UIDeactivate(LPOLEINPLACEOBJECT lpThis)
                    163: {
                    164:     LPSERVERDOC     lpServerDoc =
                    165:                         ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    166:     LPSERVERAPP     lpServerApp = (LPSERVERAPP)g_lpApp;
                    167:        LPOUTLINEDOC    lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                    168:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    169:     LPLINELIST         lpLL = (LPLINELIST)&((LPOUTLINEDOC)lpServerDoc)->m_LineList;
                    170:        HWND                    hWndApp = OutlineApp_GetWindow(g_lpApp);
                    171:     
                    172:     OLEDBG_BEGIN2("SvrDoc_IPObj_UIDeactivate\r\n");
                    173: 
                    174:     if (!lpServerDoc->m_fUIActive) {
                    175:         OLEDBG_END2
                    176:         return NOERROR;
                    177:     }
                    178: 
                    179:     lpServerDoc->m_fUIActive = FALSE;
                    180: 
                    181:        // Clip the hatch window to the size of pos rect so, that the object 
                    182:        // adornments and hatch border will not be visible.
                    183:     ServerDoc_ResizeInPlaceWindow(lpServerDoc,
                    184:             (LPRECT)&(lpServerDoc->m_lpIPData->rcPosRect),
                    185:             (LPRECT)&(lpServerDoc->m_lpIPData->rcPosRect)
                    186:     );
                    187: 
                    188:     if (lpIPData->lpDoc) 
                    189:         lpIPData->lpDoc->lpVtbl->SetActiveObject(lpIPData->lpDoc, NULL, NULL);
                    190: 
                    191:     if (lpIPData->lpFrame) { 
                    192:         lpIPData->lpFrame->lpVtbl->SetActiveObject(
                    193:             lpIPData->lpFrame,
                    194:             NULL,
                    195:             NULL
                    196:         );
                    197:     }
                    198:     
                    199: #if defined( USE_FRAMETOOLS )
                    200:        /* OLE2NOTE: we must hide our frame tools here but NOT call
                    201:        **    IOleInPlaceFrame::SetBorderSpace(NULL) or SetMenu(NULL).
                    202:        **    we must hide our tools BEFORE calling
                    203:        **    IOleInPlaceSite::OnUIDeactivate. the container will put
                    204:        **    his menus and tools back when OnUIDeactivate is called.
                    205:        */
                    206:     ServerDoc_RemoveFrameLevelTools(lpServerDoc);
                    207: #endif
                    208: 
                    209:     OLEDBG_BEGIN2("IOleInPlaceSite::OnUIDeactivate called\r\n");
                    210:     lpIPData->lpSite->lpVtbl->OnUIDeactivate(lpIPData->lpSite, FALSE);
                    211:     OLEDBG_END2
                    212: 
                    213:        /* Reset to use our normal app's accelerator table */
                    214:     g_lpApp->m_hAccel = g_lpApp->m_hAccelApp;
                    215:     g_lpApp->m_hWndAccelTarget = hWndApp;
                    216: 
                    217:     OLEDBG_END2
                    218:                
                    219: #if !defined( SVR_INSIDEOUT )
                    220:     /* OLE2NOTE: an "outside-in" style in-place server would hide its
                    221:     **    window here. an "inside-out" style server leaves its window
                    222:     **    visible when it is UIDeactivated. it would only hide its
                    223:     **    window when InPlaceDeactivated. this app is an "inside-out" 
                    224:     **    style server. it is recommended for most server to support
                    225:     **    inside-out behavior if possible.
                    226:     */
                    227:        ServerDoc_DoInPlaceHide(lpServerDoc);
                    228: #endif // INSIEDOUT
                    229: 
                    230:     return NOERROR;
                    231: }
                    232: 
                    233: 
                    234: // IOleInPlaceObject::SetObjectRects method
                    235: 
                    236: STDMETHODIMP SvrDoc_IPObj_SetObjectRects(
                    237:         LPOLEINPLACEOBJECT  lpThis,
                    238:         LPCRECT             lprcPosRect,
                    239:         LPCRECT             lprcClipRect
                    240: )
                    241: {
                    242:     LPSERVERDOC  lpServerDoc =
                    243:                     ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    244:     LPINPLACEDATA lpIPData = lpServerDoc->m_lpIPData;
                    245:     LPLINELIST   lpLL = OutlineDoc_GetLineList((LPOUTLINEDOC)lpServerDoc);
                    246: 
                    247:     OLEDBG_BEGIN2("SvrDoc_IPObj_SetObjectRects\r\n")
                    248: 
                    249:     OleDbgOutRect3("SvrDoc_IPObj_SetObjectRects (PosRect)", 
                    250:                        (LPRECT)lprcPosRect);
                    251:     OleDbgOutRect3("SvrDoc_IPObj_SetObjectRects (ClipRect)", 
                    252:             (LPRECT)lprcClipRect);
                    253: 
                    254:        // save the current PosRect and ClipRect
                    255:        lpIPData->rcPosRect = *lprcPosRect;
                    256:        lpIPData->rcClipRect = *lprcClipRect;
                    257: 
                    258:        if (! lpServerDoc->m_fUIActive) // hatch and adornaments must not be drawn
                    259:                lprcClipRect = lprcPosRect;
                    260:        
                    261:        ServerDoc_ResizeInPlaceWindow(
                    262:                        lpServerDoc, (LPRECT)lprcPosRect, (LPRECT)lprcClipRect);
                    263:     
                    264: 
                    265:     /* reset the horizontal extent of the listbox. this makes 
                    266:     **    the listbox realize that a scroll bar is not needed.
                    267:     */
                    268:     SendMessage(
                    269:             lpLL->m_hWndListBox, 
                    270:             LB_SETHORIZONTALEXTENT, 
                    271:             (int) 0,
                    272:             0L
                    273:     );
                    274:     SendMessage(
                    275:             lpLL->m_hWndListBox,
                    276:             LB_SETHORIZONTALEXTENT,
                    277:             (int) (lpIPData->rcPosRect.right - lpIPData->rcPosRect.left),
                    278:             0L
                    279:     );
                    280: 
                    281:     OLEDBG_END2
                    282:     return NOERROR;
                    283: }
                    284: 
                    285: 
                    286: // IOleInPlaceObject::ReactivateAndUndo method
                    287: 
                    288: STDMETHODIMP SvrDoc_IPObj_ReactivateAndUndo(LPOLEINPLACEOBJECT lpThis)
                    289: {
                    290:     OLEDBG_BEGIN2("SvrDoc_IPObj_ReactivateAndUndo\r\n")
                    291: 
                    292:     // We do not support support UNDO.
                    293: 
                    294:     /* REVIEW: for debugging purposes it would be useful to give a
                    295:     **    message box indicating that this method has been called.
                    296:     */
                    297: 
                    298:     OLEDBG_END2
                    299:     return NOERROR;
                    300: }
                    301: 
                    302: 
                    303: /*************************************************************************
                    304: ** ServerDoc::IOleInPlaceActiveObject interface implementation
                    305: *************************************************************************/
                    306: 
                    307: // IOleInPlaceActiveObject::QueryInterface method
                    308: 
                    309: STDMETHODIMP SvrDoc_IPActiveObj_QueryInterface(
                    310:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    311:         REFIID                      riid,
                    312:         LPVOID FAR *                lplpvObj
                    313: )
                    314: {
                    315:     SCODE sc = E_NOINTERFACE;
                    316:     LPSERVERDOC lpServerDoc =
                    317:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    318: 
                    319:     /* The container should not be able to access the other interfaces
                    320:     ** of our object by doing QI on this interface. 
                    321:     */
                    322: 
                    323:     *lplpvObj = NULL;
                    324:     if (IsEqualIID(riid, &IID_IUnknown) ||
                    325:         IsEqualIID(riid, &IID_IOleWindow) ||
                    326:         IsEqualIID(riid, &IID_IOleInPlaceActiveObject)) {
                    327:         OleDbgOut4("OleDoc_QueryInterface: IOleInPlaceActiveObject* RETURNED\r\n");
                    328: 
                    329:         *lplpvObj = lpThis;
                    330:         OleDoc_AddRef((LPOLEDOC)lpServerDoc);
                    331:         sc = NOERROR;
                    332:     }
                    333:     
                    334:     OleDbgQueryInterfaceMethod(*lplpvObj);
                    335: 
                    336:     return ResultFromScode(sc);   
                    337: }
                    338: 
                    339: 
                    340: // IOleInPlaceActiveObject::AddRef method
                    341: 
                    342: STDMETHODIMP_(ULONG) SvrDoc_IPActiveObj_AddRef(
                    343:         LPOLEINPLACEACTIVEOBJECT lpThis
                    344: )
                    345: {
                    346:     LPSERVERDOC lpServerDoc =
                    347:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    348: 
                    349:     OleDbgAddRefMethod(lpThis, "IOleInPlaceActiveObject");
                    350: 
                    351:     return OleDoc_AddRef((LPOLEDOC)lpServerDoc);
                    352: }
                    353: 
                    354: 
                    355: // IOleInPlaceActiveObject::Release method
                    356: 
                    357: STDMETHODIMP_(ULONG) SvrDoc_IPActiveObj_Release(
                    358:         LPOLEINPLACEACTIVEOBJECT lpThis
                    359: )
                    360: {
                    361:     LPSERVERDOC lpServerDoc =
                    362:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    363:     
                    364:     OleDbgReleaseMethod(lpThis, "IOleInPlaceActiveObject");
                    365: 
                    366:     return OleDoc_Release((LPOLEDOC)lpServerDoc);
                    367: }
                    368: 
                    369: 
                    370: // IOleInPlaceActiveObject::GetWindow method
                    371: 
                    372: STDMETHODIMP SvrDoc_IPActiveObj_GetWindow(
                    373:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    374:         HWND FAR*                   lphwnd
                    375: )
                    376: {
                    377:     LPSERVERDOC lpServerDoc =
                    378:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    379: 
                    380:     OLEDBG_BEGIN2("SvrDoc_IPActiveObj_GetWindow\r\n")
                    381: 
                    382:     *lphwnd = ((LPOUTLINEDOC)lpServerDoc)->m_hWndDoc;
                    383: 
                    384:     OLEDBG_END2
                    385:     return NOERROR;
                    386: }
                    387: 
                    388: 
                    389: // IOleInPlaceActiveObject::ContextSensitiveHelp method
                    390: 
                    391: STDMETHODIMP SvrDoc_IPActiveObj_ContextSensitiveHelp(
                    392:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    393:         BOOL                        fEnable
                    394: )
                    395: {
                    396:     LPSERVERDOC lpServerDoc =
                    397:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    398: 
                    399:     OLEDBG_BEGIN2("SvrDoc_IPActiveObj_ContextSensitiveHelp\r\n")
                    400: 
                    401:     lpServerDoc->m_lpIPData->fInCSHelpMode = fEnable;
                    402: 
                    403:     OLEDBG_END2
                    404:     return NOERROR;
                    405: }
                    406: 
                    407: 
                    408: // IOleInPlaceActiveObject::TranslateAccelerator method
                    409: 
                    410: STDMETHODIMP SvrDoc_IPActiveObj_TranslateAccelerator(
                    411:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    412:         LPMSG                       lpmsg
                    413: )
                    414: {
                    415:     // This will never be called because this server is implemented as an EXE
                    416:     return NOERROR; 
                    417: }
                    418: 
                    419: 
                    420: // IOleInPlaceActiveObject::OnFrameWindowActivate method
                    421: 
                    422: STDMETHODIMP SvrDoc_IPActiveObj_OnFrameWindowActivate(
                    423:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    424:         BOOL                        fActivate
                    425: )
                    426: {
                    427:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)
                    428:             ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    429:     HWND hWndDoc = OutlineDoc_GetWindow(lpOutlineDoc);
                    430: 
                    431:     OleDbgOut2("SvrDoc_IPActiveObj_OnFrameWindowActivate\r\n");
                    432: 
                    433:        /* OLE2NOTE: this is a notification of the container application's
                    434:        **    WM_ACTIVATEAPP status. some applications may find this
                    435:        **    important. we need to update the enable/disable status of our
                    436:     **    tool bar buttons.
                    437:        */
                    438: 
                    439:     // OLE2NOTE: We can't call OutlineDoc_UpdateFrameToolButtons
                    440:     //           right away which 
                    441:     //           would generate some OLE calls and eventually 
                    442:     //           WM_ACTIVATEAPP and a loop was formed. Therefore, we
                    443:     //           should delay the frame tool initialization until 
                    444:     //                  WM_ACTIVATEAPP is finished by posting a message
                    445:     //                  to ourselves.
                    446: 
                    447:     /* Update enable/disable state of buttons in toolbar */
                    448:     if (fActivate) 
                    449:         PostMessage(hWndDoc, WM_U_INITFRAMETOOLS, 0, 0L);
                    450: 
                    451:     return NOERROR;
                    452: }
                    453: 
                    454: 
                    455: // IOleInPlaceActiveObject::OnDocWindowActivate method
                    456: 
                    457: STDMETHODIMP SvrDoc_IPActiveObj_OnDocWindowActivate(
                    458:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    459:         BOOL                        fActivate
                    460: )
                    461: {
                    462:     LPSERVERDOC     lpServerDoc =
                    463:                         ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    464:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    465: 
                    466:     OLEDBG_BEGIN2("SvrDoc_IPActiveObj_OnDocWindowActivate\r\n")
                    467: 
                    468:     if (fActivate) {
                    469:         ServerDoc_AddFrameLevelUI(lpServerDoc);
                    470:     }
                    471:     else {
                    472: #if defined( USE_FRAMETOOLS )
                    473:                /* OLE2NOTE: we must NOT call IOleInPlaceFrame::SetBorderSpace(NULL)
                    474:                **    or SetMenu(NULL) here. we should simply hide our tools.
                    475:                */
                    476:         ServerDoc_RemoveFrameLevelTools(lpServerDoc);
                    477: #endif  
                    478:     }
                    479: 
                    480:     OLEDBG_END2
                    481:     return NOERROR;
                    482: }
                    483: 
                    484: 
                    485: // IOleInPlaceActiveObject::ResizeBorder method
                    486: 
                    487: STDMETHODIMP SvrDoc_IPActiveObj_ResizeBorder(
                    488:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    489:         LPCRECT                     lprectBorder,
                    490:         LPOLEINPLACEUIWINDOW        lpIPUiWnd,
                    491:                BOOL                                            fFrameWindow
                    492: )
                    493: {
                    494:     LPSERVERDOC lpServerDoc =
                    495:                     ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    496:        LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                    497: 
                    498:     OLEDBG_BEGIN2("SvrDoc_IPActiveObj_ResizeBorder\r\n")
                    499: 
                    500: 
                    501: #if defined( USE_FRAMETOOLS )
                    502: 
                    503:        if (fFrameWindow) {
                    504:                FrameTools_NegotiateForSpaceAndShow(
                    505:                                lpOutlineDoc->m_lpFrameTools, 
                    506:                                (LPRECT)lprectBorder,
                    507:                                (LPOLEINPLACEFRAME)lpIPUiWnd
                    508:                );              
                    509:        }
                    510: 
                    511: #endif
                    512: 
                    513:     OLEDBG_END2
                    514:     return NOERROR;
                    515: }   
                    516: 
                    517: 
                    518: // IOleInPlaceActiveObject::EnableModeless method
                    519: 
                    520: STDMETHODIMP SvrDoc_IPActiveObj_EnableModeless(
                    521:         LPOLEINPLACEACTIVEOBJECT    lpThis,
                    522:         BOOL                        fEnable
                    523: )
                    524: {
                    525:     LPSERVERDOC lpServerDoc =
                    526:                     ((struct CDocOleObjectImpl FAR*)lpThis)->lpServerDoc;
                    527: 
                    528:     OleDbgOut2("SvrDoc_IPActiveObj_EnableModeless\r\n");
                    529: 
                    530:     return NOERROR;
                    531: }
                    532: 
                    533: 
                    534: /*************************************************************************
                    535: ** Support Functions
                    536: *************************************************************************/
                    537: 
                    538: 
                    539: HRESULT ServerDoc_DoInPlaceActivate(
                    540:         LPSERVERDOC     lpServerDoc,
                    541:                LONG                    lVerb,
                    542:         LPMSG           lpmsg, 
                    543:         LPOLECLIENTSITE lpActiveSite
                    544: )
                    545: {
                    546:     LPOUTLINEAPP                       lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                    547:     LPSERVERAPP                                lpServerApp = (LPSERVERAPP)g_lpApp;
                    548:     LPOLEAPP                lpOleApp = (LPOLEAPP)g_lpApp;
                    549:     SCODE                   sc = E_FAIL;
                    550:     RECT                    rcPos;
                    551:     RECT                    rcClip;
                    552:     LPINPLACEDATA           lpIPData = lpServerDoc->m_lpIPData;
                    553:     LPOUTLINEDOC            lpOutlineDoc=(LPOUTLINEDOC)lpServerDoc;
                    554:     HWND                    hWndDoc = lpOutlineDoc->m_hWndDoc;
                    555:        HWND                                    hWndHatch = lpServerDoc->m_hWndHatch;
                    556:     HRESULT                 hrErr;
                    557:     LPLINELIST              lpLL=(LPLINELIST)&lpOutlineDoc->m_LineList;
                    558:     LPOLEINPLACESITE    lpIPSite = NULL;
                    559: 
                    560:     /* OLE2NOTE: lpActiveSite should be used only for InPlace PLAYing.
                    561:     **    This app does not do inplace PLAYing, so it never uses
                    562:     **    lpActiveSite.
                    563:     */
                    564: 
                    565:     /* InPlace activation can only be done if the ClientSite is non-NULL. */
                    566:     if (! lpServerDoc->m_lpOleClientSite) 
                    567:         return NOERROR;
                    568: 
                    569:     if (! lpServerDoc->m_fInPlaceActive) {
                    570: 
                    571:                // if the object is in open mode then we do not want to do inplace
                    572:                // activation. 
                    573:                if (IsWindowVisible(lpOutlineDoc->m_hWndDoc))
                    574:                        return NOERROR;
                    575:                
                    576:         lpIPSite = (LPOLEINPLACESITE)OleStdQueryInterface(
                    577:                 (LPUNKNOWN)lpServerDoc->m_lpOleClientSite,
                    578:                 &IID_IOleInPlaceSite
                    579:         );
                    580:             
                    581:         if (! lpIPSite)
                    582:             goto errActivate;
                    583: 
                    584:         if (lpIPSite->lpVtbl->CanInPlaceActivate(lpIPSite) != NOERROR)
                    585:             goto errActivate;
                    586:     
                    587:         lpServerDoc->m_fInPlaceActive = TRUE;
                    588:         if (lpIPSite->lpVtbl->OnInPlaceActivate(lpIPSite) != NOERROR)
                    589:             goto errActivate;
                    590: 
                    591:         if (! ServerDoc_AllocInPlaceData(lpServerDoc)) {
                    592:             sc = E_OUTOFMEMORY;
                    593:             lpIPSite->lpVtbl->OnInPlaceDeactivate(lpIPSite);
                    594:             goto errActivate;
                    595:         }           
                    596: 
                    597:         (lpIPData = lpServerDoc->m_lpIPData)->lpSite = lpIPSite;
                    598:                goto InPlaceActive;
                    599: 
                    600:     errActivate:
                    601:         lpServerDoc->m_fInPlaceActive = FALSE;
                    602:         if (lpIPSite) 
                    603:                        OleStdRelease((LPUNKNOWN)lpIPSite);   
                    604:         return ResultFromScode(sc);
                    605:     }       
                    606: 
                    607:     
                    608: InPlaceActive:  
                    609:                        
                    610:        if (! lpServerDoc->m_fInPlaceVisible) {
                    611:                lpServerDoc->m_fInPlaceVisible = TRUE;
                    612: 
                    613:                OLEDBG_BEGIN2("IOleInPlaceSite::GetWindow called\r\n");
                    614:                hrErr = lpIPData->lpSite->lpVtbl->GetWindow(
                    615:                                        lpIPData->lpSite, 
                    616:                                        &lpServerDoc->m_hWndParent
                    617:                );
                    618:                OLEDBG_END2
                    619:                if (hrErr != NOERROR) {
                    620:                        sc = GetScode(hrErr);
                    621:                        goto errRtn;
                    622:                }
                    623:     
                    624:                if (! lpServerDoc->m_hWndParent)
                    625:                        goto errRtn;
                    626:        
                    627:                /* OLE2NOTE: The server should fill in the "cb" field so that the
                    628:                **    container can tell what size structure the server is
                    629:                **    expecting. this enables this structure to be easily extended
                    630:                **    in future releases of OLE. the container should check this
                    631:                **    field so that it doesn't try to use fields that do not exist
                    632:                **    since the server may be using an old structure definition. 
                    633:                */
                    634:                _fmemset(
                    635:                        (LPOLEINPLACEFRAMEINFO)&lpIPData->frameInfo,
                    636:                        0,
                    637:                        sizeof(OLEINPLACEFRAMEINFO)
                    638:                );
                    639:                lpIPData->frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
                    640: 
                    641:                OLEDBG_BEGIN2("IOleInPlaceSite::GetWindowContext called\r\n");
                    642:                hrErr = lpIPData->lpSite->lpVtbl->GetWindowContext(lpIPData->lpSite, 
                    643:                                        (LPOLEINPLACEFRAME FAR*) &lpIPData->lpFrame,
                    644:                                        (LPOLEINPLACEUIWINDOW FAR*)&lpIPData->lpDoc,
                    645:                                        (LPRECT)&rcPos, 
                    646:                                        (LPRECT)&rcClip, 
                    647:                                        (LPOLEINPLACEFRAMEINFO)&lpIPData->frameInfo);
                    648:                OLEDBG_END2
                    649: 
                    650:                if (hrErr != NOERROR) {
                    651:                        sc = GetScode(hrErr);
                    652:                        goto errRtn;
                    653:                }
                    654:                
                    655:                lpServerApp->m_lpIPData = lpIPData;
                    656:                ShowWindow(hWndDoc, SW_HIDE);   // make sure we are hidden
                    657: 
                    658:                /* OLE2NOTE: reparent in-place server document's window to the
                    659:                **    special in-place hatch border window. set the in-place site's
                    660:                **    window as the parent of the hatch window. position the
                    661:                **    in-place and hatch border windows using the PosRect and
                    662:                **    ClipRect. 
                    663:                **    it is important to properly parent and position the in-place
                    664:                **    server window BEFORE calling IOleInPlaceFrame::SetMenu and
                    665:                **    SetBorderSpace.
                    666:                */
                    667:                ShowWindow(lpServerDoc->m_hWndHatch, SW_SHOW);
                    668:                // make sure App busy/blocked dialogs are parented to our 
                    669:                // new hWndFrame
                    670:                OleStdMsgFilter_SetParentWindow(
                    671:             lpOleApp->m_lpMsgFilter,lpIPData->frameInfo.hwndFrame);    
                    672:                SetParent(lpServerDoc->m_hWndHatch, lpServerDoc->m_hWndParent); 
                    673:                SetParent(hWndDoc, lpServerDoc->m_hWndHatch);   
                    674: 
                    675:         OleDbgOutRect3("IOleInPlaceSite::GetWindowContext (PosRect)", 
                    676:                 (LPRECT)&rcPos);
                    677:         OleDbgOutRect3("IOleInPlaceSite::GetWindowContext (ClipRect)", 
                    678:                 (LPRECT)&rcClip);
                    679: 
                    680:                // save the current PosRect and ClipRect
                    681:                lpIPData->rcPosRect  = rcPos;
                    682:                lpIPData->rcClipRect = rcClip;
                    683: 
                    684:                /* OLE2NOTE: build the shared menu for the in-place container and
                    685:                **    the server. 
                    686:                */
                    687:                if (ServerDoc_AssembleMenus (lpServerDoc) != NOERROR)
                    688:                        goto errRtn;
                    689: 
                    690: #if defined( SVR_INSIDEOUT )
                    691:                if (lVerb == OLEIVERB_INPLACEACTIVATE) {                
                    692:                        // Clip the hatch window to the size of pos rect so, that 
                    693:                        // hatch and object adornments  will not be visible.
                    694:                        ServerDoc_ResizeInPlaceWindow(lpServerDoc,
                    695:                                (LPRECT)&(lpServerDoc->m_lpIPData->rcPosRect),
                    696:                                (LPRECT)&(lpServerDoc->m_lpIPData->rcPosRect)
                    697:                        );
                    698:                }
                    699: #endif  // SVR_INSIDEOUT
                    700:        }
                    701: 
                    702: #if defined( SVR_INSIDEOUT )
                    703:     // OLE2NOTE: if verb is OLEIVERB_INPLACEACTIVATE we do NOT want to 
                    704:     // show our UI
                    705:        if (lVerb == OLEIVERB_INPLACEACTIVATE) {
                    706:         return NOERROR;
                    707:     }
                    708: #endif  // SVR_INSIDEOUT
                    709:        
                    710:        if (! lpServerDoc->m_fUIActive) {
                    711:                lpServerDoc->m_fUIActive = TRUE;
                    712:                OLEDBG_BEGIN2("IOleInPlaceSite::OnUIActivate called\r\n");
                    713:                hrErr = lpIPData->lpSite->lpVtbl->OnUIActivate(lpIPData->lpSite);
                    714:                OLEDBG_END2
                    715:                if (hrErr != NOERROR) {
                    716:                        lpServerDoc->m_fUIActive = FALSE;
                    717:                        goto errRtn;
                    718:                }
                    719:        
                    720:                SetFocus(hWndDoc);      
                    721:                
                    722:                // Show the object adornments and hacth border around them.
                    723:                ServerDoc_ResizeInPlaceWindow(lpServerDoc, 
                    724:                                        (LPRECT)&lpIPData->rcPosRect, 
                    725:                                        (LPRECT)&lpIPData->rcClipRect
                    726:                );
                    727:                
                    728:                /* OLE2NOTE: IOleInPlaceFrame::SetActiveObject must be called BEFORE
                    729:                **    IOleInPlaceFrame::SetMenu.
                    730:                */
                    731:                lpIPData->lpFrame->lpVtbl->SetActiveObject(
                    732:                        lpIPData->lpFrame, 
                    733:                        (LPOLEINPLACEACTIVEOBJECT) &lpServerDoc->m_OleInPlaceActiveObject,
                    734:                        (LPSTR)g_szIPObjectTitle
                    735:                );
                    736:     
                    737:                if (lpIPData->lpDoc) {
                    738:                        lpIPData->lpDoc->lpVtbl->SetActiveObject(
                    739:                                lpIPData->lpDoc, 
                    740:                                (LPOLEINPLACEACTIVEOBJECT)&lpServerDoc->m_OleInPlaceActiveObject,
                    741:                                (LPSTR)g_szIPObjectTitle
                    742:                        );
                    743:                }
                    744:     
                    745:                /* OLE2NOTE: install the menu and frame-level tools on the in-place
                    746:                **    frame.
                    747:                */
                    748:                ServerDoc_AddFrameLevelUI(lpServerDoc);
                    749:        }
                    750: 
                    751:        return NOERROR;
                    752:                
                    753: errRtn:     
                    754:     ServerDoc_DoInPlaceDeactivate(lpServerDoc);
                    755:     return ResultFromScode(sc);
                    756: }
                    757: 
                    758: 
                    759: 
                    760: HRESULT ServerDoc_DoInPlaceDeactivate(LPSERVERDOC lpServerDoc)
                    761: {
                    762:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    763:        LPOUTLINEDOC    lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                    764:     
                    765:     if (!lpServerDoc->m_fInPlaceActive)
                    766:         return S_OK;
                    767:         
                    768:     lpServerDoc->m_fInPlaceActive = FALSE;
                    769: 
                    770:     SvrDoc_IPObj_UIDeactivate(
                    771:             (LPOLEINPLACEOBJECT)&lpServerDoc->m_OleInPlaceObject);
                    772: 
                    773: #if defined( SVR_INSIDEOUT )
                    774:     /* OLE2NOTE: an inside-out style in-place server will
                    775:     **    NOT hide its window in UIDeactive (an outside-in
                    776:     **    style object will hide its window in
                    777:     **    UIDeactivate). thus we need to explicitly hide
                    778:     **    our window now.
                    779:     */
                    780:     ServerDoc_DoInPlaceHide(lpServerDoc);
                    781: #endif // INSIEDOUT
                    782: 
                    783:     OLEDBG_BEGIN2("IOleInPlaceSite::OnInPlaceDeactivate called\r\n");
                    784:     lpIPData->lpSite->lpVtbl->OnInPlaceDeactivate(lpIPData->lpSite);
                    785:     OLEDBG_END2
                    786:                
                    787:     OleStdRelease((LPUNKNOWN)lpIPData->lpSite);   
                    788:     lpIPData->lpSite = NULL;
                    789:     
                    790:     ServerDoc_FreeInPlaceData(lpServerDoc);
                    791:        
                    792:     return NOERROR;
                    793: }
                    794: 
                    795: 
                    796: HRESULT ServerDoc_DoInPlaceHide(LPSERVERDOC lpServerDoc)
                    797: {
                    798:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    799:        LPOUTLINEDOC    lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                    800:     LPOLEAPP        lpOleApp = (LPOLEAPP)g_lpApp;
                    801:        HWND                    hWndApp = OutlineApp_GetWindow(g_lpApp);
                    802:        
                    803:        if (! lpServerDoc->m_fInPlaceVisible)
                    804:                return NOERROR;
                    805:        
                    806:     // Set the parent back to server app's window 
                    807:        OleDoc_HideWindow((LPOLEDOC)lpServerDoc, FALSE /* fShutdown */);
                    808: 
                    809:        lpServerDoc->m_fInPlaceVisible = FALSE;
                    810: 
                    811:     lpServerDoc->m_hWndParent = hWndApp;
                    812:     SetParent(
                    813:         lpOutlineDoc->m_hWndDoc, 
                    814:         lpServerDoc->m_hWndParent
                    815:     );
                    816: 
                    817:     // make sure App busy/blocked dialogs are parented to our own hWndApp
                    818:     OleStdMsgFilter_SetParentWindow(lpOleApp->m_lpMsgFilter, hWndApp);
                    819:     
                    820:        // Hide the in-place hatch border window.
                    821:        ShowWindow(lpServerDoc->m_hWndHatch, SW_HIDE);
                    822: 
                    823:     ServerDoc_DisassembleMenus(lpServerDoc);
                    824:     
                    825:        /* we no longer need the IOleInPlaceFrame* or the doc's
                    826:        **    IOleInPlaceWindow* interface pointers.
                    827:        */
                    828:     if (lpIPData->lpDoc) {
                    829:                OleStdRelease((LPUNKNOWN)lpIPData->lpDoc);
                    830:         lpIPData->lpDoc = NULL;
                    831:     }       
                    832: 
                    833:     if (lpIPData->lpFrame) {
                    834:         OleStdRelease((LPUNKNOWN)lpIPData->lpFrame);
                    835:         lpIPData->lpFrame = NULL;
                    836:     }
                    837:        
                    838:     ((LPSERVERAPP)g_lpApp)->m_lpIPData = NULL;
                    839:        
                    840:        return NOERROR;
                    841: }
                    842: 
                    843: 
                    844: BOOL ServerDoc_AllocInPlaceData(LPSERVERDOC lpServerDoc)
                    845: {
                    846:     LPINPLACEDATA   lpIPData;
                    847:     
                    848:     if (!(lpIPData = (LPINPLACEDATA) New(sizeof(INPLACEDATA))))
                    849:         return FALSE;
                    850:     
                    851:     lpIPData->lpFrame       = NULL;
                    852:     lpIPData->lpDoc         = NULL;
                    853:     lpIPData->lpSite        = NULL; 
                    854:     lpIPData->fInCSHelpMode = FALSE;
                    855:     lpIPData->hOlemenu      = NULL;
                    856:     lpIPData->hMenuShared   = NULL;
                    857:     
                    858:     lpServerDoc->m_lpIPData = lpIPData;
                    859:     return TRUE;
                    860: }
                    861: 
                    862: 
                    863: void ServerDoc_FreeInPlaceData(LPSERVERDOC lpServerDoc)
                    864: {
                    865:     Delete(lpServerDoc->m_lpIPData);
                    866:     lpServerDoc->m_lpIPData = NULL;
                    867: }
                    868: 
                    869: 
                    870: HRESULT ServerDoc_AssembleMenus(LPSERVERDOC lpServerDoc)
                    871: {
                    872:     HMENU           hMenuShared;
                    873:     LONG FAR*       lpWidths;
                    874:     UINT            uPosition;
                    875:        UINT                    uPositionStart;
                    876:     LPSERVERAPP     lpServerApp = (LPSERVERAPP) g_lpApp;
                    877:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    878:     HRESULT         hresult;
                    879:        BOOL                    fNoError = TRUE;
                    880:     
                    881:     lpWidths = lpIPData->menuGroupWidths.width;
                    882:     hMenuShared = CreateMenu(); 
                    883:     
                    884:     if (hMenuShared &&
                    885:         (hresult = lpIPData->lpFrame->lpVtbl->InsertMenus(
                    886:             lpIPData->lpFrame, hMenuShared, 
                    887:             &lpIPData->menuGroupWidths)) == NOERROR) {
                    888: 
                    889:        /* Insert EDIT group menus */
                    890:            
                    891:        uPosition = (UINT)lpWidths[0]; /* # of menus in the FILE group */
                    892:        uPositionStart = uPosition;
                    893: 
                    894:        fNoError &= InsertMenu(
                    895:                hMenuShared, 
                    896:                (UINT)uPosition,
                    897:                (UINT)(MF_BYPOSITION | MF_POPUP), 
                    898:                (UINT)lpServerApp->m_hMenuEdit, 
                    899:                (LPCSTR)"&Edit"
                    900:        );
                    901:        uPosition++;
                    902:        
                    903:        lpWidths[1] = uPosition - uPositionStart;
                    904: 
                    905:        /* Insert OBJECT group menus */
                    906: 
                    907:        uPosition += (UINT)lpWidths[2];
                    908:        uPositionStart = uPosition;
                    909: 
                    910:        fNoError &= InsertMenu(
                    911:                hMenuShared, 
                    912:                (UINT)uPosition,
                    913:                (UINT)(MF_BYPOSITION | MF_POPUP), 
                    914:                (UINT)lpServerApp->m_hMenuLine, 
                    915:                (LPCSTR)"&Line"
                    916:        );
                    917:        uPosition++;
                    918: 
                    919:        fNoError &= InsertMenu(
                    920:                hMenuShared, 
                    921:                (UINT)uPosition,
                    922:                (UINT)(MF_BYPOSITION | MF_POPUP), 
                    923:                (UINT)lpServerApp->m_hMenuName, 
                    924:                (LPCSTR)"&Name"
                    925:        );
                    926:        uPosition++;
                    927: 
                    928:        fNoError &= InsertMenu(
                    929:                hMenuShared, 
                    930:                (UINT)uPosition,
                    931:                (UINT)(MF_BYPOSITION | MF_POPUP), 
                    932:                (UINT)lpServerApp->m_hMenuOptions, 
                    933:                (LPCSTR)"&Options"
                    934:        );
                    935:        uPosition++;
                    936:     
                    937:        fNoError &= InsertMenu(
                    938:                hMenuShared, 
                    939:                (UINT)uPosition,
                    940:                (UINT)(MF_BYPOSITION | MF_POPUP), 
                    941:                (UINT)lpServerApp->m_hMenuDebug, 
                    942:                (LPCSTR)"DbgI&Svr"
                    943:         );
                    944:         uPosition++;
                    945:     
                    946:         lpWidths[3] = uPosition - uPositionStart;
                    947: 
                    948:         /* Insert HELP group menus */
                    949: 
                    950:         uPosition += (UINT) lpWidths[4]; /* # of menus in WINDOW group */
                    951:         uPositionStart = uPosition;
                    952: 
                    953:         fNoError &= InsertMenu(
                    954:                 hMenuShared, 
                    955:                 (UINT)uPosition,
                    956:                 (UINT)(MF_BYPOSITION | MF_POPUP), 
                    957:                 (UINT)lpServerApp->m_hMenuHelp,
                    958:                 (LPCSTR)"&Help"
                    959:         );
                    960:         uPosition++;    
                    961: 
                    962:         lpWidths[5] = uPosition - uPositionStart; 
                    963:        
                    964:         OleDbgAssert(fNoError == TRUE);
                    965: 
                    966:     } else {
                    967:         /* In-place container does not allow us to add menus to the
                    968:         **    frame.
                    969:         ** OLE2NOTE: even when the in-place container does NOT allow
                    970:         **    the building of a merged menu bar, it is CRITICAL that
                    971:         **    the in-place server still call OleCreateMenuDescriptor
                    972:         **    passing NULL for hMenuShared. 
                    973:         */
                    974:         if (hMenuShared) {
                    975:             DestroyMenu(hMenuShared);
                    976:             hMenuShared = NULL;
                    977:         }
                    978:     }
                    979:     
                    980:     lpIPData->hMenuShared = hMenuShared;
                    981: 
                    982:     if (!(lpIPData->hOlemenu = OleCreateMenuDescriptor(hMenuShared, 
                    983:                                             &lpIPData->menuGroupWidths)))
                    984:         return ResultFromScode(E_OUTOFMEMORY);
                    985:     
                    986:     return NOERROR;
                    987: }
                    988: 
                    989: 
                    990: void ServerDoc_DisassembleMenus(LPSERVERDOC lpServerDoc)
                    991: {
                    992:     UINT             uCount;
                    993:        UINT                    uGroup;
                    994:        UINT                    uDeleteAt;
                    995:     LPINPLACEDATA   lpIPData = lpServerDoc->m_lpIPData;
                    996:     LONG FAR*       lpWidths = lpIPData->menuGroupWidths.width;
                    997:        BOOL                    fNoError = TRUE;
                    998:     
                    999:     /* OLE2NOTE: even when hMenuShared is NULL (ie. the server has no
                   1000:     **    Menu), there is still an hOleMenu created that must be destroyed.
                   1001:     */
                   1002:     if (lpIPData->hOlemenu) {
                   1003:         OleDestroyMenuDescriptor (lpIPData->hOlemenu);
                   1004:         lpIPData->hOlemenu = NULL;
                   1005:     }
                   1006: 
                   1007:     if (! lpIPData->hMenuShared)
                   1008:         return;     // no menus to be destroyed
                   1009:     
                   1010:     /* Remove server group menus. */
                   1011:        uDeleteAt = 0;
                   1012:        for (uGroup = 0; uGroup < 6; uGroup++) {
                   1013:                uDeleteAt += (UINT)lpWidths[uGroup++];
                   1014:                for (uCount = 0; uCount < (UINT)lpWidths[uGroup]; uCount++)
                   1015:                        fNoError &= RemoveMenu(lpIPData->hMenuShared, uDeleteAt, 
                   1016:                                                                MF_BYPOSITION);
                   1017:        }
                   1018:     
                   1019:     /* Remove container group menus */
                   1020:     fNoError &= (lpIPData->lpFrame->lpVtbl->RemoveMenus(
                   1021:         lpIPData->lpFrame, 
                   1022:         lpIPData->hMenuShared) == NOERROR);
                   1023:         
                   1024:        OleDbgAssert(fNoError == TRUE);
                   1025:        
                   1026:     DestroyMenu(lpIPData->hMenuShared);
                   1027:     lpIPData->hMenuShared = NULL;
                   1028: }
                   1029: 
                   1030: 
                   1031: /* ServerDoc_UpdateInPlaceWindowOnExtentChange
                   1032: ** -------------------------------------------
                   1033: **    The size of the in-place window needs to be changed. 
                   1034: **    calculate the size required in Client coordinates (taking into
                   1035: **    account the current scale factor imposed by the in-place
                   1036: **    container) and ask our in-place container to allow us to resize.
                   1037: **    our container must call us back via
                   1038: **    IOleInPlaceObject::SetObjectRects for the actual sizing to take
                   1039: **    place. 
                   1040: **    
                   1041: **    OLE2NOTE: the rectangle that we ask for from our in-place
                   1042: **    container is always the rectangle required for the object display
                   1043: **    itself (in our case the size of the LineList contents). it does
                   1044: **    NOT include the space we require for object frame adornments.
                   1045: */
                   1046: void ServerDoc_UpdateInPlaceWindowOnExtentChange(LPSERVERDOC lpServerDoc)
                   1047: {
                   1048:     SIZEL              sizelHim;
                   1049:     SIZEL              sizelPix;
                   1050:     RECT               rcPosRect;
                   1051:        LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1052:     LPLINELIST lpLL=(LPLINELIST)&lpOutlineDoc->m_LineList;
                   1053:        HWND            hWndLL = lpLL->m_hWndListBox;
                   1054:        LPSCALEFACTOR lpscale = (LPSCALEFACTOR)&lpOutlineDoc->m_scale;
                   1055: 
                   1056:     if (!lpServerDoc->m_fInPlaceActive)
                   1057:         return;
                   1058:        
                   1059:        OleDoc_GetExtent((LPOLEDOC)lpServerDoc, (LPSIZEL)&sizelHim);
                   1060: 
                   1061:        // apply current scale factor
                   1062:        sizelHim.cx = sizelHim.cx * lpscale->dwSxN / lpscale->dwSxD;
                   1063:        sizelHim.cy = sizelHim.cy * lpscale->dwSxN / lpscale->dwSxD;
                   1064:     XformSizeInHimetricToPixels(NULL, (LPSIZEL)&sizelHim, (LPSIZEL)&sizelPix);
                   1065: 
                   1066:     GetWindowRect(hWndLL, (LPRECT)&rcPosRect);
                   1067:     ScreenToClient(lpServerDoc->m_hWndParent, (POINT FAR *)&rcPosRect);
                   1068:     
                   1069:     rcPosRect.right = rcPosRect.left + (int) sizelPix.cx;
                   1070:     rcPosRect.bottom = rcPosRect.top + (int) sizelPix.cy;
                   1071: 
                   1072:     OleDbgOutRect3("ServerDoc_UpdateInPlaceWindowOnExtentChange: (PosRect)", 
                   1073:                        (LPRECT)&rcPosRect);
                   1074:     
                   1075:     OLEDBG_BEGIN2("IOleInPlaceSite::OnPosRectChange called\r\n");
                   1076:     lpServerDoc->m_lpIPData->lpSite->lpVtbl->OnPosRectChange(
                   1077:                        lpServerDoc->m_lpIPData->lpSite,
                   1078:                        (LPRECT) &rcPosRect
                   1079:     );
                   1080:     OLEDBG_END2
                   1081: }
                   1082: 
                   1083: 
                   1084: /* ServerDoc_CalcInPlaceWindowPos
                   1085:  * ------------------------------
                   1086:  *
                   1087:  *     Move (and re-scale) the ServerDoc to the specified rectangle.
                   1088:  *
                   1089:  *     Parameters:
                   1090:  *             lprcListBox     - rect in client coordinate in which the listbox will fit
                   1091:  *             lprcDoc         - corresponding size of the Doc in client coordinate
                   1092:  *
                   1093:  */
                   1094: void ServerDoc_CalcInPlaceWindowPos(
                   1095:                LPSERVERDOC                     lpServerDoc, 
                   1096:                LPRECT                          lprcListBox, 
                   1097:                LPRECT                          lprcDoc,
                   1098:                LPSCALEFACTOR           lpscale
                   1099: )
                   1100: {
                   1101:        SIZEL sizelHim;
                   1102:        SIZEL sizelPix;
                   1103:        LPLINELIST lpLL;
                   1104:        LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1105:        LPHEADING lphead;
                   1106:        
                   1107:        if (!lpServerDoc || !lprcListBox || !lprcDoc)
                   1108:                return;
                   1109: 
                   1110:        lphead = (LPHEADING)&lpOutlineDoc->m_heading;
                   1111:        
                   1112:        lpLL = OutlineDoc_GetLineList(lpOutlineDoc);
                   1113:        OleDoc_GetExtent((LPOLEDOC)lpServerDoc, (LPSIZEL)&sizelHim);
                   1114:        XformSizeInHimetricToPixels(NULL, &sizelHim, &sizelPix);
                   1115: 
                   1116:        if (sizelHim.cx == 0) {
                   1117:                lpscale->dwSxN = 1;
                   1118:                lpscale->dwSxD = 1;
                   1119:        } else {
                   1120:                lpscale->dwSxN = lprcListBox->right - lprcListBox->left;
                   1121:                lpscale->dwSxD = sizelPix.cx;
                   1122:        }
                   1123:                
                   1124:        if (sizelHim.cy == 0) {
                   1125:                lpscale->dwSyN = 1;
                   1126:                lpscale->dwSyD = 1;
                   1127:        } else {
                   1128:                lpscale->dwSyN = lprcListBox->bottom - lprcListBox->top;
                   1129:                lpscale->dwSyD = sizelPix.cy;
                   1130:        }
                   1131: 
                   1132:        lprcDoc->left = lprcListBox->left - Heading_RH_GetWidth(lphead,lpscale);
                   1133:        lprcDoc->right = lprcListBox->right;
                   1134:        lprcDoc->top = lprcListBox->top - Heading_CH_GetHeight(lphead,lpscale);
                   1135:        lprcDoc->bottom = lprcListBox->bottom;
                   1136: }
                   1137: 
                   1138: 
                   1139: /* ServerDoc_ResizeInPlaceWindow
                   1140: ** -----------------------------
                   1141: **    Actually resize the in-place ServerDoc windows according to the
                   1142: **    PosRect and ClipRect allowed by our in-place container.
                   1143: **    
                   1144: **    OLE2NOTE: the PosRect rectangle that our in-place container tells
                   1145: **    us is always the rectangle required for the object display
                   1146: **    itself (in our case the size of the LineList contents). it does
                   1147: **    NOT include the space we require for object frame adornments.
                   1148: */
                   1149: void ServerDoc_ResizeInPlaceWindow(
                   1150:                LPSERVERDOC                     lpServerDoc, 
                   1151:         LPCRECT             lprcPosRect,
                   1152:         LPCRECT             lprcClipRect
                   1153: )
                   1154: {
                   1155:     LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1156:     LPLINELIST   lpLL = (LPLINELIST)&lpOutlineDoc->m_LineList;
                   1157:        SCALEFACTOR      scale;
                   1158:        RECT             rcDoc;
                   1159:     POINT        ptOffset;
                   1160: 
                   1161:        /* OLE2NOTE: calculate the space needed for our object frame
                   1162:        **    adornments. our in-place container tells us the size that our
                   1163:        **    object should take in window client coordinates
                   1164:        **    (lprcPosRect). the rectangle cooresponds to the size that our
                   1165:        **    LineList ListBox should be. our Doc window must the correct
                   1166:        **    amount larger to accomodate our row/column headings.
                   1167:        **    then move all windows into position.
                   1168:        */
                   1169:        ServerDoc_CalcInPlaceWindowPos(
                   1170:                        lpServerDoc, 
                   1171:                        (LPRECT)lprcPosRect, 
                   1172:                        (LPRECT)&rcDoc,
                   1173:                        (LPSCALEFACTOR)&scale
                   1174:        );
                   1175: 
                   1176:     /* OLE2NOTE: we need to honor the lprcClipRect specified by our
                   1177:     **    in-place container. we must NOT draw outside of the ClipRect.
                   1178:     **    in order to achieve this, we will size the hatch window to be
                   1179:     **    exactly the size that should be visible (rcVisRect). the
                   1180:     **    rcVisRect is defined as the intersection of the full size of
                   1181:     **    the in-place server window and the lprcClipRect.
                   1182:     **    the ClipRect could infact clip the HatchRect on the
                   1183:     **    right/bottom and/or on the top/left. if it is clipped on the
                   1184:     **    right/bottom then it is sufficient to simply resize the hatch
                   1185:     **    window. but if the HatchRect is clipped on the top/left then
                   1186:     **    we must "move" the ServerDoc window (child of HatchWindow) by
                   1187:     **    the delta that was clipped. the window origin of the
                   1188:     **    ServerDoc window will then have negative coordinates relative
                   1189:     **    to its parent HatchWindow.
                   1190:     */
                   1191:     SetHatchWindowSize(
                   1192:             lpServerDoc->m_hWndHatch, 
                   1193:             (LPRECT)&rcDoc,
                   1194:             (LPRECT)lprcClipRect, 
                   1195:             (LPPOINT)&ptOffset
                   1196:     );
                   1197: 
                   1198:     // shift Doc window to account for hatch frame being drawn
                   1199:        OffsetRect((LPRECT)&rcDoc, ptOffset.x, ptOffset.y);
                   1200:     
                   1201:     // move/size/set scale factor of ServerDoc window.
                   1202:        OutlineDoc_SetScaleFactor(
                   1203:                        lpOutlineDoc, (LPSCALEFACTOR)&scale, (LPRECT)&rcDoc);
                   1204: }
                   1205: 
                   1206: 
                   1207: 
                   1208: /* ServerDoc_GetTopInPlaceFrame
                   1209: ** ----------------------------
                   1210: **    returns NON-AddRef'ed pointer to Top In-Place Frame interface
                   1211: */
                   1212: LPOLEINPLACEFRAME ServerDoc_GetTopInPlaceFrame(LPSERVERDOC lpServerDoc)
                   1213: {
                   1214:        if (lpServerDoc->m_lpIPData) 
                   1215:                return lpServerDoc->m_lpIPData->lpFrame;
                   1216:        else 
                   1217:                return NULL;
                   1218: }
                   1219: 
                   1220: void ServerDoc_GetSharedMenuHandles(
                   1221:                LPSERVERDOC     lpServerDoc,
                   1222:                HMENU FAR*              lphSharedMenu,
                   1223:                HOLEMENU FAR*   lphOleMenu
                   1224: )
                   1225: {
                   1226:        if (lpServerDoc->m_lpIPData) {
                   1227:                *lphSharedMenu = lpServerDoc->m_lpIPData->hMenuShared;
                   1228:                *lphOleMenu = lpServerDoc->m_lpIPData->hOlemenu;
                   1229:        } else {
                   1230:                *lphSharedMenu = NULL;
                   1231:                *lphOleMenu = NULL;
                   1232:        }
                   1233: }
                   1234: 
                   1235:        
                   1236: void ServerDoc_AddFrameLevelUI(LPSERVERDOC lpServerDoc)
                   1237: {
                   1238:        LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                   1239:        LPSERVERAPP lpServerApp = (LPSERVERAPP)g_lpApp;
                   1240:        LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1241:        LPOLEINPLACEFRAME lpTopIPFrame=ServerDoc_GetTopInPlaceFrame(lpServerDoc);
                   1242:        HMENU                   hSharedMenu;                    // combined obj/cntr menu
                   1243:        HOLEMENU                hOleMenu;                               // returned by OleCreateMenuDesc.
                   1244: 
                   1245:        ServerDoc_GetSharedMenuHandles(
                   1246:                        lpServerDoc, 
                   1247:                        &hSharedMenu,
                   1248:                        &hOleMenu
                   1249:        );
                   1250: 
                   1251:        lpTopIPFrame->lpVtbl->SetMenu(
                   1252:                        lpTopIPFrame, 
                   1253:                        hSharedMenu, 
                   1254:                        hOleMenu,
                   1255:                        lpOutlineDoc->m_hWndDoc
                   1256:        );
                   1257:     
                   1258:     lpOutlineApp->m_hAccel = lpServerApp->m_hAccelIPSvr;
                   1259:     lpOutlineApp->m_hWndAccelTarget = lpOutlineDoc->m_hWndDoc;
                   1260: 
                   1261: #if defined( USE_FRAMETOOLS )
                   1262:        ServerDoc_AddFrameLevelTools(lpServerDoc);
                   1263: 
                   1264:     // update toolbar button enable states
                   1265:     OutlineDoc_UpdateFrameToolButtons(lpOutlineDoc);
                   1266: #endif  
                   1267: }
                   1268: 
                   1269:        
                   1270: void ServerDoc_AddFrameLevelTools(LPSERVERDOC lpServerDoc)
                   1271: {
                   1272:        LPOUTLINEAPP    lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                   1273:        LPSERVERAPP             lpServerApp = (LPSERVERAPP)g_lpApp;
                   1274:        LPOUTLINEDOC    lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1275:        LPOLEINPLACEFRAME lpTopIPFrame=ServerDoc_GetTopInPlaceFrame(lpServerDoc);
                   1276: 
                   1277: #if defined( USE_FRAMETOOLS )
                   1278:     HWND            hWndFrame;
                   1279: 
                   1280:        FrameTools_Enable(lpOutlineDoc->m_lpFrameTools, TRUE);
                   1281: 
                   1282:        // if not in-place UI active, add our tools to our own frame.
                   1283:        if (! lpServerDoc->m_fUIActive) {
                   1284:                OutlineDoc_AddFrameLevelTools(lpOutlineDoc);
                   1285:                return;
                   1286:        }
                   1287: 
                   1288:        if ((hWndFrame = OutlineApp_GetFrameWindow(lpOutlineApp)) == NULL) {
                   1289:                /* we could NOT get a valid frame window, so POP our tools up. */
                   1290: 
                   1291:         /* OLE2NOTE: since we are poping up our tools, we MUST inform
                   1292:         **    the top in-place frame window that we need NO tool space
                   1293:         **    BUT that it should NOT put its own tools up. if we were
                   1294:         **    to pass NULL instead of (0,0,0,0), then the container
                   1295:         **    would have the option to leave its own tools up.
                   1296:         */
                   1297:         lpTopIPFrame->lpVtbl->SetBorderSpace(
                   1298:                 lpTopIPFrame, 
                   1299:                 (LPCBORDERWIDTHS)&g_rectNull
                   1300:         );
                   1301:                FrameTools_PopupTools(lpOutlineDoc->m_lpFrameTools);
                   1302:        } else {
                   1303: 
                   1304:                /* OLE2NOTE: we need to negotiate for space and attach our frame
                   1305:                **    level tools to the top-level in-place container's frame window.
                   1306:                */
                   1307:                FrameTools_AttachToFrame(lpOutlineDoc->m_lpFrameTools, hWndFrame);
                   1308: 
                   1309:                FrameTools_NegotiateForSpaceAndShow(
                   1310:                                lpOutlineDoc->m_lpFrameTools, 
                   1311:                                NULL,
                   1312:                                lpTopIPFrame
                   1313:                );              
                   1314:        }
                   1315: 
                   1316: #else  // ! USE_FRAMETOOLS
                   1317:        /* OLE2NOTE: if you do NOT use frame tools, you MUST inform the top
                   1318:        **    in-place frame window so that it can put back its own tools.
                   1319:        */
                   1320:        lpTopIPFrame->lpVtbl->SetBorderSpace(lpIPData->lpFrame, NULL);
                   1321: #endif // ! USE_FRAMETOOLS
                   1322: }
                   1323: 
                   1324: 
                   1325: #if defined( USE_FRAMETOOLS )
                   1326: 
                   1327: void ServerDoc_RemoveFrameLevelTools(LPSERVERDOC lpServerDoc) 
                   1328: {
                   1329:        LPOUTLINEDOC lpOutlineDoc = (LPOUTLINEDOC)lpServerDoc;
                   1330:        OleDbgAssert(lpOutlineDoc->m_lpFrameTools != NULL);
                   1331: 
                   1332:        FrameTools_Enable(lpOutlineDoc->m_lpFrameTools, FALSE);
                   1333: }
                   1334: #endif // USE_FRAMETOOLS
                   1335: 
                   1336: 
                   1337: 
                   1338: void ServerDoc_UIActivate (LPSERVERDOC lpServerDoc) 
                   1339: {
                   1340:        if (lpServerDoc->m_fInPlaceActive && !lpServerDoc->m_fUIActive) {
                   1341:                ServerDoc_DoInPlaceActivate(lpServerDoc,
                   1342:                                OLEIVERB_UIACTIVATE,
                   1343:                                NULL /*lpmsg*/,
                   1344:                                lpServerDoc->m_lpOleClientSite
                   1345:                );
                   1346:         OutlineDoc_ShowWindow((LPOUTLINEDOC)lpServerDoc);
                   1347:        }       
                   1348: }
                   1349: 
                   1350: 
                   1351: 
                   1352: #endif  // INPLACE_SVR
                   1353: 

unix.superglobalmegacorp.com

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