#ifndef _NSC_C #define _NSC_C #include "droptgt.h" #include "iface.h" #include "dpastuff.h" #include "cwndproc.h" #include "resource.h" #include "inetnot.h" #include "cowsite.h" #include #include // LPCOBJECTINFO #define ID_CONTROL 100 #define ID_HEADER 101 typedef enum { NSIF_HITEM = 0x0001, NSIF_FOLDER = 0x0002, NSIF_PARENTFOLDER = 0x0004, NSIF_IDLIST = 0x0008, NSIF_FULLIDLIST = 0x0010, NSIF_ATTRIBUTES = 0x0020 } NSI_FLAGS; typedef enum { NSSR_ENUMBELOWROOT = 0x0001, NSSR_CREATEPIDL = 0x0002 } NSSR_FLAGS; typedef struct { PORDERITEM poi; DWORD dwSig; // Signature of the item, so we can find it back after async processing BITBOOL fPinned:1; // is this url pinned in the cache? BITBOOL fGreyed:1; // draw the item greyed (if offline & not in cache) BITBOOL fFetched:1; // have we fetched the pinned/greyed state? BITBOOL fDontRefetch:1; // can't be cached by wininet BOOL fNavigable:1; // item can be navigated to } ITEMINFO; typedef struct { const SHCOLUMNID *pscid; int iFldrCol; // index for this column in GetDetailsOf TCHAR szName[MAX_COLUMN_NAME_LEN]; DWORD fmt; int cxChar; } HEADERINFO; // Forward decls struct NSC_BKGDENUMDONEDATA; // _FrameTrack flags #define TRACKHOT 0x0001 #define TRACKEXPAND 0x0002 #define TRACKNOCHILD 0x0004 // _DrawItem flags #define DIICON 0x0001 #define DIRTLREADING 0x0002 #define DIHOT 0x0004 #define DIFIRST 0x0020 #define DISUBITEM 0x0040 #define DILAST 0x0080 #define DISUBLAST (DISUBITEM | DILAST) #define DIACTIVEBORDER 0x0100 #define DISUBFIRST (DISUBITEM | DIFIRST) #define DIPINNED 0x0400 // overlay pinned glyph #define DIGREYED 0x0800 // draw greyed #define DIFOLDEROPEN 0x1000 #define DIFOLDER 0x2000 //item is a folder #define DIFOCUSRECT 0x4000 #define DIRIGHT 0x8000 //right aligned #define NSC_TVIS_MARKED 0x1000 // async icon/url extract flags #define NSCICON_GREYED 0x0001 #define NSCICON_PINNED 0x0002 #define NSCICON_DONTREFETCH 0x0004 #define WM_NSCUPDATEICONINFO WM_USER + 0x700 #define WM_NSCBACKGROUNDENUMDONE WM_USER + 0x701 #define WM_NSCUPDATEICONOVERLAY WM_USER + 0x702 HRESULT GetNavTargetName(IShellFolder* pFolder, LPCITEMIDLIST pidl, LPTSTR pszUrl, UINT cMaxChars); BOOL MayBeUnavailableOffline(LPTSTR pszUrl); INSCTree2 * CNscTree_CreateInstance(void); STDAPI CNscTree_CreateInstance(IUnknown * punkOuter, IUnknown ** ppunk, LPCOBJECTINFO poi); BOOL IsExpandableChannelFolder(IShellFolder *psf, LPCITEMIDLIST pidl); // class wrapper for tree control component of nscband. class ATL_NO_VTABLE CNscTree : public CComObjectRootEx, public CComCoClass, public CComControl, public IDispatchImpl, public IProvideClassInfo2Impl<&CLSID_ShellNameSpace, &DIID_DShellNameSpaceEvents, &LIBID_SHDocVw, 1, 0, CComTypeInfoHolder>, public IPersistStreamInitImpl, public IPersistPropertyBagImpl, public IQuickActivateImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public ISpecifyPropertyPagesImpl, public IConnectionPointImpl, public IConnectionPointContainerImpl, public IShellChangeNotify, public CDelegateDropTarget, public CNotifySubclassWndProc, public CObjectWithSite, public INSCTree2, public IWinEventHandler, public IShellBrowser, public IFolderFilterSite { public: DECLARE_WND_CLASS(TEXT("NamespaceOC Window")) DECLARE_NO_REGISTRY(); BEGIN_COM_MAP(CNscTree) COM_INTERFACE_ENTRY(IShellNameSpace) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_IMPL(IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY_IMPL(IOleControl) COM_INTERFACE_ENTRY_IMPL(IOleObject) COM_INTERFACE_ENTRY_IMPL(IQuickActivate) COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit) COM_INTERFACE_ENTRY_IMPL(ISpecifyPropertyPages) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag) COM_INTERFACE_ENTRY(IShellChangeNotify) // IID_IShellChangeNotify COM_INTERFACE_ENTRY(INSCTree) // IID_INSCTree COM_INTERFACE_ENTRY(INSCTree2) // IID_INSCTree2 COM_INTERFACE_ENTRY(IShellFavoritesNameSpace) // IID_IShellFavoritesNameSpace COM_INTERFACE_ENTRY(IShellNameSpace) // IID_IShellNameSpace COM_INTERFACE_ENTRY(IWinEventHandler) // IID_IWinEventHandler COM_INTERFACE_ENTRY(IDropTarget) // IID_IDropTarget COM_INTERFACE_ENTRY(IObjectWithSite) // IID_IObjectWithSite COM_INTERFACE_ENTRY(IShellBrowser) // IID_IShellBrowser COM_INTERFACE_ENTRY(IFolderFilterSite) // IID_IFolderFilterSite END_COM_MAP() BEGIN_PROPERTY_MAP(CNscTree) PROP_ENTRY("Root", DISPID_ROOT, CLSID_NULL) PROP_ENTRY("EnumOptions", DISPID_ENUMOPTIONS, CLSID_NULL) PROP_ENTRY("Flags", DISPID_FLAGS, CLSID_NULL) PROP_ENTRY("Depth", DISPID_DEPTH, CLSID_NULL) PROP_ENTRY("Mode", DISPID_MODE, CLSID_NULL) PROP_ENTRY("TVFlags", DISPID_TVFLAGS, CLSID_NULL) PROP_ENTRY("Columns", DISPID_NSCOLUMNS, CLSID_NULL) END_PROPERTY_MAP() BEGIN_MSG_MAP(CNscTree) MESSAGE_HANDLER(WM_NOTIFY, OnNotify) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus) MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) MESSAGE_HANDLER(CWM_GETISHELLBROWSER, OnGetIShellBrowser) END_MSG_MAP() BEGIN_CONNECTION_POINT_MAP(CNscTree) CONNECTION_POINT_ENTRY(DIID_DShellNameSpaceEvents) END_CONNECTION_POINT_MAP() // IObjectWithSite STDMETHODIMP SetSite(IUnknown *punkSite); // INSCTree STDMETHODIMP CreateTree(HWND hwndParent, DWORD dwStyles, HWND *phwnd); // create window of tree view. STDMETHODIMP Initialize(LPCITEMIDLIST pidlRoot, DWORD grfFlags, DWORD dwFlags); // init the treeview control with data. STDMETHODIMP ShowWindow(BOOL fShow); STDMETHODIMP Refresh(void); STDMETHODIMP GetSelectedItem(LPITEMIDLIST * ppidl, int nItem); STDMETHODIMP SetSelectedItem(LPCITEMIDLIST pidl, BOOL fCreate, BOOL fReinsert, int nItem); STDMETHODIMP GetNscMode(UINT * pnMode) { *pnMode = _mode; return S_OK;}; STDMETHODIMP SetNscMode(UINT nMode) { _mode = nMode; return S_OK;}; STDMETHODIMP GetSelectedItemName(LPWSTR pszName, DWORD cchName); STDMETHODIMP BindToSelectedItemParent(REFIID riid, void **ppv, LPITEMIDLIST *ppidl); STDMETHODIMP_(BOOL) InLabelEdit(void) {return _fInLabelEdit;}; // INSCTree2 STDMETHODIMP RightPaneNavigationStarted(LPITEMIDLIST pidl); STDMETHODIMP RightPaneNavigationFinished(LPITEMIDLIST pidl); STDMETHODIMP CreateTree2(HWND hwndParent, DWORD dwStyle, DWORD dwExStyle, HWND *phwnd); // create window of tree view. // IShellBrowser (Hack) STDMETHODIMP InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) {return E_NOTIMPL;}; STDMETHODIMP SetMenuSB(HMENU hmenuShared, HOLEMENU holemenu, HWND hwnd) {return E_NOTIMPL;}; STDMETHODIMP RemoveMenusSB(HMENU hmenuShared) {return E_NOTIMPL;}; STDMETHODIMP SetStatusTextSB(LPCOLESTR lpszStatusText) {return E_NOTIMPL;}; STDMETHODIMP EnableModelessSB(BOOL fEnable) {return E_NOTIMPL;}; STDMETHODIMP TranslateAcceleratorSB(LPMSG lpmsg, WORD wID) {return E_NOTIMPL;}; STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) {return E_NOTIMPL;}; STDMETHODIMP GetViewStateStream(DWORD grfMode, LPSTREAM *ppStrm) {return E_NOTIMPL; }; STDMETHODIMP GetControlWindow(UINT id, HWND * lphwnd) {return E_NOTIMPL;}; STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) {return E_NOTIMPL;}; STDMETHODIMP QueryActiveShellView(struct IShellView ** ppshv) {return E_NOTIMPL;}; STDMETHODIMP OnViewWindowActive(struct IShellView * ppshv) {return E_NOTIMPL;}; STDMETHODIMP SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) {return E_NOTIMPL;}; //STDMETHODIMP GetWindow(HWND * lphwnd) {return E_NOTIMPL;}; //already defined in IOleWindow STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) {return E_NOTIMPL;}; // IWinEventHandler STDMETHODIMP OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT *plres); STDMETHODIMP IsWindowOwner(HWND hwnd) {return E_NOTIMPL;}; // IShellChangeNotify STDMETHODIMP OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); // IShellNameSpace STDMETHODIMP get_SubscriptionsEnabled(VARIANT_BOOL *pVal); STDMETHODIMP Import() {return DoImportOrExport(TRUE);}; STDMETHODIMP Export() {return DoImportOrExport(FALSE);}; STDMETHODIMP Synchronize(); STDMETHODIMP NewFolder(); STDMETHODIMP ResetSort(); STDMETHODIMP MoveSelectionDown() {MoveItemUpOrDown(FALSE); return S_OK;}; STDMETHODIMP MoveSelectionUp() {MoveItemUpOrDown(TRUE); return S_OK;}; STDMETHODIMP InvokeContextMenuCommand(BSTR strCommand); STDMETHODIMP MoveSelectionTo(); STDMETHODIMP CreateSubscriptionForSelection(/*[out, retval]*/ VARIANT_BOOL *pBool); STDMETHODIMP DeleteSubscriptionForSelection(/*[out, retval]*/ VARIANT_BOOL *pBool); STDMETHODIMP get_EnumOptions(LONG *pVal); STDMETHODIMP put_EnumOptions(LONG lVal); STDMETHODIMP get_SelectedItem(IDispatch **ppItem); STDMETHODIMP put_SelectedItem(IDispatch *pItem); STDMETHODIMP get_Root(VARIANT *pvar); STDMETHODIMP put_Root(VARIANT pItem); STDMETHODIMP SetRoot(BSTR bstrRoot); STDMETHODIMP put_Depth(int iDepth){ return S_OK;}; STDMETHODIMP get_Depth(int *piDepth){ *piDepth = 1; return S_OK;}; STDMETHODIMP put_Mode(UINT uMode); STDMETHODIMP get_Mode(UINT *puMode) { *puMode = _mode; return S_OK;}; STDMETHODIMP put_Flags(DWORD dwFlags); STDMETHODIMP get_Flags(DWORD *pdwFlags) { *pdwFlags = _dwFlags; return S_OK;}; STDMETHODIMP put_TVFlags(DWORD dwFlags) { _dwTVFlags = dwFlags; return S_OK;}; STDMETHODIMP get_TVFlags(DWORD *dwFlags) { *dwFlags = _dwTVFlags; return S_OK;}; STDMETHODIMP put_Columns(BSTR bstrColumns); STDMETHODIMP get_Columns(BSTR *bstrColumns); STDMETHODIMP get_CountViewTypes(int *piTypes); STDMETHODIMP SetViewType(int iType); STDMETHODIMP SelectedItems(IDispatch **ppItems); STDMETHODIMP Expand(VARIANT var, int iDepth); //STDMETHODIMP get_ReadyState(READYSTATE *plReady); STDMETHODIMP UnselectAll(); // IViewObjectEx STDMETHOD(GetViewStatus)(DWORD* pdwStatus) { ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n")); *pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE; return S_OK; } // IOleInPlaceObject STDMETHODIMP SetObjectRects(LPCRECT prcPos, LPCRECT prcClip); // IOleInPlaceActiveObjectImpl STDMETHODIMP TranslateAccelerator(MSG *pMsg); // IOleWindow STDMETHODIMP GetWindow(HWND *phwnd); // IOleObject STDMETHODIMP SetClientSite(IOleClientSite *pClientSite); // CDelegateDropTarget virtual HRESULT GetWindowsDDT(HWND * phwndLock, HWND * phwndScroll); virtual HRESULT HitTestDDT(UINT nEvent, LPPOINT ppt, DWORD_PTR * pdwId, DWORD * pdwDropEffect); virtual HRESULT GetObjectDDT(DWORD_PTR dwId, REFIID riid, void ** ppvObj); virtual HRESULT OnDropDDT(IDropTarget *pdt, IDataObject *pdtobj, DWORD * pgrfKeyState, POINTL pt, DWORD *pdwEffect); // IFolderFilterSite STDMETHODIMP SetFilter(IUnknown* punk); CNscTree(); // override ATL default handlers HRESULT OnDraw(ATL_DRAWINFO& di); LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnGetIShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect = NULL); HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR pszWindowName = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, DWORD dwExStyle = 0, UINT nID = 0); HRESULT GetEventInfo(IShellFolder *psf, LPCITEMIDLIST pidl, UINT *pcItems, LPWSTR pszUrl, DWORD cchUrl, UINT *pcVisits, LPWSTR pszLastVisited, BOOL *pfAvailableOffline); protected: ~CNscTree(); class CSelectionContextMenu : public IContextMenu2 { friend CNscTree; protected: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj); STDMETHODIMP_(ULONG) AddRef(void) ; STDMETHODIMP_(ULONG) Release(void); // IContextMenu STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici); STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT * pwRes, LPSTR pszName, UINT cchMax) { return E_NOTIMPL; }; // IContextMenu2 STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); protected: ~CSelectionContextMenu(); IContextMenu *_pcmSelection; IContextMenu2 *_pcm2Selection; ULONG _ulRefs; public: CSelectionContextMenu() : _pcmSelection(NULL),_ulRefs(0) {} }; friend class CSelectionContextMenu; CSelectionContextMenu _scm; private: void _FireFavoritesSelectionChange(long cItems, long hItem, BSTR strName, BSTR strUrl, long cVisits, BSTR strDate, long fAvailableOffline); HRESULT _InvokeContextMenuCommand(BSTR strCommand); void _InsertMarkedChildren(HTREEITEM htiParent, LPCITEMIDLIST pidlParent, IInsertItem *pii); HRESULT _GetEnumFlags(IShellFolder *psf, LPCITEMIDLIST pidlFolder, DWORD *pgrfFlags, HWND *phwnd); HRESULT _GetEnum(IShellFolder *psf, LPCITEMIDLIST pidlFolder, IEnumIDList **ppenum); BOOL _ShouldShow(IShellFolder* psf, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlItem); HWND _CreateTreeview(); HWND _CreateHeader(); void _SubClass(LPCITEMIDLIST pidlRoot); void _UnSubClass(void); int _GetChildren(IShellFolder *psf, LPCITEMIDLIST pidl, ULONG ulAttrs); HRESULT _LoadSF(HTREEITEM htiRoot, LPCITEMIDLIST pidl, BOOL * pfOrdered); HRESULT _StartBackgroundEnum(HTREEITEM htiRoot, LPCITEMIDLIST pidl, BOOL * pfOrdered, BOOL fUpdatePidls); void _GetDefaultIconIndex(LPCITEMIDLIST pidl, ULONG ulAttrs, TVITEM *pitem, BOOL fFolder); BOOL _LabelEditIsNewValueValid(TV_DISPINFO *ptvdi); LRESULT _OnEndLabelEdit(TV_DISPINFO *ptvdi); LRESULT _OnBeginLabelEdit(TV_DISPINFO *ptvdi); LPITEMIDLIST _CacheParentShellFolder(HTREEITEM hti, LPITEMIDLIST pidl); BOOL _CacheShellFolder(HTREEITEM hti); void _CacheDetails(); void _ReleaseRootFolder(void ); void _ReleasePidls(void); void _ReleaseCachedShellFolder(void); void _TvOnHide(); void _TvOnShow(); void _ReorderChildren(HTREEITEM htiParent); void _Sort(HTREEITEM hti, IShellFolder *psf); void MoveItemUpOrDown(BOOL fUp); LPITEMIDLIST _FindHighestDeadItem(LPCITEMIDLIST pidl); void _RemoveDeadBranch(LPCITEMIDLIST pidl); HRESULT CreateNewFolder(HTREEITEM hti); BOOL MoveItemsIntoFolder(HWND hwndParent); HRESULT DoImportOrExport(BOOL fImport); HRESULT DoSubscriptionForSelection(BOOL fCreate); LRESULT _OnNotify(LPNMHDR pnm); HRESULT _OnPaletteChanged(WPARAM wPAram, LPARAM lParam); HRESULT _OnWindowCleanup(void); HRESULT _HandleWinIniChange(void); HRESULT _EnterNewFolderEditMode(LPCITEMIDLIST pidlNewFolder); HTREEITEM _AddItemToTree(HTREEITEM htiParent, LPITEMIDLIST pidl, int cChildren, int iPos, HTREEITEM htiAfter = TVI_LAST, BOOL fCheckForDups = TRUE, BOOL fMarked = FALSE); HTREEITEM _FindChild(IShellFolder *psf, HTREEITEM htiParent, LPCITEMIDLIST pidlChild); LPITEMIDLIST _GetFullIDList(HTREEITEM hti); ITEMINFO *_GetTreeItemInfo(HTREEITEM hti); PORDERITEM _GetTreeOrderItem(HTREEITEM hti); BOOL _SetRoot(LPCITEMIDLIST pidlRoot, int iExpandDepth, LPCITEMIDLIST pidlExpandTo, NSSR_FLAGS flags); DWORD _SetStyle(DWORD dwStyle); DWORD _SetExStyle(DWORD dwExStyle); void _OnGetInfoTip(NMTVGETINFOTIP *pnm); LRESULT _OnSetCursor(NMMOUSE* pnm); void _ApplyCmd(HTREEITEM hti, IContextMenu *pcm, UINT cmdId); HRESULT _QuerySelection(IContextMenu **ppcm, HTREEITEM *phti); HMENU _CreateContextMenu(IContextMenu *pcm, HTREEITEM hti); LRESULT _OnContextMenu(short x, short y); void _OnBeginDrag(NM_TREEVIEW *pnmhdr); void _OnChangeNotify(LONG lEvent, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlExtra); HRESULT _OnDeleteItem(NM_TREEVIEW *pnm); void _OnGetDisplayInfo(TV_DISPINFO *pnm); HRESULT _ChangePidlRoot(LPCITEMIDLIST pidl); BOOL _IsExpandable(HTREEITEM hti); BOOL _OnItemExpandingMsg(NM_TREEVIEW *pnm); BOOL _OnItemExpanding(HTREEITEM htiToActivate, UINT action, BOOL fExpandedOnce, BOOL fIsExpandPartial); BOOL _OnSelChange(BOOL fMark); void _OnSetSelection(); BOOL _FIsItem(IShellFolder * psf, LPCITEMIDLIST pidlTarget, HTREEITEM hti); HTREEITEM _FindFromRoot(HTREEITEM htiRoot, LPCITEMIDLIST pidl); HRESULT _OnSHNotifyRename(LPCITEMIDLIST pidl, LPCITEMIDLIST pidlNew); HRESULT _OnSHNotifyDelete(LPCITEMIDLIST pidl, int *piPosDeleted, HTREEITEM *phtiParent); void _OnSHNotifyUpdateItem(LPCITEMIDLIST pidl, LPITEMIDLIST pidlReal); HRESULT _OnSHNotifyUpdateDir(LPCITEMIDLIST pidl); HRESULT _OnSHNotifyCreate(LPCITEMIDLIST pidl, int iPosition, HTREEITEM htiParent); void _OnSHNotifyOnlineChange(HTREEITEM htiRoot, BOOL fGoingOnline); void _OnSHNotifyCacheChange(HTREEITEM htiRoot, DWORD_PTR dwChanged); HRESULT _IdlRealFromIdlSimple(IShellFolder * psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal); void _DtRevoke(); void _DtRegister(); int _TreeItemIndexInHDPA(HDPA hdpa, IShellFolder *psfParent, HTREEITEM hti, int iReverseStart); BOOL _IsItemExpanded(HTREEITEM hti); HRESULT _UpdateDir(HTREEITEM hti, BOOL bUpdatePidls); HRESULT _GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, LPSHELLDETAILS pdetails); HRESULT _ParentFromItem(LPCITEMIDLIST pidl, IShellFolder** ppsfParent, LPCITEMIDLIST *ppidlChild); HRESULT _CompareIDs(IShellFolder *psf, LPITEMIDLIST pidl1, LPITEMIDLIST pidl2); static int CALLBACK _TreeCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); static LRESULT CALLBACK s_SubClassTreeWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData); LRESULT _SubClassTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void _InitHeaderInfo(); HRESULT _Expand(LPCITEMIDLIST pidl, int iDepth); HTREEITEM _ExpandToItem(LPCITEMIDLIST pidl, BOOL fCreate = TRUE, BOOL fReinsert = FALSE); HRESULT _ExpandNode(HTREEITEM htiParent, int iCode, int iDepth); HRESULT _PutRootVariant(VARIANT *pvar); BOOL _IsItemNameInTree(LPCITEMIDLIST pidl); COLORREF _GetRegColor(COLORREF clrDefault, LPCTSTR pszName); void _AssignPidl(PORDERITEM poi, LPITEMIDLIST pidlNew); protected: // used for background thread icon + draw info extraction static void s_NscIconCallback(CNscTree *pns, UINT_PTR uId, int iIcon, int iOpenIcon, DWORD dwFlags, UINT uMagic); static void s_NscOverlayCallback(CNscTree *pns, UINT_PTR uId, int iOverlayIndex, UINT uMagic); // used for background enumeration static void s_NscEnumCallback(CNscTree *pns, LPITEMIDLIST pidl, UINT_PTR uId, DWORD dwSig, HDPA hdpa, LPITEMIDLIST pidlExpandingTo, DWORD dwOrderSig, UINT uDepth, BOOL fUpdate, BOOL fUpdatePidls); private: void _EnumBackgroundDone(NSC_BKGDENUMDONEDATA *pbedd); #ifdef DEBUG void TraceHTREE(HTREEITEM hti, LPCTSTR pszDebugMsg); void TracePIDL(LPCITEMIDLIST pidl, LPCTSTR pszDebugMsg); void TracePIDLAbs(LPCITEMIDLIST pidl, LPCTSTR pszDebugMsg); #endif static int CALLBACK _TreeOrder(LPARAM lParam1, LPARAM lParam2 , LPARAM lParamSort); BOOL _IsOrdered(HTREEITEM htiRoot); void _SelectPidl(LPCITEMIDLIST pidl, BOOL fCreate, BOOL fReinsert = FALSE); void _SelectNoExpand(HWND hwnd, HTREEITEM hti); HRESULT _InsertChild(HTREEITEM htiParent, IShellFolder *psfParent, LPCITEMIDLIST pidlChild, BOOL fExpand, BOOL fSimpleToRealIDL, int iPosition, HTREEITEM *phti); LRESULT _OnCommand(WPARAM wParam, LPARAM lParam); IStream *GetOrderStream(LPCITEMIDLIST pidl, DWORD grfMode); HRESULT _PopulateOrderList(HTREEITEM htiRoot); void _FreeOrderList(HTREEITEM htiRoot); void _Dropped(void); LRESULT _OnCDNotify(LPNMCUSTOMDRAW pnm); BOOL _IsTopParentItem(HTREEITEM hti); BOOL _MoveNode(int _iDragSrc, int iNewPos, LPITEMIDLIST pidl); void _TreeInvalidateItemInfo(HTREEITEM hItem, UINT mask); void _InvalidateImageIndex(HTREEITEM hItem, int iImage); void _DrawItem(HTREEITEM hti, TCHAR * psz, HDC hdc, LPRECT prc, DWORD dwFlags, int iLevel, COLORREF clrbk, COLORREF clrtxt); void _DrawIcon(HTREEITEM hti,HDC hdc, int iLevel, RECT *prc, DWORD dwFlags); void _UpdateActiveBorder(HTREEITEM htiSelected); void _MarkChildren(HTREEITEM htiParent, BOOL fOn); BOOL _IsMarked(HTREEITEM hti); void _UpdateItemDisplayInfo(HTREEITEM hti); void _TreeSetItemState(HTREEITEM hti, UINT stateMask, UINT state); void _TreeNukeCutState(); BOOL _IsChannelFolder(HTREEITEM hti); BOOL _LoadOrder(HTREEITEM hti, LPCITEMIDLIST pidl, IShellFolder* psf, HDPA* phdpa); HWND _hwndParent; // parent window to notify HWND _hwndTree; // tree or combo box HWND _hwndNextViewer; HWND _hwndHdr; DWORD _style; DWORD _dwExStyle; DWORD _grfFlags; // Flags to filter what goes in the tree. DWORD _dwFlags; // Behavior Flags (NSS_*) DWORD _dwTVFlags; BITBOOL _fInitialized : 1; // Has INSCTree::Initialize() been called at least once yet? BITBOOL _fIsSelectionCached: 1; // If the WM_NCDESTROY has been processed, then we squired the selected pidl(s) in _pidlSelected BITBOOL _fCacheIsDesktop : 1; // state flags BITBOOL _fAutoExpanding : 1; // tree is auto-expanding BITBOOL _fDTRegistered:1; // have we registered as droptarget? BITBOOL _fpsfCacheIsTopLevel : 1; // is the cached psf a root channel ? BITBOOL _fDragging : 1; // one o items being dragged BITBOOL _fStartingDrag : 1; // starting to drag an item BITBOOL _fDropping : 1; // a drop occurred in the nsc BITBOOL _fInSelectPidl : 1; // we are performing a SelectPidl BITBOOL _fInserting : 1; // we're on the insertion edge. BITBOOL _fInsertBefore : 1; // a drop occurred in the nsc BITBOOL _fClosing : 1; // are we closing ? BITBOOL _fOkToRename : 1; // are we right clicking. BITBOOL _fInLabelEdit:1; BITBOOL _fCollapsing:1; // is a node collapsing. BITBOOL _fOnline:1; // is inet online? BITBOOL _fWeChangedOrder:1; // did we change the order? BITBOOL _fHandlingShellNotification:1; //are we handing a shell notification? BITBOOL _fSingleExpand:1; // are we in single expand mode BITBOOL _fHasFocus:1; // does nsc have the focus? BITBOOL _fIgnoreNextSelChange:1;// hack to get around treeview keydown bug BITBOOL _fIgnoreNextItemExpanding:1; //hack to get around annoying single expand behavior BITBOOL _fInExpand:1; // TRUE while we are doing delayed expansion (called back from the secondary thread) BITBOOL _fSubClassed:1; // Have we subclassed the window yet? BITBOOL _fAsyncDrop:1; // async drop from outside or another inside folder. BITBOOL _fOrdered:1; // is root folder ordered. BITBOOL _fExpandNavigateTo:1; // Do we need to expand when the right pane navigation comes back? BITBOOL _fNavigationFinished:1; // TRUE when the right hand pane has finished its navigation BITBOOL _fSelectFromMouseClick:1; // Did we use the mouse to select the item? (as opposed to the keyboard) BITBOOL _fShouldShowAppStartCursor:1; // TRUE to show the appstart cursor while there is a background task going BOOL _fUpdate; // true if we are enumerating so that we can update the tree (refresh) int _cxOldWidth; UINT _mode; UINT _csidl; IContextMenu* _pcm; // context menu currently being displayed IContextMenu2* _pcmSendTo; // deal with send to hack so messages tgo right place. LPITEMIDLIST _pidlRoot; LPITEMIDLIST _pidlSelected; // Valid if _fIsSelectionCached is true. Used for INSCTree::GetSelectedItem() after tree is gone. HTREEITEM _htiCache; // tree item associated with Current shell folder IShellFolder* _psfCache; // cache of the last IShellFolder I needed... IShellFolder2* _psf2Cache; // IShellDetails2 for _psfISD2Cache IFolderFilter* _pFilter; INamespaceProxy* _pnscProxy; ULONG _ulDisplayCol; // Default display col for _psfCache ULONG _ulSortCol; // Default sort col for _psfCache ULONG _nChangeNotifyID; // SHChangeNotify registration ID HDPA _hdpaOrd; // dpa order for current shell folder. // drop target privates HTREEITEM _htiCur; // current tree item (dragging over) DWORD _dwLastTime; DWORD _dwEffectCur; // current drag effect int _iDragSrc; // dragging from this pos. int _iDragDest; // destination drag point HTREEITEM _htiDropInsert; // parent of inserted item. HTREEITEM _htiDragging; // the tree item being dragged during D&D. HTREEITEM _htiCut; // Used for Clipboard and Visuals LPITEMIDLIST _pidlDrag; // pidl of item being dragged from within. HTREEITEM _htiFolderStart; // what folder do we start in. HICON _hicoPinned; // drawn over items that are sticky in the inet cache HWND _hwndDD; // window to draw custom drag cursors on. HTREEITEM _htiActiveBorder; // the folder to draw the active border around CWinInetNotify _inetNotify; // hooks up wininet notifications (online/offline, etc) IShellTaskScheduler* _pTaskScheduler; // background task icon/info extracter int _iDefaultFavoriteIcon; // index of default favorite icon in system image list int _iDefaultFolderIcon; // index of default folder icon in system image list HTREEITEM _htiRenaming; // hti of item being renamed in rename mode LPITEMIDLIST _pidlNewFolderParent; // where the new folder will be arriving (when user picks "Create New Folder") DWORD _dwSignature; // Signature used to track items in the tree, even after they've moved DWORD _dwOrderSig; // Signature that lets us detect changes in ordering of items BYTE _bSynchId; // magic number for validating tree during background icon extraction HDPA _hdpaColumns; // visible columns when NSS_HEADER is set HDPA _hdpaViews; // ishellfolderviewtype view pidls LPITEMIDLIST _pidlExpandingTo; // During expansion of the tree, this is the pidl of the item we want to reach. LPITEMIDLIST _pidlNavigatingTo; // This is the pidl to which the right pane is currently navigating to UINT _uDepth; // depth of recursive expansion CRITICAL_SECTION _csBackgroundData; // protects the data from the background tasks. NSC_BKGDENUMDONEDATA * _pbeddList; // List of tasks that are done. BITBOOL _fShowCompColor:1; // Show compressed files in different color enum { RSVIDM_CONTEXT_START = RSVIDM_LAST + 1, // our private menu items end here }; }; int DPADeleteItemCB(void *pItem, void *pData); int DPADeletePidlsCB(void *pItem, void *pData); // util macros. #define GetPoi(p) (((ITEMINFO *)p)->poi) #define GetPii(p) ((ITEMINFO *)p) #include "nscband.h" #endif // _NSC_C