4 * Copyright 1998 <juergen.schmied@metronet.de>
6 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
15 #include "wine/obj_base.h"
16 #include "wine/obj_shellfolder.h"
17 #include "wine/obj_shellview.h"
18 #include "wine/obj_commdlgbrowser.h"
19 #include "wine/obj_shellbrowser.h"
20 #include "wine/obj_dockingwindowframe.h"
21 #include "wine/obj_extracticon.h"
25 #include "debugtools.h"
30 #include "shell32_main.h"
32 DEFAULT_DEBUG_CHANNEL(shell)
35 { ICOM_VTABLE(IShellView)* lpvtbl;
37 ICOM_VTABLE(IOleCommandTarget)* lpvtblOleCommandTarget;
38 ICOM_VTABLE(IDropTarget)* lpvtblDropTarget;
39 ICOM_VTABLE(IViewObject)* lpvtblViewObject;
40 IShellFolder* pSFParent;
41 IShellBrowser* pShellBrowser;
42 ICommDlgBrowser* pCommDlgBrowser;
46 FOLDERSETTINGS FolderSettings;
50 LPITEMIDLIST *aSelectedItems;
53 static struct ICOM_VTABLE(IShellView) svvt;
55 static struct ICOM_VTABLE(IOleCommandTarget) ctvt;
56 #define _IOleCommandTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblOleCommandTarget)))
57 #define _ICOM_THIS_From_IOleCommandTarget(class, name) class* This = (class*)(((char*)name)-_IOleCommandTarget_Offset);
59 static struct ICOM_VTABLE(IDropTarget) dtvt;
60 #define _IDropTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropTarget)))
61 #define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
63 static struct ICOM_VTABLE(IViewObject) vovt;
64 #define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject)))
65 #define _ICOM_THIS_From_IViewObject(class, name) class* This = (class*)(((char*)name)-_IViewObject_Offset);
68 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
69 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
70 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
72 #define ID_LISTVIEW 2000
77 #define TOOLBAR_ID (L"SHELLDLL_DefView")
79 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
80 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
81 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
83 #define WM_SETTINGCHANGE WM_WININICHANGE
84 extern void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition,
85 UINT wID, UINT fType, LPSTR dwTypeData, UINT fState);
95 } MYTOOLINFO, *LPMYTOOLINFO;
98 MYTOOLINFO g_Tools[] =
99 { {IDM_VIEW_FILES, 0, IDS_TB_VIEW_FILES, IDS_MI_VIEW_FILES, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON},
100 {-1, 0, 0, 0, 0, 0, 0}
105 typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
107 /**************************************************************************
108 * IShellView_Constructor
110 IShellView * IShellView_Constructor( IShellFolder * pFolder, LPCITEMIDLIST pidl)
111 { IShellViewImpl * sv;
112 sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IShellViewImpl));
115 sv->lpvtblOleCommandTarget=&ctvt;
116 sv->lpvtblDropTarget=&dtvt;
117 sv->lpvtblViewObject=&vovt;
120 sv->pSFParent = pFolder;
122 sv->aSelectedItems = NULL;
125 IShellFolder_AddRef(pFolder);
127 TRACE("(%p)->(%p pidl=%p)\n",sv, pFolder, pidl);
129 return (IShellView *) sv;
131 /**************************************************************************
132 * helperfunctions for communication with ICommDlgBrowser
135 static BOOL IsInCommDlg(IShellViewImpl * This)
136 { return(This->pCommDlgBrowser != NULL);
138 static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
140 if ( IsInCommDlg(This) )
141 { TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
142 return (ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl));
147 static HRESULT OnDefaultCommand(IShellViewImpl * This)
149 if (IsInCommDlg(This))
150 { TRACE("ICommDlgBrowser::OnDefaultCommand\n");
151 return (ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This));
156 static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
158 if (IsInCommDlg(This))
159 { TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
160 return (ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags));
164 static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
167 TRACE("(%p)\n", This);
169 tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
170 SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
173 static void CheckToolbar(IShellViewImpl * This)
178 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
179 FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
180 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
181 FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
182 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
183 FCIDM_TB_SMALLICON, TRUE, &result);
184 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
185 FCIDM_TB_REPORTVIEW, TRUE, &result);
189 static void MergeToolBar(IShellViewImpl * This)
190 { LRESULT iStdBMOffset;
191 LRESULT iViewBMOffset;
193 TBBUTTON tbActual[6];
196 { IN_STD_BMP = 0x4000,
199 static const TBBUTTON c_tbDefault[] =
200 { { STD_COPY | IN_STD_BMP, FCIDM_SHVIEW_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, -1},
201 { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0,0}, 0, -1 },
202 { VIEW_LARGEICONS | IN_VIEW_BMP, FCIDM_SHVIEW_BIGICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
203 { VIEW_SMALLICONS | IN_VIEW_BMP, FCIDM_SHVIEW_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
204 { VIEW_LIST | IN_VIEW_BMP, FCIDM_SHVIEW_LISTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
205 { VIEW_DETAILS | IN_VIEW_BMP, FCIDM_SHVIEW_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
210 ab.hInst = HINST_COMMCTRL; /* hinstCommctrl */
211 ab.nID = IDB_STD_SMALL_COLOR; /* std bitmaps */
212 IShellBrowser_SendControlMsg(This->pShellBrowser,FCW_TOOLBAR,
213 TB_ADDBITMAP, 8, (LPARAM)&ab, &iStdBMOffset);
215 TRACE("TB_ADDBITMAP returns %lx\n", iStdBMOffset);
217 ab.nID = IDB_VIEW_SMALL_COLOR; /* std view bitmaps */
218 IShellBrowser_SendControlMsg(This->pShellBrowser,FCW_TOOLBAR,
219 TB_ADDBITMAP, 8, (LPARAM)&ab, &iViewBMOffset);
221 TRACE("TB_ADDBITMAP returns %lx\n", iViewBMOffset);
224 { tbActual[i] = c_tbDefault[i];
225 if (!(tbActual[i].fsStyle & TBSTYLE_SEP))
226 { if (tbActual[i].iBitmap & IN_VIEW_BMP)
227 { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_VIEW_BMP) + iViewBMOffset;
229 else if (tbActual[i].iBitmap & IN_STD_BMP)
230 { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_STD_BMP) + iStdBMOffset;
235 IShellBrowser_SetToolbarItems(This->pShellBrowser,tbActual, 6, FCT_MERGE);
242 /**************************************************************************
243 * ShellView_CreateList()
247 BOOL ShellView_CreateList (IShellViewImpl * This)
252 dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
253 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT;
254 switch (This->FolderSettings.ViewMode)
255 { case FVM_ICON: dwStyle |= LVS_ICON; break;
256 case FVM_DETAILS: dwStyle |= LVS_REPORT; break;
257 case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break;
258 case FVM_LIST: dwStyle |= LVS_LIST; break;
259 default: dwStyle |= LVS_LIST; break;
261 if (This->FolderSettings.fFlags && FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE;
262 /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
263 if (This->FolderSettings.fFlags && FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
265 This->hWndList=CreateWindowExA( WS_EX_CLIENTEDGE,
278 /* UpdateShellSettings(); */
281 /**************************************************************************
282 * ShellView_InitList()
287 int nColumn1=120; /* width of column */
292 BOOL ShellView_InitList(IShellViewImpl * This)
293 { LVCOLUMNA lvColumn;
298 ListView_DeleteAllItems(This->hWndList);
300 /*initialize the columns */
301 lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; /* | LVCF_SUBITEM;*/
302 lvColumn.fmt = LVCFMT_LEFT;
303 lvColumn.pszText = szString;
305 lvColumn.cx = nColumn1;
306 strcpy(szString,"File");
307 /*LoadStringA(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/
308 ListView_InsertColumnA(This->hWndList, 0, &lvColumn);
310 lvColumn.cx = nColumn2;
311 strcpy(szString,"Size");
312 ListView_InsertColumnA(This->hWndList, 1, &lvColumn);
314 lvColumn.cx = nColumn3;
315 strcpy(szString,"Type");
316 ListView_InsertColumnA(This->hWndList, 2, &lvColumn);
318 lvColumn.cx = nColumn4;
319 strcpy(szString,"Modified");
320 ListView_InsertColumnA(This->hWndList, 3, &lvColumn);
322 ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL);
323 ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL);
327 /**************************************************************************
328 * ShellView_CompareItems()
331 * internal, CALLBACK for DSA_Sort
333 INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
335 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
340 ret = (int)((LPSHELLFOLDER)lpData)->lpvtbl->fnCompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2);
341 TRACE("ret=%i\n",ret);
345 /**************************************************************************
346 * ShellView_FillList()
352 static HRESULT ShellView_FillList(IShellViewImpl * This)
353 { LPENUMIDLIST pEnumIDList;
363 /* get the itemlist from the shfolder*/
364 hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
371 /* create a pointer array */
372 hdpa = pDPA_Create(16);
374 { return(E_OUTOFMEMORY);
377 /* copy the items into the array*/
378 while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
379 { if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
385 pDPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent);
387 /*turn the listview's redrawing off*/
388 SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
390 for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/
391 { pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
392 if (IncludeObject(This, pidl) == S_OK) /* in a commdlg This works as a filemask*/
393 { ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/
394 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
395 lvItem.iItem = ListView_GetItemCount(This->hWndList); /*add the item to the end of the list*/
396 lvItem.lParam = (LPARAM) pidl; /*set the item's data*/
397 lvItem.pszText = LPSTR_TEXTCALLBACKA; /*get text on a callback basis*/
398 lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
399 ListView_InsertItemA(This->hWndList, &lvItem);
402 SHFree(pidl); /* the listview has the COPY*/
405 /*turn the listview's redrawing back on and force it to draw*/
406 SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
407 InvalidateRect(This->hWndList, NULL, TRUE);
408 UpdateWindow(This->hWndList);
410 IEnumIDList_Release(pEnumIDList); /* destroy the list*/
416 /**************************************************************************
417 * ShellView_OnCreate()
422 LRESULT ShellView_OnCreate(IShellViewImpl * This)
423 { TRACE("%p\n",This);
425 if(ShellView_CreateList(This))
426 { if(ShellView_InitList(This))
427 { ShellView_FillList(This);
433 /**************************************************************************
436 LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
437 { TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
439 /*resize the ListView to fit our window*/
441 { MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
446 /**************************************************************************
447 * ShellView_BuildFileMenu()
449 HMENU ShellView_BuildFileMenu(IShellViewImpl * This)
450 { CHAR szText[MAX_PATH];
455 TRACE("(%p) semi-stub\n",This);
457 hSubMenu = CreatePopupMenu();
459 { /*get the number of items in our global array*/
460 for(nTools = 0; g_Tools[nTools].idCommand != -1; nTools++){}
462 /*add the menu items*/
463 for(i = 0; i < nTools; i++)
464 { strcpy(szText, "dummy BuildFileMenu");
466 ZeroMemory(&mii, sizeof(mii));
467 mii.cbSize = sizeof(mii);
468 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
470 if(TBSTYLE_SEP != g_Tools[i].bStyle) /* no seperator*/
471 { mii.fType = MFT_STRING;
472 mii.fState = MFS_ENABLED;
473 mii.dwTypeData = szText;
474 mii.wID = g_Tools[i].idCommand;
477 { mii.fType = MFT_SEPARATOR;
479 /* tack This item onto the end of the menu */
480 InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
483 TRACE("-- return (menu=0x%x)\n",hSubMenu);
486 /**************************************************************************
487 * ShellView_MergeFileMenu()
489 void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu)
490 { TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
493 { /*insert This item at the beginning of the menu */
494 _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
495 _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
501 /**************************************************************************
502 * ShellView_MergeViewMenu()
505 void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu)
508 TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
511 { /*add a separator at the correct position in the menu*/
512 _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
514 ZeroMemory(&mii, sizeof(mii));
515 mii.cbSize = sizeof(mii);
516 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
517 mii.fType = MFT_STRING;
518 mii.dwTypeData = "View";
519 mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
520 InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
524 /**************************************************************************
525 * ShellView_CanDoIDockingWindow()
527 BOOL ShellView_CanDoIDockingWindow(IShellViewImpl * This)
528 { BOOL bReturn = FALSE;
530 LPSERVICEPROVIDER pSP;
531 LPDOCKINGWINDOWFRAME pFrame;
533 FIXME("(%p) stub\n",This);
535 /*get the browser's IServiceProvider*/
536 hr = IShellBrowser_QueryInterface(This->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
538 { hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
541 pFrame->lpvtbl->fnRelease(pFrame);
543 IServiceProvider_Release(pSP);
548 /**************************************************************************
549 * ShellView_UpdateMenu()
551 LRESULT ShellView_UpdateMenu(IShellViewImpl * This, HMENU hMenu)
552 { TRACE("(%p)->(menu=0x%08x)\n",This,hMenu);
553 CheckMenuItem(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED));
555 if(ShellView_CanDoIDockingWindow(This))
556 { EnableMenuItem(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_ENABLED);
557 CheckMenuItem(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | (g_bShowIDW ? MF_CHECKED: MF_UNCHECKED));
560 { EnableMenuItem(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
561 CheckMenuItem(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED);
566 /**************************************************************************
567 * ShellView_OnDeactivate()
572 void ShellView_OnDeactivate(IShellViewImpl * This)
573 { TRACE("%p\n",This);
574 if(This->uState != SVUIA_DEACTIVATE)
576 { IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
577 IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
578 DestroyMenu(This->hMenu);
582 This->uState = SVUIA_DEACTIVATE;
586 /**************************************************************************
587 * ShellView_OnActivate()
589 LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState)
590 { OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
592 CHAR szText[MAX_PATH];
594 TRACE("%p uState=%x\n",This,uState);
596 /*don't do anything if the state isn't really changing */
597 if(This->uState == uState)
601 ShellView_OnDeactivate(This);
603 /*only do This if we are active */
604 if(uState != SVUIA_DEACTIVATE)
605 { /*merge the menus */
606 This->hMenu = CreateMenu();
609 { IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
610 TRACE("-- after fnInsertMenusSB\n");
611 /*build the top level menu get the menu item's text*/
612 strcpy(szText,"dummy 31");
614 ZeroMemory(&mii, sizeof(mii));
615 mii.cbSize = sizeof(mii);
616 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
617 mii.fType = MFT_STRING;
618 mii.fState = MFS_ENABLED;
619 mii.dwTypeData = szText;
620 mii.hSubMenu = ShellView_BuildFileMenu(This);
622 /*insert our menu into the menu bar*/
624 { InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
627 /*get the view menu so we can merge with it*/
628 ZeroMemory(&mii, sizeof(mii));
629 mii.cbSize = sizeof(mii);
630 mii.fMask = MIIM_SUBMENU;
632 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
633 { ShellView_MergeViewMenu(This, mii.hSubMenu);
636 /*add the items that should only be added if we have the focus*/
637 if(SVUIA_ACTIVATE_FOCUS == uState)
638 { /*get the file menu so we can merge with it */
639 ZeroMemory(&mii, sizeof(mii));
640 mii.cbSize = sizeof(mii);
641 mii.fMask = MIIM_SUBMENU;
643 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
644 { ShellView_MergeFileMenu(This, mii.hSubMenu);
647 TRACE("-- before fnSetMenuSB\n");
648 IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
651 This->uState = uState;
656 /**************************************************************************
657 * ShellView_OnSetFocus()
662 LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
663 { TRACE("%p\n",This);
664 /* Tell the browser one of our windows has received the focus. This should always
665 be done before merging menus (OnActivate merges the menus) if one of our
666 windows has the focus.*/
667 IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
668 ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
673 /**************************************************************************
674 * ShellView_OnKillFocus()
676 LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
677 { TRACE("(%p) stub\n",This);
678 ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
682 /**************************************************************************
683 * ShellView_AddRemoveDockingWindow()
685 BOOL ShellView_AddRemoveDockingWindow(IShellViewImpl * This, BOOL bAdd)
686 { BOOL bReturn = FALSE;
688 LPSERVICEPROVIDER pSP;
689 LPDOCKINGWINDOWFRAME pFrame;
691 WARN("(%p)->(badd=0x%08x) semi-stub\n",This,bAdd);
693 /* get the browser's IServiceProvider */
694 hr = IShellBrowser_QueryInterface(This->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
696 { /*get the IDockingWindowFrame pointer*/
697 hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
701 FIXME("no docking implemented\n");
703 if(!This->pDockingWindow)
704 { /* create the toolbar object */
705 This->pDockingWindow = DockingWindow_Constructor(This, This->hWnd);
708 if(This->pDockingWindow)
709 { /*add the toolbar object */
710 hr = pFrame->lpvtbl->fnAddToolbar(pFrame, (IDockingWindow*)This->pDockingWindow, TOOLBAR_ID, 0);
719 { FIXME("no docking implemented\n");
721 if(This->pDockingWindow)
722 { hr = pFrame->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)This->pDockingWindow, DWFRF_NORMAL);
725 { /* RemoveToolbar should release the toolbar object which will cause */
726 /*it to destroy itself. Our toolbar object is no longer valid at */
729 This->pDockingWindow = NULL;
735 pFrame->lpvtbl->fnRelease(pFrame);
737 IServiceProvider_Release(pSP);
742 /**************************************************************************
743 * ShellView_UpdateShellSettings()
745 void ShellView_UpdateShellSettings(IShellViewImpl * This)
746 { FIXME("(%p) stub\n",This);
750 HINSTANCE hinstShell32;
752 /* Since SHGetSettings is not implemented in all versions of the shell, get the
753 function address manually at run time. This allows the code to run on all
756 ZeroMemory(&sfs, sizeof(sfs));
758 /* The default, in case any of the following steps fails, is classic Windows 95
761 sfs.fWin95Classic = TRUE;
763 hinstShell32 = LoadLibrary("shell32.dll");
765 { PFNSHGETSETTINGSPROC pfnSHGetSettings;
767 pfnSHGetSettings = (PFNSHGETSETTINGSPROC)GetProcAddress(hinstShell32, "SHGetSettings");
769 { (*pfnSHGetSettings)(&sfs, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC);
771 FreeLibrary(hinstShell32);
774 DWORD dwExStyles = 0;
776 if(!sfs.fWin95Classic && !sfs.fDoubleClickInWebView)
777 dwExStyles |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT | LVS_EX_UNDERLINEHOT;
779 ListView_SetExtendedListViewStyle(This->hWndList, dwExStyles);
783 /**************************************************************************
784 * ShellView_OnSettingChange()
786 LRESULT ShellView_OnSettingChange(IShellViewImpl * This, LPCSTR lpszSection)
787 { TRACE("(%p) stub\n",This);
788 /*if(0 == lstrcmpi(lpszSection, "ShellState"))*/
789 { ShellView_UpdateShellSettings(This);
794 /**************************************************************************
795 * ShellView_OnCommand()
797 LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
798 { TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
800 { case IDM_VIEW_FILES:
801 g_bViewKeys = ! g_bViewKeys;
802 IShellView_Refresh((IShellView*) This);
806 g_bShowIDW = ! g_bShowIDW;
807 ShellView_AddRemoveDockingWindow(This, g_bShowIDW);
814 case FCIDM_SHVIEW_SMALLICON:
815 This->FolderSettings.ViewMode = FVM_SMALLICON;
816 SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
819 case FCIDM_SHVIEW_BIGICON:
820 This->FolderSettings.ViewMode = FVM_ICON;
821 SetStyle (This, LVS_ICON, LVS_TYPEMASK);
824 case FCIDM_SHVIEW_LISTVIEW:
825 This->FolderSettings.ViewMode = FVM_LIST;
826 SetStyle (This, LVS_LIST, LVS_TYPEMASK);
829 case FCIDM_SHVIEW_REPORTVIEW:
830 This->FolderSettings.ViewMode = FVM_DETAILS;
831 SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
835 TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
840 /**************************************************************************
841 * ShellView_GetSelections()
844 * number of selected items
846 UINT ShellView_GetSelections(IShellViewImpl * This)
851 if (This->aSelectedItems)
852 { SHFree(This->aSelectedItems);
855 This->uSelected = ListView_GetSelectedCount(This->hWndList);
856 This->aSelectedItems = (LPITEMIDLIST*)SHAlloc(This->uSelected * sizeof(LPITEMIDLIST));
858 TRACE("selected=%i\n", This->uSelected);
860 if(This->aSelectedItems)
861 { TRACE("-- Items selected =%u\n", This->uSelected);
862 ZeroMemory(&lvItem, sizeof(lvItem));
863 lvItem.mask = LVIF_STATE | LVIF_PARAM;
864 lvItem.stateMask = LVIS_SELECTED;
869 while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->uSelected))
870 { if(lvItem.state & LVIS_SELECTED)
871 { This->aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam;
873 TRACE("-- selected Item found\n");
878 return This->uSelected;
881 /**************************************************************************
882 * ShellView_DoContextMenu()
884 void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL fDefault)
888 BOOL fExplore = FALSE;
892 LPCONTEXTMENU pContextMenu = NULL;
893 CMINVOKECOMMANDINFO cmi;
895 TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, fDefault);
897 /* look, what's selected and create a context menu object of it*/
898 if(ShellView_GetSelections(This))
899 { This->pSFParent->lpvtbl->fnGetUIObjectOf( This->pSFParent, This->hWndParent, This->uSelected,
900 This->aSelectedItems, (REFIID)&IID_IContextMenu,
901 NULL, (LPVOID *)&pContextMenu);
904 { TRACE("-- pContextMenu\n");
905 hMenu = CreatePopupMenu();
908 { /* See if we are in Explore or Open mode. If the browser's tree
909 is present, then we are in Explore mode.*/
911 if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
912 { TRACE("-- explore mode\n");
916 wFlags = CMF_NORMAL | (This->uSelected != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
918 if (SUCCEEDED(pContextMenu->lpvtbl->fnQueryContextMenu( pContextMenu, hMenu, 0, MENU_OFFSET, MENU_MAX, wFlags )))
920 { TRACE("-- get menu default command\n");
922 uCommand = nMenuIndex = 0;
923 ZeroMemory(&mii, sizeof(mii));
924 mii.cbSize = sizeof(mii);
925 mii.fMask = MIIM_STATE | MIIM_ID;
927 while(GetMenuItemInfoA(hMenu, nMenuIndex, TRUE, &mii)) /*find the default item in the menu*/
928 { if(mii.fState & MFS_DEFAULT)
929 { uCommand = mii.wID;
936 { TRACE("-- track popup\n");
937 uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
941 { TRACE("-- uCommand=%u\n", uCommand);
942 if (IsInCommDlg(This) && (((uCommand-MENU_OFFSET)==IDM_EXPLORE) || ((uCommand-MENU_OFFSET)==IDM_OPEN)))
943 { TRACE("-- dlg: OnDefaultCommand\n");
944 OnDefaultCommand(This);
947 { TRACE("-- explore -- invoke command\n");
948 ZeroMemory(&cmi, sizeof(cmi));
949 cmi.cbSize = sizeof(cmi);
950 cmi.hwnd = This->hWndParent;
951 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand - MENU_OFFSET);
952 pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
959 pContextMenu->lpvtbl->fnRelease(pContextMenu);
962 else /* background context menu */
963 { hMenu = LoadMenuA(shell32_hInstance, "MENU_002");
964 uCommand = TrackPopupMenu( GetSubMenu(hMenu,0),TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
965 ShellView_OnCommand(This, uCommand, 0,0);
970 /**************************************************************************
971 * ShellView_OnNotify()
974 LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
975 { NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
976 NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
981 TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
985 TRACE("-- NM_SETFOCUS %p\n",This);
986 ShellView_OnSetFocus(This);
990 TRACE("-- NM_KILLFOCUS %p\n",This);
991 ShellView_OnDeactivate(This);
995 TRACE("-- HDN_ENDTRACKA %p\n",This);
996 /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
997 nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
1000 case LVN_DELETEITEM:
1001 TRACE("-- LVN_DELETEITEM %p\n",This);
1002 SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
1005 case LVN_ITEMACTIVATE:
1006 TRACE("-- LVN_ITEMACTIVATE %p\n",This);
1007 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1008 ShellView_DoContextMenu(This, 0, 0, TRUE);
1012 TRACE("-- NM_RCLICK %p\n",This);
1013 dwCursor = GetMessagePos();
1014 ShellView_DoContextMenu(This, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
1017 case LVN_GETDISPINFOA:
1018 TRACE("-- LVN_GETDISPINFOA %p\n",This);
1019 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1022 if(lpdi->item.iSubItem) /*is the sub-item information being requested?*/
1023 { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
1024 { if(_ILIsValue(pidl)) /*is This a value or a folder?*/
1025 { switch (lpdi->item.iSubItem)
1026 { case 1: /* size */
1027 _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1029 case 2: /* extension */
1031 if (_ILGetExtension (pidl, sTemp, 64))
1032 { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64)
1033 && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax )))
1034 { strncpy (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax);
1035 strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax);
1038 else /* no extension found */
1039 { lpdi->item.pszText[0]=0x00;
1044 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1048 else /*its a folder*/
1049 { switch (lpdi->item.iSubItem)
1051 strcpy(lpdi->item.pszText, "");
1054 strncpy (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
1057 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1061 TRACE("-- text=%s\n",lpdi->item.pszText);
1064 else /*the item text is being requested*/
1065 { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
1066 { if(SUCCEEDED(IShellFolder_GetDisplayNameOf(This->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
1067 { if(STRRET_WSTR == str.uType)
1068 { WideCharToLocal(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax);
1069 SHFree(str.u.pOleStr);
1071 else if(STRRET_CSTRA == str.uType)
1072 { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
1075 { FIXME("type wrong\n");
1078 TRACE("-- text=%s\n",lpdi->item.pszText);
1081 if(lpdi->item.mask & LVIF_IMAGE) /*is the image being requested?*/
1082 { lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
1087 case LVN_ITEMCHANGED:
1088 TRACE("-- LVN_ITEMCHANGED %p\n",This);
1089 ShellView_GetSelections(This);
1090 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1094 TRACE("-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
1100 /**************************************************************************
1104 LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
1105 { IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongA(hWnd, GWL_USERDATA);
1106 LPCREATESTRUCTA lpcs;
1109 TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
1113 { TRACE("-- WM_NCCREATE\n");
1114 lpcs = (LPCREATESTRUCTA)lParam;
1115 pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
1116 SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
1117 pThis->hWnd = hWnd; /*set the window handle*/
1122 TRACE("-- WM_SIZE\n");
1123 return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
1126 TRACE("-- WM_SETFOCUS\n");
1127 return ShellView_OnSetFocus(pThis);
1130 TRACE("-- WM_KILLFOCUS\n");
1131 return ShellView_OnKillFocus(pThis);
1134 TRACE("-- WM_CREATE\n");
1135 return ShellView_OnCreate(pThis);
1138 TRACE("-- WM_SHOWWINDOW\n");
1139 UpdateWindow(pThis->hWndList);
1143 TRACE("-- WM_ACTIVATE\n");
1144 return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
1147 TRACE("-- WM_COMMAND\n");
1148 return ShellView_OnCommand(pThis, GET_WM_COMMAND_ID(wParam, lParam),
1149 GET_WM_COMMAND_CMD(wParam, lParam),
1150 GET_WM_COMMAND_HWND(wParam, lParam));
1152 case WM_INITMENUPOPUP:
1153 TRACE("-- WM_INITMENUPOPUP\n");
1154 return ShellView_UpdateMenu(pThis, (HMENU)wParam);
1157 TRACE("-- WM_NOTIFY\n");
1158 return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
1160 case WM_SETTINGCHANGE:
1161 TRACE("-- WM_SETTINGCHANGE\n");
1162 return ShellView_OnSettingChange(pThis,(LPCSTR)lParam);
1164 case WM_PARENTNOTIFY:
1165 TRACE("-- WM_PARENTNOTIFY\n");
1166 if ( LOWORD(wParam) == WM_RBUTTONDOWN ) /* fixme: should not be handled here*/
1167 { dwCursor = GetMessagePos();
1168 ShellView_DoContextMenu(pThis, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
1174 TRACE("-- message %s unhandled\n", SPY_GetMsgName(uMessage));
1177 return DefWindowProcA (hWnd, uMessage, wParam, lParam);
1179 /**************************************************************************
1182 * The INTERFACE of the IShellView object
1185 ***************************************************************************
1186 * IShellView_QueryInterface
1188 static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj)
1190 ICOM_THIS(IShellViewImpl, iface);
1193 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1194 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1198 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
1201 else if(IsEqualIID(riid, &IID_IShellView)) /*IShellView*/
1202 { *ppvObj = (IShellView*)This;
1204 else if(IsEqualIID(riid, &IID_IOleCommandTarget)) /*IOleCommandTarget*/
1205 { *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
1207 else if(IsEqualIID(riid, &IID_IDropTarget)) /*IDropTarget*/
1208 { *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
1210 else if(IsEqualIID(riid, &IID_IViewObject)) /*ViewObject*/
1211 { *ppvObj = (IViewObject*)&(This->lpvtblViewObject);
1215 { IShellView_AddRef( (IShellView*)This );
1216 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
1219 TRACE("-- Interface: E_NOINTERFACE\n");
1220 return E_NOINTERFACE;
1223 /**************************************************************************
1226 static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
1228 ICOM_THIS(IShellViewImpl, iface);
1230 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1233 return ++(This->ref);
1235 /**************************************************************************
1236 * IShellView_Release
1238 static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
1240 ICOM_THIS(IShellViewImpl, iface);
1242 TRACE("(%p)->()\n",This);
1246 { TRACE(" destroying IShellView(%p)\n",This);
1249 IShellFolder_Release(This->pSFParent);
1251 if (This->aSelectedItems)
1252 SHFree(This->aSelectedItems);
1254 if (This->pCommDlgBrowser)
1255 ICommDlgBrowser_Release(This->pCommDlgBrowser);
1257 HeapFree(GetProcessHeap(),0,This);
1262 /**************************************************************************
1263 * ShellView_GetWindow
1265 static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd)
1267 ICOM_THIS(IShellViewImpl, iface);
1269 TRACE("(%p)\n",This);
1271 *phWnd = This->hWnd;
1276 static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode)
1278 ICOM_THIS(IShellViewImpl, iface);
1280 FIXME("(%p) stub\n",This);
1284 /**************************************************************************
1285 * IShellView_TranslateAccelerator
1288 * use the accel functions
1290 static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg)
1292 ICOM_THIS(IShellViewImpl, iface);
1294 FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
1297 switch (lpmsg->message)
1298 { case WM_KEYDOWN: TRACE("-- key=0x04%x",lpmsg->wParam) ;
1303 static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable)
1305 ICOM_THIS(IShellViewImpl, iface);
1307 FIXME("(%p) stub\n",This);
1312 static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState)
1314 ICOM_THIS(IShellViewImpl, iface);
1316 CHAR szName[MAX_PATH];
1318 int nPartArray[1] = {-1};
1320 TRACE("(%p)->(state=%x) stub\n",This, uState);
1321 /*don't do anything if the state isn't really changing*/
1322 if(This->uState == uState)
1326 /*OnActivate handles the menu merging and internal state*/
1327 ShellView_OnActivate(This, uState);
1329 /*remove the docking window*/
1331 { ShellView_AddRemoveDockingWindow(This, FALSE);
1334 /*only do This if we are active*/
1335 if(uState != SVUIA_DEACTIVATE)
1336 { /*update the status bar */
1337 strcpy(szName, "dummy32");
1339 IShellFolder_GetFolderPath( This->pSFParent, szName + strlen(szName), sizeof(szName) - strlen(szName));
1341 /* set the number of parts */
1342 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
1343 (LPARAM)nPartArray, &lResult);
1345 /* set the text for the parts */
1346 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
1347 0, (LPARAM)szName, &lResult);
1349 /*add the docking window if necessary */
1351 { ShellView_AddRemoveDockingWindow(This, TRUE);
1356 static HRESULT WINAPI IShellView_fnRefresh(IShellView * iface)
1358 ICOM_THIS(IShellViewImpl, iface);
1360 TRACE("(%p)\n",This);
1362 ListView_DeleteAllItems(This->hWndList);
1363 ShellView_FillList(This);
1367 static HRESULT WINAPI IShellView_fnCreateViewWindow(IShellView * iface, IShellView *lpPrevView,
1368 LPCFOLDERSETTINGS lpfs, IShellBrowser * psb, RECT * prcView, HWND *phWnd)
1370 ICOM_THIS(IShellViewImpl, iface);
1376 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
1377 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);
1379 /*set up the member variables*/
1380 This->pShellBrowser = psb;
1381 This->FolderSettings = *lpfs;
1383 /*get our parent window*/
1384 IShellBrowser_AddRef(This->pShellBrowser);
1385 IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent));
1387 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
1388 This->pCommDlgBrowser=NULL;
1389 if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser,
1390 (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
1391 { TRACE("-- CommDlgBrowser\n");
1394 /*if our window class has not been registered, then do so*/
1395 if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc))
1396 { ZeroMemory(&wc, sizeof(wc));
1397 wc.style = CS_HREDRAW | CS_VREDRAW;
1398 wc.lpfnWndProc = (WNDPROC) ShellView_WndProc;
1401 wc.hInstance = shell32_hInstance;
1403 wc.hCursor = LoadCursorA (0, IDC_ARROWA);
1404 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
1405 wc.lpszMenuName = NULL;
1406 wc.lpszClassName = SV_CLASS_NAME;
1408 if(!RegisterClassA(&wc))
1412 *phWnd = CreateWindowExA(0, SV_CLASS_NAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
1413 prcView->left, prcView->top, prcView->right - prcView->left, prcView->bottom - prcView->top,
1414 This->hWndParent, 0, shell32_hInstance, (LPVOID)This);
1424 static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface)
1426 ICOM_THIS(IShellViewImpl, iface);
1428 TRACE("(%p)\n",This);
1430 /*Make absolutely sure all our UI is cleaned up.*/
1431 IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
1433 { DestroyMenu(This->hMenu);
1435 DestroyWindow(This->hWnd);
1436 IShellBrowser_Release(This->pShellBrowser);
1440 static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView * iface, LPFOLDERSETTINGS lpfs)
1442 ICOM_THIS(IShellViewImpl, iface);
1444 TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
1445 This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
1448 { *lpfs = This->FolderSettings;
1452 return E_INVALIDARG;
1455 static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView * iface, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
1457 ICOM_THIS(IShellViewImpl, iface);
1459 FIXME("(%p) stub\n",This);
1464 static HRESULT WINAPI IShellView_fnSaveViewState(IShellView * iface)
1466 ICOM_THIS(IShellViewImpl, iface);
1468 FIXME("(%p) stub\n",This);
1473 static HRESULT WINAPI IShellView_fnSelectItem(IShellView * iface, LPCITEMIDLIST pidlItem, UINT uFlags)
1474 { ICOM_THIS(IShellViewImpl, iface);
1476 FIXME("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
1481 static HRESULT WINAPI IShellView_fnGetItemObject(IShellView * iface, UINT uItem, REFIID riid, LPVOID *ppvOut)
1483 ICOM_THIS(IShellViewImpl, iface);
1485 LPUNKNOWN pObj = NULL;
1488 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1489 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
1492 if(IsEqualIID(riid, &IID_IContextMenu))
1493 { ShellView_GetSelections(This);
1494 pObj =(LPUNKNOWN)IContextMenu_Constructor(This->pSFParent,This->aSelectedItems,This->uSelected);
1496 else if (IsEqualIID(riid, &IID_IDataObject))
1497 { ShellView_GetSelections(This);
1498 pObj =(LPUNKNOWN)IDataObject_Constructor(This->hWndParent, This->pSFParent,This->aSelectedItems,This->uSelected);
1501 TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
1504 return E_OUTOFMEMORY;
1509 static struct ICOM_VTABLE(IShellView) svvt =
1511 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1512 IShellView_fnQueryInterface,
1513 IShellView_fnAddRef,
1514 IShellView_fnRelease,
1515 IShellView_fnGetWindow,
1516 IShellView_fnContextSensitiveHelp,
1517 IShellView_fnTranslateAccelerator,
1518 IShellView_fnEnableModeless,
1519 IShellView_fnUIActivate,
1520 IShellView_fnRefresh,
1521 IShellView_fnCreateViewWindow,
1522 IShellView_fnDestroyViewWindow,
1523 IShellView_fnGetCurrentInfo,
1524 IShellView_fnAddPropertySheetPages,
1525 IShellView_fnSaveViewState,
1526 IShellView_fnSelectItem,
1527 IShellView_fnGetItemObject
1531 /************************************************************************
1532 * ISVOleCmdTarget_QueryInterface (IUnknown)
1534 static HRESULT WINAPI ISVOleCmdTarget_QueryInterface(
1535 IOleCommandTarget * iface,
1539 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1541 return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
1544 /************************************************************************
1545 * ISVOleCmdTarget_AddRef (IUnknown)
1547 static ULONG WINAPI ISVOleCmdTarget_AddRef(
1548 IOleCommandTarget * iface)
1550 _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface);
1552 return IShellFolder_AddRef((IShellFolder*)This);
1555 /************************************************************************
1556 * ISVOleCmdTarget_Release (IUnknown)
1558 static ULONG WINAPI ISVOleCmdTarget_Release(
1559 IOleCommandTarget * iface)
1561 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1563 return IShellFolder_Release((IShellFolder*)This);
1566 /************************************************************************
1567 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
1569 static HRESULT WINAPI ISVOleCmdTarget_QueryStatus(
1570 IOleCommandTarget *iface,
1571 const GUID* pguidCmdGroup,
1574 OLECMDTEXT* pCmdText)
1578 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1580 WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
1582 FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n", This, pguidCmdGroup, xguid, cCmds, prgCmds, pCmdText);
1586 /************************************************************************
1587 * ISVOleCmdTarget_Exec (IOleCommandTarget)
1589 * nCmdID is the OLECMDID_* enumeration
1591 static HRESULT WINAPI ISVOleCmdTarget_Exec(
1592 IOleCommandTarget *iface,
1593 const GUID* pguidCmdGroup,
1601 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1603 WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
1605 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n", This, xguid, nCmdID, nCmdexecopt, pvaIn, pvaOut);
1609 static ICOM_VTABLE(IOleCommandTarget) ctvt =
1611 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1612 ISVOleCmdTarget_QueryInterface,
1613 ISVOleCmdTarget_AddRef,
1614 ISVOleCmdTarget_Release,
1615 ISVOleCmdTarget_QueryStatus,
1616 ISVOleCmdTarget_Exec
1619 /****************************************************************************
1620 * ISVDropTarget implementation
1623 static HRESULT WINAPI ISVDropTarget_QueryInterface(
1630 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1632 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1634 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1636 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1639 static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface)
1641 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1643 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1645 return IShellFolder_AddRef((IShellFolder*)This);
1648 static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
1650 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1652 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1654 return IShellFolder_Release((IShellFolder*)This);
1657 static HRESULT WINAPI ISVDropTarget_DragEnter(
1659 IDataObject *pDataObject,
1665 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1667 FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
1672 static HRESULT WINAPI ISVDropTarget_DragOver(
1678 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1680 FIXME("Stub: This=%p\n",This);
1685 static HRESULT WINAPI ISVDropTarget_DragLeave(
1688 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1690 FIXME("Stub: This=%p\n",This);
1695 static HRESULT WINAPI ISVDropTarget_Drop(
1697 IDataObject* pDataObject,
1702 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1704 FIXME("Stub: This=%p\n",This);
1709 static struct ICOM_VTABLE(IDropTarget) dtvt =
1711 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1712 ISVDropTarget_QueryInterface,
1713 ISVDropTarget_AddRef,
1714 ISVDropTarget_Release,
1715 ISVDropTarget_DragEnter,
1716 ISVDropTarget_DragOver,
1717 ISVDropTarget_DragLeave,
1721 /****************************************************************************
1722 * ISVViewObject implementation
1725 static HRESULT WINAPI ISVViewObject_QueryInterface(
1732 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1734 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1736 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1738 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1741 static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface)
1743 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1745 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1747 return IShellFolder_AddRef((IShellFolder*)This);
1750 static ULONG WINAPI ISVViewObject_Release( IViewObject *iface)
1752 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1754 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1756 return IShellFolder_Release((IShellFolder*)This);
1759 static HRESULT WINAPI ISVViewObject_Draw(
1764 DVTARGETDEVICE* ptd,
1767 LPCRECTL lprcBounds,
1768 LPCRECTL lprcWBounds,
1769 IVO_ContCallback pfnContinue,
1773 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1775 FIXME("Stub: This=%p\n",This);
1779 static HRESULT WINAPI ISVViewObject_GetColorSet(
1784 DVTARGETDEVICE* ptd,
1785 HDC hicTargetDevice,
1786 LOGPALETTE** ppColorSet)
1789 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1791 FIXME("Stub: This=%p\n",This);
1795 static HRESULT WINAPI ISVViewObject_Freeze(
1803 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1805 FIXME("Stub: This=%p\n",This);
1809 static HRESULT WINAPI ISVViewObject_Unfreeze(
1814 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1816 FIXME("Stub: This=%p\n",This);
1820 static HRESULT WINAPI ISVViewObject_SetAdvise(
1824 IAdviseSink* pAdvSink)
1827 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1829 FIXME("Stub: This=%p\n",This);
1833 static HRESULT WINAPI ISVViewObject_GetAdvise(
1837 IAdviseSink** ppAdvSink)
1840 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1842 FIXME("Stub: This=%p\n",This);
1848 static struct ICOM_VTABLE(IViewObject) vovt =
1850 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1851 ISVViewObject_QueryInterface,
1852 ISVViewObject_AddRef,
1853 ISVViewObject_Release,
1855 ISVViewObject_GetColorSet,
1856 ISVViewObject_Freeze,
1857 ISVViewObject_Unfreeze,
1858 ISVViewObject_SetAdvise,
1859 ISVViewObject_GetAdvise