2 * Copyright 2003, 2004, 2005 Martin Fuchs
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.
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.
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
25 // Martin Fuchs, 23.07.2003
28 #include "../utility/treedroptarget.h"
29 #include "../utility/shellbrowserimpl.h"
32 /// information structure to hold current shell folder information
35 ShellPathInfo(int mode
=0) : _open_mode(mode
) {}
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
)
44 ShellPath _shell_path
;
45 ShellPath _root_shell_path
;
47 int _open_mode
; //OPEN_WINDOW_MODE
51 struct BrowserCallback
53 virtual ~BrowserCallback() {}
54 virtual void entry_selected(Entry
* entry
) = 0;
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
64 ShellBrowser(HWND hwnd
, HWND left_hwnd
, WindowHandle
& right_hwnd
, ShellPathInfo
& create_info
,
65 HIMAGELIST himl
, BrowserCallback
* cb
, CtxMenuInterfaces
& cm_ifs
);
66 virtual ~ShellBrowser();
69 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
* lphwnd
)
76 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
** ppshv
)
78 _pShellView
->AddRef();
83 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
* lphwnd
)
93 HWND hwnd
= (HWND
)SendMessage(_hWndFrame
, PM_GET_CONTROLWINDOW
, id
, 0);
103 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
* pret
)
108 HWND hstatusbar
= (HWND
)SendMessage(_hWndFrame
, PM_GET_CONTROLWINDOW
, id
, 0);
111 *pret
= ::SendMessage(hstatusbar
, uMsg
, wParam
, lParam
);
118 const Root
& get_root() const {return _root
;}
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
);
125 LRESULT
Init(HWND hWndFrame
);
127 void Init(HIMAGELIST himl
)
129 InitializeTree(himl
);
133 int InsertSubitems(HTREEITEM hParentItem
, Entry
* entry
, IShellFolder
* pParentFolder
);
135 bool jump_to_pidl(LPCITEMIDLIST pidl
);
137 HRESULT
OnDefaultCommand(LPIDA pida
);
139 void UpdateFolderView(IShellFolder
* folder
);
140 HTREEITEM
select_entry(HTREEITEM hitem
, Entry
* entry
, bool expand
=true);
143 void jump_to(LPCITEMIDLIST pidl
);
148 WindowHandle
& _right_hwnd
;
149 ShellPathInfo
& _create_info
;
151 HIMAGELIST _himl_old
;
152 BrowserCallback
* _callback
;
154 WindowHandle _hWndFrame
;
157 IShellView
* _pShellView
; // current hosted shellview
158 TreeDropTarget
* _pDropTarget
;
163 ShellDirectory
* _cur_dir
;
165 CtxMenuInterfaces
& _cm_ifs
;
167 void InitializeTree(HIMAGELIST himl
);
170 #ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
171 typedef IComSrvBase
<IShellFolderViewCB
, ShellBrowser
> super
;
173 // IShellFolderViewCB
174 virtual HRESULT STDMETHODCALLTYPE
MessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
179 #define C_DRIVE_STR TEXT("C:\\")
181 // work around GCC's wide string constant bug
183 extern const LPCTSTR C_DRIVE
;
185 #define C_DRIVE C_DRIVE_STR
188 template<typename BASE
> struct ShellBrowserChildT
189 : public BASE
, public BrowserCallback
193 // constructor for SDIMainFrame
194 ShellBrowserChildT(HWND hwnd
)
200 // constructor for MDIShellBrowserChild
201 ShellBrowserChildT(HWND hwnd
, const ShellChildWndInfo
& info
)
211 _himlSmall
= (HIMAGELIST
)SHGetFileInfo(C_DRIVE
, 0, &sfi
, sizeof(SHFILEINFO
), SHGFI_SYSICONINDEX
|SHGFI_SMALLICON
);
212 // _himlLarge = (HIMAGELIST)SHGetFileInfo(C_DRIVE, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
216 HIMAGELIST _himlSmall
; // list
217 // HIMAGELIST _himlLarge; // shell image
220 auto_ptr
<ShellBrowser
> _shellBrowser
;
222 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
)
225 case PM_GET_SHELLBROWSER_PTR
:
226 return (LRESULT
)&*_shellBrowser
;
228 case WM_GETISHELLBROWSER
: // for Registry Explorer Plugin
229 return (LRESULT
)static_cast<IShellBrowser
*>(&*_shellBrowser
);
232 return super::WndProc(nmsg
, wparam
, lparam
);
238 int Notify(int id
, NMHDR
* pnmh
)
242 case TVN_GETDISPINFO
: _shellBrowser
->OnTreeGetDispInfo(id
, pnmh
); break;
243 case TVN_SELCHANGED
: _shellBrowser
->OnTreeItemSelected(id
, (LPNMTREEVIEW
)pnmh
); break;
244 case TVN_ITEMEXPANDING
: _shellBrowser
->OnTreeItemExpanding(id
, (LPNMTREEVIEW
)pnmh
); break;
245 case NM_RCLICK
: _shellBrowser
->OnTreeItemRClick(id
, pnmh
); break;
246 default: return super::Notify(id
, pnmh
);
249 return super::Notify(id
, pnmh
);
258 struct MDIShellBrowserChild
: public ExtContextMenuHandlerT
<
259 ShellBrowserChildT
<ChildWindow
>
262 typedef ExtContextMenuHandlerT
<
263 ShellBrowserChildT
<ChildWindow
>
266 MDIShellBrowserChild(HWND hwnd
, const ShellChildWndInfo
& info
);
268 static MDIShellBrowserChild
* create(const ShellChildWndInfo
& info
);
270 LRESULT
Init(LPCREATESTRUCT
);
272 virtual String
jump_to_int(LPCTSTR url
);
275 ShellChildWndInfo _create_info
;
276 ShellPathInfo _shellpath_info
;
278 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
);
280 void update_shell_browser();
282 // interface BrowserCallback
283 virtual void entry_selected(Entry
* entry
);