#include "precomp.h" #include "mcinc.h" #include "panel.h" #include "marswin.h" #include "axhost.h" //#include "befact.h" CMarsAxHostWindow::~CMarsAxHostWindow() { } STDMETHODIMP CMarsAxHostWindow::SetSite(IUnknown* pUnkSite) { m_spMarsPanel.Release(); CMarsPanel::GetFromUnknown(pUnkSite, &m_spMarsPanel); return CAxHostWindow::SetSite(pUnkSite); } STDMETHODIMP CMarsAxHostWindow::OnUIActivate() { if (m_spMarsPanel) { m_spMarsPanel->OnUIActivate(); } return S_OK; } STDMETHODIMP CMarsAxHostWindow::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers) { HRESULT hr; if (m_spMarsPanel) { hr = m_spMarsPanel->TranslateAccelerator(lpMsg, grfModifiers); } else { hr = S_FALSE; } return hr; } LRESULT CMarsAxHostWindow::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { m_bHaveFocus = TRUE; if (!m_bReleaseAll) { if (m_spOleObject != NULL) { CComPtr spClientSite; GetControllingUnknown()->QueryInterface(IID_IOleClientSite, (void**)&spClientSite); if (spClientSite != NULL) m_spOleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos); } if(!m_bWindowless && !IsChild(::GetFocus())) ::SetFocus(::GetWindow(m_hWnd, GW_CHILD)); } bHandled = FALSE; return 0; } LRESULT CMarsAxHostWindow::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (m_spMarsPanel) { m_spMarsPanel->OnWindowPosChanging((WINDOWPOS *)lParam); } bHandled = FALSE; return 0; } LRESULT CMarsAxHostWindow::OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (m_spMarsPanel) { m_spMarsPanel->OnWindowPosChanged((WINDOWPOS *)lParam); } bHandled = FALSE; return 0; } LRESULT CMarsAxHostWindow::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if(m_spMarsPanel) { MINMAXINFO* pInfo = (MINMAXINFO*)lParam; POINT ptMin; POINT ptMax; m_spMarsPanel->GetMinMaxInfo( ptMin, ptMax ); if(ptMin.x >= 0) pInfo->ptMinTrackSize.x = ptMin.x; if(ptMin.y >= 0) pInfo->ptMinTrackSize.y = ptMin.y; if(ptMax.x >= 0) pInfo->ptMaxTrackSize.x = ptMax.x; if(ptMax.y >= 0) pInfo->ptMaxTrackSize.y = ptMax.y; } return 0; } STDMETHODIMP CMarsAxHostWindow::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr) { HRESULT hr = CAxHostWindow::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); if (FAILED(hr)) { if ((DISPID_AMBIENT_USERAGENT == dispidMember) && (DISPATCH_PROPERTYGET == wFlags) && (NULL != pvarResult)) { // BUGBUG: Once "real" C++ panel interface is defined, this should be // set by the host CHAR szUA[MAX_PATH]; DWORD dwSize = ARRAYSIZE(szUA); if (SUCCEEDED(ObtainUserAgentString(0, szUA, &dwSize))) { LPSTR pszAppend = szUA + dwSize - 2; // skip back to the ')' if (*pszAppend != ')') { pszAppend = StrRChrA(szUA, pszAppend, ')'); } if (pszAppend) { const CHAR c_szUserAgentAppend[] = "; PCHSHELL 2.0)"; *pszAppend = '\0'; StrCatBuffA(szUA, c_szUserAgentAppend, ARRAYSIZE(szUA)); CComBSTR bstrUA(szUA); if (bstrUA) { pvarResult->vt = VT_BSTR; pvarResult->bstrVal = bstrUA.Detach(); hr = S_OK; } } } } } return hr; } HRESULT CMarsAxHostWindow::AskHostForDocHostUIHandler( CComPtr& spHost ) { return QueryService( IID_IDocHostUIHandler, IID_IDocHostUIHandler, (void**)&spHost ); } // IOleInPlaceSite overrides STDMETHODIMP CMarsAxHostWindow::GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo) { HRESULT hr; if (ppFrame && ppDoc && lprcPosRect && lprcClipRect) { hr = S_OK; if (m_spMarsPanel) { m_spMarsPanel->QueryInterface(IID_IOleInPlaceUIWindow, (void **)ppDoc); m_spMarsPanel->Document()->MarsWindow()->QueryInterface(IID_IOleInPlaceFrame, (void **)ppFrame); GetClientRect(lprcPosRect); GetClientRect(lprcClipRect); pFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO); pFrameInfo->fMDIApp = m_bMDIApp; pFrameInfo->hwndFrame = GetParent(); m_spMarsPanel->Document()->MarsWindow()->GetAccelerators(&pFrameInfo->haccel, &pFrameInfo->cAccelEntries); hr = S_OK; } else { hr = E_UNEXPECTED; } } else { hr = E_POINTER; } return hr; } STDMETHODIMP CMarsAxHostWindow::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext) { // We let IE enable SBCMDID_ADDTOFAVORITES for us along with the other context menus return OLECMDERR_E_NOTSUPPORTED; } HRESULT CMarsAxHostWindow::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvarargIn, VARIANT *pvarargOut) { // HACK: Shdocvw sometimes tests specifically for a value like // OLECMDERR_E_NOTSUPPORTED and will not perform an essential action // if we return something more generic like E_FAIL HRESULT hr = OLECMDERR_E_NOTSUPPORTED; if (pguidCmdGroup != NULL) { if (*pguidCmdGroup == CGID_DocHostCommandHandler) { // Trident calls us with this command group as an extension // to IDocHostUIHandler if (m_spMarsPanel) { hr = m_spMarsPanel->OnDocHostUIExec(pguidCmdGroup, nCmdID, nCmdexecopt, pvarargIn, pvarargOut); } } } return hr; } HRESULT GetDoc2FromAxWindow(CMarsAxWindow *pAxWin, IHTMLDocument2 **ppDoc2) { ATLASSERT((NULL != ppDoc2) && (NULL != pAxWin)); *ppDoc2 = NULL; pAxWin->QueryControl(IID_IHTMLDocument2, (void **)ppDoc2); if (!*ppDoc2) { CComPtr spWebBrowser2; pAxWin->QueryControl(IID_IWebBrowser2, (void **)&spWebBrowser2); if (spWebBrowser2) { CComPtr spdisp; spWebBrowser2->get_Document(&spdisp); if (spdisp) { spdisp->QueryInterface(IID_IHTMLDocument2, (void **)ppDoc2); } } } return (*ppDoc2) ? S_OK : E_NOINTERFACE; } HRESULT GetWin2FromDoc2(IHTMLDocument2 *pDoc2, IHTMLWindow2 **ppWin2) { ATLASSERT(NULL != ppWin2); *ppWin2 = NULL; if (pDoc2) { pDoc2->get_parentWindow(ppWin2); } return (NULL != *ppWin2) ? S_OK : E_FAIL; } HRESULT GetWin2FromAxWindow(CMarsAxWindow *pAxWin, IHTMLWindow2 **ppWin2) { CComPtr spDoc2; GetDoc2FromAxWindow(pAxWin, &spDoc2); return GetWin2FromDoc2(spDoc2, ppWin2); } HRESULT GetControlWindow(CMarsAxWindow *pAxWin, HWND *phwnd) { CComPtr spOleWindow; if (SUCCEEDED(pAxWin->QueryControl(&spOleWindow)) && SUCCEEDED(spOleWindow->GetWindow(phwnd))) { ATLASSERT((*phwnd != (HWND)-1) && (*phwnd != NULL)); return S_OK; } return E_FAIL; }