259 lines
9.1 KiB
C
259 lines
9.1 KiB
C
|
#ifndef _DUIVIEW_H_INCLUDED_
|
||
|
#define _DUIVIEW_H_INCLUDED_
|
||
|
|
||
|
#define GADGET_ENABLE_TRANSITIONS
|
||
|
#define GADGET_ENABLE_CONTROLS
|
||
|
#define GADGET_ENABLE_OLE
|
||
|
#include <duser.h>
|
||
|
#include <directui.h>
|
||
|
#include <duserctrl.h>
|
||
|
|
||
|
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<IThumbnail2> _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
|