#ifndef _DUIVIEW_H_INCLUDED_ #define _DUIVIEW_H_INCLUDED_ #define GADGET_ENABLE_TRANSITIONS #define GADGET_ENABLE_CONTROLS #define GADGET_ENABLE_OLE #include #include #include using namespace DirectUI; UsingDUIClass(Element); UsingDUIClass(Button); UsingDUIClass(RepeatButton); UsingDUIClass(Thumb); UsingDUIClass(ScrollBar); UsingDUIClass(Viewer); UsingDUIClass(Selector); UsingDUIClass(HWNDElement); UsingDUIClass(ScrollViewer); UsingDUIClass(Edit); #define WM_HTML_BITMAP (WM_USER + 100) #define WM_DETAILS_INFO (WM_USER + 101) typedef enum { DUISEC_UNKNOWN = 0, DUISEC_SPECIALTASKS = 1, DUISEC_FILETASKS = 2, DUISEC_OTHERPLACESTASKS = 3, DUISEC_DETAILSTASKS = 4 } DUISEC; struct DUISEC_ATTRIBUTES; // Right now our themeing information is hard-coded due to limitations of DirectUI (only one resource) // so we'll ask the namespace for a hardcoded name that we can look up in the below table. Add new // names/entries to this list as we add theme parts to our shellstyle.dll. // typedef struct { LPCWSTR pszThemeName; int idSpecialSectionIcon; int idSpecialSectionWatermark; int idListviewWatermark; } WVTHEME; #include "defviewp.h" #include "w32utils.h" class CDefView; class Expando; class HWNDView; class ActionTask; class DestinationTask; class DUIListView; class DUIAxHost; class CDetailsSectionInfoTask; class CDUIDropTarget; STDAPI CDetailsSectionInfoTask_CreateInstance(IShellFolder *psfContaining, LPCITEMIDLIST pidlAbsolute, HWND hwndMsg, UINT uMsg, DWORD dwDetailsInfoID, CDetailsSectionInfoTask **ppTask); // // CDUIView class // class CDUIView { private: LONG _cRef; HWND _hWnd; HWNDView * _phe; DUIListView * _peListView; INT _iListViewHeight; // used when the preview control is also displayed INT _iOriginalTaskPaneWidth; INT _iTaskPaneWidth; DUIAxHost * _pePreview; IUnknown * _punkPreview; CDefView * _pDefView; Element * _peTaskPane; Element * _peClientViewHost; Element * _peBarrier; BOOL _bBarrierShown; BOOL _bInitialized; BSTR _bstrIntroText; IPropertyBag * _ppbShellFolders; CDUIDropTarget * _pDT; Expando* _peSpecialSection; Element* _peSpecialTaskList; Value* _pvSpecialTaskSheet; Expando* _peFolderSection; Element* _peFolderTaskList; Value* _pvFolderTaskSheet; Expando* _peDetailsSection; Element* _peDetailsInfoArea; Value* _pvDetailsSheet; IShellItemArray* _pshlItems; HDSA _hdsaNonStdTaskSections; BOOL _fLoadedTheme; HINSTANCE _hinstTheme; HANDLE _hinstScrollbarTheme; BOOL _bAnimationsDisabled; HRESULT _hrInit; CDUIView(CDefView * pDefView); ~CDUIView(); public: HRESULT Initialize(); friend CDUIView* Create_CDUIView(CDefView * pDefView); void AddRef(void) { InterlockedIncrement(&_cRef); } void Release(void) { if (0 == InterlockedDecrement(&_cRef)) delete this; } void DetachListview(); HRESULT Initialize(BOOL bDisplayBarrier, IUnknown * punkPreview); HRESULT EnableBarrier(BOOL bDisplayBarrier); HRESULT EnablePreview(IUnknown * punkPreview); HRESULT Refresh(void); HRESULT SetSize(RECT *rc); HRESULT SetTaskPaneVisibility(BOOL bShow); void CalculateInfotipRect(Element *pe, RECT *pRect); BOOL Navigate(BOOL fForward); HRESULT InitializeDropTarget (LPITEMIDLIST pidl, HWND hWnd, IDropTarget **pdt); HRESULT NavigateToDestination(LPCITEMIDLIST pidl); HRESULT DelayedNavigation(IShellItemArray *psiItemArray, IUICommand *puiCommand); void UnInitializeDirectUI(void); void ManageAnimations(BOOL bExiting); HINSTANCE _GetThemeHinst(void); void OnSelectionChange(IShellItemArray *psiItemArray); void OnContentsChange(IShellItemArray *psiItemArray); void OnExpandSection(DUISEC eDUISecID, BOOL bExpanded); const WVTHEME* GetThemeInfo(); private: // // Flags passed to _Refresh(). // enum REFRESH_FLAGS { REFRESH_TASKS = 0x00000001, // Refresh webview task list content. REFRESH_CONTENT = 0x00000002, // Refresh webview right-pane content. REFRESH_SELCHG = 0x00000004, // Refreshing for a selection change REFRESH_ALL = 0x00000003 }; HRESULT _CreateHostWindow(void); HRESULT _LoadUIFileFromResources(HINSTANCE hinst, INT iID, char **pUIFile); HRESULT _BuildUIFile(char **pUIFile, int *piCharCount); HRESULT _BuildSection(Element* peSectionList, BOOL bMain, IUIElement* pTitle, int idBitmapDesc, int idWatermarkDesc, Value* pvSectionSheet, Parser* pParser, DUISEC eDUISecID, Expando ** ppeExpando, Element ** pTaskList); HRESULT _AddActionTasks(Expando* peExpando, Element* peTaskList, IEnumUICommand* penum, Value* pvTaskSheet, BOOL bIntroAdded); HRESULT _AddDestinationTasks(Element* peTaskList, IEnumIDList* penum, Value* pvTaskSheet); HRESULT _AddDetailsSectionInfo(); HRESULT _BuildTaskList(Parser* pParser); HRESULT _BuildStandardTaskList(Parser *pParser, Element *peSectionList); HRESULT _BuildNonStandardTaskList(Parser *pParser, Element *peSectionList, HDSA hdsaSections); HRESULT _InitializeElements(char * pUIFile, int iCharCount, BOOL bDisplayBarrier, IUnknown * punkPreview); HRESULT _SwitchToBarrier(BOOL bDisplayBarrier); HRESULT _ManagePreview(IUnknown * punkPreview); HRESULT _GetIntroTextElement(Element** ppeIntroText); HRESULT _BuildSoftBarrier(void); void _InitializeShellFolderPropertyBag(); BOOL _ShowSectionExpanded(DUISEC eDUISecID); const struct DUISEC_ATTRIBUTES *_GetSectionAttributes(DUISEC eDUISecID); static LRESULT CALLBACK _DUIHostWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam); HRESULT _OnResize(long lWidth, long lHeight); void _Refresh(IShellItemArray *psiItemArray, DWORD dwRefreshFlags = REFRESH_ALL); HRESULT _AddNonStdTaskSection(const SFVM_WEBVIEW_ENUMTASKSECTION_DATA *pData); HRESULT _GetNonStdTaskSectionsFromViewCB(void); void _ClearNonStdTaskSections(void); BOOL _bHideTaskPaneAlways; // Set to TRUE when "Use Classic View" is used, FALSE otherwise BOOL _fHideTasklist; // Set to TRUE when an explorer bar is visible public: // Thumbnail extraction stuff... HRESULT InitializeThumbnail(WNDPROC pfnWndProc); HRESULT SetThumbnailMsgWindowPtr(void* p, void* pCheck); HRESULT StartBitmapExtraction(LPCITEMIDLIST pidl); // Details section info extraction stuff... HRESULT InitializeDetailsInfo(WNDPROC pfnWndProc); HRESULT SetDetailsInfoMsgWindowPtr(void* p, void* pCheck); HRESULT StartInfoExtraction(LPCITEMIDLIST pidl); VOID ShowDetails(BOOL fShow); BOOL ShouldShowMiniPreview(); DWORD _dwThumbnailID; // Accessed by CMiniPreviewer (duiinfo.cpp) DWORD _dwDetailsInfoID; // Accessed by CMiniPreviewer (duiinfo.cpp) protected: CComPtr _spThumbnailExtractor2; HWND _hwndMsgThumbExtract; HWND _hwndMsgInfoExtract; }; HBITMAP DUILoadBitmap(HINSTANCE hInstTheme, int idBitmapID, UINT uiLoadFlags); HICON DUILoadIcon(LPCWSTR pszIconDesc, BOOL bSmall); class HWNDView: public HWNDElement { public: static HRESULT Create(OUT Element** ppElement); // Required for ClassInfo (always fails) static HRESULT Create(HWND hParent, bool fDblBuffer, UINT nCreate, OUT Element** ppElement); static HRESULT Create(HWND hParent, bool fDblBuffer, UINT nCreate, CDUIView * pDUIView, CDefView* pDefView, OUT Element** ppElement); BOOL Navigate(BOOL fForward); virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual UINT MessageCallback(GMSG* pGMsg); virtual void OnEvent(Event* pEvent); void SetViewPtrs (CDUIView * pDUIView, CDefView* pDefView); // ClassInfo accessors (static and virtual instance-based) static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register(); HWNDView(void); virtual ~HWNDView(void); private: BOOL _fFocus; // hack until SetGadgetFocus(NULL) works. // see HWNDView::Navigate. BOOL _fDelayedNavigation; // Try to prevent double-clicking. If this is TRUE, then one click // has already been fired. IUICommand * _puiDelayNavCmd; // The UI command object for delayed navigation. Look for WM_USER_DELAY_NAGIVATION. IShellItemArray * _psiDelayNavArray; // The Shell Item Arraay for delayed navigation. Look for WM_USER_DELAY_NAGIVATION. CDefView * _pDefView;// used to relay infotip messages CDUIView* _pDUIView; }; #endif