// wvcoord.cpp : Implementation of CWebViewCoord #include "priv.h" #include "wvcoord.h" const CLSID CLSID_WebViewOld = {0x7a707490,0x260a,0x11d1,{0x83,0xdf,0x00,0xa0,0xc9,0x0d,0xc8,0x49}}; // retired from service, so made private ///////////////////////////////////////////////////////////////////////////// // CWebViewCoord ///////////////////////////////////////////////////////////////////////////// CWebViewCoord::CWebViewCoord() { m_pFileListWrapper = NULL; m_pThumbNailWrapper = NULL; m_pdispWindow = NULL; m_dwFileListAdviseCookie = 0; m_dwThumbNailAdviseCookie = 0; m_dwHtmlWindowAdviseCookie = 0; m_dwCSCHotTrackCookie = 0; } CWebViewCoord::~CWebViewCoord() { ReleaseFolderObjects(); } STDMETHODIMP CWebViewCoord::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HRESULT hr = S_OK; switch (dispidMember) { case DISPID_HTMLWINDOWEVENTS_ONLOAD: hr = OnWindowLoad(); break; case DISPID_HTMLWINDOWEVENTS_ONUNLOAD: hr = OnWindowUnLoad(); break; case DISPID_HTMLWINDOWEVENTS_ONRESIZE: hr = OnFixSize(); break; case DISPID_EVMETH_ONMOUSEOVER: hr = OnCSCMouseOver(); break; case DISPID_EVMETH_ONMOUSEOUT: hr = OnCSCMouseOut(); break; case DISPID_EVMETH_ONKEYPRESS: case DISPID_EVMETH_ONCLICK: hr = OnCSCClick(); break; default: hr = IDispatchImpl:: Invoke(dispidMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); break; } return hr; } STDMETHODIMP CWebViewCoord::OnCSCClick() { HRESULT hres = S_OK; if (m_pFileListWrapper) { hres = m_pFileListWrapper->OnCSCClick(); } return hres; } STDMETHODIMP CWebViewCoord::OnCSCMouseOver() { HRESULT hres = S_OK; if (m_pFileListWrapper) { hres = m_pFileListWrapper->OnCSCMouseOnOff(TRUE); } return hres; } STDMETHODIMP CWebViewCoord::OnCSCMouseOut() { HRESULT hres = S_OK; if (m_pFileListWrapper) { hres = m_pFileListWrapper->OnCSCMouseOnOff(FALSE); } return hres; } STDMETHODIMP CWebViewCoord::CSCSynchronize() { HRESULT hres = S_OK; if (m_pFileListWrapper) { hres = m_pFileListWrapper->CSCSynchronize(); } return hres; } STDMETHODIMP CWebViewCoord::SetSite(IUnknown *punkSite) { HRESULT hr; if (punkSite == NULL && m_pdispWindow) { DisconnectHtmlEvents(m_pdispWindow, m_dwHtmlWindowAdviseCookie); m_dwHtmlWindowAdviseCookie = 0; } hr = IObjectWithSiteImpl::SetSite(punkSite); m_spClientSite = NULL; // Release client site pointer ReleaseFolderObjects(); if (punkSite != NULL && SUCCEEDED(hr)) { hr = punkSite->QueryInterface(IID_IOleClientSite, (void **)&m_spClientSite); if (SUCCEEDED(hr)) { hr = ConnectHtmlEvents(this, m_spClientSite, &m_pdispWindow, &m_dwHtmlWindowAdviseCookie); } } return hr; } HRESULT CWebViewCoord::InitFolderObjects() { HRESULT hr; CComPtr spContainer; CComPtr spdispItem; CComVariant vEmpty; CComPtr spThumbNail; CComPtr spElement; CComPtr spInfo; CComPtr spLinks; CComPtr spMediaPlayerSpan; CComPtr spFileList; CComPtr spCSCPlusMin; CComPtr spCSCText; CComPtr spCSCDetail; CComPtr spCSCButton; CComPtr spCSCStyle; CComPtr spCSCDetailStyle; CComPtr spCSCButtonStyle; CComPtr spWindow; // Get some document level objects IfFailRet(m_spClientSite->GetContainer(&spContainer)); IfFailRet(spContainer->QueryInterface(IID_IHTMLDocument2, (void **)&m_spDocument)); IfFailRet(IUnknown_QueryService(m_spClientSite, SID_SHTMLWindow, IID_IHTMLWindow2, (LPVOID*)&spWindow)); IfFailRet(m_spDocument->get_all(&m_spDocAll)); hr = m_spDocument->get_body(&spElement); if (SUCCEEDED(hr)) { spElement->QueryInterface(IID_IHTMLControlElement, (void **)&m_spDocBody); } // // Init Info // if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("Info")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spInfo); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("Links")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spLinks); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("MediaPlayerSpan")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spMediaPlayerSpan); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("panel")), vEmpty, &spdispItem)) && spdispItem) { FindObjectStyle(spdispItem, m_spPanelStyle); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSC")), vEmpty, &spdispItem)) && spdispItem) { FindObjectStyle(spdispItem, spCSCStyle); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCHotTrack")), vEmpty, &spdispItem)) && spdispItem) { // // Set up sink for CSC UI notifications to implement hot tracking and expand/collapse // AtlAdvise(spdispItem, GetUnknown(), IID_IDispatch, &m_dwCSCHotTrackCookie); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCPlusMin")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spCSCPlusMin); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCText")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spCSCText); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCDetail")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spCSCDetail); FindObjectStyle(spdispItem, spCSCDetailStyle); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCButton")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&spCSCButton); FindObjectStyle(spdispItem, spCSCButtonStyle); spdispItem = NULL; } // // Init the thumbnail wrapper object // if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("ThumbNail")), vEmpty, &spdispItem)) && spdispItem) { if (SUCCEEDED(spdispItem->QueryInterface(IID_IThumbCtl, (void **)&spThumbNail))) { m_pThumbNailWrapper = new CThumbNailWrapper; if (m_pThumbNailWrapper == NULL) { return E_OUTOFMEMORY; } CComPtr spdispItem2; CComPtr spThumbnailLabel; if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("ThumbnailLabel")), vEmpty, &spdispItem2)) && spdispItem2) { spdispItem2->QueryInterface(IID_IHTMLElement, (void **)&spThumbnailLabel); spdispItem2 = NULL; } m_pThumbNailWrapper->Init(spThumbNail, spThumbnailLabel); AtlAdvise(spdispItem, m_pThumbNailWrapper, IID_IDispatch, &m_dwThumbNailAdviseCookie); } spdispItem = NULL; } // // Init the file list object // if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("Filelist")), vEmpty, &spdispItem)) && spdispItem) { if (SUCCEEDED(spdispItem->QueryInterface(IID_IShellFolderViewDual, (void **)&spFileList))) { m_pFileListWrapper = new CFileListWrapper; if (m_pFileListWrapper == NULL) { AtlUnadvise(spdispItem, IID_IDispatch, m_dwThumbNailAdviseCookie); m_dwThumbNailAdviseCookie = 0; delete m_pThumbNailWrapper; return E_OUTOFMEMORY; } m_pFileListWrapper->Init(spFileList, spInfo, spLinks, m_spPanelStyle, spMediaPlayerSpan, spCSCPlusMin, spCSCText, spCSCDetail, spCSCButton, spCSCStyle, spCSCDetailStyle, spCSCButtonStyle, m_spDocument, spWindow, m_pThumbNailWrapper); AtlAdvise(spdispItem, m_pFileListWrapper, IID_IDispatch, &m_dwFileListAdviseCookie); } spdispItem = NULL; } // // Init onsize properties // if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("Banner")), vEmpty, &spdispItem)) && spdispItem) { spdispItem->QueryInterface(IID_IHTMLElement, (void **)&m_spHeading); FindObjectStyle(spdispItem, m_spHeadingStyle); spdispItem = NULL; } m_bRTLDocument = IsRTLDocument(m_spDocument); if (!m_bRTLDocument && m_spPanelStyle) { m_spPanelStyle->put_overflow(OLESTR("auto")); } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("FileList")), vEmpty, &spdispItem)) && spdispItem) { FindObjectStyle(spdispItem, m_spFileListStyle); spdispItem = NULL; } if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("rule")), vEmpty, &spdispItem)) && spdispItem) { FindObjectStyle(spdispItem, m_spRuleStyle); spdispItem = NULL; } return S_OK; } HRESULT CWebViewCoord::ReleaseFolderObjects() { CComPtr spdisp; // // Do the unadvise // if (m_dwCSCHotTrackCookie) { CComVariant vEmpty; if (SUCCEEDED(m_spDocAll->item(CComVariant(OLESTR("CSCHotTrack")), vEmpty, &spdisp)) && spdisp) { AtlUnadvise(spdisp, IID_IDispatch, m_dwCSCHotTrackCookie); m_dwCSCHotTrackCookie = 0; spdisp = NULL; } } if (m_dwFileListAdviseCookie != 0) { spdisp = m_pFileListWrapper->Control(); if (spdisp != NULL) { AtlUnadvise(spdisp, IID_IDispatch, m_dwFileListAdviseCookie); m_dwFileListAdviseCookie = 0; spdisp = NULL; } } if (m_dwThumbNailAdviseCookie != 0) { spdisp = (IThumbCtl *)(m_pThumbNailWrapper->Control()); if (spdisp != NULL) { AtlUnadvise(spdisp, IID_IDispatch, m_dwThumbNailAdviseCookie); m_dwThumbNailAdviseCookie = 0; spdisp = NULL; } } // // Free the file list wrapper // if (m_pFileListWrapper != NULL) { // Need to unadvise from WV links before releasing m_pFileListWrapper->AdviseWebviewLinks( FALSE ); m_pFileListWrapper->Release(); m_pFileListWrapper = NULL; } if (m_pThumbNailWrapper != NULL) { m_pThumbNailWrapper->Release(); m_pThumbNailWrapper = NULL; } // // Free any references we may have // m_spDocAll = NULL; m_spDocBody = NULL; m_spDocument = NULL; m_spFileListStyle = NULL; m_spHeading = NULL; m_spHeadingStyle = NULL; m_spPanelStyle = NULL; m_spRuleStyle = NULL; return S_OK; } HRESULT CWebViewCoord::OnWindowLoad() { HRESULT hr; ReleaseFolderObjects(); InitFolderObjects(); hr = OnFixSize(); return hr; } HRESULT CWebViewCoord::OnWindowUnLoad() { return ReleaseFolderObjects(); } HRESULT CWebViewCoord::OnFixSize() { HRESULT hr = S_OK; LONG lClientWidth; if (m_spFileListStyle && m_spDocBody && SUCCEEDED(m_spDocBody->get_clientWidth(&lClientWidth))) { LONG lPanelWidth; if (!m_spPanelStyle || FAILED(m_spPanelStyle->get_pixelWidth(&lPanelWidth))) { lPanelWidth = 0; } CComBSTR bstrPanelVisibility; LONG lFileListLeft, lFileListWidth = -1; if (lClientWidth < (lPanelWidth * 2)) { bstrPanelVisibility = OLESTR("hidden"); lFileListLeft = 0; } else { bstrPanelVisibility = OLESTR("visible"); if (m_bRTLDocument) { lFileListLeft = 0; lFileListWidth = lClientWidth - lPanelWidth; if (m_spPanelStyle) { m_spPanelStyle->put_pixelLeft(lClientWidth - lPanelWidth); } } else { lFileListLeft = lPanelWidth; } } if (m_spPanelStyle) { m_spPanelStyle->put_visibility(bstrPanelVisibility); } m_spFileListStyle->put_pixelLeft(lFileListLeft); m_spFileListStyle->put_pixelWidth((lFileListWidth == -1) ? (lClientWidth - lFileListLeft) : lFileListWidth); } return hr; }