home *** CD-ROM | disk | FTP | other *** search
- /*
- * IIPAOBJ.CPP
- * Cosmo Chapter 23
- *
- * IOleInPlaceActiveObject interface implementation for Cosmo
- *
- * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
- *
- * Kraig Brockschmidt, Microsoft
- * Internet : kraigb@microsoft.com
- * Compuserve: >INTERNET:kraigb@microsoft.com
- */
-
-
- #include "cosmo.h"
-
-
- /*
- * CImpIOleInPlaceActiveObject::CImpIOleInPlaceActiveObject
- * CImpIOleInPlaceActiveObject::~CImpIOleInPlaceActiveObject
- *
- * Parameters (Constructor):
- * pObj PCFigure of the object we're in.
- * pUnkOuter LPUNKNOWN to which we delegate.
- */
-
- CImpIOleInPlaceActiveObject::CImpIOleInPlaceActiveObject
- (PCFigure pObj, LPUNKNOWN pUnkOuter)
- {
- m_cRef=0;
- m_pObj=pObj;
- m_pUnkOuter=pUnkOuter;
- return;
- }
-
- CImpIOleInPlaceActiveObject::~CImpIOleInPlaceActiveObject(void)
- {
- return;
- }
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::QueryInterface
- * CImpIOleInPlaceActiveObject::AddRef
- * CImpIOleInPlaceActiveObject::Release
- *
- * Purpose:
- * IUnknown members for CImpIOleInPlaceActiveObject object.
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::QueryInterface(REFIID riid
- , PPVOID ppv)
- {
- /*
- * This interface should be stand-alone on an object such that
- * a container cannot QueryInterface for it through any other
- * object interface, relying instead of calls to SetActiveObject
- * for it. By implementing QueryInterface here ourselves, we
- * prevent such abuses. Note that reference counting still
- * uses CFigure.
- */
-
- *ppv=NULL;
-
- if (IID_IUnknown==riid || IID_IOleWindow==riid
- || IID_IOleInPlaceActiveObject==riid)
- *ppv=this;
-
- if (NULL!=*ppv)
- {
- ((LPUNKNOWN)*ppv)->AddRef();
- return NOERROR;
- }
-
- return ResultFromScode(E_NOINTERFACE);
- }
-
-
- STDMETHODIMP_(ULONG) CImpIOleInPlaceActiveObject::AddRef(void)
- {
- ++m_cRef;
- return m_pUnkOuter->AddRef();
- }
-
- STDMETHODIMP_(ULONG) CImpIOleInPlaceActiveObject::Release(void)
- {
- --m_cRef;
- return m_pUnkOuter->Release();
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::GetWindow
- *
- * Purpose:
- * Retrieves the handle of the window associated with the object
- * on which this interface is implemented.
- *
- * Parameters:
- * phWnd HWND * in which to store the window handle.
- *
- * Return Value:
- * HRESULT NOERROR if successful, E_FAIL if there is no
- * window.
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::GetWindow(HWND * phWnd)
- {
- *phWnd=m_pObj->m_pHW->Window();
- return NOERROR;
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::ContextSensitiveHelp
- *
- * Purpose:
- * Instructs the object on which this interface is implemented to
- * enter or leave a context-sensitive help mode.
- *
- * Parameters:
- * fEnterMode BOOL TRUE to enter the mode, FALSE otherwise.
- *
- * Return Value:
- * HRESULT NOERROR or an error code
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::ContextSensitiveHelp
- (BOOL fEnterMode)
- {
- return ResultFromScode(E_NOTIMPL);
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::TranslateAccelerator
- *
- * Purpose:
- * Requests that the active in-place object translate the message
- * given in pMSG if appropriate.
- *
- * Parameters:
- * pMSG LPMSG to the message to translate.
- *
- * Return Value:
- * HRESULT NOERROR if translates, S_FALSE if not.
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::TranslateAccelerator
- (LPMSG pMSG)
- {
- //This is only used for DLL objects.
- return ResultFromScode(S_FALSE);
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::OnFrameWindowActivate
- *
- * Purpose:
- * Informs the in-place object that the container's frame window
- * was either activated or deactivated. When the frame is
- * activated, the object can change its toolbar interface to
- * reflect a non-activated state as desired. Usually you don't
- * have to do anything.
- *
- * Parameters:
- * fActivate BOOL TRUE if the frame is active, FALSE
- * otherwise
- * Return Value:
- * HRESULT NOERROR or an error code
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::OnFrameWindowActivate
- (BOOL fActivate)
- {
- //Nothing for us to do.
- return NOERROR;
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::OnDocWindowActivate
- *
- * Purpose:
- * Informs the in-place object that the document window in the
- * container is either becoming active or deactive. On this call
- * the object must either add or remove frame-level tools,
- * including the mixed menu, depending on fActivate.
- *
- * Parameters:
- * fActivate BOOL TRUE if the document is active, FALSE
- * otherwise
- *
- * Return Value:
- * HRESULT NOERROR or an error code
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::OnDocWindowActivate
- (BOOL fActivate)
- {
- HWND hWndTB;
-
- if (NULL==m_pObj->m_pIOleIPFrame)
- return NOERROR;
-
- hWndTB=m_pObj->m_pTB->Window();
-
- if (fActivate)
- {
- #ifdef WIN32ANSI
- OLECHAR szTemp[40];
-
- MultiByteToWideChar(CP_ACP, 0
- , (*m_pObj->m_pST)[IDS_INPLACETITLE], -1, szTemp, 40);
- m_pObj->m_pIOleIPFrame->SetActiveObject(this, szTemp);
- #else
- m_pObj->m_pIOleIPFrame->SetActiveObject(this
- , (*m_pObj->m_pST)[IDS_INPLACETITLE]);
- #endif
-
- m_pObj->m_pIOleIPFrame->SetMenu(m_pObj->m_hMenuShared
- , m_pObj->m_hOLEMenu, m_pObj->m_pFR->Window());
-
- if (m_pObj->InPlaceToolsRenegotiate())
- {
- RECT rc;
-
- m_pObj->m_pIOleIPFrame->GetBorder(&rc);
- SetWindowPos(hWndTB, NULL, rc.left, rc.top
- , rc.right-rc.left, rc.top+m_pObj->m_cyBar
- , SWP_NOZORDER);
-
- ShowWindow(hWndTB, SW_SHOW);
- }
- }
- else
- {
- m_pObj->m_pIOleIPFrame->SetActiveObject(NULL, NULL);
-
- //Hide our tools, but do not call SetMenu
- ShowWindow(hWndTB, SW_HIDE);
- }
-
- return NOERROR;
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::ResizeBorder
- *
- * Purpose:
- * Informs the object that the frame or document size changed in
- * which case the object may need to resize any of its frame or
- * document-level tools to match.
- *
- * Parameters:
- * pRect LPCRECT indicating the new size of the window
- * of interest.
- * pIUIWindow LPOLEINPLACEUIWINDOW pointing to an
- * IOleInPlaceUIWindow interface on the container
- * object of interest. We use this to do border-
- * space negotiation.
- * fFrame BOOL indicating if the frame was resized (TRUE)
- * or the document (FALSE)
- *
- * Return Value:
- * HRESULT NOERROR or an error code
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::ResizeBorder(LPCRECT pRect
- , LPOLEINPLACEUIWINDOW pIUIWindow, BOOL fFrame)
- {
- //The document case is uninteresting for us.
- if (!fFrame)
- return NOERROR;
-
- if (!m_pObj->InPlaceToolsRenegotiate())
- return ResultFromScode(INPLACE_E_NOTOOLSPACE);
-
- SetWindowPos(m_pObj->m_pTB->Window(), NULL, pRect->left
- , pRect->top, pRect->right-pRect->left, m_pObj->m_cyBar
- , SWP_NOZORDER);
-
- return NOERROR;
- }
-
-
-
-
- /*
- * CImpIOleInPlaceActiveObject::EnableModeless
- *
- * Purpose:
- * Instructs the object to show or hide any modeless popup windows
- * that it may be using when activated in-place.
- *
- * Parameters:
- * fEnable BOOL indicating to enable/show the windows
- * (TRUE) or to hide them (FALSE).
- *
- * Return Value:
- * HRESULT NOERROR or an error code
- */
-
- STDMETHODIMP CImpIOleInPlaceActiveObject::EnableModeless
- (BOOL fActivate)
- {
- return ResultFromScode(E_NOTIMPL);
- }
-