source: trunk/src/shell32/shlview.c@ 8266

Last change on this file since 8266 was 8048, checked in by sandervl, 23 years ago

PH: Wine resync + OS2 integration

File size: 58.8 KB
Line 
1/*
2 * ShellView
3 *
4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
5 *
6 * This is the view visualizing the data provied by the shellfolder.
7 * No direct access to data from pidls should be done from here.
8 *
9 * FIXME: The order by part of the background context menu should be
10 * buily according to the columns shown.
11 *
12 * FIXME: Load/Save the view state from/into the stream provied by
13 * the ShellBrowser
14 *
15 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
16 *
17 * FIXME: ShellView_FillList: consider sort orders
18 *
19 * FIXME: implement the drag and drop in the old (msg-based) way
20 *
21 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
22 * Release() ???
23 */
24
25#include <stdlib.h>
26#include <string.h>
27
28#include "windef.h"
29#include "winerror.h"
30#include "winnls.h"
31#include "servprov.h"
32#include "shlguid.h"
33#include "shlobj.h"
34#include "wine/undocshell.h"
35#include "shresdef.h"
36#include "debugtools.h"
37
38#include "docobj.h"
39#include "pidl.h"
40#include "shell32_main.h"
41#include "shellfolder.h"
42
43DEFAULT_DEBUG_CHANNEL(shell);
44
45typedef struct
46{ BOOL bIsAscending;
47 INT nHeaderID;
48 INT nLastHeaderID;
49}LISTVIEW_SORT_INFO, *LPLISTVIEW_SORT_INFO;
50
51typedef struct
52{ ICOM_VFIELD(IShellView);
53 DWORD ref;
54 ICOM_VTABLE(IOleCommandTarget)* lpvtblOleCommandTarget;
55 ICOM_VTABLE(IDropTarget)* lpvtblDropTarget;
56 ICOM_VTABLE(IDropSource)* lpvtblDropSource;
57 ICOM_VTABLE(IViewObject)* lpvtblViewObject;
58 IShellFolder* pSFParent;
59 IShellFolder2* pSF2Parent;
60 IShellBrowser* pShellBrowser;
61 ICommDlgBrowser* pCommDlgBrowser;
62 HWND hWnd; /* SHELLDLL_DefView */
63 HWND hWndList; /* ListView control */
64 HWND hWndParent;
65 FOLDERSETTINGS FolderSettings;
66 HMENU hMenu;
67 UINT uState;
68 UINT cidl;
69 LPITEMIDLIST *apidl;
70 LISTVIEW_SORT_INFO ListViewSortInfo;
71 HANDLE hNotify; /* change notification handle */
72 HANDLE hAccel;
73} IShellViewImpl;
74
75static struct ICOM_VTABLE(IShellView) svvt;
76
77static struct ICOM_VTABLE(IOleCommandTarget) ctvt;
78#define _IOleCommandTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblOleCommandTarget)))
79#define _ICOM_THIS_From_IOleCommandTarget(class, name) class* This = (class*)(((char*)name)-_IOleCommandTarget_Offset);
80
81static struct ICOM_VTABLE(IDropTarget) dtvt;
82#define _IDropTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropTarget)))
83#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
84
85static struct ICOM_VTABLE(IDropSource) dsvt;
86#define _IDropSource_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropSource)))
87#define _ICOM_THIS_From_IDropSource(class, name) class* This = (class*)(((char*)name)-_IDropSource_Offset);
88
89static struct ICOM_VTABLE(IViewObject) vovt;
90#define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject)))
91#define _ICOM_THIS_From_IViewObject(class, name) class* This = (class*)(((char*)name)-_IViewObject_Offset);
92
93/* ListView Header ID's */
94#define LISTVIEW_COLUMN_NAME 0
95#define LISTVIEW_COLUMN_SIZE 1
96#define LISTVIEW_COLUMN_TYPE 2
97#define LISTVIEW_COLUMN_TIME 3
98#define LISTVIEW_COLUMN_ATTRIB 4
99
100/*menu items */
101#define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
102#define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
103#define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
104
105#define ID_LISTVIEW 2000
106
107#define SHV_CHANGE_NOTIFY WM_USER + 0x1111
108
109/*windowsx.h */
110#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
111#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
112#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
113
114extern void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition,
115 UINT wID, UINT fType, LPSTR dwTypeData, UINT fState);
116
117/*
118 Items merged into the toolbar and and the filemenu
119*/
120typedef struct
121{ int idCommand;
122 int iImage;
123 int idButtonString;
124 int idMenuString;
125 BYTE bState;
126 BYTE bStyle;
127} MYTOOLINFO, *LPMYTOOLINFO;
128
129MYTOOLINFO Tools[] =
130{
131{ FCIDM_SHVIEW_BIGICON, 0, 0, IDS_VIEW_LARGE, TBSTATE_ENABLED, TBSTYLE_BUTTON },
132{ FCIDM_SHVIEW_SMALLICON, 0, 0, IDS_VIEW_SMALL, TBSTATE_ENABLED, TBSTYLE_BUTTON },
133{ FCIDM_SHVIEW_LISTVIEW, 0, 0, IDS_VIEW_LIST, TBSTATE_ENABLED, TBSTYLE_BUTTON },
134{ FCIDM_SHVIEW_REPORTVIEW, 0, 0, IDS_VIEW_DETAILS, TBSTATE_ENABLED, TBSTYLE_BUTTON },
135{ -1, 0, 0, 0, 0, 0}
136};
137
138#ifdef __WIN32OS2__
139typedef void (* CALLBACK PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
140#else
141typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
142#endif
143
144/**********************************************************
145 * IShellView_Constructor
146 */
147IShellView * IShellView_Constructor( IShellFolder * pFolder)
148{ IShellViewImpl * sv;
149 sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl));
150 sv->ref=1;
151 ICOM_VTBL(sv)=&svvt;
152 sv->lpvtblOleCommandTarget=&ctvt;
153 sv->lpvtblDropTarget=&dtvt;
154 sv->lpvtblDropSource=&dsvt;
155 sv->lpvtblViewObject=&vovt;
156
157 sv->pSFParent = pFolder;
158 if(pFolder) IShellFolder_AddRef(pFolder);
159 IShellFolder_QueryInterface(sv->pSFParent, &IID_IShellFolder2, (LPVOID*)&sv->pSF2Parent);
160
161 TRACE("(%p)->(%p)\n",sv, pFolder);
162 shell32_ObjCount++;
163 return (IShellView *) sv;
164}
165
166/**********************************************************
167 *
168 * ##### helperfunctions for communication with ICommDlgBrowser #####
169 */
170static BOOL IsInCommDlg(IShellViewImpl * This)
171{ return(This->pCommDlgBrowser != NULL);
172}
173
174static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
175{
176 HRESULT ret = S_OK;
177
178 if ( IsInCommDlg(This) )
179 {
180 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
181 ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl);
182 TRACE("--0x%08lx\n", ret);
183 }
184 return ret;
185}
186
187static HRESULT OnDefaultCommand(IShellViewImpl * This)
188{
189 HRESULT ret = S_FALSE;
190
191 if (IsInCommDlg(This))
192 {
193 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
194 ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This);
195 TRACE("--\n");
196 }
197 return ret;
198}
199
200static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
201{
202 HRESULT ret = S_FALSE;
203
204 if (IsInCommDlg(This))
205 {
206 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
207 ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags);
208 TRACE("--\n");
209 }
210 return ret;
211}
212/**********************************************************
213 * set the toolbar of the filedialog buttons
214 *
215 * - activates the buttons from the shellbrowser according to
216 * the view state
217 */
218static void CheckToolbar(IShellViewImpl * This)
219{
220 LRESULT result;
221
222 TRACE("\n");
223
224 if (IsInCommDlg(This))
225 {
226 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
227 FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
228 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
229 FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
230 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
231 FCIDM_TB_SMALLICON, TRUE, &result);
232 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
233 FCIDM_TB_REPORTVIEW, TRUE, &result);
234 }
235}
236
237/**********************************************************
238 *
239 * ##### helperfunctions for initializing the view #####
240 */
241/**********************************************************
242 * change the style of the listview control
243 */
244static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
245{
246 DWORD tmpstyle;
247
248 TRACE("(%p)\n", This);
249
250 tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
251 SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
252}
253
254/**********************************************************
255* ShellView_CreateList()
256*
257* - creates the list view window
258*/
259static BOOL ShellView_CreateList (IShellViewImpl * This)
260{ DWORD dwStyle;
261
262 TRACE("%p\n",This);
263
264 dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
265 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE;
266
267 switch (This->FolderSettings.ViewMode)
268 {
269 case FVM_ICON: dwStyle |= LVS_ICON; break;
270 case FVM_DETAILS: dwStyle |= LVS_REPORT; break;
271 case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break;
272 case FVM_LIST: dwStyle |= LVS_LIST; break;
273 default: dwStyle |= LVS_LIST; break;
274 }
275
276 if (This->FolderSettings.fFlags & FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE;
277 /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
278 if (This->FolderSettings.fFlags & FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
279
280 This->hWndList=CreateWindowExA( WS_EX_CLIENTEDGE,
281 WC_LISTVIEWA,
282 NULL,
283 dwStyle,
284 0,0,0,0,
285 This->hWnd,
286 (HMENU)ID_LISTVIEW,
287 shell32_hInstance,
288 NULL);
289
290 if(!This->hWndList)
291 return FALSE;
292
293 This->ListViewSortInfo.bIsAscending = TRUE;
294 This->ListViewSortInfo.nHeaderID = -1;
295 This->ListViewSortInfo.nLastHeaderID = -1;
296
297 /* UpdateShellSettings(); */
298 return TRUE;
299}
300
301/**********************************************************
302* ShellView_InitList()
303*
304* - adds all needed columns to the shellview
305*/
306static BOOL ShellView_InitList(IShellViewImpl * This)
307{
308 LVCOLUMNA lvColumn;
309 SHELLDETAILS sd;
310 int i;
311 char szTemp[50];
312
313 TRACE("%p\n",This);
314
315 ListView_DeleteAllItems(This->hWndList);
316
317 lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
318 lvColumn.pszText = szTemp;
319
320 if (This->pSF2Parent)
321 {
322 for (i=0; 1; i++)
323 {
324 if (!SUCCEEDED(IShellFolder2_GetDetailsOf(This->pSF2Parent, NULL, i, &sd)))
325 break;
326 lvColumn.fmt = sd.fmt;
327 lvColumn.cx = sd.cxChar*8; /* chars->pixel */
328 StrRetToStrNA( szTemp, 50, &sd.str, NULL);
329 ListView_InsertColumnA(This->hWndList, i, &lvColumn);
330 }
331 }
332 else
333 {
334 FIXME("no SF2\n");
335 }
336
337 ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL);
338 ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL);
339
340 return TRUE;
341}
342/**********************************************************
343* ShellView_CompareItems()
344*
345* NOTES
346* internal, CALLBACK for DSA_Sort
347*/
348static INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
349{
350 int ret;
351 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
352
353 if(!lpData) return 0;
354
355 ret = (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2));
356 TRACE("ret=%i\n",ret);
357 return ret;
358}
359
360/*************************************************************************
361 * ShellView_ListViewCompareItems
362 *
363 * Compare Function for the Listview (FileOpen Dialog)
364 *
365 * PARAMS
366 * lParam1 [I] the first ItemIdList to compare with
367 * lParam2 [I] the second ItemIdList to compare with
368 * lpData [I] The column ID for the header Ctrl to process
369 *
370 * RETURNS
371 * A negative value if the first item should precede the second,
372 * a positive value if the first item should follow the second,
373 * or zero if the two items are equivalent
374 *
375 * NOTES
376 * FIXME: function does what ShellView_CompareItems is supposed to do.
377 * unify it and figure out how to use the undocumented first parameter
378 * of IShellFolder_CompareIDs to do the job this function does and
379 * move this code to IShellFolder.
380 * make LISTVIEW_SORT_INFO obsolete
381 * the way this function works is only usable if we had only
382 * filesystemfolders (25/10/99 jsch)
383 */
384static INT CALLBACK ShellView_ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
385{
386 INT nDiff=0;
387 FILETIME fd1, fd2;
388 char strName1[MAX_PATH], strName2[MAX_PATH];
389 BOOL bIsFolder1, bIsFolder2,bIsBothFolder;
390 LPITEMIDLIST pItemIdList1 = (LPITEMIDLIST) lParam1;
391 LPITEMIDLIST pItemIdList2 = (LPITEMIDLIST) lParam2;
392 LISTVIEW_SORT_INFO *pSortInfo = (LPLISTVIEW_SORT_INFO) lpData;
393
394
395 bIsFolder1 = _ILIsFolder(pItemIdList1);
396 bIsFolder2 = _ILIsFolder(pItemIdList2);
397 bIsBothFolder = bIsFolder1 && bIsFolder2;
398
399 /* When sorting between a File and a Folder, the Folder gets sorted first */
400 if( (bIsFolder1 || bIsFolder2) && !bIsBothFolder)
401 {
402 nDiff = bIsFolder1 ? -1 : 1;
403 }
404 else
405 {
406 /* Sort by Time: Folders or Files can be sorted */
407
408 if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME)
409 {
410 _ILGetFileDateTime(pItemIdList1, &fd1);
411 _ILGetFileDateTime(pItemIdList2, &fd2);
412 nDiff = CompareFileTime(&fd2, &fd1);
413 }
414 /* Sort by Attribute: Folder or Files can be sorted */
415 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB)
416 {
417 _ILGetFileAttributes(pItemIdList1, strName1, MAX_PATH);
418 _ILGetFileAttributes(pItemIdList2, strName2, MAX_PATH);
419 nDiff = strcasecmp(strName1, strName2);
420 }
421 /* Sort by FileName: Folder or Files can be sorted */
422 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder)
423 {
424 /* Sort by Text */
425 _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
426 _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
427 nDiff = strcasecmp(strName1, strName2);
428 }
429 /* Sort by File Size, Only valid for Files */
430 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE)
431 {
432 nDiff = (INT)(_ILGetFileSize(pItemIdList1, NULL, 0) - _ILGetFileSize(pItemIdList2, NULL, 0));
433 }
434 /* Sort by File Type, Only valid for Files */
435 else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE)
436 {
437 /* Sort by Type */
438 _ILGetFileType(pItemIdList1, strName1, MAX_PATH);
439 _ILGetFileType(pItemIdList2, strName2, MAX_PATH);
440 nDiff = strcasecmp(strName1, strName2);
441 }
442 }
443 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
444
445 if(nDiff == 0)
446 {
447 _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
448 _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
449 nDiff = strcasecmp(strName1, strName2);
450 }
451
452 if(!pSortInfo->bIsAscending)
453 {
454 nDiff = -nDiff;
455 }
456
457 return nDiff;
458
459}
460
461/**********************************************************
462* LV_FindItemByPidl()
463*/
464static int LV_FindItemByPidl(
465 IShellViewImpl * This,
466 LPCITEMIDLIST pidl)
467{
468 LVITEMA lvItem;
469 ZeroMemory(&lvItem, sizeof(LVITEMA));
470 lvItem.mask = LVIF_PARAM;
471 for(lvItem.iItem = 0; ListView_GetItemA(This->hWndList, &lvItem); lvItem.iItem++)
472 {
473 LPITEMIDLIST currentpidl = (LPITEMIDLIST) lvItem.lParam;
474 HRESULT hr = IShellFolder_CompareIDs(This->pSFParent, 0, pidl, currentpidl);
475 if(SUCCEEDED(hr) && !HRESULT_CODE(hr))
476 {
477 return lvItem.iItem;
478 }
479 }
480 return -1;
481}
482
483/**********************************************************
484* LV_AddItem()
485*/
486static BOOLEAN LV_AddItem(IShellViewImpl * This, LPCITEMIDLIST pidl)
487{
488 LVITEMA lvItem;
489
490 TRACE("(%p)(pidl=%p)\n", This, pidl);
491
492 ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listview item*/
493 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
494 lvItem.iItem = ListView_GetItemCount(This->hWndList); /*add the item to the end of the list*/
495 lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/
496 lvItem.pszText = LPSTR_TEXTCALLBACKA; /*get text on a callback basis*/
497 lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
498 return (-1==ListView_InsertItemA(This->hWndList, &lvItem))? FALSE: TRUE;
499}
500
501/**********************************************************
502* LV_DeleteItem()
503*/
504static BOOLEAN LV_DeleteItem(IShellViewImpl * This, LPCITEMIDLIST pidl)
505{
506 int nIndex;
507
508 TRACE("(%p)(pidl=%p)\n", This, pidl);
509
510 nIndex = LV_FindItemByPidl(This, ILFindLastID(pidl));
511 return (-1==ListView_DeleteItem(This->hWndList, nIndex))? FALSE: TRUE;
512}
513
514/**********************************************************
515* LV_RenameItem()
516*/
517static BOOLEAN LV_RenameItem(IShellViewImpl * This, LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew )
518{
519 int nItem;
520 LVITEMA lvItem;
521
522 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", This, pidlOld, pidlNew);
523
524 nItem = LV_FindItemByPidl(This, ILFindLastID(pidlOld));
525 if ( -1 != nItem )
526 {
527 ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listview item*/
528 lvItem.mask = LVIF_PARAM; /* only the pidl */
529 lvItem.iItem = nItem;
530 ListView_GetItemA(This->hWndList, &lvItem);
531
532 SHFree((LPITEMIDLIST)lvItem.lParam);
533 lvItem.mask = LVIF_PARAM;
534 lvItem.iItem = nItem;
535 lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidlNew)); /* set the item's data */
536 ListView_SetItemA(This->hWndList, &lvItem);
537 ListView_Update(This->hWndList, nItem);
538 return TRUE; /* FIXME: better handling */
539 }
540 return FALSE;
541}
542/**********************************************************
543* ShellView_FillList()
544*
545* - gets the objectlist from the shellfolder
546* - sorts the list
547* - fills the list into the view
548*/
549
550static HRESULT ShellView_FillList(IShellViewImpl * This)
551{
552 LPENUMIDLIST pEnumIDList;
553 LPITEMIDLIST pidl;
554 DWORD dwFetched;
555 UINT i;
556 HRESULT hRes;
557 HDPA hdpa;
558
559 TRACE("%p\n",This);
560
561 /* get the itemlist from the shfolder*/
562 hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
563 if (hRes != S_OK)
564 {
565 if (hRes==S_FALSE)
566 return(NOERROR);
567 return(hRes);
568 }
569
570 /* create a pointer array */
571 hdpa = pDPA_Create(16);
572 if (!hdpa)
573 {
574 return(E_OUTOFMEMORY);
575 }
576
577 /* copy the items into the array*/
578 while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
579 {
580 if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
581 {
582 SHFree(pidl);
583 }
584 }
585
586 /* sort the array */
587 pDPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent);
588
589 /*turn the listview's redrawing off*/
590 SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
591
592 for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/
593 {
594 pidl = (LPITEMIDLIST)pDPA_GetPtr(hdpa, i);
595
596 /* in a commdlg This works as a filemask*/
597 if ( IncludeObject(This, pidl)==S_OK )
598 LV_AddItem(This, pidl);
599 SHFree(pidl);
600 }
601
602 /*turn the listview's redrawing back on and force it to draw*/
603 SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
604
605 IEnumIDList_Release(pEnumIDList); /* destroy the list*/
606 pDPA_Destroy(hdpa);
607
608 return S_OK;
609}
610
611/**********************************************************
612* ShellView_OnCreate()
613*/
614static LRESULT ShellView_OnCreate(IShellViewImpl * This)
615{
616 IDropTarget* pdt;
617 NOTIFYREGISTER ntreg;
618 IPersistFolder2 * ppf2 = NULL;
619
620 TRACE("%p\n",This);
621
622 if(ShellView_CreateList(This))
623 {
624 if(ShellView_InitList(This))
625 {
626 ShellView_FillList(This);
627 }
628 }
629
630 if(GetShellOle())
631 {
632 if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt)))
633 {
634 pRegisterDragDrop(This->hWnd, pdt);
635 IDropTarget_Release(pdt);
636 }
637 }
638
639 /* register for receiving notifications */
640 IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2);
641 if (ppf2)
642 {
643 IPersistFolder2_GetCurFolder(ppf2, &ntreg.pidlPath);
644 ntreg.bWatchSubtree = FALSE;
645 This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
646 SHFree(ntreg.pidlPath);
647 IPersistFolder2_Release(ppf2);
648 }
649
650 This->hAccel = LoadAcceleratorsA(shell32_hInstance, "shv_accel");
651
652 return S_OK;
653}
654
655/**********************************************************
656 * #### Handling of the menus ####
657 */
658
659/**********************************************************
660* ShellView_BuildFileMenu()
661*/
662static HMENU ShellView_BuildFileMenu(IShellViewImpl * This)
663{ CHAR szText[MAX_PATH];
664 MENUITEMINFOA mii;
665 int nTools,i;
666 HMENU hSubMenu;
667
668 TRACE("(%p)\n",This);
669
670 hSubMenu = CreatePopupMenu();
671 if(hSubMenu)
672 { /*get the number of items in our global array*/
673 for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){}
674
675 /*add the menu items*/
676 for(i = 0; i < nTools; i++)
677 {
678 LoadStringA(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
679
680 ZeroMemory(&mii, sizeof(mii));
681 mii.cbSize = sizeof(mii);
682 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
683
684 if(TBSTYLE_SEP != Tools[i].bStyle) /* no seperator*/
685 {
686 mii.fType = MFT_STRING;
687 mii.fState = MFS_ENABLED;
688 mii.dwTypeData = szText;
689 mii.wID = Tools[i].idCommand;
690 }
691 else
692 {
693 mii.fType = MFT_SEPARATOR;
694 }
695 /* tack This item onto the end of the menu */
696 InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
697 }
698 }
699 TRACE("-- return (menu=0x%x)\n",hSubMenu);
700 return hSubMenu;
701}
702/**********************************************************
703* ShellView_MergeFileMenu()
704*/
705static void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu)
706{ TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
707
708 if(hSubMenu)
709 { /*insert This item at the beginning of the menu */
710 _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
711 _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
712
713 }
714 TRACE("--\n");
715}
716
717/**********************************************************
718* ShellView_MergeViewMenu()
719*/
720
721static void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu)
722{ MENUITEMINFOA mii;
723
724 TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
725
726 if(hSubMenu)
727 { /*add a separator at the correct position in the menu*/
728 _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
729
730 ZeroMemory(&mii, sizeof(mii));
731 mii.cbSize = sizeof(mii);
732 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
733 mii.fType = MFT_STRING;
734 mii.dwTypeData = "View";
735 mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
736 InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
737 }
738}
739
740/**********************************************************
741* ShellView_GetSelections()
742*
743* - fills the this->apidl list with the selected objects
744*
745* RETURNS
746* number of selected items
747*/
748static UINT ShellView_GetSelections(IShellViewImpl * This)
749{
750 LVITEMA lvItem;
751 UINT i = 0;
752
753 if (This->apidl)
754 {
755 SHFree(This->apidl);
756 }
757
758 This->cidl = ListView_GetSelectedCount(This->hWndList);
759 This->apidl = (LPITEMIDLIST*)SHAlloc(This->cidl * sizeof(LPITEMIDLIST));
760
761 TRACE("selected=%i\n", This->cidl);
762
763 if(This->apidl)
764 {
765 TRACE("-- Items selected =%u\n", This->cidl);
766
767 ZeroMemory(&lvItem, sizeof(lvItem));
768 lvItem.mask = LVIF_STATE | LVIF_PARAM;
769 lvItem.stateMask = LVIS_SELECTED;
770
771 while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->cidl))
772 {
773 if(lvItem.state & LVIS_SELECTED)
774 {
775 This->apidl[i] = (LPITEMIDLIST)lvItem.lParam;
776 i++;
777 TRACE("-- selected Item found\n");
778 }
779 lvItem.iItem++;
780 }
781 }
782 return This->cidl;
783
784}
785/**********************************************************
786 * ShellView_DoContextMenu()
787 */
788static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault)
789{ UINT uCommand;
790 DWORD wFlags;
791 HMENU hMenu;
792 BOOL fExplore = FALSE;
793 HWND hwndTree = 0;
794 LPCONTEXTMENU pContextMenu = NULL;
795 IContextMenu * pCM = NULL;
796 CMINVOKECOMMANDINFO cmi;
797
798 TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
799
800 /* look, what's selected and create a context menu object of it*/
801 if( ShellView_GetSelections(This) )
802 {
803 IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, This->apidl,
804 (REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
805
806 if(pContextMenu)
807 {
808 TRACE("-- pContextMenu\n");
809 hMenu = CreatePopupMenu();
810
811 if( hMenu )
812 {
813 /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
814 if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
815 {
816 TRACE("-- explore mode\n");
817 fExplore = TRUE;
818 }
819
820 /* build the flags depending on what we can do with the selected item */
821 wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
822
823 /* let the ContextMenu merge its items in */
824 if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
825 {
826 if( bDefault )
827 {
828 TRACE("-- get menu default command\n");
829 uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
830 }
831 else
832 {
833 TRACE("-- track popup\n");
834 uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
835 }
836
837 if(uCommand > 0)
838 {
839 TRACE("-- uCommand=%u\n", uCommand);
840 if (IsInCommDlg(This) && ((uCommand==FCIDM_SHVIEW_EXPLORE) || (uCommand==FCIDM_SHVIEW_OPEN)))
841 {
842 TRACE("-- dlg: OnDefaultCommand\n");
843 OnDefaultCommand(This);
844 }
845 else
846 {
847 TRACE("-- explore -- invoke command\n");
848 ZeroMemory(&cmi, sizeof(cmi));
849 cmi.cbSize = sizeof(cmi);
850 cmi.hwnd = This->hWndParent; /* this window has to answer CWM_GETISHELLBROWSER */
851 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
852 IContextMenu_InvokeCommand(pContextMenu, &cmi);
853 }
854 }
855 DestroyMenu(hMenu);
856 }
857 }
858 if (pContextMenu)
859 IContextMenu_Release(pContextMenu);
860 }
861 }
862 else /* background context menu */
863 {
864 hMenu = CreatePopupMenu();
865
866 pCM = ISvBgCm_Constructor(This->pSFParent);
867 IContextMenu_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
868
869 uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
870 DestroyMenu(hMenu);
871
872 TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
873
874 ZeroMemory(&cmi, sizeof(cmi));
875 cmi.cbSize = sizeof(cmi);
876 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
877 cmi.hwnd = This->hWndParent;
878 IContextMenu_InvokeCommand(pCM, &cmi);
879
880 IContextMenu_Release(pCM);
881 }
882}
883
884/**********************************************************
885 * ##### message handling #####
886 */
887
888/**********************************************************
889* ShellView_OnSize()
890*/
891static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
892{
893 TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
894
895 /*resize the ListView to fit our window*/
896 if(This->hWndList)
897 {
898 MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
899 }
900
901 return S_OK;
902}
903/**********************************************************
904* ShellView_OnDeactivate()
905*
906* NOTES
907* internal
908*/
909static void ShellView_OnDeactivate(IShellViewImpl * This)
910{
911 TRACE("%p\n",This);
912
913 if(This->uState != SVUIA_DEACTIVATE)
914 {
915 if(This->hMenu)
916 {
917 IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
918 IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
919 DestroyMenu(This->hMenu);
920 This->hMenu = 0;
921 }
922
923 This->uState = SVUIA_DEACTIVATE;
924 }
925}
926
927/**********************************************************
928* ShellView_OnActivate()
929*/
930static LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState)
931{ OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
932 MENUITEMINFOA mii;
933 CHAR szText[MAX_PATH];
934
935 TRACE("%p uState=%x\n",This,uState);
936
937 /*don't do anything if the state isn't really changing */
938 if(This->uState == uState)
939 {
940 return S_OK;
941 }
942
943 ShellView_OnDeactivate(This);
944
945 /*only do This if we are active */
946 if(uState != SVUIA_DEACTIVATE)
947 {
948 /*merge the menus */
949 This->hMenu = CreateMenu();
950
951 if(This->hMenu)
952 {
953 IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
954 TRACE("-- after fnInsertMenusSB\n");
955
956 /*build the top level menu get the menu item's text*/
957 strcpy(szText,"dummy 31");
958
959 ZeroMemory(&mii, sizeof(mii));
960 mii.cbSize = sizeof(mii);
961 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
962 mii.fType = MFT_STRING;
963 mii.fState = MFS_ENABLED;
964 mii.dwTypeData = szText;
965 mii.hSubMenu = ShellView_BuildFileMenu(This);
966
967 /*insert our menu into the menu bar*/
968 if(mii.hSubMenu)
969 {
970 InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
971 }
972
973 /*get the view menu so we can merge with it*/
974 ZeroMemory(&mii, sizeof(mii));
975 mii.cbSize = sizeof(mii);
976 mii.fMask = MIIM_SUBMENU;
977
978 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
979 {
980 ShellView_MergeViewMenu(This, mii.hSubMenu);
981 }
982
983 /*add the items that should only be added if we have the focus*/
984 if(SVUIA_ACTIVATE_FOCUS == uState)
985 {
986 /*get the file menu so we can merge with it */
987 ZeroMemory(&mii, sizeof(mii));
988 mii.cbSize = sizeof(mii);
989 mii.fMask = MIIM_SUBMENU;
990
991 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
992 {
993 ShellView_MergeFileMenu(This, mii.hSubMenu);
994 }
995 }
996 TRACE("-- before fnSetMenuSB\n");
997 IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
998 }
999 }
1000 This->uState = uState;
1001 TRACE("--\n");
1002 return S_OK;
1003}
1004
1005/**********************************************************
1006* ShellView_OnSetFocus()
1007*
1008*/
1009static LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
1010{
1011 TRACE("%p\n",This);
1012
1013 /* Tell the browser one of our windows has received the focus. This
1014 should always be done before merging menus (OnActivate merges the
1015 menus) if one of our windows has the focus.*/
1016
1017 IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
1018 ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
1019
1020 /* Set the focus to the listview */
1021 SetFocus(This->hWndList);
1022
1023 /* Notify the ICommDlgBrowser interface */
1024 OnStateChange(This,CDBOSC_SETFOCUS);
1025
1026 return 0;
1027}
1028
1029/**********************************************************
1030* ShellView_OnKillFocus()
1031*/
1032static LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
1033{
1034 TRACE("(%p) stub\n",This);
1035
1036 ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
1037 /* Notify the ICommDlgBrowser */
1038 OnStateChange(This,CDBOSC_KILLFOCUS);
1039
1040 return 0;
1041}
1042
1043/**********************************************************
1044* ShellView_OnCommand()
1045*
1046* NOTES
1047* the CmdID's are the ones from the context menu
1048*/
1049static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
1050{
1051 TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
1052
1053 switch(dwCmdID)
1054 {
1055 case FCIDM_SHVIEW_SMALLICON:
1056 This->FolderSettings.ViewMode = FVM_SMALLICON;
1057 SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
1058 CheckToolbar(This);
1059 break;
1060
1061 case FCIDM_SHVIEW_BIGICON:
1062 This->FolderSettings.ViewMode = FVM_ICON;
1063 SetStyle (This, LVS_ICON, LVS_TYPEMASK);
1064 CheckToolbar(This);
1065 break;
1066
1067 case FCIDM_SHVIEW_LISTVIEW:
1068 This->FolderSettings.ViewMode = FVM_LIST;
1069 SetStyle (This, LVS_LIST, LVS_TYPEMASK);
1070 CheckToolbar(This);
1071 break;
1072
1073 case FCIDM_SHVIEW_REPORTVIEW:
1074 This->FolderSettings.ViewMode = FVM_DETAILS;
1075 SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
1076 CheckToolbar(This);
1077 break;
1078
1079 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1080 case 0x30:
1081 case 0x31:
1082 case 0x32:
1083 case 0x33:
1084 This->ListViewSortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30);
1085 This->ListViewSortInfo.bIsAscending = TRUE;
1086 This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
1087 ListView_SortItems(This->hWndList, ShellView_ListViewCompareItems, (LPARAM) (&(This->ListViewSortInfo)));
1088 break;
1089
1090 default:
1091 TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
1092 }
1093 return 0;
1094}
1095
1096/**********************************************************
1097* ShellView_OnNotify()
1098*/
1099
1100static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
1101{ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lpnmh;
1102 NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
1103 LPITEMIDLIST pidl;
1104
1105 TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
1106
1107 switch(lpnmh->code)
1108 {
1109 case NM_SETFOCUS:
1110 TRACE("-- NM_SETFOCUS %p\n",This);
1111 ShellView_OnSetFocus(This);
1112 break;
1113
1114 case NM_KILLFOCUS:
1115 TRACE("-- NM_KILLFOCUS %p\n",This);
1116 ShellView_OnDeactivate(This);
1117 /* Notify the ICommDlgBrowser interface */
1118 OnStateChange(This,CDBOSC_KILLFOCUS);
1119 break;
1120
1121 case HDN_ENDTRACKA:
1122 TRACE("-- HDN_ENDTRACKA %p\n",This);
1123 /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
1124 nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
1125 break;
1126
1127 case LVN_DELETEITEM:
1128 TRACE("-- LVN_DELETEITEM %p\n",This);
1129 SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
1130 break;
1131
1132 case LVN_ITEMACTIVATE:
1133 TRACE("-- LVN_ITEMACTIVATE %p\n",This);
1134 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1135 ShellView_DoContextMenu(This, 0, 0, TRUE);
1136 break;
1137
1138 case LVN_COLUMNCLICK:
1139 This->ListViewSortInfo.nHeaderID = lpnmlv->iSubItem;
1140 if(This->ListViewSortInfo.nLastHeaderID == This->ListViewSortInfo.nHeaderID)
1141 {
1142 This->ListViewSortInfo.bIsAscending = !This->ListViewSortInfo.bIsAscending;
1143 }
1144 else
1145 {
1146 This->ListViewSortInfo.bIsAscending = TRUE;
1147 }
1148 This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
1149
1150 ListView_SortItems(lpnmlv->hdr.hwndFrom, ShellView_ListViewCompareItems, (LPARAM) (&(This->ListViewSortInfo)));
1151 break;
1152
1153 case LVN_GETDISPINFOA:
1154 case LVN_GETDISPINFOW:
1155 TRACE("-- LVN_GETDISPINFO %p\n",This);
1156 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1157
1158 if(lpdi->item.mask & LVIF_TEXT) /* text requested */
1159 {
1160 if (This->pSF2Parent)
1161 {
1162 SHELLDETAILS sd;
1163 IShellFolder2_GetDetailsOf(This->pSF2Parent, pidl, lpdi->item.iSubItem, &sd);
1164 if (lpnmh->code == LVN_GETDISPINFOA)
1165 {
1166 StrRetToStrNA( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
1167 TRACE("-- text=%s\n",lpdi->item.pszText);
1168 }
1169 else /* LVN_GETDISPINFOW */
1170 {
1171 StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
1172 TRACE("-- text=%s\n",debugstr_w((WCHAR*)(lpdi->item.pszText)));
1173 }
1174 }
1175 else
1176 {
1177 FIXME("no SF2\n");
1178 }
1179 }
1180 if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
1181 {
1182 lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
1183 }
1184 break;
1185
1186 case LVN_ITEMCHANGED:
1187 TRACE("-- LVN_ITEMCHANGED %p\n",This);
1188 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1189 break;
1190
1191 case LVN_BEGINDRAG:
1192 case LVN_BEGINRDRAG:
1193 TRACE("-- LVN_BEGINDRAG\n");
1194
1195 if (ShellView_GetSelections(This))
1196 {
1197 IDataObject * pda;
1198 DWORD dwAttributes = SFGAO_CANLINK;
1199 DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
1200
1201 if(GetShellOle())
1202 {
1203 if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
1204 {
1205 IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */
1206
1207 if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, This->apidl, &dwAttributes)))
1208 {
1209 if (dwAttributes & SFGAO_CANLINK)
1210 {
1211 dwEffect |= DROPEFFECT_LINK;
1212 }
1213 }
1214
1215 if (pds)
1216 {
1217 DWORD dwEffect;
1218 pDoDragDrop(pda, pds, dwEffect, &dwEffect);
1219 }
1220 IDataObject_Release(pda);
1221 }
1222 }
1223 }
1224 break;
1225
1226 case LVN_BEGINLABELEDITA:
1227 {
1228 DWORD dwAttr = SFGAO_CANRENAME;
1229 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1230
1231 TRACE("-- LVN_BEGINLABELEDITA %p\n",This);
1232
1233 IShellFolder_GetAttributesOf(This->pSFParent, 1, &pidl, &dwAttr);
1234 if (SFGAO_CANRENAME & dwAttr)
1235 {
1236 return FALSE;
1237 }
1238 return TRUE;
1239 }
1240 break;
1241
1242 case LVN_ENDLABELEDITA:
1243 {
1244 TRACE("-- LVN_ENDLABELEDITA %p\n",This);
1245 if (lpdi->item.pszText)
1246 {
1247 HRESULT hr;
1248 WCHAR wszNewName[MAX_PATH];
1249 LVITEMA lvItem;
1250
1251 ZeroMemory(&lvItem, sizeof(LVITEMA));
1252 lvItem.iItem = lpdi->item.iItem;
1253 lvItem.mask = LVIF_PARAM;
1254 ListView_GetItemA(This->hWndList, &lvItem);
1255
1256 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1257 if (!MultiByteToWideChar( CP_ACP, 0, lpdi->item.pszText, -1, wszNewName, MAX_PATH ))
1258 wszNewName[MAX_PATH-1] = 0;
1259 hr = IShellFolder_SetNameOf(This->pSFParent, 0, pidl, wszNewName, SHGDN_INFOLDER, &pidl);
1260
1261 if(SUCCEEDED(hr) && pidl)
1262 {
1263 lvItem.mask = LVIF_PARAM;
1264 lvItem.lParam = (LPARAM)pidl;
1265 ListView_SetItemA(This->hWndList, &lvItem);
1266 return TRUE;
1267 }
1268 }
1269 return FALSE;
1270 }
1271 break;
1272
1273 case LVN_KEYDOWN:
1274 {
1275 /* MSG msg;
1276 msg.hwnd = This->hWnd;
1277 msg.message = WM_KEYDOWN;
1278 msg.wParam = plvKeyDown->wVKey;
1279 msg.lParam = 0;
1280 msg.time = 0;
1281 msg.pt = 0;*/
1282
1283 LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
1284
1285 /* initiate a rename of the selected file or directory */
1286 if(plvKeyDown->wVKey == VK_F2)
1287 {
1288 /* see how many files are selected */
1289 int i = ListView_GetSelectedCount(This->hWndList);
1290
1291 /* get selected item */
1292 if(i == 1)
1293 {
1294 /* get selected item */
1295 i = ListView_GetNextItem(This->hWndList, -1,
1296 LVNI_SELECTED);
1297
1298 ListView_EnsureVisible(This->hWndList, i, 0);
1299 ListView_EditLabelA(This->hWndList, i);
1300 }
1301 }
1302#if 0
1303 TranslateAccelerator(This->hWnd, This->hAccel, &msg)
1304#endif
1305 else if(plvKeyDown->wVKey == VK_DELETE)
1306 {
1307 int i, item_index;
1308 LVITEMA item;
1309 LPITEMIDLIST* pItems;
1310 ISFHelper *psfhlp;
1311
1312 IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper,
1313 (LPVOID*)&psfhlp);
1314
1315 if(!(i = ListView_GetSelectedCount(This->hWndList)))
1316 break;
1317
1318 /* allocate memory for the pidl array */
1319 pItems = HeapAlloc(GetProcessHeap(), 0,
1320 sizeof(LPITEMIDLIST) * i);
1321
1322 /* retrieve all selected items */
1323 i = 0;
1324 item_index = -1;
1325 while(ListView_GetSelectedCount(This->hWndList) > i)
1326 {
1327 /* get selected item */
1328 item_index = ListView_GetNextItem(This->hWndList,
1329 item_index, LVNI_SELECTED);
1330 item.iItem = item_index;
1331 ListView_GetItemA(This->hWndList, &item);
1332
1333 /* get item pidl */
1334 pItems[i] = (LPITEMIDLIST)item.lParam;
1335
1336 i++;
1337 }
1338
1339 /* perform the item deletion */
1340 ISFHelper_DeleteItems(psfhlp, i, pItems);
1341
1342 /* free pidl array memory */
1343 HeapFree(GetProcessHeap(), 0, pItems);
1344 }
1345 else
1346 FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
1347 }
1348 break;
1349
1350 default:
1351 TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code);
1352 break;;
1353 }
1354 return 0;
1355}
1356
1357/**********************************************************
1358* ShellView_OnChange()
1359*/
1360
1361static LRESULT ShellView_OnChange(IShellViewImpl * This, LPITEMIDLIST * Pidls, LONG wEventId)
1362{
1363
1364 TRACE("(%p)(%p,%p,0x%08lx)\n", This, Pidls[0], Pidls[1], wEventId);
1365 switch(wEventId)
1366 {
1367 case SHCNE_MKDIR:
1368 case SHCNE_CREATE:
1369 LV_AddItem(This, Pidls[0]);
1370 break;
1371 case SHCNE_RMDIR:
1372 case SHCNE_DELETE:
1373 LV_DeleteItem(This, Pidls[0]);
1374 break;
1375 case SHCNE_RENAMEFOLDER:
1376 case SHCNE_RENAMEITEM:
1377 LV_RenameItem(This, Pidls[0], Pidls[1]);
1378 break;
1379 case SHCNE_UPDATEITEM:
1380 break;
1381 }
1382 return TRUE;
1383}
1384/**********************************************************
1385* ShellView_WndProc
1386*/
1387
1388static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
1389{
1390 IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongA(hWnd, GWL_USERDATA);
1391 LPCREATESTRUCTA lpcs;
1392
1393 TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
1394
1395 switch (uMessage)
1396 {
1397 case WM_NCCREATE:
1398 lpcs = (LPCREATESTRUCTA)lParam;
1399 pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
1400 SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
1401 pThis->hWnd = hWnd; /*set the window handle*/
1402 break;
1403
1404 case WM_SIZE: return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
1405 case WM_SETFOCUS: return ShellView_OnSetFocus(pThis);
1406 case WM_KILLFOCUS: return ShellView_OnKillFocus(pThis);
1407 case WM_CREATE: return ShellView_OnCreate(pThis);
1408 case WM_ACTIVATE: return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
1409 case WM_NOTIFY: return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
1410 case WM_COMMAND: return ShellView_OnCommand(pThis,
1411 GET_WM_COMMAND_ID(wParam, lParam),
1412 GET_WM_COMMAND_CMD(wParam, lParam),
1413 GET_WM_COMMAND_HWND(wParam, lParam));
1414 case SHV_CHANGE_NOTIFY: return ShellView_OnChange(pThis, (LPITEMIDLIST*)wParam, (LONG)lParam);
1415
1416 case WM_CONTEXTMENU: ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
1417 return 0;
1418
1419 case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList);
1420 break;
1421
1422 case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0);
1423
1424 case WM_DESTROY: if(GetShellOle())
1425 {
1426 pRevokeDragDrop(pThis->hWnd);
1427 }
1428 SHChangeNotifyDeregister(pThis->hNotify);
1429 break;
1430 }
1431
1432 return DefWindowProcA (hWnd, uMessage, wParam, lParam);
1433}
1434/**********************************************************
1435*
1436*
1437* The INTERFACE of the IShellView object
1438*
1439*
1440**********************************************************
1441* IShellView_QueryInterface
1442*/
1443static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj)
1444{
1445 ICOM_THIS(IShellViewImpl, iface);
1446
1447 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
1448
1449 *ppvObj = NULL;
1450
1451 if(IsEqualIID(riid, &IID_IUnknown))
1452 {
1453 *ppvObj = This;
1454 }
1455 else if(IsEqualIID(riid, &IID_IShellView))
1456 {
1457 *ppvObj = (IShellView*)This;
1458 }
1459 else if(IsEqualIID(riid, &IID_IOleCommandTarget))
1460 {
1461 *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
1462 }
1463 else if(IsEqualIID(riid, &IID_IDropTarget))
1464 {
1465 *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
1466 }
1467 else if(IsEqualIID(riid, &IID_IDropSource))
1468 {
1469 *ppvObj = (IDropSource*)&(This->lpvtblDropSource);
1470 }
1471 else if(IsEqualIID(riid, &IID_IViewObject))
1472 {
1473 *ppvObj = (IViewObject*)&(This->lpvtblViewObject);
1474 }
1475
1476 if(*ppvObj)
1477 {
1478 IUnknown_AddRef( (IUnknown*)*ppvObj );
1479 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
1480 return S_OK;
1481 }
1482 TRACE("-- Interface: E_NOINTERFACE\n");
1483 return E_NOINTERFACE;
1484}
1485
1486/**********************************************************
1487* IShellView_AddRef
1488*/
1489static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
1490{
1491 ICOM_THIS(IShellViewImpl, iface);
1492
1493 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1494
1495 shell32_ObjCount++;
1496 return ++(This->ref);
1497}
1498/**********************************************************
1499* IShellView_Release
1500*/
1501static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
1502{
1503 ICOM_THIS(IShellViewImpl, iface);
1504
1505 TRACE("(%p)->()\n",This);
1506
1507 shell32_ObjCount--;
1508
1509 if (!--(This->ref))
1510 {
1511 TRACE(" destroying IShellView(%p)\n",This);
1512
1513 if(This->pSFParent)
1514 IShellFolder_Release(This->pSFParent);
1515
1516 if(This->pSF2Parent)
1517 IShellFolder2_Release(This->pSF2Parent);
1518
1519 if (This->apidl)
1520 SHFree(This->apidl);
1521
1522 if (This->pCommDlgBrowser)
1523 ICommDlgBrowser_Release(This->pCommDlgBrowser);
1524
1525 HeapFree(GetProcessHeap(),0,This);
1526 return 0;
1527 }
1528 return This->ref;
1529}
1530
1531/**********************************************************
1532* ShellView_GetWindow
1533*/
1534static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd)
1535{
1536 ICOM_THIS(IShellViewImpl, iface);
1537
1538 TRACE("(%p)\n",This);
1539
1540 *phWnd = This->hWnd;
1541
1542 return S_OK;
1543}
1544
1545static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode)
1546{
1547 ICOM_THIS(IShellViewImpl, iface);
1548
1549 FIXME("(%p) stub\n",This);
1550
1551 return E_NOTIMPL;
1552}
1553
1554/**********************************************************
1555* IShellView_TranslateAccelerator
1556*
1557* FIXME:
1558* use the accel functions
1559*/
1560static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg)
1561{
1562#if 0
1563 ICOM_THIS(IShellViewImpl, iface);
1564
1565 FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
1566#endif
1567
1568 if ((lpmsg->message>=WM_KEYFIRST) && (lpmsg->message>=WM_KEYLAST))
1569 {
1570 TRACE("-- key=0x04%x\n",lpmsg->wParam) ;
1571 }
1572 return S_FALSE; /* not handled */
1573}
1574
1575static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable)
1576{
1577 ICOM_THIS(IShellViewImpl, iface);
1578
1579 FIXME("(%p) stub\n",This);
1580
1581 return E_NOTIMPL;
1582}
1583
1584static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState)
1585{
1586 ICOM_THIS(IShellViewImpl, iface);
1587
1588/*
1589 CHAR szName[MAX_PATH];
1590*/
1591 LRESULT lResult;
1592 int nPartArray[1] = {-1};
1593
1594 TRACE("(%p)->(state=%x) stub\n",This, uState);
1595
1596 /*don't do anything if the state isn't really changing*/
1597 if(This->uState == uState)
1598 {
1599 return S_OK;
1600 }
1601
1602 /*OnActivate handles the menu merging and internal state*/
1603 ShellView_OnActivate(This, uState);
1604
1605 /*only do This if we are active*/
1606 if(uState != SVUIA_DEACTIVATE)
1607 {
1608
1609/*
1610 GetFolderPath is not a method of IShellFolder
1611 IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
1612*/
1613 /* set the number of parts */
1614 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
1615 (LPARAM)nPartArray, &lResult);
1616
1617 /* set the text for the parts */
1618/*
1619 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
1620 0, (LPARAM)szName, &lResult);
1621*/
1622 }
1623
1624 return S_OK;
1625}
1626
1627static HRESULT WINAPI IShellView_fnRefresh(IShellView * iface)
1628{
1629 ICOM_THIS(IShellViewImpl, iface);
1630
1631 TRACE("(%p)\n",This);
1632
1633 ListView_DeleteAllItems(This->hWndList);
1634 ShellView_FillList(This);
1635
1636 return S_OK;
1637}
1638
1639static HRESULT WINAPI IShellView_fnCreateViewWindow(
1640 IShellView * iface,
1641 IShellView *lpPrevView,
1642 LPCFOLDERSETTINGS lpfs,
1643 IShellBrowser * psb,
1644 RECT * prcView,
1645 HWND *phWnd)
1646{
1647 ICOM_THIS(IShellViewImpl, iface);
1648
1649 WNDCLASSA wc;
1650 *phWnd = 0;
1651
1652
1653 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
1654 TRACE("-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
1655
1656 /*set up the member variables*/
1657 This->pShellBrowser = psb;
1658 This->FolderSettings = *lpfs;
1659
1660 /*get our parent window*/
1661 IShellBrowser_AddRef(This->pShellBrowser);
1662 IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent));
1663
1664 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
1665 This->pCommDlgBrowser=NULL;
1666 if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser,
1667 (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
1668 {
1669 TRACE("-- CommDlgBrowser\n");
1670 }
1671
1672 /*if our window class has not been registered, then do so*/
1673 if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc))
1674 {
1675 ZeroMemory(&wc, sizeof(wc));
1676 wc.style = CS_HREDRAW | CS_VREDRAW;
1677 wc.lpfnWndProc = (WNDPROC) ShellView_WndProc;
1678 wc.cbClsExtra = 0;
1679 wc.cbWndExtra = 0;
1680 wc.hInstance = shell32_hInstance;
1681 wc.hIcon = 0;
1682 wc.hCursor = LoadCursorA (0, IDC_ARROWA);
1683 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
1684 wc.lpszMenuName = NULL;
1685 wc.lpszClassName = SV_CLASS_NAME;
1686
1687 if(!RegisterClassA(&wc))
1688 return E_FAIL;
1689 }
1690
1691 *phWnd = CreateWindowExA(0,
1692 SV_CLASS_NAME,
1693 NULL,
1694 WS_CHILD | WS_VISIBLE | WS_TABSTOP,
1695 prcView->left,
1696 prcView->top,
1697 prcView->right - prcView->left,
1698 prcView->bottom - prcView->top,
1699 This->hWndParent,
1700 0,
1701 shell32_hInstance,
1702 (LPVOID)This);
1703
1704 CheckToolbar(This);
1705
1706 if(!*phWnd) return E_FAIL;
1707
1708 return S_OK;
1709}
1710
1711static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface)
1712{
1713 ICOM_THIS(IShellViewImpl, iface);
1714
1715 TRACE("(%p)\n",This);
1716
1717 /*Make absolutely sure all our UI is cleaned up.*/
1718 IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
1719
1720 if(This->hMenu)
1721 {
1722 DestroyMenu(This->hMenu);
1723 }
1724
1725 DestroyWindow(This->hWnd);
1726 IShellBrowser_Release(This->pShellBrowser);
1727
1728 return S_OK;
1729}
1730
1731static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView * iface, LPFOLDERSETTINGS lpfs)
1732{
1733 ICOM_THIS(IShellViewImpl, iface);
1734
1735 TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
1736 This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
1737
1738 if (!lpfs) return E_INVALIDARG;
1739
1740 *lpfs = This->FolderSettings;
1741 return NOERROR;
1742}
1743
1744static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView * iface, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
1745{
1746 ICOM_THIS(IShellViewImpl, iface);
1747
1748 FIXME("(%p) stub\n",This);
1749
1750 return E_NOTIMPL;
1751}
1752
1753static HRESULT WINAPI IShellView_fnSaveViewState(IShellView * iface)
1754{
1755 ICOM_THIS(IShellViewImpl, iface);
1756
1757 FIXME("(%p) stub\n",This);
1758
1759 return S_OK;
1760}
1761
1762static HRESULT WINAPI IShellView_fnSelectItem(
1763 IShellView * iface,
1764 LPCITEMIDLIST pidl,
1765 UINT uFlags)
1766{
1767 ICOM_THIS(IShellViewImpl, iface);
1768 int i;
1769
1770 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidl, uFlags);
1771
1772 i = LV_FindItemByPidl(This, pidl);
1773
1774 if (i != -1)
1775 {
1776 LVITEMA lvItem;
1777
1778 if(uFlags & SVSI_ENSUREVISIBLE)
1779 ListView_EnsureVisible(This->hWndList, i, 0);
1780
1781 ZeroMemory(&lvItem, sizeof(LVITEMA));
1782 lvItem.mask = LVIF_STATE;
1783 lvItem.iItem = 0;
1784
1785 while(ListView_GetItemA(This->hWndList, &lvItem))
1786 {
1787 if (lvItem.iItem == i)
1788 {
1789 if (uFlags & SVSI_SELECT)
1790 lvItem.state |= LVIS_SELECTED;
1791 else
1792 lvItem.state &= ~LVIS_SELECTED;
1793
1794 if(uFlags & SVSI_FOCUSED)
1795 lvItem.state &= ~LVIS_FOCUSED;
1796 }
1797 else
1798 {
1799 if (uFlags & SVSI_DESELECTOTHERS)
1800 lvItem.state &= ~LVIS_SELECTED;
1801 }
1802 ListView_SetItemA(This->hWndList, &lvItem);
1803 lvItem.iItem++;
1804 }
1805
1806
1807 if(uFlags & SVSI_EDIT)
1808 ListView_EditLabelA(This->hWndList, i);
1809
1810 }
1811 return S_OK;
1812}
1813
1814static HRESULT WINAPI IShellView_fnGetItemObject(IShellView * iface, UINT uItem, REFIID riid, LPVOID *ppvOut)
1815{
1816 ICOM_THIS(IShellViewImpl, iface);
1817
1818 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, debugstr_guid(riid), ppvOut);
1819
1820 *ppvOut = NULL;
1821
1822 switch(uItem)
1823 {
1824 case SVGIO_BACKGROUND:
1825 *ppvOut = ISvBgCm_Constructor(This->pSFParent);
1826 break;
1827
1828 case SVGIO_SELECTION:
1829 ShellView_GetSelections(This);
1830 IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, riid, 0, ppvOut);
1831 break;
1832 }
1833 TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut);
1834
1835 if(!*ppvOut) return E_OUTOFMEMORY;
1836
1837 return S_OK;
1838}
1839
1840static HRESULT WINAPI IShellView_fnEditItem(
1841 IShellView * iface,
1842 LPITEMIDLIST pidl)
1843{
1844 ICOM_THIS(IShellViewImpl, iface);
1845 int i;
1846
1847 TRACE("(%p)->(pidl=%p)\n",This, pidl);
1848
1849 i = LV_FindItemByPidl(This, pidl);
1850 if (i != -1)
1851 {
1852 SetFocus(This->hWndList);
1853 ListView_EditLabelA(This->hWndList, i);
1854 }
1855 return S_OK;
1856}
1857
1858static struct ICOM_VTABLE(IShellView) svvt =
1859{
1860 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1861 IShellView_fnQueryInterface,
1862 IShellView_fnAddRef,
1863 IShellView_fnRelease,
1864 IShellView_fnGetWindow,
1865 IShellView_fnContextSensitiveHelp,
1866 IShellView_fnTranslateAccelerator,
1867 IShellView_fnEnableModeless,
1868 IShellView_fnUIActivate,
1869 IShellView_fnRefresh,
1870 IShellView_fnCreateViewWindow,
1871 IShellView_fnDestroyViewWindow,
1872 IShellView_fnGetCurrentInfo,
1873 IShellView_fnAddPropertySheetPages,
1874 IShellView_fnSaveViewState,
1875 IShellView_fnSelectItem,
1876 IShellView_fnGetItemObject,
1877 IShellView_fnEditItem
1878};
1879
1880
1881/**********************************************************
1882 * ISVOleCmdTarget_QueryInterface (IUnknown)
1883 */
1884static HRESULT WINAPI ISVOleCmdTarget_QueryInterface(
1885 IOleCommandTarget * iface,
1886 REFIID iid,
1887 LPVOID* ppvObj)
1888{
1889 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1890
1891 return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
1892}
1893
1894/**********************************************************
1895 * ISVOleCmdTarget_AddRef (IUnknown)
1896 */
1897static ULONG WINAPI ISVOleCmdTarget_AddRef(
1898 IOleCommandTarget * iface)
1899{
1900 _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface);
1901
1902 return IShellFolder_AddRef((IShellFolder*)This);
1903}
1904
1905/**********************************************************
1906 * ISVOleCmdTarget_Release (IUnknown)
1907 */
1908static ULONG WINAPI ISVOleCmdTarget_Release(
1909 IOleCommandTarget * iface)
1910{
1911 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1912
1913 return IShellFolder_Release((IShellFolder*)This);
1914}
1915
1916/**********************************************************
1917 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
1918 */
1919static HRESULT WINAPI ISVOleCmdTarget_QueryStatus(
1920 IOleCommandTarget *iface,
1921 const GUID* pguidCmdGroup,
1922 ULONG cCmds,
1923 OLECMD * prgCmds,
1924 OLECMDTEXT* pCmdText)
1925{
1926 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1927
1928 FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n",
1929 This, pguidCmdGroup, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
1930 return E_NOTIMPL;
1931}
1932
1933/**********************************************************
1934 * ISVOleCmdTarget_Exec (IOleCommandTarget)
1935 *
1936 * nCmdID is the OLECMDID_* enumeration
1937 */
1938static HRESULT WINAPI ISVOleCmdTarget_Exec(
1939 IOleCommandTarget *iface,
1940 const GUID* pguidCmdGroup,
1941 DWORD nCmdID,
1942 DWORD nCmdexecopt,
1943 VARIANT* pvaIn,
1944 VARIANT* pvaOut)
1945{
1946 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1947
1948 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n",
1949 This, debugstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt, pvaIn, pvaOut);
1950 return E_NOTIMPL;
1951}
1952
1953static ICOM_VTABLE(IOleCommandTarget) ctvt =
1954{
1955 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1956 ISVOleCmdTarget_QueryInterface,
1957 ISVOleCmdTarget_AddRef,
1958 ISVOleCmdTarget_Release,
1959 ISVOleCmdTarget_QueryStatus,
1960 ISVOleCmdTarget_Exec
1961};
1962
1963/**********************************************************
1964 * ISVDropTarget implementation
1965 */
1966
1967static HRESULT WINAPI ISVDropTarget_QueryInterface(
1968 IDropTarget *iface,
1969 REFIID riid,
1970 LPVOID *ppvObj)
1971{
1972 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1973
1974 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
1975
1976 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1977}
1978
1979static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface)
1980{
1981 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1982
1983 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1984
1985 return IShellFolder_AddRef((IShellFolder*)This);
1986}
1987
1988static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
1989{
1990 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1991
1992 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1993
1994 return IShellFolder_Release((IShellFolder*)This);
1995}
1996
1997static HRESULT WINAPI ISVDropTarget_DragEnter(
1998 IDropTarget *iface,
1999 IDataObject *pDataObject,
2000 DWORD grfKeyState,
2001 POINTL pt,
2002 DWORD *pdwEffect)
2003{
2004
2005 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
2006
2007 FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
2008
2009 return E_NOTIMPL;
2010}
2011
2012static HRESULT WINAPI ISVDropTarget_DragOver(
2013 IDropTarget *iface,
2014 DWORD grfKeyState,
2015 POINTL pt,
2016 DWORD *pdwEffect)
2017{
2018 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
2019
2020 FIXME("Stub: This=%p\n",This);
2021
2022 return E_NOTIMPL;
2023}
2024
2025static HRESULT WINAPI ISVDropTarget_DragLeave(
2026 IDropTarget *iface)
2027{
2028 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
2029
2030 FIXME("Stub: This=%p\n",This);
2031
2032 return E_NOTIMPL;
2033}
2034
2035static HRESULT WINAPI ISVDropTarget_Drop(
2036 IDropTarget *iface,
2037 IDataObject* pDataObject,
2038 DWORD grfKeyState,
2039 POINTL pt,
2040 DWORD *pdwEffect)
2041{
2042 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
2043
2044 FIXME("Stub: This=%p\n",This);
2045
2046 return E_NOTIMPL;
2047}
2048
2049static struct ICOM_VTABLE(IDropTarget) dtvt =
2050{
2051 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2052 ISVDropTarget_QueryInterface,
2053 ISVDropTarget_AddRef,
2054 ISVDropTarget_Release,
2055 ISVDropTarget_DragEnter,
2056 ISVDropTarget_DragOver,
2057 ISVDropTarget_DragLeave,
2058 ISVDropTarget_Drop
2059};
2060
2061/**********************************************************
2062 * ISVDropSource implementation
2063 */
2064
2065static HRESULT WINAPI ISVDropSource_QueryInterface(
2066 IDropSource *iface,
2067 REFIID riid,
2068 LPVOID *ppvObj)
2069{
2070 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
2071
2072 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
2073
2074 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
2075}
2076
2077static ULONG WINAPI ISVDropSource_AddRef( IDropSource *iface)
2078{
2079 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
2080
2081 TRACE("(%p)->(count=%lu)\n",This,This->ref);
2082
2083 return IShellFolder_AddRef((IShellFolder*)This);
2084}
2085
2086static ULONG WINAPI ISVDropSource_Release( IDropSource *iface)
2087{
2088 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
2089
2090 TRACE("(%p)->(count=%lu)\n",This,This->ref);
2091
2092 return IShellFolder_Release((IShellFolder*)This);
2093}
2094static HRESULT WINAPI ISVDropSource_QueryContinueDrag(
2095 IDropSource *iface,
2096 BOOL fEscapePressed,
2097 DWORD grfKeyState)
2098{
2099 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
2100 TRACE("(%p)\n",This);
2101
2102 if (fEscapePressed)
2103 return DRAGDROP_S_CANCEL;
2104 else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
2105 return DRAGDROP_S_DROP;
2106 else
2107 return NOERROR;
2108}
2109
2110static HRESULT WINAPI ISVDropSource_GiveFeedback(
2111 IDropSource *iface,
2112 DWORD dwEffect)
2113{
2114 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
2115 TRACE("(%p)\n",This);
2116
2117 return DRAGDROP_S_USEDEFAULTCURSORS;
2118}
2119
2120static struct ICOM_VTABLE(IDropSource) dsvt =
2121{
2122 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2123 ISVDropSource_QueryInterface,
2124 ISVDropSource_AddRef,
2125 ISVDropSource_Release,
2126 ISVDropSource_QueryContinueDrag,
2127 ISVDropSource_GiveFeedback
2128};
2129/**********************************************************
2130 * ISVViewObject implementation
2131 */
2132
2133static HRESULT WINAPI ISVViewObject_QueryInterface(
2134 IViewObject *iface,
2135 REFIID riid,
2136 LPVOID *ppvObj)
2137{
2138 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2139
2140 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
2141
2142 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
2143}
2144
2145static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface)
2146{
2147 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2148
2149 TRACE("(%p)->(count=%lu)\n",This,This->ref);
2150
2151 return IShellFolder_AddRef((IShellFolder*)This);
2152}
2153
2154static ULONG WINAPI ISVViewObject_Release( IViewObject *iface)
2155{
2156 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2157
2158 TRACE("(%p)->(count=%lu)\n",This,This->ref);
2159
2160 return IShellFolder_Release((IShellFolder*)This);
2161}
2162
2163static HRESULT WINAPI ISVViewObject_Draw(
2164 IViewObject *iface,
2165 DWORD dwDrawAspect,
2166 LONG lindex,
2167 void* pvAspect,
2168 DVTARGETDEVICE* ptd,
2169 HDC hdcTargetDev,
2170 HDC hdcDraw,
2171 LPCRECTL lprcBounds,
2172 LPCRECTL lprcWBounds,
2173 IVO_ContCallback pfnContinue,
2174 DWORD dwContinue)
2175{
2176
2177 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2178
2179 FIXME("Stub: This=%p\n",This);
2180
2181 return E_NOTIMPL;
2182}
2183static HRESULT WINAPI ISVViewObject_GetColorSet(
2184 IViewObject *iface,
2185 DWORD dwDrawAspect,
2186 LONG lindex,
2187 void *pvAspect,
2188 DVTARGETDEVICE* ptd,
2189 HDC hicTargetDevice,
2190 LOGPALETTE** ppColorSet)
2191{
2192
2193 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2194
2195 FIXME("Stub: This=%p\n",This);
2196
2197 return E_NOTIMPL;
2198}
2199static HRESULT WINAPI ISVViewObject_Freeze(
2200 IViewObject *iface,
2201 DWORD dwDrawAspect,
2202 LONG lindex,
2203 void* pvAspect,
2204 DWORD* pdwFreeze)
2205{
2206
2207 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2208
2209 FIXME("Stub: This=%p\n",This);
2210
2211 return E_NOTIMPL;
2212}
2213static HRESULT WINAPI ISVViewObject_Unfreeze(
2214 IViewObject *iface,
2215 DWORD dwFreeze)
2216{
2217
2218 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2219
2220 FIXME("Stub: This=%p\n",This);
2221
2222 return E_NOTIMPL;
2223}
2224static HRESULT WINAPI ISVViewObject_SetAdvise(
2225 IViewObject *iface,
2226 DWORD aspects,
2227 DWORD advf,
2228 IAdviseSink* pAdvSink)
2229{
2230
2231 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2232
2233 FIXME("Stub: This=%p\n",This);
2234
2235 return E_NOTIMPL;
2236}
2237static HRESULT WINAPI ISVViewObject_GetAdvise(
2238 IViewObject *iface,
2239 DWORD* pAspects,
2240 DWORD* pAdvf,
2241 IAdviseSink** ppAdvSink)
2242{
2243
2244 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
2245
2246 FIXME("Stub: This=%p\n",This);
2247
2248 return E_NOTIMPL;
2249}
2250
2251
2252static struct ICOM_VTABLE(IViewObject) vovt =
2253{
2254 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2255 ISVViewObject_QueryInterface,
2256 ISVViewObject_AddRef,
2257 ISVViewObject_Release,
2258 ISVViewObject_Draw,
2259 ISVViewObject_GetColorSet,
2260 ISVViewObject_Freeze,
2261 ISVViewObject_Unfreeze,
2262 ISVViewObject_SetAdvise,
2263 ISVViewObject_GetAdvise
2264};
2265
Note: See TracBrowser for help on using the repository browser.