windows-nt/Source/XPSP1/NT/shell/browseui/dhuihand.cpp
2020-09-26 16:20:57 +08:00

220 lines
6.2 KiB
C++

#include "priv.h"
#include "dhuihand.h"
#define DM_DOCHOSTUIHANDLER 0
//==========================================================================
// IDocHostUIHandler implementation
//==========================================================================
HRESULT CDocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::ShowContextMenu called");
//
// LATER: WebBand in a DesktBar/BrowserBar needs to hook this event
// to popup a customized context menu.
//
return S_FALSE; // Host did not display any UI.
}
HRESULT CDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::GetHostInfo called");
// Trident does not initialize it. It's defined as [in] parameter.
#if 0
if (pInfo->cbSize < SIZEOF(DOCHOSTUIINFO)) {
return E_INVALIDARG;
}
#endif
pInfo->cbSize = SIZEOF(DOCHOSTUIINFO);
pInfo->dwFlags = DOCHOSTUIFLAG_BROWSER;
// Disable double buffering if low memory machine.
// if (SHIsLowMemoryMachine(ILMM_IE4))
// pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_DISABLE_OFFSCREEN;
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT; // default
return S_OK;
}
HRESULT CDocHostUIHandler::ShowUI(
DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame,
IOleInPlaceUIWindow *pDoc)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::ShowUI called");
// Host did not display its own UI. Trident will proceed to display its own.
return S_FALSE;
}
HRESULT CDocHostUIHandler::HideUI(void)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::HideUI called");
// This one is paired with ShowUI
return S_FALSE;
}
HRESULT CDocHostUIHandler::UpdateUI(void)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::UpdateUI called");
// LATER: Isn't this equivalent to OLECMDID_UPDATECOMMANDS?
return S_FALSE;
}
HRESULT CDocHostUIHandler::EnableModeless(BOOL fEnable)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::EnableModeless called");
// Called from the Trident when the equivalent member of its
// IOleInPlaceActiveObject is called by the frame. We don't care
// those cases.
return S_OK;
}
HRESULT CDocHostUIHandler::OnDocWindowActivate(BOOL fActivate)
{
// Called from the Trident when the equivalent member of its
// IOleInPlaceActiveObject is called by the frame. We don't care
// those cases.
return S_OK;
}
HRESULT CDocHostUIHandler::OnFrameWindowActivate(BOOL fActivate)
{
// Called from the Trident when the equivalent member of its
// IOleInPlaceActiveObject is called by the frame. We don't care
// those cases.
return S_OK;
}
HRESULT CDocHostUIHandler::ResizeBorder(
LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
{
// Called from the Trident when the equivalent member of its
// IOleInPlaceActiveObject is called by the frame. We don't care
// those cases.
return S_OK;
}
HRESULT CDocHostUIHandler::TranslateAccelerator(
LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
{
// Called from the Trident when the equivalent member of its
// IOleInPlaceActiveObject is called by the frame. We don't care
// those cases.
return S_FALSE; // The message was not translated
}
HRESULT CDocHostUIHandler::GetOptionKeyPath(BSTR *pbstrKey, DWORD dw)
{
// Trident will default to its own user options.
*pbstrKey = NULL;
return S_FALSE;
}
HRESULT CDocHostUIHandler::GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::GetDropTarget called");
return E_NOTIMPL;
}
HRESULT CDocHostUIHandler::GetAltExternal(IDispatch **ppDisp)
{
HRESULT hr = E_FAIL;
IDocHostUIHandler *pDocHostUIHandler;
IOleObject *pOleObject;
IOleClientSite *pOleClientSite;
*ppDisp = NULL;
// * QI ourselves for a service provider
// * QS for the top level browser's service provider
// * Ask for an IOleObject
// * Ask the IOleObject for an IOleClientSite
// * QI the IOleClientSite for an IDocHostUIHandler
// * Call GetExternal on the IDocHostUIHandler to get the IDispatch
if (SUCCEEDED(IUnknown_QueryServiceForWebBrowserApp(this, IID_PPV_ARG(IOleObject, &pOleObject))))
{
if (SUCCEEDED(pOleObject->GetClientSite(&pOleClientSite)))
{
if (SUCCEEDED(pOleClientSite->QueryInterface(IID_IDocHostUIHandler,
(void **)&pDocHostUIHandler)))
{
hr = pDocHostUIHandler->GetExternal(ppDisp);
pDocHostUIHandler->Release();
}
pOleClientSite->Release();
}
pOleObject->Release();
}
return hr;
}
HRESULT CDocHostUIHandler::GetExternal(IDispatch **ppDisp)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::GetExternal called");
HRESULT hr;
if (ppDisp)
{
IDispatch *psuihDisp;
IDispatch *pAltExternalDisp;
*ppDisp = NULL;
GetAltExternal(&pAltExternalDisp);
hr = CShellUIHelper_CreateInstance2((IUnknown **)&psuihDisp, IID_IDispatch,
(IUnknown *)this, pAltExternalDisp);
if (SUCCEEDED(hr))
{
*ppDisp = psuihDisp;
if (pAltExternalDisp)
{
// Don't hold a ref - the ShellUIHelper will do it
pAltExternalDisp->Release();
}
}
else if (pAltExternalDisp)
{
// Couldn't create a ShellUIHelper but we got our host's
// external.
*ppDisp = pAltExternalDisp;
hr = S_OK;
}
}
else
{
hr = E_INVALIDARG;
}
ASSERT((SUCCEEDED(hr) && (*ppDisp)) || (FAILED(hr)));
return hr;
}
HRESULT CDocHostUIHandler::TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::TranslateUrl called");
return S_FALSE;
}
HRESULT CDocHostUIHandler::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
{
TraceMsg(DM_DOCHOSTUIHANDLER, "CDOH::FilterDataObject called");
return S_FALSE;
}