3bdce69db7c1d00f8dfc4843fa211ace3a53fa45
[reactos.git] / reactos / subsys / system / explorer / shell / shellbrowser.h
1 /*
2 * Copyright 2003, 2004, 2005 Martin Fuchs
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19
20 //
21 // Explorer clone
22 //
23 // shellbrowser.h
24 //
25 // Martin Fuchs, 23.07.2003
26 //
27
28 #include "../utility/treedroptarget.h"
29 #include "../utility/shellbrowserimpl.h"
30
31
32 /// information structure to hold current shell folder information
33 struct ShellPathInfo
34 {
35 ShellPathInfo(int mode=0) : _open_mode(mode) {}
36
37 ShellPathInfo(const ShellChildWndInfo& info)
38 : _shell_path(info._shell_path),
39 _root_shell_path(info._root_shell_path),
40 _open_mode(info._open_mode)
41 {
42 }
43
44 ShellPath _shell_path;
45 ShellPath _root_shell_path;
46
47 int _open_mode; //OPEN_WINDOW_MODE
48 };
49
50
51 struct BrowserCallback
52 {
53 virtual ~BrowserCallback() {}
54 virtual void entry_selected(Entry* entry) = 0;
55 };
56
57
58 /// Implementation of IShellBrowserImpl interface in explorer child windows
59 struct ShellBrowser : public IShellBrowserImpl
60 #ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
61 , public IComSrvBase<IShellFolderViewCB, ShellBrowser>, public SimpleComObject
62 #endif
63 {
64 ShellBrowser(HWND hwnd, HWND hwndFrame, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
65 BrowserCallback* cb, CtxMenuInterfaces& cm_ifs);
66 virtual ~ShellBrowser();
67
68 //IOleWindow
69 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd)
70 {
71 *lphwnd = _hwnd;
72 return S_OK;
73 }
74
75 //IShellBrowser
76 virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView** ppshv)
77 {
78 _pShellView->AddRef();
79 *ppshv = _pShellView;
80 return S_OK;
81 }
82
83 virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND* lphwnd)
84 {
85 if (!lphwnd)
86 return E_POINTER;
87
88 if (id == FCW_TREE) {
89 *lphwnd = _left_hwnd;
90 return S_OK;
91 }
92
93 HWND hwnd = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
94
95 if (hwnd) {
96 *lphwnd = hwnd;
97 return S_OK;
98 }
99
100 return E_NOTIMPL;
101 }
102
103 virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret)
104 {
105 if (!pret)
106 return E_POINTER;
107
108 HWND hstatusbar = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
109
110 if (hstatusbar) {
111 *pret = ::SendMessage(hstatusbar, uMsg, wParam, lParam);
112 return S_OK;
113 }
114
115 return E_NOTIMPL;
116 }
117
118 const Root& get_root() const {return _root;}
119
120 void OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh);
121 void OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv);
122 void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh);
123 void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv);
124
125 void Init();
126
127 int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder);
128
129 bool jump_to_pidl(LPCITEMIDLIST pidl);
130
131 HRESULT OnDefaultCommand(LPIDA pida);
132
133 void UpdateFolderView(IShellFolder* folder);
134 HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true);
135
136 bool select_folder(Entry* entry, bool expand);
137
138 // for SDIMainFrame
139 void jump_to(LPCITEMIDLIST pidl);
140
141 void invalidate_cache();
142
143 protected:
144 HWND _hwnd;
145 HWND _left_hwnd;
146 WindowHandle& _right_hwnd;
147 ShellPathInfo& _create_info;
148 HIMAGELIST _himl;
149 HIMAGELIST _himl_old;
150 BrowserCallback* _callback;
151
152 HWND _hwndFrame;
153 ShellFolder _folder;
154
155 IShellView* _pShellView; // current hosted shellview
156 TreeDropTarget* _pDropTarget;
157
158 HTREEITEM _last_sel;
159
160 Root _root;
161 ShellDirectory* _cur_dir;
162
163 CtxMenuInterfaces& _cm_ifs;
164
165 void InitializeTree();
166 bool InitDragDrop();
167
168 #ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
169 typedef IComSrvBase<IShellFolderViewCB, ShellBrowser> super;
170
171 // IShellFolderViewCB
172 virtual HRESULT STDMETHODCALLTYPE MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
173 #endif
174
175 map<int, int> _image_map;
176
177 int get_image_idx(int icon_id);
178 };
179
180
181 #define C_DRIVE_STR TEXT("C:\\")
182
183 // work around GCC's wide string constant bug
184 #ifdef __GNUC__
185 extern const LPCTSTR C_DRIVE;
186 #else
187 #define C_DRIVE C_DRIVE_STR
188 #endif
189
190 template<typename BASE> struct ShellBrowserChildT
191 : public BASE, public BrowserCallback
192 {
193 typedef BASE super;
194
195 // constructor for SDIMainFrame
196 ShellBrowserChildT(HWND hwnd)
197 : super(hwnd)
198 {
199 }
200
201 // constructor for MDIShellBrowserChild
202 ShellBrowserChildT(HWND hwnd, const ShellChildWndInfo& info)
203 : super(hwnd, info)
204 {
205 }
206
207 protected:
208 auto_ptr<ShellBrowser> _shellBrowser;
209
210 LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
211 {
212 switch(nmsg) {
213 case PM_GET_SHELLBROWSER_PTR:
214 return (LRESULT)&*_shellBrowser;
215
216 case WM_GETISHELLBROWSER: // for Registry Explorer Plugin
217 return (LRESULT)static_cast<IShellBrowser*>(&*_shellBrowser);
218
219 default:
220 return super::WndProc(nmsg, wparam, lparam);
221 }
222
223 return 0;
224 }
225
226 int Notify(int id, NMHDR* pnmh)
227 {
228 if (_shellBrowser.get())
229 switch(pnmh->code) {
230 case TVN_GETDISPINFO: _shellBrowser->OnTreeGetDispInfo(id, pnmh); break;
231 case TVN_SELCHANGED: _shellBrowser->OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break;
232 case TVN_ITEMEXPANDING: _shellBrowser->OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break;
233 case NM_RCLICK: _shellBrowser->OnTreeItemRClick(id, pnmh); break;
234 default: return super::Notify(id, pnmh);
235 }
236 else
237 return super::Notify(id, pnmh);
238
239 return 0;
240 }
241 };
242
243
244 #ifndef _NO_MDI
245
246 struct MDIShellBrowserChild : public ExtContextMenuHandlerT<
247 ShellBrowserChildT<ChildWindow>
248 >
249 {
250 typedef ExtContextMenuHandlerT<
251 ShellBrowserChildT<ChildWindow>
252 > super;
253
254 MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info);
255
256 static MDIShellBrowserChild* create(const ShellChildWndInfo& info);
257
258 LRESULT Init(LPCREATESTRUCT);
259
260 virtual String jump_to_int(LPCTSTR url);
261
262 protected:
263 ShellChildWndInfo _create_info;
264 ShellPathInfo _shellpath_info;
265
266 LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
267
268 void update_shell_browser();
269
270 // interface BrowserCallback
271 virtual void entry_selected(Entry* entry);
272 };
273
274 #endif