Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

407 lines
10 KiB

/*
* IIPSITE.CPP
* IOleInPlaceSite for Document Objects CSite class
*
* Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
*/
#include "stdafx.h"
#include <docobj.h>
#include "DHTMLEd.h"
#include "DHTMLEdit.h"
#include "site.h"
#include "proxyframe.h"
/**
Note: the m_cRef count is provided for debugging purposes only.
CSite controls the destruction of the object through delete,
not reference counting
*/
/*
* CImpIOleInPlaceSite::CImpIOleInPlaceSite
* CImpIOleInPlaceSite::~CImpIOleInPlaceSite
*
* Parameters (Constructor):
* pSite PCSite of the site we're in.
* pUnkOuter LPUNKNOWN to which we delegate.
*/
CImpIOleInPlaceSite::CImpIOleInPlaceSite( PCSite pSite, LPUNKNOWN pUnkOuter)
{
m_cRef = 0;
m_pSite = pSite;
m_pUnkOuter = pUnkOuter;
}
CImpIOleInPlaceSite::~CImpIOleInPlaceSite( void )
{
}
/*
* CImpIOleInPlaceSite::QueryInterface
* CImpIOleInPlaceSite::AddRef
* CImpIOleInPlaceSite::Release
*
* Purpose:
* IUnknown members for CImpIOleInPlaceSite object.
*/
STDMETHODIMP CImpIOleInPlaceSite::QueryInterface( REFIID riid, void **ppv )
{
return m_pUnkOuter->QueryInterface( riid, ppv );
}
STDMETHODIMP_(ULONG) CImpIOleInPlaceSite::AddRef(void)
{
++m_cRef;
return m_pUnkOuter->AddRef();
}
STDMETHODIMP_(ULONG) CImpIOleInPlaceSite::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 S_OK if successful, E_FAIL if there is no
* window.
*/
STDMETHODIMP CImpIOleInPlaceSite::GetWindow( HWND *phWnd )
{
//This is the client-area window in the frame
*phWnd = m_pSite->GetWindow();
return S_OK;
}
/*
* 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 S_OK
*/
STDMETHODIMP CImpIOleInPlaceSite::ContextSensitiveHelp(
BOOL /*fEnterMode*/ )
{
return S_OK;
}
/*
* CImpIOleInPlaceSite::CanInPlaceActivate
*
* Purpose:
* Answers the server whether or not we can currently in-place
* activate its object. By implementing this interface we say
* that we support in-place activation, but through this function
* we indicate whether the object can currently be activated
* in-place. Iconic aspects, for example, cannot, meaning we
* return S_FALSE.
*
* Parameters:
* None
*
* Return Value:
* HRESULT S_OK if we can in-place activate the object
* in this site, S_FALSE if not.
*/
STDMETHODIMP CImpIOleInPlaceSite::CanInPlaceActivate( void )
{
/*
* We can always in-place activate--no restrictions for DocObjects.
* We don't worry about other cases since CSite only ever creates
* embedded files.
*/
return S_OK;
}
/*
* CImpIOleInPlaceSite::OnInPlaceActivate
*
* Purpose:
* Informs the container that an object is being activated in-place
* such that the container can prepare appropriately. The
* container does not, however, make any user interface changes at
* this point. See OnUIActivate.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::OnInPlaceActivate( void )
{
LPOLEINPLACEOBJECT pIOleIPObject;
HRESULT hr = m_pSite->GetObjectUnknown()->QueryInterface(
IID_IOleInPlaceObject, (void**) &pIOleIPObject );
m_pSite->SetIPObject( pIOleIPObject );
return hr;
}
/*
* CImpIOleInPlaceSite::OnInPlaceDeactivate
*
* Purpose:
* Notifies the container that the object has deactivated itself
* from an in-place state. Opposite of OnInPlaceActivate. The
* container does not change any UI at this point.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::OnInPlaceDeactivate( void )
{
/*
* Since we don't have an Undo command, we can tell the object
* right away to discard its Undo state.
*/
m_pSite->Activate(OLEIVERB_DISCARDUNDOSTATE);
m_pSite->GetIPObject()->Release();
return NOERROR;
}
/*
* CImpIOleInPlaceSite::OnUIActivate
*
* Purpose:
* Informs the container that the object is going to start munging
* around with user interface, like replacing the menu. The
* container should remove any relevant UI in preparation.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::OnUIActivate( void )
{
m_pSite->GetFrame()->GetControl()->DoVerbUIActivate ( NULL, NULL );
// Bug 107500 returns an error from OnUIActivate.
// If we return that error here, the control gets into an inconsistant state.
// All is well if we return OK.
return S_OK;
}
/*
* CImpIOleInPlaceSite::OnUIDeactivate
*
* Purpose:
* Informs the container that the object is deactivating its
* in-place user interface at which time the container may
* reinstate its own. Opposite of OnUIActivate.
*
* Parameters:
* fUndoable BOOL indicating if the object will actually
* perform an Undo if the container calls
* ReactivateAndUndo.
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::OnUIDeactivate( BOOL /*fUndoable*/ )
{
// Normally we'd tidy up here, but since MSHTML.DLL is the only thing we host
// the Frame will go away on deactivation so there's no point in restoring
// the Frame's empty state
return NOERROR;
}
/*
* CImpIOleInPlaceSite::DeactivateAndUndo
*
* Purpose:
* If immediately after activation the object does an Undo, the
* action being undone is the activation itself, and this call
* informs the container that this is, in fact, what happened.
* The container should call IOleInPlaceObject::UIDeactivate.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::DeactivateAndUndo( void )
{
// Tell the object we are deactivating
m_pSite->GetIPObject()->InPlaceDeactivate();
return NOERROR;
}
/*
* CImpIOleInPlaceSite::DiscardUndoState
*
* Purpose:
* Informs the container that something happened in the object
* that means the container should discard any undo information
* it currently maintains for the object.
*
* Parameters:
* None
*
* Return Value:
* HRESULT NOERROR or an appropriate error code.
*/
STDMETHODIMP CImpIOleInPlaceSite::DiscardUndoState( void )
{
return E_NOTIMPL;
}
/*
* CImpIOleInPlaceSite::GetWindowContext
*
* Purpose:
* Provides an in-place object with pointers to the frame and
* document level in-place interfaces (IOleInPlaceFrame and
* IOleInPlaceUIWindow) such that the object can do border
* negotiation and so forth. Also requests the position and
* clipping rectangles of the object in the container and a
* pointer to an OLEINPLACEFRAME info structure which contains
* accelerator information.
*
* Note that the two interfaces this call returns are not
* available through QueryInterface on IOleInPlaceSite since they
* live with the frame and document, but not the site.
*
* Parameters:
* ppIIPFrame LPOLEINPLACEFRAME * in which to return the
* AddRef'd pointer to the container's
* IOleInPlaceFrame.
* ppIIPUIWindow LPOLEINPLACEUIWINDOW * in which to return
* the AddRef'd pointer to the container document's
* IOleInPlaceUIWindow.
* prcPos LPRECT in which to store the object's position.
* prcClip LPRECT in which to store the object's visible
* region.
* pFI LPOLEINPLACEFRAMEINFO to fill with accelerator
* stuff.
*
* Return Value:
* HRESULT NOERROR
*/
STDMETHODIMP CImpIOleInPlaceSite::GetWindowContext(
LPOLEINPLACEFRAME* ppIIPFrame,
LPOLEINPLACEUIWINDOW* ppIIPUIWindow,
LPRECT prcPos,
LPRECT prcClip,
LPOLEINPLACEFRAMEINFO pFI )
{
*ppIIPUIWindow = NULL;
m_pSite->QueryInterface(
IID_IOleInPlaceFrame, (void **)ppIIPFrame);
if (NULL != prcPos)
{
GetClientRect( m_pSite->GetWindow(), prcPos );
}
*prcClip = *prcPos;
pFI->cb = sizeof(OLEINPLACEFRAMEINFO);
pFI->fMDIApp = FALSE;
m_pSite->GetFrame()->GetWindow(&pFI->hwndFrame);
SetWindowLong ( pFI->hwndFrame, GWL_STYLE,
GetWindowLong ( pFI->hwndFrame, GWL_STYLE ) |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN );
pFI->haccel = NULL;
pFI->cAccelEntries = 0;
return NOERROR;
}
/*
* CImpIOleInPlaceSite::Scroll
*
* Purpose:
* Asks the container to scroll the document, and thus the object,
* by the given amounts in the sz parameter.
*
* Parameters:
* sz SIZE containing signed horizontal and vertical
* extents by which the container should scroll.
* These are in device units.
*
* Return Value:
* HRESULT NOERROR
*/
STDMETHODIMP CImpIOleInPlaceSite::Scroll( SIZE /*sz*/ )
{
//Not needed for DocObjects
return E_NOTIMPL;
}
/*
* CImpIOleInPlaceSite::OnPosRectChange
*
* Purpose:
* Informs the container that the in-place object was resized.
* The container must call IOleInPlaceObject::SetObjectRects.
* This does not change the site's rectangle in any case.
*
* Parameters:
* prcPos LPCRECT containing the new size of the object.
*
* Return Value:
* HRESULT NOERROR
*/
STDMETHODIMP CImpIOleInPlaceSite::OnPosRectChange( LPCRECT /*prcPos*/ )
{
//Not needed for DocObjects
return E_NOTIMPL;
}