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.
1270 lines
32 KiB
1270 lines
32 KiB
/*
|
|
* d o c h o s t . c p p
|
|
*
|
|
* Purpose:
|
|
* basic implementation of a docobject host. Used by the body class to
|
|
* host Trident and/or MSHTML
|
|
*
|
|
* History
|
|
* August '96: brettm - created
|
|
*
|
|
* Copyright (C) Microsoft Corp. 1995, 1996.
|
|
*/
|
|
|
|
#include <pch.hxx>
|
|
#include "dllmain.h"
|
|
#include "strconst.h"
|
|
#include "msoert.h"
|
|
#include "dochost.h"
|
|
#include "oleutil.h"
|
|
|
|
ASSERTDATA
|
|
|
|
/*
|
|
* m a c r o s
|
|
*/
|
|
|
|
/*
|
|
* c o n s t a n t s
|
|
*/
|
|
|
|
/*
|
|
* t y p e d e f s
|
|
*/
|
|
|
|
/*
|
|
* g l o b a l s
|
|
*/
|
|
|
|
/*
|
|
* f u n c t i o n p r o t y p e s
|
|
*/
|
|
|
|
/*
|
|
* f u n c t i o n s
|
|
*/
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
CDocHost::CDocHost()
|
|
{
|
|
/*
|
|
Not initialised
|
|
Member: Initialised In:
|
|
--------------------+---------------------------
|
|
*/
|
|
m_cRef=1;
|
|
m_hwnd=0;
|
|
m_pDocView=0;
|
|
m_lpOleObj=0;
|
|
m_pCmdTarget=0;
|
|
m_hwndDocObj=NULL;
|
|
m_fUIActive=FALSE;
|
|
m_fFocus=FALSE;
|
|
m_fDownloading=FALSE;
|
|
m_fCycleFocus=FALSE;
|
|
m_pInPlaceActiveObj = NULL;
|
|
m_dwFrameWidth = 0;
|
|
m_dwFrameHeight = 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member:
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
CDocHost::~CDocHost()
|
|
{
|
|
// These should all get feed up when we get a WM_DESTROY and close the docobj
|
|
Assert(m_lpOleObj==NULL);
|
|
Assert(m_pDocView==NULL);
|
|
Assert(m_pInPlaceActiveObj==NULL);
|
|
Assert(m_pCmdTarget==NULL);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: AddRef
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
ULONG CDocHost::AddRef()
|
|
{
|
|
TraceCall("CDocHost::AddRef");
|
|
|
|
//TraceInfo(_MSG("CDocHost::AddRef: cRef==%d", m_cRef+1));
|
|
return ++m_cRef;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Release
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
ULONG CDocHost::Release()
|
|
{
|
|
TraceCall("CDocHost::Release");
|
|
|
|
//TraceInfo(_MSG("CDocHost::Release: cRef==%d", m_cRef-1));
|
|
if (--m_cRef==0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return m_cRef;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: QueryInterface
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::QueryInterface(REFIID riid, LPVOID *lplpObj)
|
|
{
|
|
TraceCall("CDocHost::QueryInterface");
|
|
|
|
if(!lplpObj)
|
|
return E_INVALIDARG;
|
|
|
|
*lplpObj = NULL; // set to NULL, in case we fail.
|
|
|
|
//DebugPrintInterface(riid, "CDocHost");
|
|
|
|
if (IsEqualIID(riid, IID_IOleInPlaceUIWindow))
|
|
*lplpObj = (LPVOID)(IOleInPlaceUIWindow *)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleInPlaceSite))
|
|
*lplpObj = (LPVOID)(LPOLEINPLACESITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleClientSite))
|
|
*lplpObj = (LPVOID)(LPOLECLIENTSITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleControlSite))
|
|
*lplpObj = (LPVOID)(IOleControlSite *)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IAdviseSink))
|
|
*lplpObj = (LPVOID)(LPADVISESINK)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleDocumentSite))
|
|
*lplpObj = (LPVOID)(LPOLEDOCUMENTSITE)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IOleCommandTarget))
|
|
*lplpObj = (LPVOID)(LPOLECOMMANDTARGET)this;
|
|
|
|
else if (IsEqualIID(riid, IID_IServiceProvider))
|
|
*lplpObj = (LPVOID)(LPSERVICEPROVIDER)this;
|
|
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ExtWndProc
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
LRESULT CALLBACK CDocHost::ExtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LPDOCHOST pDocHost;
|
|
|
|
if(msg==WM_CREATE)
|
|
{
|
|
pDocHost=(CDocHost *)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
if(!pDocHost)
|
|
return -1;
|
|
|
|
if(FAILED(pDocHost->OnCreate(hwnd)))
|
|
return -1;
|
|
}
|
|
|
|
pDocHost = (LPDOCHOST)GetWndThisPtr(hwnd);
|
|
if(pDocHost)
|
|
return pDocHost->WndProc(hwnd, msg, wParam, lParam);
|
|
else
|
|
return DefWindowProc(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: WndProc
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
LRESULT CDocHost::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
|
|
case WM_SETFOCUS:
|
|
if(m_pDocView)
|
|
m_pDocView->UIActivate(TRUE);
|
|
break;
|
|
|
|
case WM_SIZE:
|
|
WMSize(LOWORD(lParam), HIWORD(lParam));
|
|
return 0;
|
|
|
|
case WM_CLOSE:
|
|
return 0; // prevent alt-f4's
|
|
|
|
case WM_DESTROY:
|
|
OnDestroy();
|
|
break;
|
|
|
|
case WM_NCDESTROY:
|
|
OnNCDestroy();
|
|
break;
|
|
|
|
case WM_WININICHANGE:
|
|
case WM_DISPLAYCHANGE:
|
|
case WM_SYSCOLORCHANGE:
|
|
case WM_QUERYNEWPALETTE:
|
|
case WM_PALETTECHANGED:
|
|
if (m_hwndDocObj)
|
|
return SendMessage(m_hwndDocObj, msg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_USER + 1:
|
|
// Hook for testing automation
|
|
// copy the contents of trident onto the clipboard.
|
|
return CmdSelectAllCopy(m_pCmdTarget);
|
|
}
|
|
return DefWindowProc(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnNCDestroy
|
|
//
|
|
// Synopsis:
|
|
//
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnNCDestroy
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnNCDestroy()
|
|
{
|
|
TraceCall("CDocHost::OnNCDestroy");
|
|
SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
|
|
m_hwnd = NULL;
|
|
Release();
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnDestroy
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnDestroy()
|
|
{
|
|
TraceCall("CDocHost::OnDestroy");
|
|
|
|
return CloseDocObj();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnCreate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnCreate(HWND hwnd)
|
|
{
|
|
TraceCall("CDocHost::OnCreate");
|
|
|
|
m_hwnd = hwnd;
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM)this);
|
|
AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CreateDocObj
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::CreateDocObj(LPCLSID pCLSID)
|
|
{
|
|
HRESULT hr=NOERROR;
|
|
|
|
TraceCall("CDocHost::CreateDocObj");
|
|
|
|
if(!pCLSID)
|
|
return E_INVALIDARG;
|
|
|
|
Assert(!m_lpOleObj);
|
|
Assert(!m_pDocView);
|
|
Assert(!m_pCmdTarget);
|
|
|
|
hr = CoCreateInstance(*pCLSID, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
|
IID_IOleObject, (LPVOID *)&m_lpOleObj);
|
|
if (FAILED(hr))
|
|
{
|
|
TraceResult(hr);
|
|
goto error;
|
|
}
|
|
|
|
hr = m_lpOleObj->SetClientSite((LPOLECLIENTSITE)this);
|
|
if (FAILED(hr))
|
|
{
|
|
TraceResult(hr);
|
|
goto error;
|
|
}
|
|
|
|
hr = m_lpOleObj->QueryInterface(IID_IOleCommandTarget, (LPVOID *)&m_pCmdTarget);
|
|
if (FAILED(hr))
|
|
{
|
|
TraceResult(hr);
|
|
goto error;
|
|
}
|
|
|
|
hr = HrInitNew(m_lpOleObj);
|
|
if (FAILED(hr))
|
|
{
|
|
TraceResult(hr);
|
|
goto error;
|
|
}
|
|
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Show
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::Show()
|
|
{
|
|
RECT rc;
|
|
HRESULT hr;
|
|
|
|
TraceCall("CDocHost::Show");
|
|
|
|
GetClientRect(m_hwnd, &rc);
|
|
GetDocObjSize(&rc);
|
|
|
|
hr=m_lpOleObj->DoVerb(OLEIVERB_SHOW, NULL, (LPOLECLIENTSITE)this, 0, m_hwnd, &rc);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CloseDocObj
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::CloseDocObj()
|
|
{
|
|
LPOLEINPLACEOBJECT pInPlaceObj=0;
|
|
|
|
TraceCall("CDocHost::CloseDocObj");
|
|
|
|
SafeRelease(m_pCmdTarget);
|
|
|
|
if(m_pDocView)
|
|
{
|
|
m_pDocView->UIActivate(FALSE);
|
|
m_pDocView->CloseView(0);
|
|
m_pDocView->SetInPlaceSite(NULL);
|
|
m_pDocView->Release();
|
|
m_pDocView=NULL;
|
|
}
|
|
|
|
if (m_lpOleObj)
|
|
{
|
|
// deactivate the docobj
|
|
if (!FAILED(m_lpOleObj->QueryInterface(IID_IOleInPlaceObject, (LPVOID*)&pInPlaceObj)))
|
|
{
|
|
pInPlaceObj->InPlaceDeactivate();
|
|
pInPlaceObj->Release();
|
|
}
|
|
|
|
// close the ole object, but blow off changes as we have either extracted
|
|
// them ourselves or don't care.
|
|
m_lpOleObj->Close(OLECLOSE_NOSAVE);
|
|
#ifdef DEBUG
|
|
ULONG uRef;
|
|
uRef=
|
|
#endif
|
|
m_lpOleObj->Release();
|
|
m_lpOleObj=NULL;
|
|
AssertSz(uRef==0, "We leaked a docobject!");
|
|
}
|
|
|
|
m_fDownloading=FALSE;
|
|
m_fFocus=FALSE;
|
|
m_fUIActive=FALSE;
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Init
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::Init(HWND hwndParent, BOOL fBorder, LPRECT prc)
|
|
{
|
|
HRESULT hr=S_OK;
|
|
HWND hwnd;
|
|
WNDCLASSW wc;
|
|
|
|
TraceCall("CDocHost::Init");
|
|
|
|
if(!IsWindow(hwndParent))
|
|
return E_INVALIDARG;
|
|
|
|
if (!GetClassInfoWrapW(g_hLocRes, c_wszDocHostWndClass, &wc))
|
|
{
|
|
ZeroMemory(&wc, sizeof(WNDCLASS));
|
|
wc.lpfnWndProc = CDocHost::ExtWndProc;
|
|
wc.hInstance = g_hLocRes;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszClassName = c_wszDocHostWndClass;
|
|
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
|
wc.style = CS_DBLCLKS;
|
|
|
|
if(!RegisterClassWrapW(&wc))
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
hwnd=CreateWindowExWrapW(WS_EX_NOPARENTNOTIFY|(fBorder?WS_EX_CLIENTEDGE:0),
|
|
c_wszDocHostWndClass,
|
|
NULL,
|
|
WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CHILD|WS_TABSTOP|WS_VISIBLE,
|
|
prc->left,
|
|
prc->right,
|
|
prc->right-prc->left,
|
|
prc->bottom-prc->top,
|
|
hwndParent,
|
|
NULL,
|
|
g_hLocRes,
|
|
(LPVOID)this);
|
|
if(!hwnd)
|
|
{
|
|
hr=E_OUTOFMEMORY;
|
|
goto error;
|
|
}
|
|
|
|
SetWindowPos(m_hwnd, NULL, prc->left, prc->top, prc->right-prc->left, prc->bottom-prc->top, SWP_NOZORDER);
|
|
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
// *** IOleWindow ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetWindow
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetWindow(HWND *phwnd)
|
|
{
|
|
TraceCall("CDocHost::GetWindow");
|
|
*phwnd=m_hwnd;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ContextSensitiveHelp
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::ContextSensitiveHelp(BOOL fEnterMode)
|
|
{
|
|
TraceCall("CDocHost::ContextSensitiveHelp");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// *** IOleInPlaceUIWindow methods ***
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetBorder
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetBorder(LPRECT lprectBorder)
|
|
{
|
|
TraceCall("CDocHost::GetBorder");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: RequestBorderSpace
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
|
|
{
|
|
TraceCall("CDocHost::RequestBorderSpace");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SetBorderSpace
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::SetBorderSpace(LPCBORDERWIDTHS lpborderwidths)
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceUIWindow::SetBorderSpace");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SetActiveObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::SetActiveObject(IOleInPlaceActiveObject * pActiveObject, LPCOLESTR lpszObjName)
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceUIWindow::SetActiveObject");
|
|
|
|
ReplaceInterface(m_pInPlaceActiveObj, pActiveObject);
|
|
return S_OK;
|
|
}
|
|
|
|
// *** IOleInPlaceFrame methods ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::InsertMenus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS)
|
|
{
|
|
TraceCall("CDocHost::InsertMenus");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::SetMenu
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::SetMenu(HMENU, HOLEMENU, HWND)
|
|
{
|
|
TraceCall("CDocHost::SetMenu");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::RemoveMenus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::RemoveMenus(HMENU)
|
|
{
|
|
TraceCall("CDocHost::RemoveMenus");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::SetStatusText
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::SetStatusText(LPCOLESTR pszW)
|
|
{
|
|
TraceCall("CDocHost::SetStatusText");
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::EnableModeless
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::EnableModeless(BOOL fEnable)
|
|
{
|
|
TraceCall("CDocHost::EnableModeless");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CDocHost::TranslateAccelerator
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::TranslateAccelerator(LPMSG, WORD)
|
|
{
|
|
TraceCall("CDocHost::TranslateAccelerator");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
|
|
|
|
// **** IOleInPlaceSite methods ****
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CanInPlaceActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::CanInPlaceActivate()
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceSite::CanInPlaceActivate");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnInPlaceActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnInPlaceActivate()
|
|
{
|
|
LPOLEINPLACEACTIVEOBJECT pInPlaceActive;
|
|
|
|
TraceCall("CDocHost::OnInPlaceActivate");
|
|
|
|
Assert(m_lpOleObj);
|
|
|
|
if (m_lpOleObj->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pInPlaceActive)==S_OK)
|
|
{
|
|
SideAssert((pInPlaceActive->GetWindow(&m_hwndDocObj)==NOERROR)&& IsWindow(m_hwndDocObj));
|
|
pInPlaceActive->Release();
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUIActivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnUIActivate()
|
|
{
|
|
TraceCall("CDocHost::OnUIActivate");
|
|
m_fUIActive=TRUE;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetWindowContext
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetWindowContext( IOleInPlaceFrame **ppFrame,
|
|
IOleInPlaceUIWindow **ppDoc,
|
|
LPRECT lprcPosRect,
|
|
LPRECT lprcClipRect,
|
|
LPOLEINPLACEFRAMEINFO lpFrameInfo)
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceSite::GetWindowContext");
|
|
|
|
*ppFrame = (LPOLEINPLACEFRAME)this;
|
|
AddRef();
|
|
|
|
*ppDoc = NULL;
|
|
|
|
GetClientRect(m_hwnd, lprcPosRect);
|
|
GetDocObjSize(lprcPosRect);
|
|
*lprcClipRect = *lprcPosRect;
|
|
|
|
lpFrameInfo->fMDIApp = FALSE;
|
|
lpFrameInfo->hwndFrame = m_hwnd;
|
|
lpFrameInfo->haccel = NULL;
|
|
lpFrameInfo->cAccelEntries = 0;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Scroll
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::Scroll(SIZE scrollExtent)
|
|
{
|
|
// the docobject consumes the entireview, so scroll requests
|
|
// are meaningless. Return NOERROR to indicate that they're scolled
|
|
// into view.
|
|
TraceCall("CDocHost::IOleInPlaceSite::Scroll");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUIDeactivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnUIDeactivate(BOOL fUndoable)
|
|
{
|
|
TraceCall("CDocHost::OnUIDeactivate");
|
|
m_fUIActive=FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnInPlaceDeactivate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnInPlaceDeactivate()
|
|
{
|
|
TraceCall("CDocHost::OnInPlaceDeactivate");
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: DiscardUndoState
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::DiscardUndoState()
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceSite::DiscardUndoState");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: DeactivateAndUndo
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::DeactivateAndUndo()
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceSite::DeactivateAndUndo");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnPosRectChange
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnPosRectChange(LPCRECT lprcPosRect)
|
|
{
|
|
TraceCall("CDocHost::IOleInPlaceSite::OnPosRectChange");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
// IOleClientSite methods.
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SaveObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::SaveObject()
|
|
{
|
|
TraceCall("CDocHost::IOleClientSite::SaveObject");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetMoniker
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppmnk)
|
|
{
|
|
TraceCall("CDocHost::IOleClientSite::GetMoniker");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetContainer
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetContainer(LPOLECONTAINER *ppCont)
|
|
{
|
|
TraceCall("CDocHost::IOleClientSite::GetContainer");
|
|
if(ppCont)
|
|
*ppCont=NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ShowObject
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::ShowObject()
|
|
{
|
|
// always shown.
|
|
// $TODO: do we need to restore the browser here if it is
|
|
// minimised?
|
|
TraceCall("CDocHost::IOleClientSite::ShowObject");
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnShowWindow
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnShowWindow(BOOL fShow)
|
|
{
|
|
TraceCall("CDocHost::IOleClientSite::OnShowWindow");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: RequestNewObjectLayout
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::RequestNewObjectLayout()
|
|
{
|
|
TraceCall("CDocHost::IOleClientSite::RequestNewObjectLayout");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IOleDocumentSite
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ActivateMe
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::ActivateMe(LPOLEDOCUMENTVIEW pViewToActivate)
|
|
{
|
|
TraceCall("CDocHost::IOleDocumentSite::ActivateMe");
|
|
return CreateDocView();
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: CreateDocView
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::CreateDocView()
|
|
{
|
|
HRESULT hr;
|
|
LPOLEDOCUMENT pOleDoc=NULL;
|
|
|
|
TraceCall("CDocHost::CreateDocView");
|
|
AssertSz(!m_pDocView, "why is this still set??");
|
|
AssertSz(m_lpOleObj, "uh? no docobject at this point?");
|
|
|
|
hr=OleRun(m_lpOleObj);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
|
|
hr=m_lpOleObj->QueryInterface(IID_IOleDocument, (LPVOID*)&pOleDoc);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
|
|
hr=pOleDoc->CreateView(this, NULL,0,&m_pDocView);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
|
|
hr=m_pDocView->SetInPlaceSite(this);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
|
|
hr=m_pDocView->Show(TRUE);
|
|
if(FAILED(hr))
|
|
goto error;
|
|
|
|
error:
|
|
ReleaseObj(pOleDoc);
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: QueryStatus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pCmdText)
|
|
{
|
|
ULONG ul;
|
|
|
|
TraceCall("CDocHost::CDocHost::QueryStatus");
|
|
|
|
if (!rgCmds)
|
|
return E_INVALIDARG;
|
|
|
|
if (pguidCmdGroup == NULL)
|
|
{
|
|
TraceInfo("IOleCmdTarget::QueryStatus - std group");
|
|
DebugPrintCmdIdBlock(cCmds, rgCmds);
|
|
|
|
for (ul=0;ul<cCmds; ul++)
|
|
{
|
|
switch (rgCmds[ul].cmdID)
|
|
{
|
|
case OLECMDID_OPEN:
|
|
case OLECMDID_SAVE:
|
|
case OLECMDID_PRINT:
|
|
rgCmds[ul].cmdf = MSOCMDF_ENABLED;
|
|
break;
|
|
|
|
default:
|
|
rgCmds[ul].cmdf = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* for now we deal only with status text*/
|
|
if (pCmdText)
|
|
{
|
|
if (!(pCmdText->cmdtextf & OLECMDTEXTF_STATUS))
|
|
{
|
|
pCmdText->cmdtextf = OLECMDTEXTF_NONE;// is this needed?
|
|
pCmdText->cwActual = 0;
|
|
return NOERROR;
|
|
}
|
|
}
|
|
return NOERROR;
|
|
}
|
|
|
|
TraceInfo("IOleCmdTarget::QueryStatus - unknown group");
|
|
return OLECMDERR_E_UNKNOWNGROUP;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: Exec
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
|
|
{
|
|
TraceCall("CDocHost::Exec");
|
|
|
|
if (pguidCmdGroup == NULL)
|
|
{
|
|
switch(nCmdID)
|
|
{
|
|
case OLECMDID_SETDOWNLOADSTATE:
|
|
if(pvaIn->vt==VT_I4)
|
|
{
|
|
m_fDownloading=pvaIn->lVal;
|
|
return S_OK;
|
|
}
|
|
break;
|
|
|
|
case OLECMDID_UPDATECOMMANDS:
|
|
OnUpdateCommands();
|
|
break;
|
|
|
|
case OLECMDID_SETPROGRESSPOS:
|
|
// when done downloading trident now hits us with a
|
|
// setprogresspos == -1 to indicate we should remove the "Done"
|
|
if (pvaIn->lVal == -1)
|
|
SetStatusText(NULL);
|
|
return S_OK;
|
|
|
|
case OLECMDID_SETPROGRESSTEXT:
|
|
if(pvaIn->vt == (VT_BSTR))
|
|
SetStatusText((LPCOLESTR)pvaIn->bstrVal);
|
|
return S_OK;
|
|
|
|
default:
|
|
return OLECMDERR_E_NOTSUPPORTED;
|
|
}
|
|
}
|
|
return OLECMDERR_E_UNKNOWNGROUP;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: WMSize
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
void CDocHost::WMSize(int cxBody, int cyBody)
|
|
{
|
|
RECT rc={0};
|
|
|
|
TraceCall("CDocHost::WMSize");
|
|
|
|
if(m_pDocView)
|
|
{
|
|
rc.bottom=cyBody;
|
|
rc.right=cxBody;
|
|
|
|
// give the subclass a chance to override the size of the
|
|
// docobj
|
|
GetDocObjSize(&rc);
|
|
#ifndef WIN16 //Trident RECTL
|
|
m_pDocView->SetRect(&rc);
|
|
#else
|
|
RECTL rc2 = { rc.left, rc.top, rc.right, rc.bottom };
|
|
m_pDocView->SetRect((LPRECT)&rc2);
|
|
#endif
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: QueryService
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject)
|
|
{
|
|
TraceCall("CDocHost::QueryService");
|
|
|
|
//DebugPrintInterface((REFIID)riid, "CDocHost::QueryService");
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
|
|
// *** IOleControlSite ***
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnControlInfoChanged
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnControlInfoChanged()
|
|
{
|
|
TraceCall("CDocHost::OnControlInfoChanged");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: LockInPlaceActive
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::LockInPlaceActive(BOOL fLock)
|
|
{
|
|
TraceCall("CDocHost::LockInPlaceActive");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: GetExtendedControl
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::GetExtendedControl(LPDISPATCH *ppDisp)
|
|
{
|
|
TraceCall("CDocHost::GetExtendedControl");
|
|
|
|
if (ppDisp)
|
|
*ppDisp=NULL;
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: TransformCoords
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::TransformCoords(POINTL *pPtlHimetric, POINTF *pPtfContainer,DWORD dwFlags)
|
|
{
|
|
TraceCall("CDocHost::TransformCoords");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: TranslateAccelerator
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// this is a little trippy, so bear with me. When we get a tab, and trident is UIActive we always pass it off to them
|
|
// if it tabs off the end of its internal tab order (a list of urls for instance) then we get hit with a VK_TAB in our
|
|
// IOleControlSite::TranslateAccel. If so then we set m_fCycleFocus to TRUE and return S_OK to indicate we took the tab
|
|
// tridents IOIPAO::TranslateAccel returns S_OK to indicate it snagged the TAB, we then detect if we set cyclefocus to true
|
|
// there and if so, we return S_FALSE from CBody::HrTranslateAccel to indicate to the browser that we didn't take it and it
|
|
// move the focus on
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers)
|
|
{
|
|
TraceCall("CDocHost::TranslateAccelerator");
|
|
if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_TAB)
|
|
{
|
|
m_fCycleFocus=TRUE;
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnFocus
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnFocus(BOOL fGotFocus)
|
|
{
|
|
TraceCall("CDocHost::OnFocus");
|
|
|
|
m_fFocus = fGotFocus;
|
|
|
|
// the docobj has focus now, be sure to send a notification
|
|
// to the parent of the dochost so that in the case of the
|
|
// mailview, it can call OnViewActivate
|
|
#if 0
|
|
// BUGBUG needed here??
|
|
NMHDR nmhdr;
|
|
|
|
nmhdr.hwndFrom = m_hwnd;
|
|
nmhdr.idFrom = GetDlgCtrlID(m_hwnd);
|
|
nmhdr.code = m_fFocus ? NM_SETFOCUS : NM_KILLFOCUS;
|
|
SendMessage(GetParent(m_hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
|
|
#endif
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ShowPropertyFrame
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::ShowPropertyFrame(void)
|
|
{
|
|
TraceCall("CDocHost::ShowPropertyFrame");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: OnUpdateCommands
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//---------------------------------------------------------------
|
|
HRESULT CDocHost::OnUpdateCommands()
|
|
{
|
|
TraceCall("CDocHost::OnUpdateCommands");
|
|
return S_OK;
|
|
}
|
|
|
|
|