369 lines
8.4 KiB
C++
369 lines
8.4 KiB
C++
|
|
|
|
#include "SWebCtrlInterFace.h"
|
|
#include <mshtmcid.h>
|
|
#include <assert.h>
|
|
|
|
CWebCtrlInterFace::CWebCtrlInterFace( HWND hWnd )
|
|
{
|
|
m_defaultClientSite = NULL;
|
|
m_defaultDocHostUIHandler = NULL;
|
|
m_contextMenuMode = kDefaultMenuSupport;
|
|
m_cRef = 0;
|
|
m_hWnd = hWnd;
|
|
}
|
|
|
|
CWebCtrlInterFace::~CWebCtrlInterFace()
|
|
{
|
|
//We release our default interfaces
|
|
this->SetDefaultClientSite(NULL);
|
|
}
|
|
|
|
VOID CWebCtrlInterFace::SetDefaultClientSite(IOleClientSite *pClientSite)
|
|
{
|
|
if (pClientSite != NULL)
|
|
{
|
|
pClientSite->AddRef();
|
|
|
|
m_defaultClientSite = pClientSite;
|
|
m_defaultClientSite->QueryInterface(IID_IDocHostUIHandler, (VOID **)&m_defaultDocHostUIHandler);
|
|
}
|
|
else
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
{
|
|
m_defaultClientSite->Release();
|
|
m_defaultClientSite = NULL;
|
|
}
|
|
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
{
|
|
m_defaultDocHostUIHandler->Release();
|
|
m_defaultDocHostUIHandler = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID CWebCtrlInterFace::SetContextMenuMode(ULONG inMode)
|
|
{
|
|
assert(inMode < kWebContextMenuModeLimit);
|
|
|
|
if (inMode < kWebContextMenuModeLimit)
|
|
m_contextMenuMode = inMode;
|
|
}
|
|
|
|
// *** IUnknown ***
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
HRESULT result = S_OK;
|
|
|
|
// Always set out parameter to NULL, validating it first
|
|
if (IsBadWritePtr(ppv, sizeof(LPVOID)))
|
|
result = E_INVALIDARG;
|
|
|
|
if (result == S_OK)
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if ( IsEqualIID( riid, IID_IUnknown ) )
|
|
*ppv = this;
|
|
else if ( IsEqualIID( riid, IID_IOleClientSite ) )
|
|
*ppv = (IOleClientSite *) this;
|
|
else if ( IsEqualIID( riid, IID_IDocHostUIHandler ) )
|
|
*ppv = (IDocHostUIHandler *) this;
|
|
else
|
|
result = E_NOINTERFACE;
|
|
}
|
|
|
|
if (result == S_OK)
|
|
this->AddRef();
|
|
|
|
return result;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CWebCtrlInterFace::AddRef()
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CWebCtrlInterFace::Release()
|
|
{
|
|
// Decrement the object's internal counter
|
|
ULONG ulRefCount = InterlockedDecrement(&m_cRef);
|
|
|
|
if (0 == m_cRef)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return ulRefCount;
|
|
}
|
|
|
|
// *** IOleClientSite ***
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::SaveObject()
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->SaveObject();
|
|
else
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetMoniker(DWORD dwAssign,
|
|
DWORD dwWhichMoniker, LPMONIKER *ppmk)
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->GetMoniker(dwAssign, dwWhichMoniker, ppmk);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppmk, sizeof(*ppmk)))
|
|
*ppmk = NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetContainer(LPOLECONTAINER *ppContainer)
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->GetContainer(ppContainer);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppContainer, sizeof(*ppContainer)))
|
|
*ppContainer = NULL;
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::ShowObject()
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->ShowObject();
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::OnShowWindow(BOOL fShow)
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->OnShowWindow(fShow);
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::RequestNewObjectLayout()
|
|
{
|
|
if (m_defaultClientSite != NULL)
|
|
return m_defaultClientSite->RequestNewObjectLayout();
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// *** IDocHostUIHandler ***
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::ShowContextMenu(DWORD dwID, POINT *ppt,
|
|
IUnknown *pcmdtReserved, IDispatch *pdispReserved)
|
|
{
|
|
HRESULT result = S_FALSE; //Dont Interfere
|
|
BOOL handled = FALSE;
|
|
|
|
switch ( m_contextMenuMode )
|
|
{
|
|
case kDefaultMenuSupport:
|
|
break;
|
|
|
|
case kNoContextMenu:
|
|
result = S_OK;
|
|
handled = TRUE;
|
|
break;
|
|
|
|
case kTextSelectionOnly:
|
|
if (dwID != CONTEXT_MENU_TEXTSELECT)
|
|
{
|
|
result = S_OK;
|
|
handled = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (! handled)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
result = m_defaultDocHostUIHandler->ShowContextMenu(dwID, ppt,
|
|
pcmdtReserved, pdispReserved);
|
|
else
|
|
result = S_FALSE;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetHostInfo(DOCHOSTUIINFO *pInfo)
|
|
{
|
|
// { sonador 7.0.11 인게임 도움창 수정
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
{
|
|
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
|
|
pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_SCROLL_NO;
|
|
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
|
|
return S_OK;
|
|
}
|
|
// } sonador 7.0.11 인게임 도움창 수정
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::ShowUI(DWORD dwID,
|
|
IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
|
|
IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->ShowUI(dwID, pActiveObject,
|
|
pCommandTarget, pFrame, pDoc);
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::HideUI()
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->HideUI();
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::UpdateUI()
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->UpdateUI();
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::EnableModeless(BOOL fEnable)
|
|
{
|
|
//Modal OK
|
|
if( fEnable )
|
|
RedrawWindow(m_hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
|
|
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->EnableModeless(fEnable);
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::OnDocWindowActivate(BOOL fActivate)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->OnDocWindowActivate(fActivate);
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::OnFrameWindowActivate(BOOL fActivate)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->OnFrameWindowActivate(fActivate);
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::ResizeBorder(LPCRECT prcBorder,
|
|
IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->ResizeBorder(prcBorder, pUIWindow, fRameWindow);
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::TranslateAccelerator(LPMSG lpMsg,
|
|
const GUID *pguidCmdGroup, DWORD nCmdID)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
|
|
else
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetOptionKeyPath(
|
|
LPOLESTR *pchKey, DWORD dw)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->GetOptionKeyPath(pchKey, dw);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(pchKey, sizeof(*pchKey)))
|
|
*pchKey = NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetDropTarget(
|
|
IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
{
|
|
HRESULT result = m_defaultDocHostUIHandler->GetDropTarget(pDropTarget, ppDropTarget);
|
|
|
|
//Returning S_FALSE seems to disable DragNDrop, while DragNDrop is by default on.
|
|
//Changing return code to E_FAIL seems to fix things.
|
|
if (result == S_FALSE)
|
|
result = E_FAIL;
|
|
|
|
return result;
|
|
}
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppDropTarget, sizeof(*ppDropTarget)))
|
|
*ppDropTarget = NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::GetExternal(IDispatch **ppDispatch)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->GetExternal(ppDispatch);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppDispatch, sizeof(*ppDispatch)))
|
|
*ppDispatch = NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::TranslateUrl(
|
|
DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->TranslateUrl(dwTranslate, pchURLIn, ppchURLOut);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppchURLOut, sizeof(*ppchURLOut)))
|
|
*ppchURLOut = NULL;
|
|
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CWebCtrlInterFace::FilterDataObject(
|
|
IDataObject *pDO, IDataObject **ppDORet)
|
|
{
|
|
if (m_defaultDocHostUIHandler != NULL)
|
|
return m_defaultDocHostUIHandler->FilterDataObject(pDO, ppDORet);
|
|
else
|
|
{
|
|
if (! IsBadWritePtr(ppDORet, sizeof(*ppDORet)))
|
|
*ppDORet = NULL;
|
|
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|