aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_local/FolderBrowseEx.h
blob: 746d186d5aa3b13aa669ca83101999bdc5956522 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifndef NULLSOFT_FOLDERBROWSE_EXTENDED_DIALOG_HEADER
#define NULLSOFT_FOLDERBROWSE_EXTENDED_DIALOG_HEADER

#include <windows.h>
#include <shlobj.h>

/// Standart controls 
#define IDC_TV_FOLDERS		0x3741
#define IDC_SB_GRIPPER		0x3747
#define IDC_LBL_FOLDER		0x3748
#define IDC_LBL_CAPTION		0x3742
#define IDC_EDT_PATH		0x3744


typedef struct _BFPATH
{
	int		empty;
	int		type;  
	void	*value;
}BFPATH;

class FolderBrowseEx
{
public:
	FolderBrowseEx(LPCITEMIDLIST pidlRoot, UINT ulFlags, LPCWSTR lpszCaption, LPCWSTR lpszTitle);
	FolderBrowseEx(UINT ulFlags, LPCWSTR lpszCaption, LPCWSTR lpszTitle);
	FolderBrowseEx(UINT ulFlags, LPCWSTR lpszTitle);
	FolderBrowseEx(void);
	virtual ~FolderBrowseEx(void);

public:
	virtual LPITEMIDLIST Browse(HWND hwndOwner);
	
	LPITEMIDLIST GetPIDL(void) { return pidl; }
	INT GetImage(void) { return image; }
	LPCWSTR GetDislpayName(void) { return  pszDisplayName; }
	HRESULT ParseDisplayName(LPCWSTR lpszPath, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut);
	HWND GetDlgItem(int nIDDlgItem) { return ::GetDlgItem(hwnd, nIDDlgItem); }
	
	void SetRoot(LPCITEMIDLIST pidlRoot) { this->pidlRoot = pidlRoot; }
	void SetFlags(UINT ulFlags) { this->ulFlags = ulFlags; }
	void SetSelection(LPCITEMIDLIST pidlSelect);
	void SetSelection(LPCWSTR lpszSelect);
	void SetExpanded(LPCITEMIDLIST pidlExpand);
	void SetExpanded(LPCWSTR lpszExpand);
	void SetCaption(LPCWSTR lpszCaption);
	void SetTitle(LPCWSTR lpszTitle); 
	

protected:
	HWND GetHandle(void) { return hwnd; }
	INT_PTR CallWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
	void SetDialogResult(LRESULT result);
	LRESULT SendMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { return ::SendMessageW(hwnd, uMsg, wParam, lParam); }
	void SetWindowText(LPCWSTR lpText) { ::SetWindowTextW(hwnd, lpText); }

	void EnableOK(BOOL enable) { SendMessage(BFFM_ENABLEOK, 0, (LPARAM)enable); }
	void SetOKText(LPCWSTR lpText) { SendMessage(BFFM_SETOKTEXT, 0, (LPARAM)lpText); }
	void SetStatusText(LPCWSTR lpText)  { SendMessage(BFFM_SETSTATUSTEXTW, 0, (LPARAM)lpText); }
	
	virtual void OnInitialized(void);
	virtual void OnIUnknown(IUnknown *lpiu) {}
	virtual void OnSelectionChanged(LPCITEMIDLIST pidl);
	virtual BOOL OnValidateFailed(LPCWSTR lpName) { return FALSE; }
	virtual void OnSelectionDone(LPCITEMIDLIST pidl) { }

	virtual INT BrowseCallback(UINT uMsg, LPARAM lParam);
	virtual INT_PTR DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam);

protected:
	LPCITEMIDLIST	pidlRoot;
	
	BFPATH			pathSelection;
	BFPATH			pathExpanded;

    LPWSTR			lpszCaption;
	LPWSTR			lpszTitle;
	UINT			ulFlags;
	INT				image;
	WCHAR			pszDisplayName[MAX_PATH];
	BOOL			expand;
	LPITEMIDLIST		pidl;


private:
	HWND				hwnd;
	LONG_PTR		oldProc;
	


	friend static int WINAPI BrowseCallback_Helper(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
	friend static LRESULT WINAPI WindowProc_Helper(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
	friend static void Initialize(FolderBrowseEx *lpfbx, LPCITEMIDLIST pidlRoot, UINT ulFlags, LPCWSTR lpszCaption, LPCWSTR lpszTitle);

};

#endif //NULLSOFT_FOLDERBROWSE_EXTENDED_DIALOG_HEADER