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: Load/Save the view state from/into the stream provided by
29 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
31 * FIXME: ShellView_FillList: consider sort orders
33 * FIXME: implement the drag and drop in the old (msg-based) way
35 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
40 #include "wine/port.h"
47 #define NONAMELESSUNION
48 #define NONAMELESSSTRUCT
61 #include "undocshell.h"
63 #include "wine/debug.h"
67 #include "shell32_main.h"
68 #include "shellfolder.h"
70 WINE_DEFAULT_DEBUG_CHANNEL(shell);
72 static const WCHAR SV_CLASS_NAME[] = {'S','H','E','L','L','D','L','L','_','D','e','f','V','i','e','w',0};
78 }LISTVIEW_SORT_INFO, *LPLISTVIEW_SORT_INFO;
82 IShellView2 IShellView2_iface;
83 IOleCommandTarget IOleCommandTarget_iface;
84 IDropTarget IDropTarget_iface;
85 IDropSource IDropSource_iface;
86 IViewObject IViewObject_iface;
87 IFolderView IFolderView_iface;
88 IShellFolderView IShellFolderView_iface;
90 IShellFolder* pSFParent;
91 IShellFolder2* pSF2Parent;
92 IShellBrowser* pShellBrowser;
93 ICommDlgBrowser* pCommDlgBrowser;
94 HWND hWnd; /* SHELLDLL_DefView */
95 HWND hWndList; /* ListView control */
97 FOLDERSETTINGS FolderSettings;
102 LISTVIEW_SORT_INFO ListViewSortInfo;
103 ULONG hNotify; /* change notification handle */
107 IAdviseSink *pAdvSink;
108 IDropTarget* pCurDropTarget; /* The sub-item, which is currently dragged over */
109 IDataObject* pCurDataObject; /* The dragged data-object */
110 LONG iDragOverItem; /* Dragged over item's index, iff pCurDropTarget != NULL */
111 UINT cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
112 POINT ptLastMousePos; /* Mouse position at last DragOver call */
115 static const IShellView2Vtbl svvt;
116 static const IOleCommandTargetVtbl ctvt;
117 static const IDropTargetVtbl dtvt;
118 static const IDropSourceVtbl dsvt;
119 static const IViewObjectVtbl vovt;
120 static const IFolderViewVtbl fviewvt;
121 static const IShellFolderViewVtbl shellfolderviewvt;
123 static inline IShellViewImpl *impl_from_IShellView2(IShellView2 *iface)
125 return CONTAINING_RECORD(iface, IShellViewImpl, IShellView2_iface);
128 static inline IShellViewImpl *impl_from_IOleCommandTarget(IOleCommandTarget *iface)
130 return CONTAINING_RECORD(iface, IShellViewImpl, IOleCommandTarget_iface);
133 static inline IShellViewImpl *impl_from_IDropTarget(IDropTarget *iface)
135 return CONTAINING_RECORD(iface, IShellViewImpl, IDropTarget_iface);
138 static inline IShellViewImpl *impl_from_IDropSource(IDropSource *iface)
140 return CONTAINING_RECORD(iface, IShellViewImpl, IDropSource_iface);
143 static inline IShellViewImpl *impl_from_IViewObject(IViewObject *iface)
145 return CONTAINING_RECORD(iface, IShellViewImpl, IViewObject_iface);
148 static inline IShellViewImpl *impl_from_IFolderView(IFolderView *iface)
150 return CONTAINING_RECORD(iface, IShellViewImpl, IFolderView_iface);
153 static inline IShellViewImpl *impl_from_IShellFolderView(IShellFolderView *iface)
155 return CONTAINING_RECORD(iface, IShellViewImpl, IShellFolderView_iface);
158 /* ListView Header IDs */
159 #define LISTVIEW_COLUMN_NAME 0
160 #define LISTVIEW_COLUMN_SIZE 1
161 #define LISTVIEW_COLUMN_TYPE 2
162 #define LISTVIEW_COLUMN_TIME 3
163 #define LISTVIEW_COLUMN_ATTRIB 4
166 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
167 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
168 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
170 #define ID_LISTVIEW 1
172 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
175 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
176 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
177 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
180 Items merged into the toolbar and the filemenu
189 } MYTOOLINFO, *LPMYTOOLINFO;
191 static const MYTOOLINFO Tools[] =
193 { FCIDM_SHVIEW_BIGICON, 0, 0, IDS_VIEW_LARGE, TBSTATE_ENABLED, BTNS_BUTTON },
194 { FCIDM_SHVIEW_SMALLICON, 0, 0, IDS_VIEW_SMALL, TBSTATE_ENABLED, BTNS_BUTTON },
195 { FCIDM_SHVIEW_LISTVIEW, 0, 0, IDS_VIEW_LIST, TBSTATE_ENABLED, BTNS_BUTTON },
196 { FCIDM_SHVIEW_REPORTVIEW, 0, 0, IDS_VIEW_DETAILS, TBSTATE_ENABLED, BTNS_BUTTON },
200 typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
202 /**********************************************************
203 * IShellView_Constructor
205 IShellView * IShellView_Constructor( IShellFolder * pFolder)
206 { IShellViewImpl * sv;
207 sv=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl));
209 sv->IShellView2_iface.lpVtbl = &svvt;
210 sv->IOleCommandTarget_iface.lpVtbl = &ctvt;
211 sv->IDropTarget_iface.lpVtbl = &dtvt;
212 sv->IDropSource_iface.lpVtbl = &dsvt;
213 sv->IViewObject_iface.lpVtbl = &vovt;
214 sv->IFolderView_iface.lpVtbl = &fviewvt;
215 sv->IShellFolderView_iface.lpVtbl = &shellfolderviewvt;
217 sv->pSFParent = pFolder;
218 if(pFolder) IShellFolder_AddRef(pFolder);
219 IShellFolder_QueryInterface(sv->pSFParent, &IID_IShellFolder2, (LPVOID*)&sv->pSF2Parent);
221 sv->pCurDropTarget = NULL;
222 sv->pCurDataObject = NULL;
223 sv->iDragOverItem = 0;
224 sv->cScrollDelay = 0;
225 sv->ptLastMousePos.x = 0;
226 sv->ptLastMousePos.y = 0;
228 TRACE("(%p)->(%p)\n",sv, pFolder);
229 return (IShellView *) sv;
232 /**********************************************************
234 * ##### helperfunctions for communication with ICommDlgBrowser #####
236 static BOOL IsInCommDlg(IShellViewImpl * This)
237 { return(This->pCommDlgBrowser != NULL);
240 static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
244 if ( IsInCommDlg(This) )
246 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
247 ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl);
248 TRACE("--0x%08x\n", ret);
253 static HRESULT OnDefaultCommand(IShellViewImpl * This)
255 HRESULT ret = S_FALSE;
257 if (IsInCommDlg(This))
259 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
260 ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This);
261 TRACE("-- returns %08x\n", ret);
266 static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
268 HRESULT ret = S_FALSE;
270 if (IsInCommDlg(This))
272 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
273 ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags);
278 /**********************************************************
279 * set the toolbar of the filedialog buttons
281 * - activates the buttons from the shellbrowser according to
284 static void CheckToolbar(IShellViewImpl * This)
290 if (IsInCommDlg(This))
292 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
293 FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
294 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
295 FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
296 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
297 FCIDM_TB_SMALLICON, TRUE, &result);
298 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
299 FCIDM_TB_REPORTVIEW, TRUE, &result);
303 /**********************************************************
305 * ##### helperfunctions for initializing the view #####
307 /**********************************************************
308 * change the style of the listview control
310 static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
314 TRACE("(%p)\n", This);
316 tmpstyle = GetWindowLongW(This->hWndList, GWL_STYLE);
317 SetWindowLongW(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
320 static DWORD ViewModeToListStyle(UINT ViewMode)
324 TRACE("%d\n", ViewMode);
328 case FVM_ICON: dwStyle = LVS_ICON; break;
329 case FVM_DETAILS: dwStyle = LVS_REPORT; break;
330 case FVM_SMALLICON: dwStyle = LVS_SMALLICON; break;
331 case FVM_LIST: dwStyle = LVS_LIST; break;
334 FIXME("ViewMode %d not implemented\n", ViewMode);
343 /**********************************************************
344 * ShellView_CreateList()
346 * - creates the list view window
348 static BOOL ShellView_CreateList (IShellViewImpl * This)
349 { DWORD dwStyle, dwExStyle;
353 dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
354 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE;
355 dwExStyle = WS_EX_CLIENTEDGE;
357 dwStyle |= ViewModeToListStyle(This->FolderSettings.ViewMode);
359 if (This->FolderSettings.fFlags & FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE;
360 if (This->FolderSettings.fFlags & FWF_DESKTOP)
361 This->FolderSettings.fFlags |= FWF_NOCLIENTEDGE | FWF_NOSCROLL;
362 if (This->FolderSettings.fFlags & FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
363 if (This->FolderSettings.fFlags & FWF_NOCLIENTEDGE)
364 dwExStyle &= ~WS_EX_CLIENTEDGE;
366 This->hWndList=CreateWindowExW( dwExStyle,
379 This->ListViewSortInfo.bIsAscending = TRUE;
380 This->ListViewSortInfo.nHeaderID = -1;
381 This->ListViewSortInfo.nLastHeaderID = -1;
383 if (This->FolderSettings.fFlags & FWF_DESKTOP) {
385 * FIXME: look at the registry value
386 * HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewShadow
387 * and activate drop shadows if necessary
390 SendMessageW(This->hWndList, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
392 SendMessageW(This->hWndList, LVM_SETTEXTBKCOLOR, 0, GetSysColor(COLOR_DESKTOP));
394 SendMessageW(This->hWndList, LVM_SETTEXTCOLOR, 0, RGB(255,255,255));
397 /* UpdateShellSettings(); */
401 /**********************************************************
402 * ShellView_InitList()
404 * - adds all needed columns to the shellview
406 static void ShellView_InitList(IShellViewImpl *This)
408 IShellDetails *details = NULL;
415 TRACE("(%p)\n", This);
417 SendMessageW(This->hWndList, LVM_DELETEALLITEMS, 0, 0);
418 SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ShellSmallIconList);
419 SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)ShellBigIconList);
421 lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
422 lvColumn.pszText = nameW;
424 if (!This->pSF2Parent)
426 hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IShellDetails, (void**)&details);
429 WARN("IShellFolder2/IShellDetails not supported\n");
436 if (This->pSF2Parent)
437 hr = IShellFolder2_GetDetailsOf(This->pSF2Parent, NULL, i, &sd);
439 hr = IShellDetails_GetDetailsOf(details, NULL, i, &sd);
440 if (FAILED(hr)) break;
442 lvColumn.fmt = sd.fmt;
443 lvColumn.cx = sd.cxChar*8; /* chars->pixel */
444 StrRetToStrNW(nameW, sizeof(nameW)/sizeof(WCHAR), &sd.str, NULL);
445 SendMessageW(This->hWndList, LVM_INSERTCOLUMNW, i, (LPARAM) &lvColumn);
448 if (details) IShellDetails_Release(details);
451 /**********************************************************
452 * ShellView_CompareItems()
455 * internal, CALLBACK for DSA_Sort
457 static INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
460 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
462 if(!lpData) return 0;
464 ret = (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2));
465 TRACE("ret=%i\n",ret);
469 /*************************************************************************
470 * ShellView_ListViewCompareItems
472 * Compare Function for the Listview (FileOpen Dialog)
475 * lParam1 [I] the first ItemIdList to compare with
476 * lParam2 [I] the second ItemIdList to compare with
477 * lpData [I] The column ID for the header Ctrl to process
480 * A negative value if the first item should precede the second,
481 * a positive value if the first item should follow the second,
482 * or zero if the two items are equivalent
485 * FIXME: function does what ShellView_CompareItems is supposed to do.
486 * unify it and figure out how to use the undocumented first parameter
487 * of IShellFolder_CompareIDs to do the job this function does and
488 * move this code to IShellFolder.
489 * make LISTVIEW_SORT_INFO obsolete
490 * the way this function works is only usable if we had only
491 * filesystemfolders (25/10/99 jsch)
493 static INT CALLBACK ShellView_ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
497 char strName1[MAX_PATH], strName2[MAX_PATH];
498 BOOL bIsFolder1, bIsFolder2,bIsBothFolder;
499 LPITEMIDLIST pItemIdList1 = lParam1;
500 LPITEMIDLIST pItemIdList2 = lParam2;
501 LISTVIEW_SORT_INFO *pSortInfo = (LPLISTVIEW_SORT_INFO) lpData;
504 bIsFolder1 = _ILIsFolder(pItemIdList1);
505 bIsFolder2 = _ILIsFolder(pItemIdList2);
506 bIsBothFolder = bIsFolder1 && bIsFolder2;
508 /* When sorting between a File and a Folder, the Folder gets sorted first */
509 if( (bIsFolder1 || bIsFolder2) && !bIsBothFolder)
511 nDiff = bIsFolder1 ? -1 : 1;
515 /* Sort by Time: Folders or Files can be sorted */
517 if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME)
519 _ILGetFileDateTime(pItemIdList1, &fd1);
520 _ILGetFileDateTime(pItemIdList2, &fd2);
521 nDiff = CompareFileTime(&fd2, &fd1);
523 /* Sort by Attribute: Folder or Files can be sorted */
524 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB)
526 _ILGetFileAttributes(pItemIdList1, strName1, MAX_PATH);
527 _ILGetFileAttributes(pItemIdList2, strName2, MAX_PATH);
528 nDiff = lstrcmpiA(strName1, strName2);
530 /* Sort by FileName: Folder or Files can be sorted */
531 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder)
534 _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
535 _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
536 nDiff = lstrcmpiA(strName1, strName2);
538 /* Sort by File Size, Only valid for Files */
539 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE)
541 nDiff = (INT)(_ILGetFileSize(pItemIdList1, NULL, 0) - _ILGetFileSize(pItemIdList2, NULL, 0));
543 /* Sort by File Type, Only valid for Files */
544 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE)
547 _ILGetFileType(pItemIdList1, strName1, MAX_PATH);
548 _ILGetFileType(pItemIdList2, strName2, MAX_PATH);
549 nDiff = lstrcmpiA(strName1, strName2);
552 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
556 _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
557 _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
558 nDiff = lstrcmpiA(strName1, strName2);
561 if(!pSortInfo->bIsAscending)
570 /**********************************************************
571 * LV_FindItemByPidl()
573 static int LV_FindItemByPidl(
574 IShellViewImpl * This,
579 lvItem.mask = LVIF_PARAM;
580 for(lvItem.iItem = 0;
581 SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
584 LPITEMIDLIST currentpidl = (LPITEMIDLIST) lvItem.lParam;
585 HRESULT hr = IShellFolder_CompareIDs(This->pSFParent, 0, pidl, currentpidl);
586 if(SUCCEEDED(hr) && !HRESULT_CODE(hr))
594 /**********************************************************
597 static BOOLEAN LV_AddItem(IShellViewImpl * This, LPCITEMIDLIST pidl)
601 TRACE("(%p)(pidl=%p)\n", This, pidl);
603 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
604 lvItem.iItem = SendMessageW(This->hWndList, LVM_GETITEMCOUNT, 0, 0); /*add the item to the end of the list*/
606 lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/
607 lvItem.pszText = LPSTR_TEXTCALLBACKW; /*get text on a callback basis*/
608 lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
609 return (-1==ListView_InsertItemW(This->hWndList, &lvItem))? FALSE: TRUE;
612 /**********************************************************
615 static BOOLEAN LV_RenameItem(IShellViewImpl * This, LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew )
620 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", This, pidlOld, pidlNew);
622 nItem = LV_FindItemByPidl(This, ILFindLastID(pidlOld));
625 lvItem.mask = LVIF_PARAM; /* only the pidl */
626 lvItem.iItem = nItem;
627 SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
629 SHFree((LPITEMIDLIST)lvItem.lParam);
630 lvItem.mask = LVIF_PARAM;
631 lvItem.iItem = nItem;
632 lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidlNew)); /* set the item's data */
633 SendMessageW(This->hWndList, LVM_SETITEMW, 0, (LPARAM) &lvItem);
634 SendMessageW(This->hWndList, LVM_UPDATE, nItem, 0);
635 return TRUE; /* FIXME: better handling */
639 /**********************************************************
640 * ShellView_FillList()
642 * - gets the objectlist from the shellfolder
644 * - fills the list into the view
647 static INT CALLBACK fill_list( LPVOID ptr, LPVOID arg )
649 LPITEMIDLIST pidl = ptr;
650 IShellViewImpl *This = arg;
651 /* in a commdlg This works as a filemask*/
652 if ( IncludeObject(This, pidl)==S_OK ) LV_AddItem(This, pidl);
657 static HRESULT ShellView_FillList(IShellViewImpl *This)
659 IShellFolderView *folderview = &This->IShellFolderView_iface;
660 LPENUMIDLIST pEnumIDList;
666 TRACE("(%p)\n", This);
668 /* get the itemlist from the shfolder*/
669 hr = IShellFolder_EnumObjects(This->pSFParent, This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
670 if (hr != S_OK) return hr;
672 /* create a pointer array */
673 hdpa = DPA_Create(16);
676 IEnumIDList_Release(pEnumIDList);
677 return E_OUTOFMEMORY;
680 /* copy the items into the array*/
681 while((S_OK == IEnumIDList_Next(pEnumIDList, 1, &pidl, &fetched)) && fetched)
683 if (DPA_InsertPtr(hdpa, DPA_GetPtrCount(hdpa), pidl) == -1)
690 DPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent);
692 IShellFolderView_SetRedraw(folderview, FALSE);
693 DPA_DestroyCallback(hdpa, fill_list, This);
694 IShellFolderView_SetRedraw(folderview, TRUE);
696 IEnumIDList_Release(pEnumIDList);
701 /**********************************************************
702 * ShellView_OnCreate()
704 static LRESULT ShellView_OnCreate(IShellViewImpl *This)
706 IShellView2 *iface = &This->IShellView2_iface;
707 static const WCHAR accel_nameW[] = {'s','h','v','_','a','c','c','e','l',0};
708 IPersistFolder2 *ppf2;
712 TRACE("(%p)\n", This);
714 if (ShellView_CreateList(This))
716 ShellView_InitList(This);
717 ShellView_FillList(This);
720 hr = IShellView2_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pdt);
723 RegisterDragDrop(This->hWnd, pdt);
724 IDropTarget_Release(pdt);
727 /* register for receiving notifications */
728 hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2);
731 LPITEMIDLIST raw_pidl;
732 SHChangeNotifyEntry ntreg;
734 hr = IPersistFolder2_GetCurFolder(ppf2, (LPITEMIDLIST*)&raw_pidl);
737 LPITEMIDLIST computer_pidl;
738 SHGetFolderLocation(NULL,CSIDL_DRIVES,NULL,0,&computer_pidl);
739 if(ILIsParent(computer_pidl,raw_pidl,FALSE))
741 /* Normalize the pidl to unixfs to workaround an issue with
742 * sending notifications on dos paths
744 WCHAR path[MAX_PATH];
745 SHGetPathFromIDListW(raw_pidl,path);
746 SHParseDisplayName(path,NULL,(LPITEMIDLIST*)&ntreg.pidl,0,NULL);
750 ntreg.pidl = raw_pidl;
751 ntreg.fRecursive = TRUE;
752 This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNRF_InterruptLevel, SHCNE_ALLEVENTS,
753 SHV_CHANGE_NOTIFY, 1, &ntreg);
754 SHFree((LPITEMIDLIST)ntreg.pidl);
755 SHFree(computer_pidl);
757 IPersistFolder2_Release(ppf2);
760 This->hAccel = LoadAcceleratorsW(shell32_hInstance, accel_nameW);
765 /**********************************************************
766 * #### Handling of the menus ####
769 /**********************************************************
770 * ShellView_BuildFileMenu()
772 static HMENU ShellView_BuildFileMenu(IShellViewImpl * This)
773 { WCHAR szText[MAX_PATH];
778 TRACE("(%p)\n",This);
780 hSubMenu = CreatePopupMenu();
782 { /*get the number of items in our global array*/
783 for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){}
785 /*add the menu items*/
786 for(i = 0; i < nTools; i++)
788 LoadStringW(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
790 ZeroMemory(&mii, sizeof(mii));
791 mii.cbSize = sizeof(mii);
792 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
794 if(BTNS_SEP != Tools[i].bStyle) /* no separator*/
796 mii.fType = MFT_STRING;
797 mii.fState = MFS_ENABLED;
798 mii.dwTypeData = szText;
799 mii.wID = Tools[i].idCommand;
803 mii.fType = MFT_SEPARATOR;
805 /* tack This item onto the end of the menu */
806 InsertMenuItemW(hSubMenu, (UINT)-1, TRUE, &mii);
809 TRACE("-- return (menu=%p)\n",hSubMenu);
812 /**********************************************************
813 * ShellView_MergeFileMenu()
815 static void ShellView_MergeFileMenu(IShellViewImpl *This, HMENU hSubMenu)
817 TRACE("(%p)->(submenu=%p) stub\n",This,hSubMenu);
821 static const WCHAR dummyW[] = {'d','u','m','m','y','4','5',0};
824 /* insert This item at the beginning of the menu */
826 mii.cbSize = sizeof(mii);
827 mii.fMask = MIIM_ID | MIIM_TYPE;
829 mii.fType = MFT_SEPARATOR;
830 InsertMenuItemW(hSubMenu, 0, TRUE, &mii);
832 mii.cbSize = sizeof(mii);
833 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
834 mii.dwTypeData = (LPWSTR)dummyW;
835 mii.fState = MFS_ENABLED;
836 mii.wID = IDM_MYFILEITEM;
837 mii.fType = MFT_STRING;
838 InsertMenuItemW(hSubMenu, 0, TRUE, &mii);
844 /**********************************************************
845 * ShellView_MergeViewMenu()
848 static void ShellView_MergeViewMenu(IShellViewImpl *This, HMENU hSubMenu)
850 TRACE("(%p)->(submenu=%p)\n",This,hSubMenu);
852 /* add a separator at the correct position in the menu */
855 static const WCHAR menuW[] = {'M','E','N','U','_','0','0','1',0};
856 static const WCHAR viewW[] = {'V','i','e','w',0};
859 memset(&mii, 0, sizeof(mii));
860 mii.cbSize = sizeof(mii);
861 mii.fMask = MIIM_ID | MIIM_TYPE;
863 mii.fType = MFT_SEPARATOR;
864 InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
866 mii.cbSize = sizeof(mii);
867 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;
868 mii.fType = MFT_STRING;
869 mii.dwTypeData = (LPWSTR)viewW;
870 mii.hSubMenu = LoadMenuW(shell32_hInstance, menuW);
871 InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
875 /**********************************************************
876 * ShellView_GetSelections()
878 * - fills the this->apidl list with the selected objects
881 * number of selected items
883 static UINT ShellView_GetSelections(IShellViewImpl * This)
890 This->cidl = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
891 This->apidl = SHAlloc(This->cidl * sizeof(LPITEMIDLIST));
893 TRACE("selected=%i\n", This->cidl);
897 TRACE("-- Items selected =%u\n", This->cidl);
899 lvItem.mask = LVIF_STATE | LVIF_PARAM;
900 lvItem.stateMask = LVIS_SELECTED;
904 while(ListView_GetItemW(This->hWndList, &lvItem) && (i < This->cidl))
906 if(lvItem.state & LVIS_SELECTED)
908 This->apidl[i] = (LPITEMIDLIST)lvItem.lParam;
910 TRACE("-- selected Item found\n");
919 /**********************************************************
920 * ShellView_OpenSelectedItems()
922 static HRESULT ShellView_OpenSelectedItems(IShellViewImpl * This)
924 static UINT CF_IDLIST = 0;
926 IDataObject* selection;
930 LPCITEMIDLIST parent_pidl;
931 WCHAR parent_path[MAX_PATH];
932 LPCWSTR parent_dir = NULL;
936 if (0 == ShellView_GetSelections(This))
940 hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
941 (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,
942 0, (LPVOID *)&selection);
948 CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLISTW);
950 fetc.cfFormat = CF_IDLIST;
952 fetc.dwAspect = DVASPECT_CONTENT;
954 fetc.tymed = TYMED_HGLOBAL;
956 hr = IDataObject_QueryGetData(selection, &fetc);
960 hr = IDataObject_GetData(selection, &fetc, &stgm);
964 pIDList = GlobalLock(stgm.u.hGlobal);
966 parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pIDList+pIDList->aoffset[0]);
967 hr = IShellFolder_GetAttributesOf(This->pSFParent, 1, &parent_pidl, &attribs);
968 if (SUCCEEDED(hr) && (attribs & SFGAO_FILESYSTEM) &&
969 SHGetPathFromIDListW(parent_pidl, parent_path))
971 parent_dir = parent_path;
974 for (i = pIDList->cidl; i > 0; --i)
978 pidl = (LPCITEMIDLIST)((LPBYTE)pIDList+pIDList->aoffset[i]);
980 attribs = SFGAO_FOLDER;
981 hr = IShellFolder_GetAttributesOf(This->pSFParent, 1, &pidl, &attribs);
983 if (SUCCEEDED(hr) && ! (attribs & SFGAO_FOLDER))
985 SHELLEXECUTEINFOW shexinfo;
987 shexinfo.cbSize = sizeof(SHELLEXECUTEINFOW);
988 shexinfo.fMask = SEE_MASK_INVOKEIDLIST; /* SEE_MASK_IDLIST is also possible. */
989 shexinfo.hwnd = NULL;
990 shexinfo.lpVerb = NULL;
991 shexinfo.lpFile = NULL;
992 shexinfo.lpParameters = NULL;
993 shexinfo.lpDirectory = parent_dir;
994 shexinfo.nShow = SW_NORMAL;
995 shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
997 ShellExecuteExW(&shexinfo); /* Discard error/success info */
999 ILFree(shexinfo.lpIDList);
1003 GlobalUnlock(stgm.u.hGlobal);
1004 ReleaseStgMedium(&stgm);
1006 IDataObject_Release(selection);
1011 /**********************************************************
1012 * ShellView_DoContextMenu()
1014 static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault)
1018 BOOL fExplore = FALSE;
1020 LPCONTEXTMENU pContextMenu = NULL;
1021 IContextMenu2 *pCM = NULL;
1022 CMINVOKECOMMANDINFO cmi;
1024 TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
1026 /* look, what's selected and create a context menu object of it*/
1027 if( ShellView_GetSelections(This) )
1029 IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, (LPCITEMIDLIST*)This->apidl,
1030 &IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
1034 TRACE("-- pContextMenu\n");
1035 hMenu = CreatePopupMenu();
1039 /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
1040 if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
1042 TRACE("-- explore mode\n");
1046 /* build the flags depending on what we can do with the selected item */
1047 wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
1049 /* let the ContextMenu merge its items in */
1050 if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
1052 if (This->FolderSettings.fFlags & FWF_DESKTOP)
1053 SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
1057 TRACE("-- get menu default command\n");
1058 uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
1062 TRACE("-- track popup\n");
1063 uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
1068 TRACE("-- uCommand=%u\n", uCommand);
1069 if (uCommand==FCIDM_SHVIEW_OPEN && IsInCommDlg(This))
1071 TRACE("-- dlg: OnDefaultCommand\n");
1072 if (OnDefaultCommand(This) != S_OK)
1074 ShellView_OpenSelectedItems(This);
1079 TRACE("-- explore -- invoke command\n");
1080 ZeroMemory(&cmi, sizeof(cmi));
1081 cmi.cbSize = sizeof(cmi);
1082 cmi.hwnd = This->hWndParent; /* this window has to answer CWM_GETISHELLBROWSER */
1083 cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
1084 IContextMenu_InvokeCommand(pContextMenu, &cmi);
1091 IContextMenu_Release(pContextMenu);
1094 else /* background context menu */
1096 hMenu = CreatePopupMenu();
1098 pCM = ISvBgCm_Constructor(This->pSFParent, FALSE);
1099 IContextMenu2_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
1101 uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
1104 TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
1106 ZeroMemory(&cmi, sizeof(cmi));
1107 cmi.cbSize = sizeof(cmi);
1108 cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
1109 cmi.hwnd = This->hWndParent;
1110 IContextMenu2_InvokeCommand(pCM, &cmi);
1112 IContextMenu2_Release(pCM);
1116 /**********************************************************
1117 * ##### message handling #####
1120 /**********************************************************
1121 * ShellView_OnSize()
1123 static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
1125 TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
1127 /*resize the ListView to fit our window*/
1130 MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
1135 /**********************************************************
1136 * ShellView_OnDeactivate()
1141 static void ShellView_OnDeactivate(IShellViewImpl * This)
1145 if(This->uState != SVUIA_DEACTIVATE)
1149 IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
1150 IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
1151 DestroyMenu(This->hMenu);
1155 This->uState = SVUIA_DEACTIVATE;
1159 /**********************************************************
1160 * ShellView_OnActivate()
1162 static LRESULT ShellView_OnActivate(IShellViewImpl *This, UINT uState)
1164 OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
1167 TRACE("(%p) uState=%x\n",This,uState);
1169 /* don't do anything if the state isn't really changing */
1170 if (This->uState == uState) return S_OK;
1172 ShellView_OnDeactivate(This);
1174 /* only do This if we are active */
1175 if (uState != SVUIA_DEACTIVATE)
1177 /* merge the menus */
1178 This->hMenu = CreateMenu();
1182 static const WCHAR dummyW[] = {'d','u','m','m','y',' ','3','1',0};
1184 IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
1185 TRACE("-- after fnInsertMenusSB\n");
1187 mii.cbSize = sizeof(mii);
1188 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
1189 mii.fType = MFT_STRING;
1190 mii.fState = MFS_ENABLED;
1192 mii.hSubMenu = ShellView_BuildFileMenu(This);
1193 mii.hbmpChecked = NULL;
1194 mii.hbmpUnchecked = NULL;
1196 /* build the top level menu get the menu item's text */
1197 mii.dwTypeData = (LPWSTR)dummyW;
1199 mii.hbmpItem = NULL;
1201 /* insert our menu into the menu bar */
1203 InsertMenuItemW(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
1205 /* get the view menu so we can merge with it */
1206 memset(&mii, 0, sizeof(mii));
1207 mii.cbSize = sizeof(mii);
1208 mii.fMask = MIIM_SUBMENU;
1210 if (GetMenuItemInfoW(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
1211 ShellView_MergeViewMenu(This, mii.hSubMenu);
1213 /* add the items that should only be added if we have the focus */
1214 if (SVUIA_ACTIVATE_FOCUS == uState)
1216 /* get the file menu so we can merge with it */
1217 memset(&mii, 0, sizeof(mii));
1218 mii.cbSize = sizeof(mii);
1219 mii.fMask = MIIM_SUBMENU;
1221 if (GetMenuItemInfoW(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
1222 ShellView_MergeFileMenu(This, mii.hSubMenu);
1225 TRACE("-- before fnSetMenuSB\n");
1226 IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
1229 This->uState = uState;
1234 /**********************************************************
1235 * ShellView_OnSetFocus()
1238 static LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
1242 /* Tell the browser one of our windows has received the focus. This
1243 should always be done before merging menus (OnActivate merges the
1244 menus) if one of our windows has the focus.*/
1246 IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
1247 ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
1249 /* Set the focus to the listview */
1250 SetFocus(This->hWndList);
1252 /* Notify the ICommDlgBrowser interface */
1253 OnStateChange(This,CDBOSC_SETFOCUS);
1258 /**********************************************************
1259 * ShellView_OnKillFocus()
1261 static LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
1263 TRACE("(%p) stub\n",This);
1265 ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
1266 /* Notify the ICommDlgBrowser */
1267 OnStateChange(This,CDBOSC_KILLFOCUS);
1272 /**********************************************************
1273 * ShellView_OnCommand()
1276 * the CmdIDs are the ones from the context menu
1278 static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
1280 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n",This, dwCmdID, dwCmd, hwndCmd);
1284 case FCIDM_SHVIEW_SMALLICON:
1285 This->FolderSettings.ViewMode = FVM_SMALLICON;
1286 SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
1290 case FCIDM_SHVIEW_BIGICON:
1291 This->FolderSettings.ViewMode = FVM_ICON;
1292 SetStyle (This, LVS_ICON, LVS_TYPEMASK);
1296 case FCIDM_SHVIEW_LISTVIEW:
1297 This->FolderSettings.ViewMode = FVM_LIST;
1298 SetStyle (This, LVS_LIST, LVS_TYPEMASK);
1302 case FCIDM_SHVIEW_REPORTVIEW:
1303 This->FolderSettings.ViewMode = FVM_DETAILS;
1304 SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
1308 /* the menu IDs for sorting are 0x30... see shell32.rc */
1313 This->ListViewSortInfo.nHeaderID = dwCmdID - 0x30;
1314 This->ListViewSortInfo.bIsAscending = TRUE;
1315 This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
1316 SendMessageW(This->hWndList, LVM_SORTITEMS, (WPARAM) &This->ListViewSortInfo, (LPARAM)ShellView_ListViewCompareItems);
1320 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID);
1325 /**********************************************************
1326 * ShellView_OnNotify()
1329 static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
1330 { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lpnmh;
1331 NMLVDISPINFOW *lpdi = (NMLVDISPINFOW *)lpnmh;
1334 TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
1339 TRACE("-- NM_SETFOCUS %p\n",This);
1340 ShellView_OnSetFocus(This);
1344 TRACE("-- NM_KILLFOCUS %p\n",This);
1345 ShellView_OnDeactivate(This);
1346 /* Notify the ICommDlgBrowser interface */
1347 OnStateChange(This,CDBOSC_KILLFOCUS);
1351 TRACE("-- NM_CUSTOMDRAW %p\n",This);
1352 return CDRF_DODEFAULT;
1354 case NM_RELEASEDCAPTURE:
1355 TRACE("-- NM_RELEASEDCAPTURE %p\n",This);
1359 TRACE("-- NM_CLICK %p\n",This);
1363 TRACE("-- NM_RCLICK %p\n",This);
1367 TRACE("-- NM_DBLCLK %p\n",This);
1368 if (OnDefaultCommand(This) != S_OK) ShellView_OpenSelectedItems(This);
1372 TRACE("-- NM_RETURN %p\n",This);
1373 if (OnDefaultCommand(This) != S_OK) ShellView_OpenSelectedItems(This);
1377 TRACE("-- HDN_ENDTRACKW %p\n",This);
1378 /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
1379 nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
1382 case LVN_DELETEITEM:
1383 TRACE("-- LVN_DELETEITEM %p\n",This);
1384 SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
1387 case LVN_DELETEALLITEMS:
1388 TRACE("-- LVN_DELETEALLITEMS %p\n",This);
1391 case LVN_INSERTITEM:
1392 TRACE("-- LVN_INSERTITEM (STUB)%p\n",This);
1395 case LVN_ITEMACTIVATE:
1396 TRACE("-- LVN_ITEMACTIVATE %p\n",This);
1397 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1400 case LVN_COLUMNCLICK:
1401 This->ListViewSortInfo.nHeaderID = lpnmlv->iSubItem;
1402 if(This->ListViewSortInfo.nLastHeaderID == This->ListViewSortInfo.nHeaderID)
1404 This->ListViewSortInfo.bIsAscending = !This->ListViewSortInfo.bIsAscending;
1408 This->ListViewSortInfo.bIsAscending = TRUE;
1410 This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
1412 SendMessageW(lpnmlv->hdr.hwndFrom, LVM_SORTITEMS, (WPARAM) &This->ListViewSortInfo, (LPARAM)ShellView_ListViewCompareItems);
1415 case LVN_GETDISPINFOA:
1416 case LVN_GETDISPINFOW:
1417 TRACE("-- LVN_GETDISPINFO %p\n",This);
1418 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1420 if(lpdi->item.mask & LVIF_TEXT) /* text requested */
1422 static WCHAR emptyW[] = { 0 };
1426 if (This->pSF2Parent)
1428 hr = IShellFolder2_GetDetailsOf(This->pSF2Parent, pidl, lpdi->item.iSubItem, &sd);
1432 IShellDetails *details;
1434 hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IShellDetails, (void**)&details);
1437 hr = IShellDetails_GetDetailsOf(details, pidl, lpdi->item.iSubItem, &sd);
1438 IShellDetails_Release(details);
1441 WARN("IShellFolder2/IShellDetails not supported\n");
1446 /* set to empty on failure */
1447 sd.str.uType = STRRET_WSTR;
1448 sd.str.u.pOleStr = emptyW;
1451 if (lpnmh->code == LVN_GETDISPINFOW)
1453 StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
1454 TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText));
1458 /* LVN_GETDISPINFOA - shouldn't happen */
1459 NMLVDISPINFOA *lpdiA = (NMLVDISPINFOA *)lpnmh;
1460 StrRetToStrNA( lpdiA->item.pszText, lpdiA->item.cchTextMax, &sd.str, NULL);
1461 TRACE("-- text=%s\n", lpdiA->item.pszText);
1465 if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
1467 lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
1471 case LVN_ITEMCHANGED:
1472 TRACE("-- LVN_ITEMCHANGED %p\n",This);
1473 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1477 case LVN_BEGINRDRAG:
1478 TRACE("-- LVN_BEGINDRAG\n");
1480 if (ShellView_GetSelections(This))
1483 DWORD dwAttributes = SFGAO_CANLINK;
1484 DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
1486 if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
1488 IDropSource *pds = &This->IDropSource_iface; /* own DropSource interface */
1490 if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes)))
1492 if (dwAttributes & SFGAO_CANLINK)
1494 dwEffect |= DROPEFFECT_LINK;
1501 DoDragDrop(pda, pds, dwEffect, &dwEffect2);
1503 IDataObject_Release(pda);
1508 case LVN_BEGINLABELEDITW:
1510 DWORD dwAttr = SFGAO_CANRENAME;
1511 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1513 TRACE("-- LVN_BEGINLABELEDITW %p\n",This);
1515 IShellFolder_GetAttributesOf(This->pSFParent, 1, (LPCITEMIDLIST*)&pidl, &dwAttr);
1516 if (SFGAO_CANRENAME & dwAttr)
1523 case LVN_ENDLABELEDITW:
1525 TRACE("-- LVN_ENDLABELEDITA %p\n",This);
1526 if (lpdi->item.pszText)
1531 lvItem.iItem = lpdi->item.iItem;
1532 lvItem.iSubItem = 0;
1533 lvItem.mask = LVIF_PARAM;
1534 SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
1536 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1537 hr = IShellFolder_SetNameOf(This->pSFParent, 0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidl);
1539 if(SUCCEEDED(hr) && pidl)
1541 lvItem.mask = LVIF_PARAM;
1542 lvItem.lParam = (LPARAM)pidl;
1543 SendMessageW(This->hWndList, LVM_SETITEMW, 0, (LPARAM) &lvItem);
1552 LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
1554 /* initiate a rename of the selected file or directory */
1555 switch (plvKeyDown->wVKey)
1559 INT i = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
1563 /* get selected item */
1564 i = SendMessageW(This->hWndList, LVM_GETNEXTITEM, -1, MAKELPARAM (LVNI_SELECTED, 0));
1566 SendMessageW(This->hWndList, LVM_ENSUREVISIBLE, i, 0);
1567 SendMessageW(This->hWndList, LVM_EDITLABELW, i, 0);
1576 LPITEMIDLIST* pItems;
1580 hr = IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (void**)&psfhlp);
1581 if (hr != S_OK) return 0;
1583 if(!(count = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0)))
1585 ISFHelper_Release(psfhlp);
1589 /* allocate memory for the pidl array */
1590 pItems = HeapAlloc(GetProcessHeap(), 0, sizeof(LPITEMIDLIST) * count);
1592 /* retrieve all selected items */
1598 /* get selected item */
1599 item_index = SendMessageW(This->hWndList, LVM_GETNEXTITEM, item_index,
1600 MAKELPARAM (LVNI_SELECTED, 0));
1601 item.iItem = item_index;
1602 item.mask = LVIF_PARAM;
1603 SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM)&item);
1606 pItems[i] = (LPITEMIDLIST)item.lParam;
1611 /* perform the item deletion */
1612 ISFHelper_DeleteItems(psfhlp, i, (LPCITEMIDLIST*)pItems);
1613 ISFHelper_Release(psfhlp);
1615 /* free pidl array memory */
1616 HeapFree(GetProcessHeap(), 0, pItems);
1621 /* Initiate a refresh */
1622 IShellView_Refresh((IShellView*)This);
1627 LPSHELLBROWSER lpSb;
1628 if((lpSb = (LPSHELLBROWSER)SendMessageW(This->hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
1630 IShellBrowser_BrowseObject(lpSb, NULL, SBSP_PARENT);
1636 FIXME("LVN_KEYDOWN key=0x%08x\n", plvKeyDown->wVKey);
1642 TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code);
1648 /**********************************************************
1649 * ShellView_OnChange()
1652 static LRESULT ShellView_OnChange(IShellViewImpl * This, const LPCITEMIDLIST *pidls, LONG event)
1656 TRACE("(%p)->(%p, %p, 0x%08x)\n", This, pidls[0], pidls[1], event);
1662 LV_AddItem(This, pidls[0]);
1667 INT i = LV_FindItemByPidl(This, ILFindLastID(pidls[0]));
1668 ret = SendMessageW(This->hWndList, LVM_DELETEITEM, i, 0);
1671 case SHCNE_RENAMEFOLDER:
1672 case SHCNE_RENAMEITEM:
1673 LV_RenameItem(This, pidls[0], pidls[1]);
1675 case SHCNE_UPDATEITEM:
1680 /**********************************************************
1684 static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
1686 IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
1687 LPCREATESTRUCTW lpcs;
1689 TRACE("(hwnd=%p msg=%x wparm=%lx lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
1694 lpcs = (LPCREATESTRUCTW)lParam;
1695 pThis = lpcs->lpCreateParams;
1696 SetWindowLongPtrW(hWnd, GWLP_USERDATA, (ULONG_PTR)pThis);
1697 pThis->hWnd = hWnd; /*set the window handle*/
1700 case WM_SIZE: return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
1701 case WM_SETFOCUS: return ShellView_OnSetFocus(pThis);
1702 case WM_KILLFOCUS: return ShellView_OnKillFocus(pThis);
1703 case WM_CREATE: return ShellView_OnCreate(pThis);
1704 case WM_ACTIVATE: return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
1705 case WM_NOTIFY: return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
1706 case WM_COMMAND: return ShellView_OnCommand(pThis,
1707 GET_WM_COMMAND_ID(wParam, lParam),
1708 GET_WM_COMMAND_CMD(wParam, lParam),
1709 GET_WM_COMMAND_HWND(wParam, lParam));
1710 case SHV_CHANGE_NOTIFY: return ShellView_OnChange(pThis, (const LPCITEMIDLIST*)wParam, (LONG)lParam);
1712 case WM_CONTEXTMENU: ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
1715 case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList);
1718 case WM_GETDLGCODE: return SendMessageW(pThis->hWndList, uMessage, 0, 0);
1721 RevokeDragDrop(pThis->hWnd);
1722 SHChangeNotifyDeregister(pThis->hNotify);
1726 if ((pThis->FolderSettings.fFlags & FWF_DESKTOP) ||
1727 (pThis->FolderSettings.fFlags & FWF_TRANSPARENT))
1732 return DefWindowProcW(hWnd, uMessage, wParam, lParam);
1734 /**********************************************************
1737 * The INTERFACE of the IShellView object
1740 **********************************************************
1741 * IShellView_QueryInterface
1743 static HRESULT WINAPI IShellView_fnQueryInterface(IShellView2 *iface, REFIID riid, void **ppvObj)
1745 IShellViewImpl *This = impl_from_IShellView2(iface);
1747 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
1751 if(IsEqualIID(riid, &IID_IUnknown))
1755 else if(IsEqualIID(riid, &IID_IShellView))
1759 else if(IsEqualIID(riid, &IID_IShellView2))
1763 else if(IsEqualIID(riid, &IID_IShellFolderView))
1765 *ppvObj = &This->IShellFolderView_iface;
1767 else if(IsEqualIID(riid, &IID_IFolderView))
1769 *ppvObj = &This->IFolderView_iface;
1771 else if(IsEqualIID(riid, &IID_IOleCommandTarget))
1773 *ppvObj = &This->IOleCommandTarget_iface;
1775 else if(IsEqualIID(riid, &IID_IDropTarget))
1777 *ppvObj = &This->IDropTarget_iface;
1779 else if(IsEqualIID(riid, &IID_IDropSource))
1781 *ppvObj = &This->IDropSource_iface;
1783 else if(IsEqualIID(riid, &IID_IViewObject))
1785 *ppvObj = &This->IViewObject_iface;
1790 IUnknown_AddRef( (IUnknown*)*ppvObj );
1791 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
1794 TRACE("-- Interface: E_NOINTERFACE\n");
1795 return E_NOINTERFACE;
1798 /**********************************************************
1801 static ULONG WINAPI IShellView_fnAddRef(IShellView2 *iface)
1803 IShellViewImpl *This = impl_from_IShellView2(iface);
1804 ULONG refCount = InterlockedIncrement(&This->ref);
1806 TRACE("(%p)->(count=%u)\n", This, refCount - 1);
1810 /**********************************************************
1811 * IShellView_Release
1813 static ULONG WINAPI IShellView_fnRelease(IShellView2 *iface)
1815 IShellViewImpl *This = impl_from_IShellView2(iface);
1816 ULONG refCount = InterlockedDecrement(&This->ref);
1818 TRACE("(%p)->(count=%i)\n", This, refCount + 1);
1822 TRACE(" destroying IShellView(%p)\n",This);
1824 DestroyWindow(This->hWndList);
1827 IShellFolder_Release(This->pSFParent);
1829 if(This->pSF2Parent)
1830 IShellFolder2_Release(This->pSF2Parent);
1832 SHFree(This->apidl);
1835 IAdviseSink_Release(This->pAdvSink);
1837 HeapFree(GetProcessHeap(),0,This);
1842 /**********************************************************
1843 * ShellView_GetWindow
1845 static HRESULT WINAPI IShellView_fnGetWindow(IShellView2 *iface, HWND *phWnd)
1847 IShellViewImpl *This = impl_from_IShellView2(iface);
1849 TRACE("(%p)\n",This);
1851 *phWnd = This->hWnd;
1856 static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView2 *iface, BOOL mode)
1858 IShellViewImpl *This = impl_from_IShellView2(iface);
1859 TRACE("(%p)->(%d)\n", This, mode);
1863 /**********************************************************
1864 * IShellView_TranslateAccelerator
1867 * use the accel functions
1869 static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView2 * iface,LPMSG lpmsg)
1872 IShellViewImpl *This = (IShellViewImpl *)iface;
1874 FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%x wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
1877 if ((lpmsg->message>=WM_KEYFIRST) && (lpmsg->message>=WM_KEYLAST))
1879 TRACE("-- key=0x04%lx\n",lpmsg->wParam) ;
1881 return S_FALSE; /* not handled */
1884 static HRESULT WINAPI IShellView_fnEnableModeless(IShellView2 *iface, BOOL fEnable)
1886 IShellViewImpl *This = impl_from_IShellView2(iface);
1888 FIXME("(%p) stub\n",This);
1893 static HRESULT WINAPI IShellView_fnUIActivate(IShellView2 *iface, UINT uState)
1895 IShellViewImpl *This = impl_from_IShellView2(iface);
1898 CHAR szName[MAX_PATH];
1901 int nPartArray[1] = {-1};
1903 TRACE("(%p)->(state=%x) stub\n",This, uState);
1905 /*don't do anything if the state isn't really changing*/
1906 if(This->uState == uState)
1911 /*OnActivate handles the menu merging and internal state*/
1912 ShellView_OnActivate(This, uState);
1914 /*only do This if we are active*/
1915 if(uState != SVUIA_DEACTIVATE)
1919 GetFolderPath is not a method of IShellFolder
1920 IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
1922 /* set the number of parts */
1923 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
1924 (LPARAM)nPartArray, &lResult);
1926 /* set the text for the parts */
1928 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
1929 0, (LPARAM)szName, &lResult);
1936 static HRESULT WINAPI IShellView_fnRefresh(IShellView2 *iface)
1938 IShellViewImpl *This = impl_from_IShellView2(iface);
1940 TRACE("(%p)\n", This);
1942 SendMessageW(This->hWndList, LVM_DELETEALLITEMS, 0, 0);
1943 ShellView_FillList(This);
1948 static HRESULT WINAPI IShellView_fnCreateViewWindow(IShellView2 *iface, IShellView *lpPrevView,
1949 LPCFOLDERSETTINGS lpfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd)
1952 SV2CVW2_PARAMS view_params;
1953 view_params.cbSize = sizeof(view_params);
1954 view_params.psvPrev = lpPrevView;
1955 view_params.pfs = lpfs;
1956 view_params.psbOwner = psb;
1957 view_params.prcView = prcView;
1958 view_params.pvid = NULL;
1959 view_params.hwndView = 0;
1961 TRACE("(%p) Forwarding to CreateViewWindow2\n", iface);
1963 hr = IShellView2_CreateViewWindow2(iface, &view_params);
1964 *phWnd = view_params.hwndView;
1969 static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView2 *iface)
1971 IShellViewImpl *This = impl_from_IShellView2(iface);
1973 TRACE("(%p)\n",This);
1975 /*Make absolutely sure all our UI is cleaned up.*/
1976 IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
1980 DestroyMenu(This->hMenu);
1983 DestroyWindow(This->hWnd);
1984 if(This->pShellBrowser) IShellBrowser_Release(This->pShellBrowser);
1985 if(This->pCommDlgBrowser) ICommDlgBrowser_Release(This->pCommDlgBrowser);
1991 static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView2 *iface, LPFOLDERSETTINGS lpfs)
1993 IShellViewImpl *This = impl_from_IShellView2(iface);
1995 TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
1996 This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
1998 if (!lpfs) return E_INVALIDARG;
2000 *lpfs = This->FolderSettings;
2004 static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView2 *iface, DWORD dwReserved,
2005 LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
2007 IShellViewImpl *This = impl_from_IShellView2(iface);
2009 FIXME("(%p) stub\n",This);
2014 static HRESULT WINAPI IShellView_fnSaveViewState(IShellView2 *iface)
2016 IShellViewImpl *This = impl_from_IShellView2(iface);
2018 FIXME("(%p) stub\n",This);
2023 static HRESULT WINAPI IShellView_fnSelectItem(IShellView2 *iface, LPCITEMIDLIST pidl, UINT flags)
2025 IShellViewImpl *This = impl_from_IShellView2(iface);
2026 IFolderView *view = &This->IFolderView_iface;
2029 TRACE("(%p)->(pidl=%p, 0x%08x)\n",This, pidl, flags);
2031 i = LV_FindItemByPidl(This, pidl);
2032 if (i == -1) return S_OK;
2034 return IFolderView_SelectItem(view, i, flags);
2037 static HRESULT WINAPI IShellView_fnGetItemObject(IShellView2 *iface, UINT uItem, REFIID riid,
2040 IShellViewImpl *This = impl_from_IShellView2(iface);
2041 HRESULT hr = E_NOINTERFACE;
2043 TRACE("(%p)->(0x%08x, %s, %p)\n",This, uItem, debugstr_guid(riid), ppvOut);
2049 case SVGIO_BACKGROUND:
2051 if (IsEqualIID(&IID_IContextMenu, riid))
2053 *ppvOut = ISvBgCm_Constructor(This->pSFParent, FALSE);
2057 FIXME("unsupported interface requested %s\n", debugstr_guid(riid));
2061 case SVGIO_SELECTION:
2062 ShellView_GetSelections(This);
2063 hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, riid, 0, ppvOut);
2067 FIXME("unimplemented for uItem = 0x%08x\n", uItem);
2069 TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut);
2074 static HRESULT WINAPI IShellView2_fnGetView(IShellView2* iface, SHELLVIEWID *view_guid, ULONG view_type)
2076 FIXME("(%p)->(view_guid %s, view_type %#x) stub!\n", iface, debugstr_guid(view_guid), view_type);
2080 static HRESULT WINAPI IShellView2_fnCreateViewWindow2(IShellView2 *iface,
2081 LPSV2CVW2_PARAMS view_params)
2083 IShellViewImpl *This = impl_from_IShellView2(iface);
2088 TRACE("(%p)->(view_params %p)\n", iface, view_params);
2090 if (view_params->cbSize != sizeof(*view_params))
2092 FIXME("Got unexpected cbSize %#x\n", view_params->cbSize);
2096 TRACE("-- psvPrev %p, pfs %p, psbOwner %p, prcView %p\n",
2097 view_params->psvPrev, view_params->pfs, view_params->psbOwner, view_params->prcView);
2098 TRACE("-- vmode %#x, flags %#x, left %d, top %d, right %d, bottom %d\n",
2099 view_params->pfs->ViewMode, view_params->pfs->fFlags, view_params->prcView->left,
2100 view_params->prcView->top, view_params->prcView->right, view_params->prcView->bottom);
2102 if (!view_params->psbOwner) return E_UNEXPECTED;
2104 /* Set up the member variables */
2105 This->pShellBrowser = view_params->psbOwner;
2106 This->FolderSettings = *view_params->pfs;
2108 if (view_params->pvid)
2110 if (IsEqualGUID(view_params->pvid, &VID_LargeIcons))
2111 This->FolderSettings.ViewMode = FVM_ICON;
2112 else if (IsEqualGUID(view_params->pvid, &VID_SmallIcons))
2113 This->FolderSettings.ViewMode = FVM_SMALLICON;
2114 else if (IsEqualGUID(view_params->pvid, &VID_List))
2115 This->FolderSettings.ViewMode = FVM_LIST;
2116 else if (IsEqualGUID(view_params->pvid, &VID_Details))
2117 This->FolderSettings.ViewMode = FVM_DETAILS;
2118 else if (IsEqualGUID(view_params->pvid, &VID_Thumbnails))
2119 This->FolderSettings.ViewMode = FVM_THUMBNAIL;
2120 else if (IsEqualGUID(view_params->pvid, &VID_Tile))
2121 This->FolderSettings.ViewMode = FVM_TILE;
2122 else if (IsEqualGUID(view_params->pvid, &VID_ThumbStrip))
2123 This->FolderSettings.ViewMode = FVM_THUMBSTRIP;
2125 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_params->pvid));
2128 /* Get our parent window */
2129 IShellBrowser_AddRef(This->pShellBrowser);
2130 IShellBrowser_GetWindow(This->pShellBrowser, &This->hWndParent);
2132 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2133 This->pCommDlgBrowser = NULL;
2134 hr = IShellBrowser_QueryInterface(This->pShellBrowser, &IID_ICommDlgBrowser, (void **)&This->pCommDlgBrowser);
2136 TRACE("-- CommDlgBrowser %p\n", This->pCommDlgBrowser);
2138 /* If our window class has not been registered, then do so */
2139 if (!GetClassInfoW(shell32_hInstance, SV_CLASS_NAME, &wc))
2141 wc.style = CS_HREDRAW | CS_VREDRAW;
2142 wc.lpfnWndProc = ShellView_WndProc;
2145 wc.hInstance = shell32_hInstance;
2147 wc.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW);
2148 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
2149 wc.lpszMenuName = NULL;
2150 wc.lpszClassName = SV_CLASS_NAME;
2152 if (!RegisterClassW(&wc)) return E_FAIL;
2155 wnd = CreateWindowExW(0, SV_CLASS_NAME, NULL, WS_CHILD | WS_TABSTOP,
2156 view_params->prcView->left, view_params->prcView->top,
2157 view_params->prcView->right - view_params->prcView->left,
2158 view_params->prcView->bottom - view_params->prcView->top,
2159 This->hWndParent, 0, shell32_hInstance, This);
2165 IShellBrowser_Release(This->pShellBrowser);
2169 SetWindowPos(wnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
2172 view_params->hwndView = wnd;
2177 static HRESULT WINAPI IShellView2_fnHandleRename(IShellView2* iface, LPCITEMIDLIST new_pidl)
2179 FIXME("(%p)->(new_pidl %p) stub!\n", iface, new_pidl);
2183 static HRESULT WINAPI IShellView2_fnSelectAndPositionItem(IShellView2 *iface, LPCITEMIDLIST item,
2184 UINT flags, POINT *point)
2186 IShellViewImpl *This = impl_from_IShellView2(iface);
2190 TRACE("(%p)->(item %p, flags %#x, point %p)\n", This, item, flags, point);
2192 hr = IShellView2_QueryInterface(iface, &IID_IFolderView, (void**)&view);
2195 hr = IFolderView_SelectAndPositionItems(view, 1, &item, point, flags);
2196 IFolderView_Release(view);
2202 static const IShellView2Vtbl svvt =
2204 IShellView_fnQueryInterface,
2205 IShellView_fnAddRef,
2206 IShellView_fnRelease,
2207 IShellView_fnGetWindow,
2208 IShellView_fnContextSensitiveHelp,
2209 IShellView_fnTranslateAccelerator,
2210 IShellView_fnEnableModeless,
2211 IShellView_fnUIActivate,
2212 IShellView_fnRefresh,
2213 IShellView_fnCreateViewWindow,
2214 IShellView_fnDestroyViewWindow,
2215 IShellView_fnGetCurrentInfo,
2216 IShellView_fnAddPropertySheetPages,
2217 IShellView_fnSaveViewState,
2218 IShellView_fnSelectItem,
2219 IShellView_fnGetItemObject,
2220 IShellView2_fnGetView,
2221 IShellView2_fnCreateViewWindow2,
2222 IShellView2_fnHandleRename,
2223 IShellView2_fnSelectAndPositionItem,
2227 /**********************************************************
2228 * ISVOleCmdTarget_QueryInterface (IUnknown)
2230 static HRESULT WINAPI ISVOleCmdTarget_QueryInterface(
2231 IOleCommandTarget * iface,
2235 IShellViewImpl *This = impl_from_IOleCommandTarget(iface);
2237 return IShellView2_QueryInterface(&This->IShellView2_iface, iid, ppvObj);
2240 /**********************************************************
2241 * ISVOleCmdTarget_AddRef (IUnknown)
2243 static ULONG WINAPI ISVOleCmdTarget_AddRef(
2244 IOleCommandTarget * iface)
2246 IShellViewImpl *This = impl_from_IOleCommandTarget(iface);
2248 return IShellView2_AddRef(&This->IShellView2_iface);
2251 /**********************************************************
2252 * ISVOleCmdTarget_Release (IUnknown)
2254 static ULONG WINAPI ISVOleCmdTarget_Release(
2255 IOleCommandTarget * iface)
2257 IShellViewImpl *This = impl_from_IOleCommandTarget(iface);
2259 return IShellView2_Release(&This->IShellView2_iface);
2262 /**********************************************************
2263 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2265 static HRESULT WINAPI ISVOleCmdTarget_QueryStatus(
2266 IOleCommandTarget *iface,
2267 const GUID *pguidCmdGroup,
2270 OLECMDTEXT *pCmdText)
2272 IShellViewImpl *This = impl_from_IOleCommandTarget(iface);
2275 FIXME("(%p)->(%s %d %p %p)\n",
2276 This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
2279 return E_INVALIDARG;
2280 for (i = 0; i < cCmds; i++)
2282 FIXME("\tprgCmds[%d].cmdID = %d\n", i, prgCmds[i].cmdID);
2283 prgCmds[i].cmdf = 0;
2285 return OLECMDERR_E_UNKNOWNGROUP;
2288 /**********************************************************
2289 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2291 * nCmdID is the OLECMDID_* enumeration
2293 static HRESULT WINAPI ISVOleCmdTarget_Exec(
2294 IOleCommandTarget *iface,
2295 const GUID* pguidCmdGroup,
2301 IShellViewImpl *This = impl_from_IOleCommandTarget(iface);
2303 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2304 This, debugstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt, pvaIn, pvaOut);
2307 return OLECMDERR_E_UNKNOWNGROUP;
2308 if (IsEqualIID(pguidCmdGroup, &CGID_Explorer) &&
2310 (nCmdexecopt == 4) && pvaOut)
2312 if (IsEqualIID(pguidCmdGroup, &CGID_ShellDocView) &&
2317 return OLECMDERR_E_UNKNOWNGROUP;
2320 static const IOleCommandTargetVtbl ctvt =
2322 ISVOleCmdTarget_QueryInterface,
2323 ISVOleCmdTarget_AddRef,
2324 ISVOleCmdTarget_Release,
2325 ISVOleCmdTarget_QueryStatus,
2326 ISVOleCmdTarget_Exec
2329 /**********************************************************
2330 * ISVDropTarget implementation
2333 static HRESULT WINAPI ISVDropTarget_QueryInterface(
2338 IShellViewImpl *This = impl_from_IDropTarget(iface);
2340 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
2342 return IShellView2_QueryInterface(&This->IShellView2_iface, riid, ppvObj);
2345 static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface)
2347 IShellViewImpl *This = impl_from_IDropTarget(iface);
2349 TRACE("(%p)->(count=%u)\n",This,This->ref);
2351 return IShellView2_AddRef(&This->IShellView2_iface);
2354 static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
2356 IShellViewImpl *This = impl_from_IDropTarget(iface);
2358 TRACE("(%p)->(count=%u)\n",This,This->ref);
2360 return IShellView2_Release(&This->IShellView2_iface);
2363 /******************************************************************************
2364 * drag_notify_subitem [Internal]
2366 * Figure out the shellfolder object, which is currently under the mouse cursor
2367 * and notify it via the IDropTarget interface.
2370 #define SCROLLAREAWIDTH 20
2372 static HRESULT drag_notify_subitem(IShellViewImpl *This, DWORD grfKeyState, POINTL pt,
2375 LVHITTESTINFO htinfo;
2381 /* Map from global to client coordinates and query the index of the listview-item, which is
2382 * currently under the mouse cursor. */
2385 htinfo.flags = LVHT_ONITEM;
2386 ScreenToClient(This->hWndList, &htinfo.pt);
2387 lResult = SendMessageW(This->hWndList, LVM_HITTEST, 0, (LPARAM)&htinfo);
2389 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2390 GetClientRect(This->hWndList, &clientRect);
2391 if (htinfo.pt.x == This->ptLastMousePos.x && htinfo.pt.y == This->ptLastMousePos.y &&
2392 (htinfo.pt.x < SCROLLAREAWIDTH || htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH ||
2393 htinfo.pt.y < SCROLLAREAWIDTH || htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH ))
2395 This->cScrollDelay = (This->cScrollDelay + 1) % 5; /* DragOver is called every 50 ms */
2396 if (This->cScrollDelay == 0) { /* Mouse did hover another 250 ms over the scroll-area */
2397 if (htinfo.pt.x < SCROLLAREAWIDTH)
2398 SendMessageW(This->hWndList, WM_HSCROLL, SB_LINEUP, 0);
2399 if (htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH)
2400 SendMessageW(This->hWndList, WM_HSCROLL, SB_LINEDOWN, 0);
2401 if (htinfo.pt.y < SCROLLAREAWIDTH)
2402 SendMessageW(This->hWndList, WM_VSCROLL, SB_LINEUP, 0);
2403 if (htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH)
2404 SendMessageW(This->hWndList, WM_VSCROLL, SB_LINEDOWN, 0);
2407 This->cScrollDelay = 0; /* Reset, if the cursor is not over the listview's scroll-area */
2409 This->ptLastMousePos = htinfo.pt;
2411 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2412 if (This->pCurDropTarget && lResult == This->iDragOverItem)
2413 return IDropTarget_DragOver(This->pCurDropTarget, grfKeyState, pt, pdwEffect);
2415 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2416 if (This->pCurDropTarget) {
2417 IDropTarget_DragLeave(This->pCurDropTarget);
2418 IDropTarget_Release(This->pCurDropTarget);
2419 This->pCurDropTarget = NULL;
2422 This->iDragOverItem = lResult;
2423 if (lResult == -1) {
2424 /* We are not above one of the listview's subitems. Bind to the parent folder's
2425 * DropTarget interface. */
2426 hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IDropTarget,
2427 (LPVOID*)&This->pCurDropTarget);
2429 /* Query the relative PIDL of the shellfolder object represented by the currently
2430 * dragged over listview-item ... */
2431 lvItem.mask = LVIF_PARAM;
2432 lvItem.iItem = lResult;
2433 lvItem.iSubItem = 0;
2434 SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
2436 /* ... and bind pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2437 hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWndList, 1,
2438 (LPCITEMIDLIST*)&lvItem.lParam, &IID_IDropTarget, NULL, (LPVOID*)&This->pCurDropTarget);
2441 /* If anything failed, pCurDropTarget should be NULL now, which ought to be a save state. */
2445 /* Notify the item just entered via DragEnter. */
2446 return IDropTarget_DragEnter(This->pCurDropTarget, This->pCurDataObject, grfKeyState, pt, pdwEffect);
2449 static HRESULT WINAPI ISVDropTarget_DragEnter(IDropTarget *iface, IDataObject *pDataObject,
2450 DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2452 IShellViewImpl *This = impl_from_IDropTarget(iface);
2454 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2455 This->pCurDataObject = pDataObject;
2456 IDataObject_AddRef(pDataObject);
2458 return drag_notify_subitem(This, grfKeyState, pt, pdwEffect);
2461 static HRESULT WINAPI ISVDropTarget_DragOver(IDropTarget *iface, DWORD grfKeyState, POINTL pt,
2464 IShellViewImpl *This = impl_from_IDropTarget(iface);
2465 return drag_notify_subitem(This, grfKeyState, pt, pdwEffect);
2468 static HRESULT WINAPI ISVDropTarget_DragLeave(IDropTarget *iface)
2470 IShellViewImpl *This = impl_from_IDropTarget(iface);
2472 if (This->pCurDropTarget)
2474 IDropTarget_DragLeave(This->pCurDropTarget);
2475 IDropTarget_Release(This->pCurDropTarget);
2476 This->pCurDropTarget = NULL;
2479 if (This->pCurDataObject)
2481 IDataObject_Release(This->pCurDataObject);
2482 This->pCurDataObject = NULL;
2485 This->iDragOverItem = 0;
2490 static HRESULT WINAPI ISVDropTarget_Drop(IDropTarget *iface, IDataObject* pDataObject,
2491 DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2493 IShellViewImpl *This = impl_from_IDropTarget(iface);
2495 IDropTarget_Drop(This->pCurDropTarget, pDataObject, grfKeyState, pt, pdwEffect);
2497 IDropTarget_Release(This->pCurDropTarget);
2498 IDataObject_Release(This->pCurDataObject);
2499 This->pCurDataObject = NULL;
2500 This->pCurDropTarget = NULL;
2501 This->iDragOverItem = 0;
2506 static const IDropTargetVtbl dtvt =
2508 ISVDropTarget_QueryInterface,
2509 ISVDropTarget_AddRef,
2510 ISVDropTarget_Release,
2511 ISVDropTarget_DragEnter,
2512 ISVDropTarget_DragOver,
2513 ISVDropTarget_DragLeave,
2517 /**********************************************************
2518 * ISVDropSource implementation
2521 static HRESULT WINAPI ISVDropSource_QueryInterface(
2526 IShellViewImpl *This = impl_from_IDropSource(iface);
2528 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
2530 return IShellView2_QueryInterface(&This->IShellView2_iface, riid, ppvObj);
2533 static ULONG WINAPI ISVDropSource_AddRef( IDropSource *iface)
2535 IShellViewImpl *This = impl_from_IDropSource(iface);
2537 TRACE("(%p)->(count=%u)\n",This,This->ref);
2539 return IShellView2_AddRef(&This->IShellView2_iface);
2542 static ULONG WINAPI ISVDropSource_Release( IDropSource *iface)
2544 IShellViewImpl *This = impl_from_IDropSource(iface);
2546 TRACE("(%p)->(count=%u)\n",This,This->ref);
2548 return IShellView2_Release(&This->IShellView2_iface);
2551 static HRESULT WINAPI ISVDropSource_QueryContinueDrag(
2553 BOOL fEscapePressed,
2556 IShellViewImpl *This = impl_from_IDropSource(iface);
2557 TRACE("(%p)\n",This);
2560 return DRAGDROP_S_CANCEL;
2561 else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
2562 return DRAGDROP_S_DROP;
2567 static HRESULT WINAPI ISVDropSource_GiveFeedback(
2571 IShellViewImpl *This = impl_from_IDropSource(iface);
2572 TRACE("(%p)\n",This);
2574 return DRAGDROP_S_USEDEFAULTCURSORS;
2577 static const IDropSourceVtbl dsvt =
2579 ISVDropSource_QueryInterface,
2580 ISVDropSource_AddRef,
2581 ISVDropSource_Release,
2582 ISVDropSource_QueryContinueDrag,
2583 ISVDropSource_GiveFeedback
2585 /**********************************************************
2586 * ISVViewObject implementation
2589 static HRESULT WINAPI ISVViewObject_QueryInterface(
2594 IShellViewImpl *This = impl_from_IViewObject(iface);
2596 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
2598 return IShellView2_QueryInterface(&This->IShellView2_iface, riid, ppvObj);
2601 static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface)
2603 IShellViewImpl *This = impl_from_IViewObject(iface);
2605 TRACE("(%p)->(count=%u)\n",This,This->ref);
2607 return IShellView2_AddRef(&This->IShellView2_iface);
2610 static ULONG WINAPI ISVViewObject_Release( IViewObject *iface)
2612 IShellViewImpl *This = impl_from_IViewObject(iface);
2614 TRACE("(%p)->(count=%u)\n",This,This->ref);
2616 return IShellView2_Release(&This->IShellView2_iface);
2619 static HRESULT WINAPI ISVViewObject_Draw(
2624 DVTARGETDEVICE* ptd,
2627 LPCRECTL lprcBounds,
2628 LPCRECTL lprcWBounds,
2629 BOOL (CALLBACK *pfnContinue)(ULONG_PTR dwContinue),
2630 ULONG_PTR dwContinue)
2633 IShellViewImpl *This = impl_from_IViewObject(iface);
2635 FIXME("Stub: This=%p\n",This);
2639 static HRESULT WINAPI ISVViewObject_GetColorSet(
2644 DVTARGETDEVICE* ptd,
2645 HDC hicTargetDevice,
2646 LOGPALETTE** ppColorSet)
2649 IShellViewImpl *This = impl_from_IViewObject(iface);
2651 FIXME("Stub: This=%p\n",This);
2655 static HRESULT WINAPI ISVViewObject_Freeze(
2663 IShellViewImpl *This = impl_from_IViewObject(iface);
2665 FIXME("Stub: This=%p\n",This);
2669 static HRESULT WINAPI ISVViewObject_Unfreeze(
2674 IShellViewImpl *This = impl_from_IViewObject(iface);
2676 FIXME("Stub: This=%p\n",This);
2680 static HRESULT WINAPI ISVViewObject_SetAdvise(
2684 IAdviseSink* pAdvSink)
2687 IShellViewImpl *This = impl_from_IViewObject(iface);
2689 FIXME("partial stub: %p %08x %08x %p\n",
2690 This, aspects, advf, pAdvSink);
2692 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2693 This->pAdvSink = pAdvSink;
2694 This->dwAspects = aspects;
2695 This->dwAdvf = advf;
2700 static HRESULT WINAPI ISVViewObject_GetAdvise(
2704 IAdviseSink** ppAdvSink)
2707 IShellViewImpl *This = impl_from_IViewObject(iface);
2709 TRACE("This=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n",
2710 This, pAspects, pAdvf, ppAdvSink);
2714 IAdviseSink_AddRef( This->pAdvSink );
2715 *ppAdvSink = This->pAdvSink;
2718 *pAspects = This->dwAspects;
2720 *pAdvf = This->dwAdvf;
2726 static const IViewObjectVtbl vovt =
2728 ISVViewObject_QueryInterface,
2729 ISVViewObject_AddRef,
2730 ISVViewObject_Release,
2732 ISVViewObject_GetColorSet,
2733 ISVViewObject_Freeze,
2734 ISVViewObject_Unfreeze,
2735 ISVViewObject_SetAdvise,
2736 ISVViewObject_GetAdvise
2740 static HRESULT WINAPI IFView_QueryInterface(
2745 IShellViewImpl *This = impl_from_IFolderView(iface);
2746 TRACE("(%p)->(IID:%s,%p)\n", This, debugstr_guid(riid), ppvObj);
2747 return IShellView2_QueryInterface(&This->IShellView2_iface, riid, ppvObj);
2750 static ULONG WINAPI IFView_AddRef( IFolderView *iface)
2752 IShellViewImpl *This = impl_from_IFolderView(iface);
2753 TRACE("(%p)->(count=%u)\n", This, This->ref);
2754 return IShellView2_AddRef(&This->IShellView2_iface);
2757 static ULONG WINAPI IFView_Release( IFolderView *iface)
2759 IShellViewImpl *This = impl_from_IFolderView(iface);
2760 TRACE("(%p)->(count=%u)\n", This, This->ref);
2761 return IShellView2_Release(&This->IShellView2_iface);
2764 static HRESULT WINAPI IFView_GetCurrentViewMode(IFolderView *iface, UINT *mode)
2766 IShellViewImpl *This = impl_from_IFolderView(iface);
2767 TRACE("(%p)->(%p), stub\n", This, mode);
2770 return E_INVALIDARG;
2772 *mode = This->FolderSettings.ViewMode;
2776 static HRESULT WINAPI IFView_SetCurrentViewMode(IFolderView *iface, UINT mode)
2778 IShellViewImpl *This = impl_from_IFolderView(iface);
2780 TRACE("(%p)->(%u), stub\n", This, mode);
2782 if((mode < FVM_FIRST || mode > FVM_LAST) &&
2784 return E_INVALIDARG;
2786 /* Windows before Vista uses LVM_SETVIEW and possibly
2787 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2788 while later versions seem to accomplish this through other
2790 dwStyle = ViewModeToListStyle(mode);
2791 SetStyle(This, dwStyle, LVS_TYPEMASK);
2793 /* This will not necessarily be the actual mode set above.
2794 This mimics the behavior of Windows XP. */
2795 This->FolderSettings.ViewMode = mode;
2800 static HRESULT WINAPI IFView_GetFolder(IFolderView *iface, REFIID riid, void **ppv)
2802 IShellViewImpl *This = impl_from_IFolderView(iface);
2804 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
2806 if (!ppv) return E_POINTER;
2808 if (IsEqualIID(riid, &IID_IShellFolder))
2810 *ppv = This->pSFParent;
2814 return E_NOINTERFACE;
2817 static HRESULT WINAPI IFView_Item(IFolderView *iface, int index, PITEMID_CHILD *ppidl)
2819 IShellViewImpl *This = impl_from_IFolderView(iface);
2822 TRACE("(%p)->(%d %p)\n", This, index, ppidl);
2824 item.mask = LVIF_PARAM;
2827 if (SendMessageW(This->hWndList, LVM_GETITEMW, 0, (LPARAM)&item))
2829 *ppidl = ILClone((PITEMID_CHILD)item.lParam);
2835 return E_INVALIDARG;
2839 static HRESULT WINAPI IFView_ItemCount(IFolderView *iface, UINT flags, int *items)
2841 IShellViewImpl *This = impl_from_IFolderView(iface);
2843 TRACE("(%p)->(%u %p)\n", This, flags, items);
2845 if (flags != SVGIO_ALLVIEW)
2846 FIXME("some flags unsupported, %x\n", flags & ~SVGIO_ALLVIEW);
2848 *items = SendMessageW(This->hWndList, LVM_GETITEMCOUNT, 0, 0);
2853 static HRESULT WINAPI IFView_Items(IFolderView *iface, UINT flags, REFIID riid, void **ppv)
2855 IShellViewImpl *This = impl_from_IFolderView(iface);
2856 FIXME("(%p)->(%u %s %p), stub\n", This, flags, debugstr_guid(riid), ppv);
2860 static HRESULT WINAPI IFView_GetSelectionMarkedItem(IFolderView *iface, int *item)
2862 IShellViewImpl *This = impl_from_IFolderView(iface);
2864 TRACE("(%p)->(%p)\n", This, item);
2866 *item = SendMessageW(This->hWndList, LVM_GETSELECTIONMARK, 0, 0);
2871 static HRESULT WINAPI IFView_GetFocusedItem(IFolderView *iface, int *item)
2873 IShellViewImpl *This = impl_from_IFolderView(iface);
2875 TRACE("(%p)->(%p)\n", This, item);
2877 *item = SendMessageW(This->hWndList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
2882 static HRESULT WINAPI IFView_GetItemPosition(IFolderView *iface, PCUITEMID_CHILD pidl, POINT *ppt)
2884 IShellViewImpl *This = impl_from_IFolderView(iface);
2885 FIXME("(%p)->(%p %p), stub\n", This, pidl, ppt);
2889 static HRESULT WINAPI IFView_GetSpacing(IFolderView *iface, POINT *pt)
2891 IShellViewImpl *This = impl_from_IFolderView(iface);
2893 TRACE("(%p)->(%p)\n", This, pt);
2895 if (!This->hWndList) return S_FALSE;
2900 ret = SendMessageW(This->hWndList, LVM_GETITEMSPACING, 0, 0);
2902 pt->x = LOWORD(ret);
2903 pt->y = HIWORD(ret);
2909 static HRESULT WINAPI IFView_GetDefaultSpacing(IFolderView *iface, POINT *pt)
2911 IShellViewImpl *This = impl_from_IFolderView(iface);
2912 FIXME("(%p)->(%p), stub\n", This, pt);
2916 static HRESULT WINAPI IFView_GetAutoArrange(IFolderView *iface)
2918 IShellViewImpl *This = impl_from_IFolderView(iface);
2919 FIXME("(%p), stub\n", This);
2923 static HRESULT WINAPI IFView_SelectItem(IFolderView *iface, int item, DWORD flags)
2925 IShellViewImpl *This = impl_from_IFolderView(iface);
2928 TRACE("(%p)->(%d, %x)\n", This, item, flags);
2931 lvItem.stateMask = LVIS_SELECTED;
2933 if (flags & SVSI_ENSUREVISIBLE)
2934 SendMessageW(This->hWndList, LVM_ENSUREVISIBLE, item, 0);
2937 if (flags & SVSI_DESELECTOTHERS)
2938 SendMessageW(This->hWndList, LVM_SETITEMSTATE, -1, (LPARAM)&lvItem);
2941 if (flags & SVSI_SELECT)
2942 lvItem.state |= LVIS_SELECTED;
2944 if (flags & SVSI_FOCUSED)
2945 lvItem.stateMask |= LVIS_FOCUSED;
2947 SendMessageW(This->hWndList, LVM_SETITEMSTATE, item, (LPARAM)&lvItem);
2949 if (flags & SVSI_EDIT)
2950 SendMessageW(This->hWndList, LVM_EDITLABELW, item, 0);
2955 static HRESULT WINAPI IFView_SelectAndPositionItems(IFolderView *iface, UINT cidl,
2956 PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD flags)
2958 IShellViewImpl *This = impl_from_IFolderView(iface);
2959 FIXME("(%p)->(%u %p %p %x), stub\n", This, cidl, apidl, apt, flags);
2963 static const IFolderViewVtbl fviewvt =
2965 IFView_QueryInterface,
2968 IFView_GetCurrentViewMode,
2969 IFView_SetCurrentViewMode,
2974 IFView_GetSelectionMarkedItem,
2975 IFView_GetFocusedItem,
2976 IFView_GetItemPosition,
2978 IFView_GetDefaultSpacing,
2979 IFView_GetAutoArrange,
2981 IFView_SelectAndPositionItems
2984 /* IShellFolderView */
2985 static HRESULT WINAPI IShellFolderView_fnQueryInterface(
2986 IShellFolderView *iface,
2990 IShellViewImpl *This = impl_from_IShellFolderView(iface);
2991 TRACE("(%p)->(IID:%s,%p)\n", This, debugstr_guid(riid), ppvObj);
2992 return IShellView2_QueryInterface(&This->IShellView2_iface, riid, ppvObj);
2995 static ULONG WINAPI IShellFolderView_fnAddRef(IShellFolderView *iface)
2997 IShellViewImpl *This = impl_from_IShellFolderView(iface);
2998 TRACE("(%p)->(count=%u)\n", This, This->ref);
2999 return IShellView2_AddRef(&This->IShellView2_iface);
3002 static ULONG WINAPI IShellFolderView_fnRelease(IShellFolderView *iface)
3004 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3005 TRACE("(%p)->(count=%u)\n", This, This->ref);
3006 return IShellView2_Release(&This->IShellView2_iface);
3009 static HRESULT WINAPI IShellFolderView_fnRearrange(IShellFolderView *iface, LPARAM sort)
3011 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3012 FIXME("(%p)->(%ld) stub\n", This, sort);
3016 static HRESULT WINAPI IShellFolderView_fnGetArrangeParam(IShellFolderView *iface, LPARAM *sort)
3018 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3019 FIXME("(%p)->(%p) stub\n", This, sort);
3023 static HRESULT WINAPI IShellFolderView_fnArrangeGrid(IShellFolderView *iface)
3025 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3026 FIXME("(%p) stub\n", This);
3030 static HRESULT WINAPI IShellFolderView_fnAutoArrange(IShellFolderView *iface)
3032 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3033 FIXME("(%p) stub\n", This);
3037 static HRESULT WINAPI IShellFolderView_fnGetAutoArrange(IShellFolderView *iface)
3039 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3040 IFolderView *view = &This->IFolderView_iface;
3042 TRACE("(%p)\n", This);
3043 return IFolderView_GetAutoArrange(view);
3046 static HRESULT WINAPI IShellFolderView_fnAddObject(
3047 IShellFolderView *iface,
3051 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3052 FIXME("(%p)->(%p %p) stub\n", This, pidl, item);
3056 static HRESULT WINAPI IShellFolderView_fnGetObject(
3057 IShellFolderView *iface,
3058 PITEMID_CHILD *pidl,
3061 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3062 IFolderView *view = &This->IFolderView_iface;
3064 TRACE("(%p)->(%p %d)\n", This, pidl, item);
3065 return IFolderView_Item(view, item, pidl);
3068 static HRESULT WINAPI IShellFolderView_fnRemoveObject(
3069 IShellFolderView *iface,
3073 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3075 TRACE("(%p)->(%p %p)\n", This, pidl, item);
3079 *item = LV_FindItemByPidl(This, ILFindLastID(pidl));
3080 SendMessageW(This->hWndList, LVM_DELETEITEM, *item, 0);
3085 SendMessageW(This->hWndList, LVM_DELETEALLITEMS, 0, 0);
3091 static HRESULT WINAPI IShellFolderView_fnGetObjectCount(
3092 IShellFolderView *iface,
3095 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3096 IFolderView *view = &This->IFolderView_iface;
3098 TRACE("(%p)->(%p)\n", This, count);
3099 return IFolderView_ItemCount(view, SVGIO_ALLVIEW, (INT*)count);
3102 static HRESULT WINAPI IShellFolderView_fnSetObjectCount(
3103 IShellFolderView *iface,
3107 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3108 FIXME("(%p)->(%d %x) stub\n", This, count, flags);
3112 static HRESULT WINAPI IShellFolderView_fnUpdateObject(
3113 IShellFolderView *iface,
3114 PITEMID_CHILD pidl_old,
3115 PITEMID_CHILD pidl_new,
3118 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3119 FIXME("(%p)->(%p %p %p) stub\n", This, pidl_old, pidl_new, item);
3123 static HRESULT WINAPI IShellFolderView_fnRefreshObject(
3124 IShellFolderView *iface,
3128 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3129 FIXME("(%p)->(%p %p) stub\n", This, pidl, item);
3133 static HRESULT WINAPI IShellFolderView_fnSetRedraw(
3134 IShellFolderView *iface,
3137 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3138 TRACE("(%p)->(%d)\n", This, redraw);
3140 SendMessageW(This->hWndList, WM_SETREDRAW, redraw, 0);
3145 static HRESULT WINAPI IShellFolderView_fnGetSelectedCount(
3146 IShellFolderView *iface,
3149 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3150 FIXME("(%p)->(%p) stub\n", This, count);
3154 static HRESULT WINAPI IShellFolderView_fnGetSelectedObjects(
3155 IShellFolderView *iface,
3156 PCITEMID_CHILD **pidl,
3159 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3161 TRACE("(%p)->(%p %p)\n", This, pidl, items);
3163 *items = ShellView_GetSelections( This );
3167 *pidl = LocalAlloc(0, *items*sizeof(LPITEMIDLIST));
3168 if (!*pidl) return E_OUTOFMEMORY;
3170 /* it's documented that caller shouldn't free PIDLs, only array itself */
3171 memcpy((PITEMID_CHILD*)*pidl, This->apidl, *items*sizeof(LPITEMIDLIST));
3177 static HRESULT WINAPI IShellFolderView_fnIsDropOnSource(
3178 IShellFolderView *iface,
3179 IDropTarget *drop_target)
3181 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3182 FIXME("(%p)->(%p) stub\n", This, drop_target);
3186 static HRESULT WINAPI IShellFolderView_fnGetDragPoint(
3187 IShellFolderView *iface,
3190 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3191 FIXME("(%p)->(%p) stub\n", This, pt);
3195 static HRESULT WINAPI IShellFolderView_fnGetDropPoint(
3196 IShellFolderView *iface,
3199 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3200 FIXME("(%p)->(%p) stub\n", This, pt);
3204 static HRESULT WINAPI IShellFolderView_fnMoveIcons(
3205 IShellFolderView *iface,
3208 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3209 TRACE("(%p)->(%p)\n", This, obj);
3213 static HRESULT WINAPI IShellFolderView_fnSetItemPos(
3214 IShellFolderView *iface,
3215 PCUITEMID_CHILD pidl,
3218 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3219 FIXME("(%p)->(%p %p) stub\n", This, pidl, pt);
3223 static HRESULT WINAPI IShellFolderView_fnIsBkDropTarget(
3224 IShellFolderView *iface,
3225 IDropTarget *drop_target)
3227 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3228 FIXME("(%p)->(%p) stub\n", This, drop_target);
3232 static HRESULT WINAPI IShellFolderView_fnSetClipboard(
3233 IShellFolderView *iface,
3236 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3237 FIXME("(%p)->(%d) stub\n", This, move);
3241 static HRESULT WINAPI IShellFolderView_fnSetPoints(
3242 IShellFolderView *iface,
3245 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3246 FIXME("(%p)->(%p) stub\n", This, obj);
3250 static HRESULT WINAPI IShellFolderView_fnGetItemSpacing(
3251 IShellFolderView *iface,
3252 ITEMSPACING *spacing)
3254 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3255 FIXME("(%p)->(%p) stub\n", This, spacing);
3259 static HRESULT WINAPI IShellFolderView_fnSetCallback(
3260 IShellFolderView *iface,
3261 IShellFolderViewCB *new_cb,
3262 IShellFolderViewCB **old_cb)
3265 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3266 FIXME("(%p)->(%p %p) stub\n", This, new_cb, old_cb);
3270 static HRESULT WINAPI IShellFolderView_fnSelect(
3271 IShellFolderView *iface,
3274 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3275 FIXME("(%p)->(%d) stub\n", This, flags);
3279 static HRESULT WINAPI IShellFolderView_fnQuerySupport(
3280 IShellFolderView *iface,
3283 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3284 TRACE("(%p)->(%p)\n", This, support);
3288 static HRESULT WINAPI IShellFolderView_fnSetAutomationObject(
3289 IShellFolderView *iface,
3292 IShellViewImpl *This = impl_from_IShellFolderView(iface);
3293 FIXME("(%p)->(%p) stub\n", This, disp);
3297 static const IShellFolderViewVtbl shellfolderviewvt =
3299 IShellFolderView_fnQueryInterface,
3300 IShellFolderView_fnAddRef,
3301 IShellFolderView_fnRelease,
3302 IShellFolderView_fnRearrange,
3303 IShellFolderView_fnGetArrangeParam,
3304 IShellFolderView_fnArrangeGrid,
3305 IShellFolderView_fnAutoArrange,
3306 IShellFolderView_fnGetAutoArrange,
3307 IShellFolderView_fnAddObject,
3308 IShellFolderView_fnGetObject,
3309 IShellFolderView_fnRemoveObject,
3310 IShellFolderView_fnGetObjectCount,
3311 IShellFolderView_fnSetObjectCount,
3312 IShellFolderView_fnUpdateObject,
3313 IShellFolderView_fnRefreshObject,
3314 IShellFolderView_fnSetRedraw,
3315 IShellFolderView_fnGetSelectedCount,
3316 IShellFolderView_fnGetSelectedObjects,
3317 IShellFolderView_fnIsDropOnSource,
3318 IShellFolderView_fnGetDragPoint,
3319 IShellFolderView_fnGetDropPoint,
3320 IShellFolderView_fnMoveIcons,
3321 IShellFolderView_fnSetItemPos,
3322 IShellFolderView_fnIsBkDropTarget,
3323 IShellFolderView_fnSetClipboard,
3324 IShellFolderView_fnSetPoints,
3325 IShellFolderView_fnGetItemSpacing,
3326 IShellFolderView_fnSetCallback,
3327 IShellFolderView_fnSelect,
3328 IShellFolderView_fnQuerySupport,
3329 IShellFolderView_fnSetAutomationObject