IIPAOBJ.CPP

/* 
* 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);
}