4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provided by the shellfolder.
7 * No direct access to data from pidls should be done from here.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * FIXME: The order by part of the background context menu should be
24 * built according to the columns shown.
26 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
31 - Load/Save the view state from/into the stream provided by the ShellBrowser.
32 - Code to merge menus in the shellbrowser is incorrect.
33 - Move the background context menu creation into shell view. It should store the
34 shell view HWND to send commands.
35 - Shell view should do SetCommandTarget on internet toolbar.
36 - When editing starts on item, set edit text to for editing value.
37 - When shell view is called back for item info, let listview save the value.
38 - Fix shell view to handle view mode popup exec.
39 - The background context menu should have a pidl just like foreground menus. This
40 causes crashes when dynamic handlers try to use the NULL pidl.
41 - The SHELLDLL_DefView should not be filled with blue unconditionally. This causes
42 annoying flashing of blue even on XP, and is not correct.
43 - Reorder of columns doesn't work - might be bug in comctl32
51 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
55 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
62 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
64 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
67 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
68 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
71 public IShellFolderView
,
72 public IOleCommandTarget
,
76 public IServiceProvider
79 CComPtr
<IShellFolder
> m_pSFParent
;
80 CComPtr
<IShellFolder2
> m_pSF2Parent
;
81 CComPtr
<IShellBrowser
> m_pShellBrowser
;
82 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
85 FOLDERSETTINGS m_FolderSettings
;
90 PCUITEMID_CHILD
*m_apidl
;
91 PIDLIST_ABSOLUTE m_pidlParent
;
92 LISTVIEW_SORT_INFO m_sortInfo
;
93 ULONG m_hNotify
; /* change notification handle */
97 CComPtr
<IAdviseSink
> m_pAdvSink
;
99 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
100 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
101 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
102 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
103 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
105 CComPtr
<IContextMenu
> m_pCM
;
114 HRESULT
_MergeToolbar();
119 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
120 HRESULT
IncludeObject(PCUITEMID_CHILD pidl
);
121 HRESULT
OnDefaultCommand();
122 HRESULT
OnStateChange(UINT uFlags
);
123 void UpdateStatusbar();
125 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
127 void UpdateListColors();
129 static INT CALLBACK
ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
);
131 PCUITEMID_CHILD
_PidlByItem(int i
);
132 PCUITEMID_CHILD
_PidlByItem(LVITEM
& lvItem
);
133 int LV_FindItemByPidl(PCUITEMID_CHILD pidl
);
134 BOOLEAN
LV_AddItem(PCUITEMID_CHILD pidl
);
135 BOOLEAN
LV_DeleteItem(PCUITEMID_CHILD pidl
);
136 BOOLEAN
LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
);
137 BOOLEAN
LV_ProdItem(PCUITEMID_CHILD pidl
);
138 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
140 HMENU
BuildFileMenu();
141 void PrepareShowFileMenu(HMENU hSubMenu
);
142 void PrepareShowViewMenu(HMENU hSubMenu
);
143 UINT
GetSelections();
144 HRESULT
OpenSelectedItems();
146 void DoActivate(UINT uState
);
147 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
148 HRESULT
InvokeContextMenuCommand(UINT uCommand
);
149 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
151 // *** IOleWindow methods ***
152 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
153 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
155 // *** IShellView methods ***
156 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
157 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
158 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
159 virtual HRESULT STDMETHODCALLTYPE
Refresh();
160 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
161 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
162 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
163 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
164 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
165 virtual HRESULT STDMETHODCALLTYPE
SelectItem(PCUITEMID_CHILD pidlItem
, SVSIF uFlags
);
166 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
168 // *** IShellView2 methods ***
169 virtual HRESULT STDMETHODCALLTYPE
GetView(SHELLVIEWID
*view_guid
, ULONG view_type
);
170 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow2(LPSV2CVW2_PARAMS view_params
);
171 virtual HRESULT STDMETHODCALLTYPE
HandleRename(LPCITEMIDLIST new_pidl
);
172 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
);
174 // *** IFolderView methods ***
175 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
176 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
177 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
178 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, PITEMID_CHILD
*ppidl
);
179 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
180 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
181 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
182 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
183 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
);
184 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
185 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
186 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
187 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
188 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
190 // *** IShellFolderView methods ***
191 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
192 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
193 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
194 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
195 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
196 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
197 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
198 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
199 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
200 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
201 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
202 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
203 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
204 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
205 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
206 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
207 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
208 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
209 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
210 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
211 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
212 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
213 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
214 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
215 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
216 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
217 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
219 // *** IOleCommandTarget methods ***
220 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
221 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
223 // *** IDropTarget methods ***
224 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
225 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
226 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
227 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
229 // *** IDropSource methods ***
230 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
231 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
233 // *** IViewObject methods ***
234 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
235 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
236 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
237 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
238 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
239 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
240 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
241 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
242 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
244 // *** IServiceProvider methods ***
245 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
248 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
249 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
250 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
251 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
252 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
253 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
254 LRESULT
OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
255 LRESULT
OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
256 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
257 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
260 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
261 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
262 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
263 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
264 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
265 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
266 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
267 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
269 static ATL::CWndClassInfo
& GetWndClassInfo()
271 static ATL::CWndClassInfo wc
=
273 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
275 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, SV_CLASS_NAME
, NULL
277 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
282 virtual WNDPROC
GetWindowProc()
287 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
292 // must hold a reference during message handling
293 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
295 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
300 BEGIN_MSG_MAP(CDefView
)
301 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
302 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
303 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
304 MESSAGE_HANDLER(WM_NCCREATE
, OnNCCreate
)
305 MESSAGE_HANDLER(WM_NCDESTROY
, OnNCDestroy
)
306 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
307 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
308 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
309 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
310 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
311 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
312 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
313 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
314 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
315 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
316 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
317 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
318 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
319 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
320 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
321 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
324 BEGIN_COM_MAP(CDefView
)
325 // Windows returns E_NOINTERFACE for IOleWindow
326 // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
327 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
328 COM_INTERFACE_ENTRY_IID(IID_IShellView2
, IShellView2
)
329 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
330 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
331 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
332 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
333 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
334 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
335 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
340 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
341 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
342 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
344 #define ID_LISTVIEW 1
347 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
348 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
349 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
351 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
353 CDefView::CDefView() :
357 m_menusLoaded(FALSE
),
372 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
373 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
374 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
375 ZeroMemory(&m_Category
, sizeof(m_Category
));
378 CDefView::~CDefView()
380 TRACE(" destroying IShellView(%p)\n", this);
390 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
392 m_pSFParent
= shellFolder
;
393 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
398 /**********************************************************
400 * ##### helperfunctions for communication with ICommDlgBrowser #####
402 HRESULT
CDefView::IncludeObject(PCUITEMID_CHILD pidl
)
406 if (m_pCommDlgBrowser
.p
!= NULL
)
408 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
409 ret
= m_pCommDlgBrowser
->IncludeObject(this, pidl
);
410 TRACE("--0x%08x\n", ret
);
416 HRESULT
CDefView::OnDefaultCommand()
418 HRESULT ret
= S_FALSE
;
420 if (m_pCommDlgBrowser
.p
!= NULL
)
422 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
423 ret
= m_pCommDlgBrowser
->OnDefaultCommand(this);
424 TRACE("-- returns %08x\n", ret
);
430 HRESULT
CDefView::OnStateChange(UINT uFlags
)
432 HRESULT ret
= S_FALSE
;
434 if (m_pCommDlgBrowser
.p
!= NULL
)
436 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
437 ret
= m_pCommDlgBrowser
->OnStateChange(this, uFlags
);
443 /**********************************************************
444 * set the toolbar of the filedialog buttons
446 * - activates the buttons from the shellbrowser according to
449 void CDefView::CheckToolbar()
455 if (m_pCommDlgBrowser
!= NULL
)
457 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
458 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
459 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
460 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
461 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
462 FCIDM_TB_SMALLICON
, TRUE
, &result
);
463 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
464 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
468 void CDefView::UpdateStatusbar()
470 WCHAR szFormat
[MAX_PATH
] = {0};
471 WCHAR szObjects
[MAX_PATH
] = {0};
474 cSelectedItems
= m_ListView
.GetSelectedCount();
477 LoadStringW(shell32_hInstance
, IDS_OBJECTS_SELECTED
, szFormat
, _countof(szFormat
));
478 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, cSelectedItems
);
482 LoadStringW(shell32_hInstance
, IDS_OBJECTS
, szFormat
, _countof(szFormat
));
483 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, m_ListView
.GetItemCount());
485 m_pShellBrowser
->SetStatusTextSB(szObjects
);
488 /**********************************************************
490 * ##### helperfunctions for initializing the view #####
492 /**********************************************************
493 * change the style of the listview control
495 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
499 TRACE("(%p)\n", this);
501 tmpstyle
= ::GetWindowLongPtrW(m_ListView
, GWL_STYLE
);
502 ::SetWindowLongPtrW(m_ListView
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
505 /**********************************************************
506 * ShellView_CreateList()
508 * - creates the list view window
510 BOOL
CDefView::CreateList()
511 { DWORD dwStyle
, dwExStyle
;
515 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
516 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
517 dwExStyle
= WS_EX_CLIENTEDGE
;
519 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
520 dwStyle
|= LVS_ALIGNLEFT
;
522 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
524 switch (m_FolderSettings
.ViewMode
)
531 dwStyle
|= LVS_REPORT
;
535 dwStyle
|= LVS_SMALLICON
;
547 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
548 dwStyle
|= LVS_AUTOARRANGE
;
550 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
551 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
553 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
554 dwStyle
|= LVS_SINGLESEL
;
556 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
557 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
559 RECT rcListView
= {0,0,0,0};
560 m_ListView
.Create(m_hWnd
, rcListView
, NULL
,dwStyle
, dwExStyle
, ID_LISTVIEW
);
565 m_sortInfo
.bIsAscending
= TRUE
;
566 m_sortInfo
.nHeaderID
= -1;
567 m_sortInfo
.nLastHeaderID
= -1;
571 /* UpdateShellSettings(); */
575 void CDefView::UpdateListColors()
577 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
579 /* Check if drop shadows option is enabled */
580 BOOL bDropShadow
= FALSE
;
581 DWORD cbDropShadow
= sizeof(bDropShadow
);
582 WCHAR wszBuf
[16] = L
"";
584 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
585 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
586 if (bDropShadow
&& SystemParametersInfoW(SPI_GETDESKWALLPAPER
, _countof(wszBuf
), wszBuf
, 0) && wszBuf
[0])
588 m_ListView
.SetTextBkColor(CLR_NONE
);
589 m_ListView
.SetBkColor(CLR_NONE
);
590 m_ListView
.SetTextColor(RGB(255, 255, 255));
591 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
595 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
596 m_ListView
.SetTextBkColor(crDesktop
);
597 m_ListView
.SetBkColor(crDesktop
);
598 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
599 m_ListView
.SetTextColor(RGB(0, 0, 0));
601 m_ListView
.SetTextColor(RGB(255, 255, 255));
602 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
);
607 /**********************************************************
608 * ShellView_InitList()
610 * - adds all needed columns to the shellview
612 BOOL
CDefView::InitList()
616 HIMAGELIST big_icons
, small_icons
;
620 m_ListView
.DeleteAllItems();
624 for (int i
= 0; 1; i
++)
626 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
628 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
629 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
638 Shell_GetImageLists(&big_icons
, &small_icons
);
639 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
640 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
645 /*************************************************************************
646 * ShellView_ListViewCompareItems
648 * Compare Function for the Listview (FileOpen Dialog)
651 * lParam1 [I] the first ItemIdList to compare with
652 * lParam2 [I] the second ItemIdList to compare with
653 * lpData [I] The column ID for the header Ctrl to process
656 * A negative value if the first item should precede the second,
657 * a positive value if the first item should follow the second,
658 * or zero if the two items are equivalent
660 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
662 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
663 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
664 CDefView
*pThis
= reinterpret_cast<CDefView
*>(lpData
);
666 HRESULT hres
= pThis
->m_pSFParent
->CompareIDs(pThis
->m_sortInfo
.nHeaderID
, pidl1
, pidl2
);
667 if (FAILED_UNEXPECTEDLY(hres
))
670 SHORT nDiff
= HRESULT_CODE(hres
);
671 if (!pThis
->m_sortInfo
.bIsAscending
)
676 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
678 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
681 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
683 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
686 /**********************************************************
687 * LV_FindItemByPidl()
689 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
691 int cItems
= m_ListView
.GetItemCount();
693 for (int i
= 0; i
<cItems
; i
++)
695 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
696 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
698 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
706 /**********************************************************
709 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
713 TRACE("(%p)(pidl=%p)\n", this, pidl
);
715 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
716 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
718 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
719 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
720 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
721 lvItem
.stateMask
= LVIS_CUT
;
723 if (m_ListView
.InsertItem(&lvItem
) == -1)
729 /**********************************************************
732 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
736 TRACE("(%p)(pidl=%p)\n", this, pidl
);
738 nIndex
= LV_FindItemByPidl(pidl
);
740 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
743 /**********************************************************
746 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
751 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
753 nItem
= LV_FindItemByPidl(pidlOld
);
757 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
758 lvItem
.iItem
= nItem
;
760 m_ListView
.GetItem(&lvItem
);
762 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
763 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
764 lvItem
.iItem
= nItem
;
766 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
767 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
768 m_ListView
.SetItem(&lvItem
);
769 m_ListView
.Update(nItem
);
770 return TRUE
; /* FIXME: better handling */
776 /**********************************************************
779 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
784 TRACE("(%p)(pidl=%p)\n", this, pidl
);
786 nItem
= LV_FindItemByPidl(pidl
);
790 lvItem
.mask
= LVIF_IMAGE
;
791 lvItem
.iItem
= nItem
;
793 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
794 m_ListView
.SetItem(&lvItem
);
795 m_ListView
.Update(nItem
);
802 /**********************************************************
803 * ShellView_FillList()
805 * - gets the objectlist from the shellfolder
807 * - fills the list into the view
809 INT CALLBACK
CDefView::fill_list( LPVOID ptr
, LPVOID arg
)
811 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
812 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
814 /* in a commdlg This works as a filemask*/
815 if (pThis
->IncludeObject(pidl
) == S_OK
)
816 pThis
->LV_AddItem(pidl
);
822 HRESULT
CDefView::FillList()
824 CComPtr
<IEnumIDList
> pEnumIDList
;
830 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
834 /* determine if there is a setting to show all the hidden files/folders */
835 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
837 DWORD dataLength
, flagVal
;
839 dataLength
= sizeof(flagVal
);
840 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
842 /* if the value is 1, then show all hidden files/folders */
845 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
846 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
854 /* get the itemlist from the shfolder */
855 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
863 /* create a pointer array */
864 hdpa
= DPA_Create(16);
867 return(E_OUTOFMEMORY
);
870 /* copy the items into the array*/
871 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
873 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
879 /*turn the listview's redrawing off*/
880 m_ListView
.SetRedraw(FALSE
);
882 DPA_DestroyCallback( hdpa
, fill_list
, this);
885 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
886 m_sortInfo
.bIsAscending
= TRUE
;
887 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
888 m_ListView
.SortItems(ListViewCompareItems
, this);
890 /*turn the listview's redrawing back on and force it to draw*/
891 m_ListView
.SetRedraw(TRUE
);
896 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
898 m_ListView
.UpdateWindow();
903 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
905 return m_ListView
.SendMessageW(uMsg
, 0, 0);
908 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
915 DestroyMenu(m_hMenu
);
918 RevokeDragDrop(m_hWnd
);
919 SHChangeNotifyDeregister(m_hNotify
);
921 SHFree(m_pidlParent
);
928 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
930 /* redirect to parent */
931 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
932 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
938 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
940 /* Update desktop labels color */
943 /* Forward WM_SYSCOLORCHANGE to common controls */
944 return m_ListView
.SendMessageW(uMsg
, 0, 0);
947 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
949 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
952 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
959 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
966 /**********************************************************
967 * ShellView_OnCreate()
969 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
971 CComPtr
<IDropTarget
> pdt
;
972 SHChangeNotifyEntry ntreg
;
973 CComPtr
<IPersistFolder2
> ppf2
;
985 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
987 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
988 ERR("Registering Drag Drop Failed");
991 /* register for receiving notifications */
992 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
995 ppf2
->GetCurFolder(&m_pidlParent
);
996 ntreg
.fRecursive
= TRUE
;
997 ntreg
.pidl
= m_pidlParent
;
998 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1001 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1008 /**********************************************************
1009 * #### Handling of the menus ####
1012 HMENU
CDefView::BuildFileMenu()
1015 CComPtr
<IContextMenu
> cm
;
1019 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1023 HMENU hmenu
= CreatePopupMenu();
1025 //FIXME: get proper numbers ?
1026 const UINT first
= 0x7800;
1027 const UINT last
= 0x7A00;
1028 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1032 // TODO: filter or something
1037 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1039 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1044 /* Cleanup the items added previously */
1045 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1048 mii
.cbSize
= sizeof(mii
);
1049 mii
.fMask
= MIIM_ID
;
1050 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1052 if (mii
.wID
< 0x8000)
1054 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1063 /* FIXME/TODO: Reenable when they implemented AND localizable (not hardcoded). */
1064 /* Insert This item at the beginning of the menu. */
1065 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1066 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1067 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1068 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1069 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1070 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1071 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1074 HMENU menubase
= BuildFileMenu();
1077 int count
= ::GetMenuItemCount(menubase
);
1078 int count2
= ::GetMenuItemCount(hSubMenu
);
1080 if (count2
> 0 && count
> 0)
1082 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1085 for (int i
= count
-1; i
>= 0; i
--)
1089 MENUITEMINFOW mii
= { 0 };
1090 mii
.cbSize
= sizeof(mii
);
1091 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1092 mii
.dwTypeData
= label
;
1093 mii
.cch
= _countof(label
);
1094 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1096 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1098 mii
.fType
|= MFT_RADIOCHECK
;
1100 ::InsertMenuItemW(hSubMenu
, 0, TRUE
, &mii
);
1104 ::DestroyMenu(menubase
);
1109 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1111 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1116 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1118 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1119 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1120 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1121 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1125 /**********************************************************
1126 * ShellView_GetSelections()
1128 * - fills the m_apidl list with the selected objects
1131 * number of selected items
1133 UINT
CDefView::GetSelections()
1137 m_cidl
= m_ListView
.GetSelectedCount();
1138 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1145 TRACE("-- Items selected =%u\n", m_cidl
);
1149 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1151 m_apidl
[i
] = _PidlByItem(lvIndex
);
1155 TRACE("-- selected Item found\n");
1161 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1163 CMINVOKECOMMANDINFO cmi
;
1165 ZeroMemory(&cmi
, sizeof(cmi
));
1166 cmi
.cbSize
= sizeof(cmi
);
1167 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1170 if (GetKeyState(VK_SHIFT
) & 0x8000)
1171 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1173 if (GetKeyState(VK_CONTROL
) & 0x8000)
1174 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1176 return m_pCM
->InvokeCommand(&cmi
);
1179 /**********************************************************
1180 * ShellView_OpenSelectedItems()
1182 HRESULT
CDefView::OpenSelectedItems()
1188 m_cidl
= m_ListView
.GetSelectedCount();
1192 hResult
= OnDefaultCommand();
1193 if (hResult
== S_OK
)
1196 hMenu
= CreatePopupMenu();
1200 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1201 if (FAILED(hResult
))
1204 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1205 if (FAILED(hResult
))
1208 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1209 if (uCommand
== (UINT
)-1)
1215 InvokeContextMenuCommand(uCommand
);
1228 /**********************************************************
1229 * ShellView_DoContextMenu()
1231 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1239 // for some reason I haven't figured out, we sometimes recurse into this method
1246 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1248 hMenu
= CreatePopupMenu();
1252 m_cidl
= m_ListView
.GetSelectedCount();
1254 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1255 if (FAILED( hResult
))
1258 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1259 if (FAILED( hResult
))
1262 uCommand
= TrackPopupMenu(hMenu
,
1263 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1264 x
, y
, 0, m_hWnd
, NULL
);
1268 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1271 InvokeContextMenuCommand(uCommand
);
1283 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1288 hMenu
= CreatePopupMenu();
1292 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1293 if (FAILED( hResult
))
1296 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1297 if (FAILED( hResult
))
1300 InvokeContextMenuCommand(uCommand
);
1312 /**********************************************************
1313 * ##### message handling #####
1316 /**********************************************************
1317 * ShellView_OnSize()
1319 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1324 wWidth
= LOWORD(lParam
);
1325 wHeight
= HIWORD(lParam
);
1327 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1329 /*resize the ListView to fit our window*/
1332 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1338 /**********************************************************
1339 * ShellView_OnDeactivate()
1344 void CDefView::OnDeactivate()
1346 TRACE("%p\n", this);
1348 if (m_uState
!= SVUIA_DEACTIVATE
)
1350 // TODO: cleanup menu after deactivation
1352 m_uState
= SVUIA_DEACTIVATE
;
1356 void CDefView::DoActivate(UINT uState
)
1358 TRACE("%p uState=%x\n", this, uState
);
1360 /*don't do anything if the state isn't really changing */
1361 if (m_uState
== uState
)
1366 if (uState
== SVUIA_DEACTIVATE
)
1376 MENUITEMINFOW mii
= { 0 };
1378 /* initialize EDIT menu */
1379 mii
.cbSize
= sizeof(mii
);
1380 mii
.fMask
= MIIM_SUBMENU
;
1381 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1383 HMENU hSubMenu
= mii
.hSubMenu
;
1385 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1387 int count
= ::GetMenuItemCount(menubase
);
1388 for (int i
= 0; i
< count
; i
++)
1392 ZeroMemory(&mii
, sizeof(mii
));
1393 mii
.cbSize
= sizeof(mii
);
1394 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1395 mii
.dwTypeData
= label
;
1396 mii
.cch
= _countof(label
);
1397 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1399 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1401 mii
.fType
|= MFT_RADIOCHECK
;
1403 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1406 ::DestroyMenu(menubase
);
1409 /* initialize VIEW menu */
1411 mii
.cbSize
= sizeof(mii
);
1412 mii
.fMask
= MIIM_SUBMENU
;
1413 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1415 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1417 HMENU hSubMenu
= mii
.hSubMenu
;
1419 m_hView
= CreatePopupMenu();
1421 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1423 int count
= ::GetMenuItemCount(menubase
);
1424 for (int i
= 0; i
< count
; i
++)
1428 ZeroMemory(&mii
, sizeof(mii
));
1429 mii
.cbSize
= sizeof(mii
);
1430 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1431 mii
.dwTypeData
= label
;
1432 mii
.cch
= _countof(label
);
1433 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1435 ::AppendMenuW(m_hView
, mii
.fType
, mii
.wID
, mii
.dwTypeData
);
1437 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1439 mii
.fType
|= MFT_RADIOCHECK
;
1441 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1444 ::DestroyMenu(menubase
);
1448 TRACE("-- before fnSetMenuSB\n");
1449 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1451 m_menusLoaded
= TRUE
;
1455 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1457 m_ListView
.SetFocus();
1465 /**********************************************************
1466 * ShellView_OnActivate()
1468 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1470 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1474 /**********************************************************
1475 * ShellView_OnSetFocus()
1478 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1480 TRACE("%p\n", this);
1482 /* Tell the browser one of our windows has received the focus. This
1483 should always be done before merging menus (OnActivate merges the
1484 menus) if one of our windows has the focus.*/
1486 m_pShellBrowser
->OnViewWindowActive(this);
1487 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1489 /* Set the focus to the listview */
1490 m_ListView
.SetFocus();
1492 /* Notify the ICommDlgBrowser interface */
1493 OnStateChange(CDBOSC_SETFOCUS
);
1498 /**********************************************************
1499 * ShellView_OnKillFocus()
1501 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1503 TRACE("(%p) stub\n", this);
1505 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1506 /* Notify the ICommDlgBrowser */
1507 OnStateChange(CDBOSC_KILLFOCUS
);
1512 /**********************************************************
1513 * ShellView_OnCommand()
1516 * the CmdID's are the ones from the context menu
1518 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1525 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1526 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1527 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1529 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1533 case FCIDM_SHVIEW_SMALLICON
:
1534 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1535 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1539 case FCIDM_SHVIEW_BIGICON
:
1540 m_FolderSettings
.ViewMode
= FVM_ICON
;
1541 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1545 case FCIDM_SHVIEW_LISTVIEW
:
1546 m_FolderSettings
.ViewMode
= FVM_LIST
;
1547 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1551 case FCIDM_SHVIEW_REPORTVIEW
:
1552 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1553 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1557 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1562 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1563 m_sortInfo
.bIsAscending
= TRUE
;
1564 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1565 m_ListView
.SortItems(ListViewCompareItems
, this);
1568 case FCIDM_SHVIEW_SELECTALL
:
1569 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1572 case FCIDM_SHVIEW_INVERTSELECTION
:
1573 nCount
= m_ListView
.GetItemCount();
1574 for (int i
=0; i
< nCount
; i
++)
1575 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1578 case FCIDM_SHVIEW_REFRESH
:
1582 case FCIDM_SHVIEW_DELETE
:
1583 case FCIDM_SHVIEW_CUT
:
1584 case FCIDM_SHVIEW_COPY
:
1585 case FCIDM_SHVIEW_RENAME
:
1586 return OnExplorerCommand(dwCmdID
, TRUE
);
1588 case FCIDM_SHVIEW_INSERT
:
1589 case FCIDM_SHVIEW_UNDO
:
1590 case FCIDM_SHVIEW_INSERTLINK
:
1591 case FCIDM_SHVIEW_NEWFOLDER
:
1592 return OnExplorerCommand(dwCmdID
, FALSE
);
1594 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1600 /**********************************************************
1601 * ShellView_OnNotify()
1604 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1608 LPNMLISTVIEW lpnmlv
;
1609 NMLVDISPINFOW
*lpdi
;
1610 PCUITEMID_CHILD pidl
;
1614 lpnmh
= (LPNMHDR
)lParam
;
1615 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1616 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1618 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1620 switch (lpnmh
->code
)
1623 TRACE("-- NM_SETFOCUS %p\n", this);
1624 OnSetFocus(0, 0, 0, unused
);
1628 TRACE("-- NM_KILLFOCUS %p\n", this);
1630 /* Notify the ICommDlgBrowser interface */
1631 OnStateChange(CDBOSC_KILLFOCUS
);
1635 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1636 return CDRF_DODEFAULT
;
1638 case NM_RELEASEDCAPTURE
:
1639 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1643 TRACE("-- NM_CLICK %p\n", this);
1647 TRACE("-- NM_RCLICK %p\n", this);
1651 TRACE("-- NM_DBLCLK %p\n", this);
1652 OpenSelectedItems();
1656 TRACE("-- NM_RETURN %p\n", this);
1657 OpenSelectedItems();
1661 TRACE("-- HDN_ENDTRACKW %p\n", this);
1662 /*nColumn1 = m_ListView.GetColumnWidth(0);
1663 nColumn2 = m_ListView.GetColumnWidth(1);*/
1666 case LVN_DELETEITEM
:
1667 TRACE("-- LVN_DELETEITEM %p\n", this);
1669 /*delete the pidl because we made a copy of it*/
1670 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1674 case LVN_DELETEALLITEMS
:
1675 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1678 case LVN_INSERTITEM
:
1679 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1682 case LVN_ITEMACTIVATE
:
1683 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1684 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1687 case LVN_COLUMNCLICK
:
1688 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1689 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1690 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1692 m_sortInfo
.bIsAscending
= TRUE
;
1693 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1695 m_ListView
.SortItems(ListViewCompareItems
, this);
1698 case LVN_GETDISPINFOA
:
1699 case LVN_GETDISPINFOW
:
1700 TRACE("-- LVN_GETDISPINFO %p\n", this);
1701 pidl
= _PidlByItem(lpdi
->item
);
1703 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1708 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1710 FIXME("failed to get details\n");
1714 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1716 /* shouldn't happen */
1717 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1718 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1719 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1721 else /* LVN_GETDISPINFOW */
1723 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1724 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1732 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1734 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1736 if(lpdi
->item
.mask
& LVIF_STATE
)
1738 ULONG attributes
= SFGAO_HIDDEN
;
1739 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1741 if (attributes
& SFGAO_HIDDEN
)
1743 lpdi
->item
.state
|= LVIS_CUT
;
1747 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1750 case LVN_ITEMCHANGED
:
1751 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1752 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1757 case LVN_BEGINRDRAG
:
1758 TRACE("-- LVN_BEGINDRAG\n");
1760 if (GetSelections())
1762 CComPtr
<IDataObject
> pda
;
1763 DWORD dwAttributes
= SFGAO_CANLINK
;
1764 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1766 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1768 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1770 if (dwAttributes
& SFGAO_CANLINK
)
1772 dwEffect
|= DROPEFFECT_LINK
;
1776 CComPtr
<IAsyncOperation
> piaso
;
1777 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1779 piaso
->SetAsyncMode(TRUE
);
1783 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1788 case LVN_BEGINLABELEDITW
:
1790 DWORD dwAttr
= SFGAO_CANRENAME
;
1791 pidl
= _PidlByItem(lpdi
->item
);
1793 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1795 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1796 if (SFGAO_CANRENAME
& dwAttr
)
1804 case LVN_ENDLABELEDITW
:
1806 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1808 m_isEditing
= FALSE
;
1810 if (lpdi
->item
.pszText
)
1815 pidl
= _PidlByItem(lpdi
->item
);
1816 PITEMID_CHILD pidlNew
;
1817 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1819 if (SUCCEEDED(hr
) && pidlNew
)
1821 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1822 lvItem
.iItem
= lpdi
->item
.iItem
;
1823 lvItem
.iSubItem
= 0;
1824 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
1825 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
1826 m_ListView
.SetItem(&lvItem
);
1827 m_ListView
.Update(lpdi
->item
.iItem
);
1836 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1844 * This is just a quick hack to make the desktop work correctly.
1845 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
1846 * a folder should know if it should update upon a change notification.
1847 * It is exported by merged folders at a minimum.
1849 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
1851 if (!pidl1
|| !pidl2
)
1853 if (ILIsParent(pidl1
, pidl2
, TRUE
))
1856 if (_ILIsDesktop(pidl1
))
1858 PIDLIST_ABSOLUTE deskpidl
;
1859 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
1860 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
1866 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
1867 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
1877 /**********************************************************
1878 * ShellView_OnChange()
1880 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1882 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
1883 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
1884 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
1886 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1888 switch (lParam
&~ SHCNE_INTERRUPT
)
1894 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
1896 LV_AddItem(ILFindLastID(Pidls
[0]));
1900 LV_ProdItem(ILFindLastID(Pidls
[0]));
1908 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1911 case SHCNE_RENAMEFOLDER
:
1912 case SHCNE_RENAMEITEM
:
1913 if (bParent0
&& bParent1
)
1914 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
1916 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1918 LV_AddItem(ILFindLastID(Pidls
[1]));
1921 case SHCNE_UPDATEITEM
:
1923 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
1926 case SHCNE_UPDATEDIR
:
1933 /**********************************************************
1934 * CDefView::OnCustomItem
1936 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1941 ERR("no menu!!!\n");
1946 HRESULT hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
1947 if (SUCCEEDED(hres
))
1953 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1955 /* Wallpaper setting affects drop shadows effect */
1956 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1962 /**********************************************************
1963 * CDefView::OnInitMenuPopup
1965 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1967 MENUITEMINFOW mii
= { 0 };
1968 HMENU hSubmenu
= (HMENU
) wParam
;
1970 TRACE("OnInitMenuPopup lParam=%d\n", lParam
);
1972 mii
.cbSize
= sizeof(mii
);
1973 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1975 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1977 TRACE("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1981 UINT menuItemId
= mii
.wID
;
1983 if (mii
.hSubMenu
!= hSubmenu
)
1985 TRACE("OnInitMenuPopup submenu does not match!!!!\n");
1989 TRACE("OnInitMenuPopup id=%d\n", menuItemId
);
1993 case FCIDM_MENU_FILE
:
1994 PrepareShowFileMenu(hSubmenu
);
1996 case FCIDM_MENU_EDIT
:
1997 //PrepareShowEditMenu(hSubmenu);
1999 case FCIDM_MENU_VIEW
:
2000 PrepareShowViewMenu(hSubmenu
);
2007 /**********************************************************
2010 * The INTERFACE of the IShellView object
2013 **********************************************************
2016 /**********************************************************
2017 * ShellView_GetWindow
2019 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2021 TRACE("(%p)\n", this);
2028 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2030 FIXME("(%p) stub\n", this);
2035 /**********************************************************
2036 * IShellView_TranslateAccelerator
2039 * use the accel functions
2041 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2046 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2048 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2051 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
2054 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2057 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2059 FIXME("(%p) stub\n", this);
2064 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2067 CHAR szName[MAX_PATH];
2070 int nPartArray
[1] = { -1};
2072 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2074 /*don't do anything if the state isn't really changing*/
2075 if (m_uState
== uState
)
2080 /*OnActivate handles the menu merging and internal state*/
2083 /*only do This if we are active*/
2084 if (uState
!= SVUIA_DEACTIVATE
)
2088 GetFolderPath is not a method of IShellFolder
2089 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2091 /* set the number of parts */
2092 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2094 /* set the text for the parts */
2096 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2103 HRESULT WINAPI
CDefView::Refresh()
2105 TRACE("(%p)\n", this);
2107 m_ListView
.DeleteAllItems();
2113 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2115 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2119 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2122 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2123 if (prcView
!= NULL
)
2124 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2126 /* Validate the Shell Browser */
2127 if (psb
== NULL
|| m_hWnd
)
2128 return E_UNEXPECTED
;
2130 /*set up the member variables*/
2131 m_pShellBrowser
= psb
;
2132 m_FolderSettings
= *lpfs
;
2134 /*get our parent window*/
2135 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2137 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2138 m_pCommDlgBrowser
= NULL
;
2139 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2141 TRACE("-- CommDlgBrowser\n");
2144 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2155 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2160 m_hMenu
= CreateMenu();
2161 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2162 TRACE("-- after fnInsertMenusSB\n");
2170 HRESULT WINAPI
CDefView::DestroyViewWindow()
2172 TRACE("(%p)\n", this);
2174 /*Make absolutely sure all our UI is cleaned up.*/
2175 UIActivate(SVUIA_DEACTIVATE
);
2179 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2185 DestroyMenu(m_hView
);
2191 DestroyMenu(m_hMenu
);
2197 m_ListView
.DestroyWindow();
2205 m_pShellBrowser
.Release();
2206 m_pCommDlgBrowser
.Release();
2211 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2213 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2214 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2217 return E_INVALIDARG
;
2219 *lpfs
= m_FolderSettings
;
2223 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2225 FIXME("(%p) stub\n", this);
2230 HRESULT WINAPI
CDefView::SaveViewState()
2232 FIXME("(%p) stub\n", this);
2237 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2241 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2243 i
= LV_FindItemByPidl(pidl
);
2247 if(uFlags
& SVSI_ENSUREVISIBLE
)
2248 m_ListView
.EnsureVisible(i
, FALSE
);
2250 LVITEMW lvItem
= {0};
2251 lvItem
.mask
= LVIF_STATE
;
2252 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2254 while (m_ListView
.GetItem(&lvItem
))
2256 if (lvItem
.iItem
== i
)
2258 if (uFlags
& SVSI_SELECT
)
2259 lvItem
.state
|= LVIS_SELECTED
;
2261 lvItem
.state
&= ~LVIS_SELECTED
;
2263 if (uFlags
& SVSI_FOCUSED
)
2264 lvItem
.state
&= ~LVIS_FOCUSED
;
2268 if (uFlags
& SVSI_DESELECTOTHERS
)
2269 lvItem
.state
&= ~LVIS_SELECTED
;
2272 m_ListView
.SetItem(&lvItem
);
2276 if(uFlags
& SVSI_EDIT
)
2277 m_ListView
.EditLabel(i
);
2282 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2284 HRESULT hr
= E_NOINTERFACE
;
2286 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2292 case SVGIO_BACKGROUND
:
2293 if (IsEqualIID(riid
, IID_IContextMenu
))
2295 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2300 hr
= CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, &pcm
);
2307 case SVGIO_SELECTION
:
2309 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2313 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2318 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2320 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2323 return E_INVALIDARG
;
2325 *pViewMode
= m_FolderSettings
.ViewMode
;
2329 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2332 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2334 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2335 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2336 return E_INVALIDARG
;
2338 /* Windows before Vista uses LVM_SETVIEW and possibly
2339 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2340 while later versions seem to accomplish this through other
2348 dwStyle
= LVS_REPORT
;
2351 dwStyle
= LVS_SMALLICON
;
2358 FIXME("ViewMode %d not implemented\n", ViewMode
);
2364 SetStyle(dwStyle
, LVS_TYPEMASK
);
2366 /* This will not necessarily be the actual mode set above.
2367 This mimics the behavior of Windows XP. */
2368 m_FolderSettings
.ViewMode
= ViewMode
;
2373 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2375 if (m_pSFParent
== NULL
)
2378 return m_pSFParent
->QueryInterface(riid
, ppv
);
2381 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2383 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2386 *ppidl
= ILClone(pidl
);
2391 return E_INVALIDARG
;
2394 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2396 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2398 if (uFlags
!= SVGIO_ALLVIEW
)
2399 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2401 *pcItems
= m_ListView
.GetItemCount();
2406 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2411 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2413 TRACE("(%p)->(%p)\n", this, piItem
);
2415 *piItem
= m_ListView
.GetSelectionMark();
2420 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2422 TRACE("(%p)->(%p)\n", this, piItem
);
2424 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2429 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2434 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2436 TRACE("(%p)->(%p)\n", this, ppt
);
2444 m_ListView
.GetItemSpacing(spacing
);
2446 ppt
->x
= spacing
.cx
;
2447 ppt
->y
= spacing
.cy
;
2453 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2458 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2463 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2467 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2470 lvItem
.stateMask
= LVIS_SELECTED
;
2472 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2473 m_ListView
.EnsureVisible(iItem
, 0);
2476 if (dwFlags
& SVSI_DESELECTOTHERS
)
2477 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2480 if (dwFlags
& SVSI_SELECT
)
2481 lvItem
.state
|= LVIS_SELECTED
;
2483 if (dwFlags
& SVSI_FOCUSED
)
2484 lvItem
.stateMask
|= LVIS_FOCUSED
;
2486 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2488 if (dwFlags
& SVSI_EDIT
)
2489 m_ListView
.EditLabel(iItem
);
2494 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2499 /**********************************************************
2500 * IShellView2 implementation
2503 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2505 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2509 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2511 FIXME("(%p)->(%p) stub\n", this, view_params
);
2515 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2517 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2521 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2523 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2527 /**********************************************************
2528 * IShellFolderView implementation
2530 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2532 FIXME("(%p)->(%ld) stub\n", this, sort
);
2536 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2538 FIXME("(%p)->(%p) stub\n", this, sort
);
2542 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2544 FIXME("(%p) stub\n", this);
2548 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2550 FIXME("(%p) stub\n", this);
2554 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2556 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2560 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2562 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2563 return Item(item
, pidl
);
2566 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2569 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2573 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2574 m_ListView
.DeleteItem(*item
);
2579 m_ListView
.DeleteAllItems();
2585 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2587 TRACE("(%p)->(%p)\n", this, count
);
2588 *count
= m_ListView
.GetItemCount();
2592 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2594 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2598 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2600 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2604 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2606 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2610 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2612 TRACE("(%p)->(%d)\n", this, redraw
);
2613 m_ListView
.SetRedraw(redraw
);
2617 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2619 FIXME("(%p)->(%p) stub\n", this, count
);
2623 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2625 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2627 *items
= GetSelections();
2631 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2634 return E_OUTOFMEMORY
;
2637 /* it's documented that caller shouldn't PIDLs, only array itself */
2638 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2644 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2646 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2650 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2652 FIXME("(%p)->(%p) stub\n", this, pt
);
2656 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2658 FIXME("(%p)->(%p) stub\n", this, pt
);
2662 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2664 TRACE("(%p)->(%p)\n", this, obj
);
2668 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2670 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2674 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2676 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2680 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2682 FIXME("(%p)->(%d) stub\n", this, move
);
2686 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2688 FIXME("(%p)->(%p) stub\n", this, obj
);
2692 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2694 FIXME("(%p)->(%p) stub\n", this, spacing
);
2698 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2700 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2704 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2706 FIXME("(%p)->(%d) stub\n", this, flags
);
2710 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2712 TRACE("(%p)->(%p)\n", this, support
);
2716 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2718 FIXME("(%p)->(%p) stub\n", this, disp
);
2722 /**********************************************************
2723 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2725 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2727 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2728 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2731 return E_INVALIDARG
;
2733 for (UINT i
= 0; i
< cCmds
; i
++)
2735 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2736 prgCmds
[i
].cmdf
= 0;
2739 return OLECMDERR_E_UNKNOWNGROUP
;
2742 /**********************************************************
2743 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2745 * nCmdID is the OLECMDID_* enumeration
2747 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2749 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2750 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2753 return OLECMDERR_E_UNKNOWNGROUP
;
2755 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
2757 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
2759 if (V_VT(pvaIn
) != VT_INT_PTR
)
2760 return OLECMDERR_E_NOTSUPPORTED
;
2764 params
.cbSize
= sizeof(params
);
2765 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
2767 HMENU hView
= m_hView
;
2769 hView
= CreatePopupMenu();
2770 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_BIGICON
, L
"Big!");
2771 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_SMALLICON
, L
"Small!");
2772 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_LISTVIEW
, L
"List!");
2773 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_REPORTVIEW
, L
"Report!");
2778 PrepareShowViewMenu(hView
);
2780 TrackPopupMenuEx(hView
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
2783 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
2784 V_VT(pvaOut
) = VT_I4
;
2785 V_I4(pvaOut
) = 0x403;
2789 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2791 (nCmdexecopt
== 4) && pvaOut
)
2794 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2799 return OLECMDERR_E_UNKNOWNGROUP
;
2802 /**********************************************************
2803 * ISVDropTarget implementation
2806 /******************************************************************************
2807 * drag_notify_subitem [Internal]
2809 * Figure out the shellfolder object, which is currently under the mouse cursor
2810 * and notify it via the IDropTarget interface.
2813 #define SCROLLAREAWIDTH 20
2815 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2817 LVHITTESTINFO htinfo
;
2822 /* Map from global to client coordinates and query the index of the listview-item, which is
2823 * currently under the mouse cursor. */
2826 htinfo
.flags
= LVHT_ONITEM
;
2827 ::ScreenToClient(m_ListView
, &htinfo
.pt
);
2828 lResult
= m_ListView
.HitTest(&htinfo
);
2830 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2831 ::GetClientRect(m_ListView
, &clientRect
);
2832 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2833 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2834 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2836 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2837 if (m_cScrollDelay
== 0)
2839 /* Mouse did hover another 250 ms over the scroll-area */
2840 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2841 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
2843 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2844 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
2846 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2847 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
2849 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2850 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
2855 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2858 m_ptLastMousePos
= htinfo
.pt
;
2860 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2861 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2862 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2864 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2865 if (m_pCurDropTarget
)
2867 m_pCurDropTarget
->DragLeave();
2868 m_pCurDropTarget
.Release();
2871 m_iDragOverItem
= lResult
;
2874 /* We are not above one of the listview's subitems. Bind to the parent folder's
2875 * DropTarget interface. */
2876 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2880 /* Query the relative PIDL of the shellfolder object represented by the currently
2881 * dragged over listview-item ... */
2882 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
2884 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2885 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2888 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2892 /* Notify the item just entered via DragEnter. */
2893 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2896 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2898 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2899 m_pCurDataObject
= pDataObject
;
2900 pDataObject
->AddRef();
2902 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2905 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2907 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2910 HRESULT WINAPI
CDefView::DragLeave()
2912 if (m_pCurDropTarget
)
2914 m_pCurDropTarget
->DragLeave();
2915 m_pCurDropTarget
.Release();
2918 if (m_pCurDataObject
!= NULL
)
2920 m_pCurDataObject
.Release();
2923 m_iDragOverItem
= 0;
2928 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2930 if (m_pCurDropTarget
)
2932 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2933 m_pCurDropTarget
.Release();
2936 m_pCurDataObject
.Release();
2937 m_iDragOverItem
= 0;
2941 /**********************************************************
2942 * ISVDropSource implementation
2945 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2947 TRACE("(%p)\n", this);
2950 return DRAGDROP_S_CANCEL
;
2951 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2952 return DRAGDROP_S_DROP
;
2957 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2959 TRACE("(%p)\n", this);
2961 return DRAGDROP_S_USEDEFAULTCURSORS
;
2964 /**********************************************************
2965 * ISVViewObject implementation
2968 HRESULT WINAPI
CDefView::Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
, BOOL (CALLBACK
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
)
2970 FIXME("Stub: this=%p\n", this);
2975 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2977 FIXME("Stub: this=%p\n", this);
2982 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2984 FIXME("Stub: this=%p\n", this);
2989 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2991 FIXME("Stub: this=%p\n", this);
2996 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2998 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
3000 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3001 m_pAdvSink
= pAdvSink
;
3002 m_dwAspects
= aspects
;
3008 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3010 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3014 *ppAdvSink
= m_pAdvSink
;
3015 m_pAdvSink
.p
->AddRef();
3019 *pAspects
= m_dwAspects
;
3027 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3029 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3030 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3031 else if(IsEqualIID(guidService
, SID_IFolderView
))
3032 return QueryInterface(riid
, ppvObject
);
3034 return E_NOINTERFACE
;
3037 HRESULT
CDefView::_MergeToolbar()
3039 CComPtr
<IExplorerToolbar
> ptb
; // [sp+8h] [bp-4h]@1
3043 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3047 m_Category
= CGID_DefViewFrame
;
3049 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3057 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3064 /**********************************************************
3065 * IShellView_Constructor
3067 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
3069 return ShellObjectCreatorInit
<CDefView
>(pFolder
, IID_IShellView
, newView
);
3072 HRESULT WINAPI
CDefView_Constructor(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3074 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);