Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

150 lines
3.5 KiB

#include <assert.h>
#include "ioipsite.h"
#include "iosite.h"
COleInPlaceSite::COleInPlaceSite(COleSite* pSite)
{
m_pOleSite = pSite;
m_nCount = 0;
AddRef();
}
COleInPlaceSite::~COleInPlaceSite()
{
assert(m_nCount == 0);
}
STDMETHODIMP COleInPlaceSite::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
// delegate to the container Site
return m_pOleSite->QueryInterface(riid, ppvObj);
}
STDMETHODIMP_(ULONG) COleInPlaceSite::AddRef()
{
return ++m_nCount;
}
STDMETHODIMP_(ULONG) COleInPlaceSite::Release()
{
--m_nCount;
if(m_nCount == 0)
{
delete this;
return 0;
}
return m_nCount;
}
STDMETHODIMP COleInPlaceSite::GetWindow (HWND* lphwnd)
{
// return the handle to our editing window.
*lphwnd = m_pOleSite->m_hWnd;
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::ContextSensitiveHelp (BOOL fEnterMode)
{
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::CanInPlaceActivate ()
{
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::OnInPlaceActivate ()
{
HRESULT hrErr;
hrErr = m_pOleSite->m_lpOleObject->QueryInterface(IID_IOleInPlaceObject, (LPVOID*)&m_pOleSite->m_lpInPlaceObject);
if (hrErr != NOERROR)
return ResultFromScode(E_FAIL);
// return S_OK to indicate we can in-place activate.
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::OnUIActivate ()
{
m_pOleSite->m_fInPlaceActive = TRUE;
m_pOleSite->m_lpInPlaceObject->GetWindow((HWND*)&m_pOleSite->m_hwndIPObj);
// return S_OK to continue in-place activation
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::GetWindowContext (LPOLEINPLACEFRAME* lplpFrame,
LPOLEINPLACEUIWINDOW* lplpDoc,
LPRECT lprcPosRect,
LPRECT lprcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
RECT rect;
// the frame is associated with the application object.
// need to AddRef() it...
m_pOleSite->m_pOleInPlaceFrame->AddRef();
*lplpFrame = m_pOleSite->m_pOleInPlaceFrame;
*lplpDoc = NULL; // must be NULL, cause we're SDI.
// get the size of the object in pixels
GetClientRect(m_pOleSite->m_hWnd, &rect);
// Copy this to the passed buffer
CopyRect(lprcPosRect, &rect);
// fill the clipping region
GetClientRect(m_pOleSite->m_hWnd, &rect);
CopyRect(lprcClipRect, &rect);
// fill the FRAMEINFO
lpFrameInfo->fMDIApp = FALSE;
lpFrameInfo->hwndFrame = m_pOleSite->m_hWnd;
lpFrameInfo->haccel = NULL;
lpFrameInfo->cAccelEntries = 0;
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::Scroll (SIZE scrollExtent)
{
return ResultFromScode(E_FAIL);
}
STDMETHODIMP COleInPlaceSite::OnUIDeactivate (BOOL fUndoable)
{
// need to clear this flag first
m_pOleSite->m_fInPlaceActive = FALSE;
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::OnInPlaceDeactivate ()
{
if (m_pOleSite->m_lpInPlaceObject) {
m_pOleSite->m_lpInPlaceObject->Release();
m_pOleSite->m_lpInPlaceObject = NULL;
}
return ResultFromScode(S_OK);
}
STDMETHODIMP COleInPlaceSite::DiscardUndoState ()
{
return ResultFromScode(E_FAIL);
}
STDMETHODIMP COleInPlaceSite::DeactivateAndUndo ()
{
return ResultFromScode(E_FAIL);
}
STDMETHODIMP COleInPlaceSite::OnPosRectChange (LPCRECT lprcPosRect)
{
return ResultFromScode(S_OK);
}