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.
 
 
 
 
 
 

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;
}