// // favband.cpp // // favorites band implementation // #include "priv.h" #include "sccls.h" #include "nscband.h" #include "resource.h" #include "favorite.h" #include "uemapp.h" // KMTF: Included for instrumentation #include #define SUPERCLASS CNSCBand #define TF_FAVBAND 0 class CFavBand : public CNSCBand { public: // *** IOleCommandTarget methods *** virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); // *** IDockingWindow methods *** virtual STDMETHODIMP ShowDW(BOOL fShow); protected: virtual void _AddButtons(BOOL fAdd); HRESULT _BrowserExec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); void _OrganizeFavorites(); virtual BOOL _ShouldNavigateToPidl(LPCITEMIDLIST pidl, ULONG ulAttrib); virtual HRESULT _NavigateRightPane(IShellBrowser *psb, LPCITEMIDLIST pidl); virtual HRESULT _TranslatePidl(LPCITEMIDLIST pidl, LPITEMIDLIST *ppidlTarget, ULONG *pulAttrib); friend HRESULT CFavBand_CreateInstance(IUnknown *punkOuter, IUnknown **ppunk, LPCOBJECTINFO poi); BOOL _fStrsAdded; LONG_PTR _lStrOffset; }; HRESULT CFavBand::_BrowserExec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) { return IUnknown_QueryServiceExec(_punkSite, SID_STopLevelBrowser, pguidCmdGroup, nCmdID, nCmdexecopt, pvarargIn, pvarargOut); } void CFavBand::_OrganizeFavorites() { DoOrganizeFavDlgW(_hwnd, NULL); } // *** IOleCommandTarget methods *** HRESULT CFavBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) { if (pguidCmdGroup && IsEqualGUID(CLSID_FavBand, *pguidCmdGroup)) { TraceMsg(TF_FAVBAND, "CFavBand::Exec CLSID_FavBand -- nCmdID == %x", nCmdID); switch(nCmdID) { case FCIDM_ADDTOFAVORITES: { _BrowserExec(&CGID_Explorer, SBCMDID_ADDTOFAVORITES, OLECMDEXECOPT_PROMPTUSER, NULL, NULL); // Instrument addition to favorites by pane UEMFireEvent(&UEMIID_BROWSER, UEME_INSTRBROWSER, UEMF_INSTRUMENT, UIBW_ADDTOFAV, UIBL_PANE); return S_OK; } case FCIDM_ORGANIZEFAVORITES: { _OrganizeFavorites(); return S_OK; } } } return SUPERCLASS::Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvarargIn, pvarargOut); } static const TBBUTTON c_tbFavorites[] = { { 0, FCIDM_ADDTOFAVORITES, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_SHOWTEXT, {0,0}, 0, 0 }, { 1, FCIDM_ORGANIZEFAVORITES, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_SHOWTEXT, {0,0}, 0, 1 }, }; void CFavBand::_AddButtons(BOOL fAdd) { IExplorerToolbar* piet; if (SUCCEEDED(_punkSite->QueryInterface(IID_IExplorerToolbar, (void**)&piet))) { if (fAdd) { piet->SetCommandTarget((IUnknown*)SAFECAST(this, IOleCommandTarget*), &CLSID_FavBand, 0); if (!_fStrsAdded) { piet->AddString(&CLSID_FavBand, MLGetHinst(), IDS_FAVS_BAR_LABELS, &_lStrOffset); _fStrsAdded = TRUE; } _EnsureImageListsLoaded(); piet->SetImageList(&CLSID_FavBand, _himlNormal, _himlHot, NULL); TBBUTTON tbFavorites[ARRAYSIZE(c_tbFavorites)]; memcpy(tbFavorites, c_tbFavorites, SIZEOF(TBBUTTON) * ARRAYSIZE(c_tbFavorites)); for (int i = 0; i < ARRAYSIZE(c_tbFavorites); i++) tbFavorites[i].iString += (long) _lStrOffset; piet->AddButtons(&CLSID_FavBand, ARRAYSIZE(tbFavorites), tbFavorites); } else piet->SetCommandTarget(NULL, NULL, 0); piet->Release(); } } // *** IDockingWindow methods *** HRESULT CFavBand::ShowDW(BOOL fShow) { HRESULT hres = SUPERCLASS::ShowDW(fShow); _AddButtons(fShow); return hres; } HRESULT CFavBand_CreateInstance(IUnknown *punkOuter, IUnknown **ppunk, LPCOBJECTINFO poi) { // aggregation checking is handled in class factory CFavBand * pfb = new CFavBand(); if (!pfb) return E_OUTOFMEMORY; if (SUCCEEDED(pfb->_Init((LPCITEMIDLIST)CSIDL_FAVORITES))) { pfb->_pns = CNscTree_CreateInstance(); if (pfb->_pns) { ASSERT(poi); pfb->_poi = poi; // if you change this cast, fix up CChannelBand_CreateInstance *ppunk = SAFECAST(pfb, IDeskBand *); IUnknown_SetSite(pfb->_pns, *ppunk); pfb->_SetNscMode(MODE_FAVORITES); return S_OK; } } pfb->Release(); return E_FAIL; } HRESULT CFavBand::_TranslatePidl(LPCITEMIDLIST pidl, LPITEMIDLIST *ppidlTarget, ULONG *pulAttrib) { HRESULT hr = E_INVALIDARG; if (pidl && ppidlTarget && pulAttrib) { hr = IEGetAttributesOf(pidl, pulAttrib); if (SUCCEEDED(hr)) { hr = SHILClone(pidl, ppidlTarget); } } return hr; } BOOL CFavBand::_ShouldNavigateToPidl(LPCITEMIDLIST pidl, ULONG ulAttrib) { return !(ulAttrib & SFGAO_FOLDER); } HRESULT CFavBand::_NavigateRightPane(IShellBrowser *psb, LPCITEMIDLIST pidl) { HRESULT hr = E_INVALIDARG; if (psb && pidl) { TCHAR szPath[MAX_PATH]; hr = SHGetNameAndFlags(pidl, SHGDN_FORPARSING, szPath, ARRAYSIZE(szPath), NULL); if (SUCCEEDED(hr)) { hr = NavFrameWithFile(szPath, psb); if (FAILED(hr)) { IShellFolder *psf; LPCITEMIDLIST pidlLast; if (SUCCEEDED(SHBindToIDListParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast))) { LPITEMIDLIST pidlTarget; if (SUCCEEDED(SHGetNavigateTarget(psf, pidlLast, &pidlTarget, NULL))) { hr = psb->BrowseObject(pidlTarget, SBSP_SAMEBROWSER); ILFree(pidlTarget); } psf->Release(); } } if (SUCCEEDED(hr)) { UEMFireEvent(&UEMIID_BROWSER, UEME_INSTRBROWSER, UEMF_INSTRUMENT, UIBW_NAVIGATE, UIBL_NAVFAVS); UEMFireEvent(&UEMIID_BROWSER, UEME_RUNPIDL, UEMF_XEVENT, (WPARAM)NULL, (LPARAM)pidl); SHSendChangeMenuNotify(NULL, SHCNEE_PROMOTEDITEM, 0, pidl); } } } return hr; }