Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1 | /* |
| 2 | * ShellView |
| 3 | * |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 4 | * Copyright 1998 <juergen.schmied@metronet.de> |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | #include <ctype.h> |
| 8 | #include <stdlib.h> |
| 9 | #include <string.h> |
| 10 | #include "ole.h" |
| 11 | #include "ole2.h" |
| 12 | #include "debug.h" |
| 13 | #include "compobj.h" |
| 14 | #include "interfaces.h" |
| 15 | #include "shlobj.h" |
| 16 | #include "shell.h" |
| 17 | #include "winerror.h" |
| 18 | #include "winnls.h" |
| 19 | #include "winproc.h" |
| 20 | #include "commctrl.h" |
| 21 | |
| 22 | #include "shell32_main.h" |
| 23 | #include "pidl.h" |
| 24 | #include "shresdef.h" |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 25 | #include "if_macros.h" |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 26 | |
| 27 | /*********************************************************************** |
| 28 | * IShellView implementation |
| 29 | */ |
| 30 | static HRESULT WINAPI IShellView_QueryInterface(LPSHELLVIEW,REFIID, LPVOID *); |
| 31 | static ULONG WINAPI IShellView_AddRef(LPSHELLVIEW) ; |
| 32 | static ULONG WINAPI IShellView_Release(LPSHELLVIEW); |
| 33 | /* IOleWindow methods */ |
| 34 | static HRESULT WINAPI IShellView_GetWindow(LPSHELLVIEW,HWND32 * lphwnd); |
| 35 | static HRESULT WINAPI IShellView_ContextSensitiveHelp(LPSHELLVIEW,BOOL32 fEnterMode); |
| 36 | /* IShellView methods */ |
| 37 | static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW,LPMSG32 lpmsg); |
| 38 | static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW,BOOL32 fEnable); |
| 39 | static HRESULT WINAPI IShellView_UIActivate(LPSHELLVIEW,UINT32 uState); |
| 40 | static HRESULT WINAPI IShellView_Refresh(LPSHELLVIEW); |
| 41 | static HRESULT WINAPI IShellView_CreateViewWindow(LPSHELLVIEW, IShellView *lpPrevView,LPCFOLDERSETTINGS lpfs, IShellBrowser * psb,RECT32 * prcView, HWND32 *phWnd); |
| 42 | static HRESULT WINAPI IShellView_DestroyViewWindow(LPSHELLVIEW); |
| 43 | static HRESULT WINAPI IShellView_GetCurrentInfo(LPSHELLVIEW, LPFOLDERSETTINGS lpfs); |
| 44 | static HRESULT WINAPI IShellView_AddPropertySheetPages(LPSHELLVIEW, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam); |
| 45 | static HRESULT WINAPI IShellView_SaveViewState(LPSHELLVIEW); |
| 46 | static HRESULT WINAPI IShellView_SelectItem(LPSHELLVIEW, LPCITEMIDLIST pidlItem, UINT32 uFlags); |
| 47 | static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW, UINT32 uItem, REFIID riid,LPVOID *ppv); |
| 48 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 49 | static BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW); |
| 50 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 51 | static struct IShellView_VTable svvt = |
| 52 | { IShellView_QueryInterface, |
| 53 | IShellView_AddRef, |
| 54 | IShellView_Release, |
| 55 | IShellView_GetWindow, |
| 56 | IShellView_ContextSensitiveHelp, |
| 57 | IShellView_TranslateAccelerator, |
| 58 | IShellView_EnableModeless, |
| 59 | IShellView_UIActivate, |
| 60 | IShellView_Refresh, |
| 61 | IShellView_CreateViewWindow, |
| 62 | IShellView_DestroyViewWindow, |
| 63 | IShellView_GetCurrentInfo, |
| 64 | IShellView_AddPropertySheetPages, |
| 65 | IShellView_SaveViewState, |
| 66 | IShellView_SelectItem, |
| 67 | IShellView_GetItemObject |
| 68 | }; |
| 69 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 70 | /*menu items */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 71 | #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500) |
| 72 | #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501) |
| 73 | #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502) |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 74 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 75 | #define ID_LISTVIEW 2000 |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 76 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 77 | #define MENU_OFFSET 1 |
| 78 | #define MENU_MAX 100 |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 79 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 80 | #define TOOLBAR_ID (L"SHELLDLL_DefView") |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 81 | /*windowsx.h */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 82 | #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp) |
| 83 | #define GET_WM_COMMAND_HWND(wp, lp) (HWND32)(lp) |
| 84 | #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 85 | /* winuser.h */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 86 | #define WM_SETTINGCHANGE WM_WININICHANGE |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 87 | extern void WINAPI _InsertMenuItem (HMENU32 hmenu, UINT32 indexMenu, BOOL32 fByPosition, |
| 88 | UINT32 wID, UINT32 fType, LPSTR dwTypeData, UINT32 fState); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 89 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 90 | typedef struct |
| 91 | { int idCommand; |
| 92 | int iImage; |
| 93 | int idButtonString; |
| 94 | int idMenuString; |
| 95 | int nStringOffset; |
| 96 | BYTE bState; |
| 97 | BYTE bStyle; |
| 98 | } MYTOOLINFO, *LPMYTOOLINFO; |
| 99 | |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 100 | extern LPCVOID _Resource_Men_MENU_001_0_data; |
| 101 | extern LPCVOID _Resource_Men_MENU_002_0_data; |
| 102 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 103 | MYTOOLINFO g_Tools[] = |
| 104 | { {IDM_VIEW_FILES, 0, IDS_TB_VIEW_FILES, IDS_MI_VIEW_FILES, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON}, |
| 105 | {-1, 0, 0, 0, 0, 0, 0} |
| 106 | }; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 107 | BOOL32 g_bViewKeys; |
| 108 | BOOL32 g_bShowIDW; |
| 109 | |
| 110 | typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask); |
| 111 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 112 | /************************************************************************** |
| 113 | * IShellView_Constructor |
| 114 | */ |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 115 | LPSHELLVIEW IShellView_Constructor( LPSHELLFOLDER pFolder, LPCITEMIDLIST pidl) |
| 116 | { LPSHELLVIEW sv; |
| 117 | sv=(LPSHELLVIEW)HeapAlloc(GetProcessHeap(),0,sizeof(IShellView)); |
| 118 | sv->ref=1; |
| 119 | sv->lpvtbl=&svvt; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 120 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 121 | sv->mpidl = ILClone(pidl); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 122 | sv->hMenu = 0; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 123 | sv->pSFParent = pFolder; |
| 124 | sv->uSelected = 0; |
| 125 | sv->aSelectedItems = NULL; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 126 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 127 | if(sv->pSFParent) |
| 128 | sv->pSFParent->lpvtbl->fnAddRef(sv->pSFParent); |
| 129 | |
| 130 | TRACE(shell,"(%p)->(%p pidl=%p)\n",sv, pFolder, pidl); |
| 131 | return sv; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 132 | } |
| 133 | /************************************************************************** |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 134 | * helperfunctions for communication with ICommDlgBrowser |
| 135 | * |
| 136 | */ |
| 137 | static BOOL32 IsInCommDlg(LPSHELLVIEW this) |
| 138 | { return(this->pCommDlgBrowser != NULL); |
| 139 | } |
| 140 | static HRESULT IncludeObject(LPSHELLVIEW this, LPCITEMIDLIST pidl) |
| 141 | { if ( IsInCommDlg(this) ) |
| 142 | { TRACE(shell,"ICommDlgBrowser::IncludeObject pidl=%p\n", pidl); |
| 143 | return (this->pCommDlgBrowser->lpvtbl->fnIncludeObject(this->pCommDlgBrowser, this, pidl)); |
| 144 | } |
| 145 | return S_OK; |
| 146 | } |
| 147 | static HRESULT OnDefaultCommand(LPSHELLVIEW this) |
| 148 | { if (IsInCommDlg(this)) |
| 149 | { TRACE(shell,"ICommDlgBrowser::OnDefaultCommand\n"); |
| 150 | return (this->pCommDlgBrowser->lpvtbl->fnOnDefaultCommand(this->pCommDlgBrowser, this)); |
| 151 | } |
| 152 | return S_FALSE; |
| 153 | } |
| 154 | static HRESULT OnStateChange(LPSHELLVIEW this, UINT32 uFlags) |
| 155 | { if (IsInCommDlg(this)) |
| 156 | { TRACE(shell,"ICommDlgBrowser::OnStateChange flags=%x\n", uFlags); |
| 157 | return (this->pCommDlgBrowser->lpvtbl->fnOnStateChange(this->pCommDlgBrowser, this, uFlags)); |
| 158 | } |
| 159 | return S_FALSE; |
| 160 | } |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 161 | static void SetStyle(LPSHELLVIEW this, DWORD dwAdd, DWORD dwRemove) |
| 162 | { DWORD tmpstyle; |
| 163 | |
| 164 | TRACE(shell,"(%p)\n", this); |
| 165 | |
| 166 | tmpstyle = GetWindowLong32A(this->hWndList, GWL_STYLE); |
| 167 | SetWindowLong32A(this->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove)); |
| 168 | } |
| 169 | |
| 170 | static void CheckToolbar(LPSHELLVIEW this) |
| 171 | { LRESULT result; |
| 172 | |
| 173 | TRACE(shell,"\n"); |
| 174 | |
| 175 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON, |
| 176 | FCIDM_TB_SMALLICON, (this->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result); |
| 177 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON, |
| 178 | FCIDM_TB_REPORTVIEW, (this->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result); |
| 179 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, |
| 180 | FCIDM_TB_SMALLICON, TRUE, &result); |
| 181 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, |
| 182 | FCIDM_TB_REPORTVIEW, TRUE, &result); |
| 183 | TRACE(shell,"--\n"); |
| 184 | } |
| 185 | |
| 186 | static void MergeToolBar(LPSHELLVIEW this) |
| 187 | { LRESULT iStdBMOffset; |
| 188 | LRESULT iViewBMOffset; |
| 189 | TBADDBITMAP ab; |
| 190 | TBBUTTON tbActual[6]; |
| 191 | int i; |
| 192 | enum |
| 193 | { IN_STD_BMP = 0x4000, |
| 194 | IN_VIEW_BMP = 0x8000, |
| 195 | } ; |
| 196 | static const TBBUTTON c_tbDefault[] = |
| 197 | { { STD_COPY | IN_STD_BMP, FCIDM_SHVIEW_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, -1}, |
| 198 | { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0,0}, 0, -1 }, |
| 199 | { VIEW_LARGEICONS | IN_VIEW_BMP, FCIDM_SHVIEW_BIGICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 }, |
| 200 | { VIEW_SMALLICONS | IN_VIEW_BMP, FCIDM_SHVIEW_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 }, |
| 201 | { VIEW_LIST | IN_VIEW_BMP, FCIDM_SHVIEW_LISTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 }, |
| 202 | { VIEW_DETAILS | IN_VIEW_BMP, FCIDM_SHVIEW_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 }, |
| 203 | } ; |
| 204 | |
| 205 | TRACE(shell,"\n"); |
| 206 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 207 | ab.hInst = HINST_COMMCTRL; /* hinstCommctrl */ |
| 208 | ab.nID = IDB_STD_SMALL_COLOR; /* std bitmaps */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 209 | IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR, |
| 210 | TB_ADDBITMAP, 8, (LPARAM)&ab, &iStdBMOffset); |
| 211 | |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 212 | TRACE(shell,"TB_ADDBITMAP returns %lx\n", iStdBMOffset); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 213 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 214 | ab.nID = IDB_VIEW_SMALL_COLOR; /* std view bitmaps */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 215 | IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR, |
| 216 | TB_ADDBITMAP, 8, (LPARAM)&ab, &iViewBMOffset); |
| 217 | |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 218 | TRACE(shell,"TB_ADDBITMAP returns %lx\n", iViewBMOffset); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 219 | |
| 220 | for (i=0; i<6; ++i) |
| 221 | { tbActual[i] = c_tbDefault[i]; |
| 222 | if (!(tbActual[i].fsStyle & TBSTYLE_SEP)) |
| 223 | { if (tbActual[i].iBitmap & IN_VIEW_BMP) |
| 224 | { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_VIEW_BMP) + iViewBMOffset; |
| 225 | } |
| 226 | else if (tbActual[i].iBitmap & IN_STD_BMP) |
| 227 | { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_STD_BMP) + iStdBMOffset; |
| 228 | } |
| 229 | } |
| 230 | } |
| 231 | |
| 232 | IShellBrowser_SetToolbarItems(this->pShellBrowser,tbActual, 6, FCT_MERGE); |
| 233 | |
| 234 | CheckToolbar(this); |
| 235 | TRACE(shell,"--\n"); |
| 236 | |
| 237 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 238 | |
| 239 | /************************************************************************** |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 240 | * ShellView_CreateList() |
| 241 | * |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 242 | */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 243 | |
| 244 | BOOL32 ShellView_CreateList (LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 245 | { DWORD dwStyle; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 246 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 247 | TRACE(shell,"%p\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 248 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 249 | dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | |
| 250 | LVS_SHAREIMAGELISTS | LVS_EDITLABELS; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 251 | switch (this->FolderSettings.ViewMode) |
| 252 | { case FVM_ICON: dwStyle |= LVS_ICON; break; |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 253 | case FVM_DETAILS: dwStyle |= LVS_REPORT; break; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 254 | case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break; |
| 255 | case FVM_LIST: dwStyle |= LVS_LIST; break; |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 256 | default: dwStyle |= LVS_LIST; break; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 257 | } |
| 258 | if (this->FolderSettings.fFlags && FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE; |
| 259 | /*if (this->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/ |
| 260 | if (this->FolderSettings.fFlags && FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 261 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 262 | this->hWndList=CreateWindowEx32A( WS_EX_CLIENTEDGE, |
| 263 | WC_LISTVIEW32A, |
| 264 | NULL, |
| 265 | dwStyle, |
| 266 | 0,0,0,0, |
| 267 | this->hWnd, |
| 268 | (HMENU32)ID_LISTVIEW, |
| 269 | shell32_hInstance, |
| 270 | NULL); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 271 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 272 | if(!this->hWndList) |
| 273 | return FALSE; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 274 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 275 | /* UpdateShellSettings(); */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 276 | return TRUE; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 277 | } |
| 278 | /************************************************************************** |
| 279 | * ShellView_InitList() |
| 280 | * |
| 281 | * NOTES |
| 282 | * internal |
| 283 | */ |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 284 | int nColumn1=120; /* width of column */ |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 285 | int nColumn2=80; |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 286 | int nColumn3=170; |
| 287 | int nColumn4=60; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 288 | |
| 289 | BOOL32 ShellView_InitList(LPSHELLVIEW this) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 290 | { LVCOLUMN32A lvColumn; |
| 291 | CHAR szString[50]; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 292 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 293 | TRACE(shell,"%p\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 294 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 295 | ListView_DeleteAllItems(this->hWndList); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 296 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 297 | /*initialize the columns */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 298 | lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; /* | LVCF_SUBITEM;*/ |
| 299 | lvColumn.fmt = LVCFMT_LEFT; |
| 300 | lvColumn.pszText = szString; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 301 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 302 | lvColumn.cx = nColumn1; |
| 303 | strcpy(szString,"File"); |
| 304 | /*LoadString32A(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/ |
| 305 | ListView_InsertColumn32A(this->hWndList, 0, &lvColumn); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 306 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 307 | lvColumn.cx = nColumn2; |
| 308 | strcpy(szString,"Size"); |
| 309 | ListView_InsertColumn32A(this->hWndList, 1, &lvColumn); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 310 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 311 | lvColumn.cx = nColumn3; |
| 312 | strcpy(szString,"Type"); |
| 313 | ListView_InsertColumn32A(this->hWndList, 2, &lvColumn); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 314 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 315 | lvColumn.cx = nColumn4; |
| 316 | strcpy(szString,"Modified"); |
| 317 | ListView_InsertColumn32A(this->hWndList, 3, &lvColumn); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 318 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 319 | ListView_SetImageList(this->hWndList, ShellSmallIconList, LVSIL_SMALL); |
| 320 | ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_NORMAL); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 321 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 322 | return TRUE; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 323 | } |
| 324 | /************************************************************************** |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 325 | * ShellView_CompareItems() |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 326 | * |
| 327 | * NOTES |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 328 | * internal, CALLBACK for DSA_Sort |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 329 | */ |
Juergen Schmied | 882c1be | 1998-12-14 17:40:25 +0000 | [diff] [blame] | 330 | INT32 CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData) |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 331 | { int ret; |
| 332 | TRACE(shell,"pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 333 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 334 | if(!lpData) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 335 | return 0; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 336 | |
| 337 | ret = (int)((LPSHELLFOLDER)lpData)->lpvtbl->fnCompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2); |
| 338 | TRACE(shell,"ret=%i\n",ret); |
| 339 | return ret; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 340 | } |
| 341 | |
| 342 | /************************************************************************** |
| 343 | * ShellView_FillList() |
| 344 | * |
| 345 | * NOTES |
| 346 | * internal |
| 347 | */ |
| 348 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 349 | static HRESULT ShellView_FillList(LPSHELLVIEW this) |
| 350 | { LPENUMIDLIST pEnumIDList; |
| 351 | LPITEMIDLIST pidl; |
| 352 | DWORD dwFetched; |
| 353 | UINT32 i; |
| 354 | LVITEM32A lvItem; |
| 355 | HRESULT hRes; |
| 356 | HDPA hdpa; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 357 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 358 | TRACE(shell,"%p\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 359 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 360 | /* get the itemlist from the shfolder*/ |
| 361 | hRes = this->pSFParent->lpvtbl->fnEnumObjects(this->pSFParent,this->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList); |
| 362 | if (hRes != S_OK) |
| 363 | { if (hRes==S_FALSE) |
| 364 | return(NOERROR); |
| 365 | return(hRes); |
| 366 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 367 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 368 | /* create a pointer array */ |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 369 | hdpa = pDPA_Create(16); |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 370 | if (!hdpa) |
| 371 | { return(E_OUTOFMEMORY); |
| 372 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 373 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 374 | /* copy the items into the array*/ |
| 375 | while((S_OK == pEnumIDList->lpvtbl->fnNext(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched) |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 376 | { if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1) |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 377 | { SHFree(pidl); |
| 378 | } |
| 379 | } |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 380 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 381 | /*sort the array*/ |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 382 | pDPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)this->pSFParent); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 383 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 384 | /*turn the listview's redrawing off*/ |
| 385 | SendMessage32A(this->hWndList, WM_SETREDRAW, FALSE, 0); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 386 | |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 387 | for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/ |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 388 | { pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i); |
| 389 | if (IncludeObject(this, pidl) == S_OK) /* in a commdlg this works as a filemask*/ |
| 390 | { ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/ |
| 391 | lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/ |
| 392 | lvItem.iItem = ListView_GetItemCount(this->hWndList); /*add the item to the end of the list*/ |
| 393 | lvItem.lParam = (LPARAM)ILClone(pidl); /*set the item's data*/ |
| 394 | lvItem.pszText = LPSTR_TEXTCALLBACK32A; /*get text on a callback basis*/ |
| 395 | lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/ |
| 396 | ListView_InsertItem32A(this->hWndList, &lvItem); |
| 397 | } |
| 398 | else |
| 399 | SHFree(pidl); /* the listview has a COPY*/ |
| 400 | } |
| 401 | |
| 402 | /*turn the listview's redrawing back on and force it to draw*/ |
| 403 | SendMessage32A(this->hWndList, WM_SETREDRAW, TRUE, 0); |
| 404 | InvalidateRect32(this->hWndList, NULL, TRUE); |
| 405 | UpdateWindow32(this->hWndList); |
| 406 | |
| 407 | pEnumIDList->lpvtbl->fnRelease(pEnumIDList); /* destroy the list*/ |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 408 | pDPA_Destroy(hdpa); |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 409 | |
| 410 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 411 | } |
| 412 | |
| 413 | /************************************************************************** |
| 414 | * ShellView_OnCreate() |
| 415 | * |
| 416 | * NOTES |
| 417 | * internal |
| 418 | */ |
| 419 | LRESULT ShellView_OnCreate(LPSHELLVIEW this) |
| 420 | { TRACE(shell,"%p\n",this); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 421 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 422 | if(ShellView_CreateList(this)) |
| 423 | { if(ShellView_InitList(this)) |
| 424 | { ShellView_FillList(this); |
| 425 | } |
| 426 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 427 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 428 | return S_OK; |
| 429 | } |
| 430 | /************************************************************************** |
| 431 | * ShellView_OnSize() |
| 432 | */ |
| 433 | LRESULT ShellView_OnSize(LPSHELLVIEW this, WORD wWidth, WORD wHeight) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 434 | { TRACE(shell,"%p width=%u height=%u\n",this, wWidth,wHeight); |
| 435 | |
| 436 | /*resize the ListView to fit our window*/ |
| 437 | if(this->hWndList) |
| 438 | { MoveWindow32(this->hWndList, 0, 0, wWidth, wHeight, TRUE); |
| 439 | } |
| 440 | |
| 441 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 442 | } |
| 443 | /************************************************************************** |
| 444 | * ShellView_BuildFileMenu() |
| 445 | */ |
| 446 | HMENU32 ShellView_BuildFileMenu(LPSHELLVIEW this) |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 447 | { CHAR szText[MAX_PATH]; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 448 | MENUITEMINFO32A mii; |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 449 | int nTools,i; |
| 450 | HMENU32 hSubMenu; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 451 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 452 | TRACE(shell,"(%p) semi-stub\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 453 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 454 | hSubMenu = CreatePopupMenu32(); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 455 | if(hSubMenu) |
| 456 | { /*get the number of items in our global array*/ |
| 457 | for(nTools = 0; g_Tools[nTools].idCommand != -1; nTools++){} |
| 458 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 459 | /*add the menu items*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 460 | for(i = 0; i < nTools; i++) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 461 | { strcpy(szText, "dummy BuildFileMenu"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 462 | |
| 463 | ZeroMemory(&mii, sizeof(mii)); |
| 464 | mii.cbSize = sizeof(mii); |
| 465 | mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; |
| 466 | |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 467 | if(TBSTYLE_SEP != g_Tools[i].bStyle) /* no seperator*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 468 | { mii.fType = MFT_STRING; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 469 | mii.fState = MFS_ENABLED; |
| 470 | mii.dwTypeData = szText; |
| 471 | mii.wID = g_Tools[i].idCommand; |
| 472 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 473 | else |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 474 | { mii.fType = MFT_SEPARATOR; |
| 475 | } |
| 476 | /* tack this item onto the end of the menu */ |
| 477 | InsertMenuItem32A(hSubMenu, (UINT32)-1, TRUE, &mii); |
| 478 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 479 | } |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 480 | TRACE(shell,"-- return (menu=0x%x)\n",hSubMenu); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 481 | return hSubMenu; |
| 482 | } |
| 483 | /************************************************************************** |
| 484 | * ShellView_MergeFileMenu() |
| 485 | */ |
| 486 | void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 487 | { TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 488 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 489 | if(hSubMenu) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 490 | { /*insert this item at the beginning of the menu */ |
| 491 | _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); |
Juergen Schmied | 0bb85b1 | 1998-12-25 08:55:15 +0000 | [diff] [blame] | 492 | _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 493 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 494 | } |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 495 | TRACE(shell,"--\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 496 | } |
| 497 | |
| 498 | /************************************************************************** |
| 499 | * ShellView_MergeViewMenu() |
| 500 | */ |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 501 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 502 | void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu) |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 503 | { MENUITEMINFO32A mii; |
| 504 | |
| 505 | TRACE(shell,"(%p)->(submenu=0x%08x)\n",this,hSubMenu); |
| 506 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 507 | if(hSubMenu) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 508 | { /*add a separator at the correct position in the menu*/ |
| 509 | _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 510 | |
| 511 | ZeroMemory(&mii, sizeof(mii)); |
| 512 | mii.cbSize = sizeof(mii); |
| 513 | mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;; |
| 514 | mii.fType = MFT_STRING; |
| 515 | mii.dwTypeData = "View"; |
| 516 | mii.hSubMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_001_0_data); |
| 517 | InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 518 | } |
| 519 | } |
| 520 | /************************************************************************** |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 521 | * ShellView_UpdateMenu() |
| 522 | */ |
| 523 | LRESULT ShellView_UpdateMenu(LPSHELLVIEW this, HMENU32 hMenu) |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 524 | { TRACE(shell,"(%p)->(menu=0x%08x)\n",this,hMenu); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 525 | CheckMenuItem32(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED)); |
| 526 | |
| 527 | if(ShellView_CanDoIDockingWindow(this)) |
| 528 | { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_ENABLED); |
| 529 | CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | (g_bShowIDW ? MF_CHECKED: MF_UNCHECKED)); |
| 530 | } |
| 531 | else |
| 532 | { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); |
| 533 | CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED); |
| 534 | } |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 535 | return S_OK; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 536 | } |
| 537 | |
| 538 | /************************************************************************** |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 539 | * ShellView_OnDeactivate() |
| 540 | * |
| 541 | * NOTES |
| 542 | * internal |
| 543 | */ |
| 544 | void ShellView_OnDeactivate(LPSHELLVIEW this) |
| 545 | { TRACE(shell,"%p\n",this); |
| 546 | if(this->uState != SVUIA_DEACTIVATE) |
| 547 | { if(this->hMenu) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 548 | { IShellBrowser_SetMenuSB(this->pShellBrowser,0, 0, 0); |
| 549 | IShellBrowser_RemoveMenusSB(this->pShellBrowser,this->hMenu); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 550 | DestroyMenu32(this->hMenu); |
| 551 | this->hMenu = 0; |
| 552 | } |
| 553 | |
| 554 | this->uState = SVUIA_DEACTIVATE; |
| 555 | } |
| 556 | } |
| 557 | |
| 558 | /************************************************************************** |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 559 | * ShellView_OnActivate() |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 560 | */ |
| 561 | LRESULT ShellView_OnActivate(LPSHELLVIEW this, UINT32 uState) |
| 562 | { OLEMENUGROUPWIDTHS32 omw = { {0, 0, 0, 0, 0, 0} }; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 563 | MENUITEMINFO32A mii; |
| 564 | CHAR szText[MAX_PATH]; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 565 | |
| 566 | TRACE(shell,"%p uState=%x\n",this,uState); |
| 567 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 568 | /*don't do anything if the state isn't really changing */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 569 | if(this->uState == uState) |
| 570 | { return S_OK; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 571 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 572 | |
| 573 | ShellView_OnDeactivate(this); |
| 574 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 575 | /*only do this if we are active */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 576 | if(uState != SVUIA_DEACTIVATE) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 577 | { /*merge the menus */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 578 | this->hMenu = CreateMenu32(); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 579 | |
| 580 | if(this->hMenu) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 581 | { IShellBrowser_InsertMenusSB(this->pShellBrowser, this->hMenu, &omw); |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 582 | TRACE(shell,"-- after fnInsertMenusSB\n"); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 583 | /*build the top level menu get the menu item's text*/ |
| 584 | strcpy(szText,"dummy 31"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 585 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 586 | ZeroMemory(&mii, sizeof(mii)); |
| 587 | mii.cbSize = sizeof(mii); |
| 588 | mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE; |
| 589 | mii.fType = MFT_STRING; |
| 590 | mii.fState = MFS_ENABLED; |
| 591 | mii.dwTypeData = szText; |
| 592 | mii.hSubMenu = ShellView_BuildFileMenu(this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 593 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 594 | /*insert our menu into the menu bar*/ |
| 595 | if(mii.hSubMenu) |
| 596 | { InsertMenuItem32A(this->hMenu, FCIDM_MENU_HELP, FALSE, &mii); |
| 597 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 598 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 599 | /*get the view menu so we can merge with it*/ |
| 600 | ZeroMemory(&mii, sizeof(mii)); |
| 601 | mii.cbSize = sizeof(mii); |
| 602 | mii.fMask = MIIM_SUBMENU; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 603 | |
| 604 | if(GetMenuItemInfo32A(this->hMenu, FCIDM_MENU_VIEW, FALSE, &mii)) |
| 605 | { ShellView_MergeViewMenu(this, mii.hSubMenu); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 606 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 607 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 608 | /*add the items that should only be added if we have the focus*/ |
| 609 | if(SVUIA_ACTIVATE_FOCUS == uState) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 610 | { /*get the file menu so we can merge with it */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 611 | ZeroMemory(&mii, sizeof(mii)); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 612 | mii.cbSize = sizeof(mii); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 613 | mii.fMask = MIIM_SUBMENU; |
| 614 | |
| 615 | if(GetMenuItemInfo32A(this->hMenu, FCIDM_MENU_FILE, FALSE, &mii)) |
| 616 | { ShellView_MergeFileMenu(this, mii.hSubMenu); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 617 | } |
| 618 | } |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 619 | TRACE(shell,"-- before fnSetMenuSB\n"); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 620 | IShellBrowser_SetMenuSB(this->pShellBrowser, this->hMenu, 0, this->hWnd); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 621 | } |
| 622 | } |
| 623 | this->uState = uState; |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 624 | TRACE(shell,"--\n"); |
| 625 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 626 | } |
| 627 | |
| 628 | /************************************************************************** |
| 629 | * ShellView_OnSetFocus() |
| 630 | * |
| 631 | * NOTES |
| 632 | * internal |
| 633 | */ |
| 634 | LRESULT ShellView_OnSetFocus(LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 635 | { TRACE(shell,"%p\n",this); |
| 636 | /* Tell the browser one of our windows has received the focus. This should always |
| 637 | be done before merging menus (OnActivate merges the menus) if one of our |
| 638 | windows has the focus.*/ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 639 | IShellBrowser_OnViewWindowActive(this->pShellBrowser,this); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 640 | ShellView_OnActivate(this, SVUIA_ACTIVATE_FOCUS); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 641 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 642 | return 0; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 643 | } |
| 644 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 645 | /************************************************************************** |
| 646 | * ShellView_OnKillFocus() |
| 647 | */ |
| 648 | LRESULT ShellView_OnKillFocus(LPSHELLVIEW this) |
| 649 | { TRACE(shell,"(%p) stub\n",this); |
| 650 | ShellView_OnActivate(this, SVUIA_ACTIVATE_NOFOCUS); |
| 651 | return 0; |
| 652 | } |
| 653 | |
| 654 | /************************************************************************** |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 655 | * ShellView_AddRemoveDockingWindow() |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 656 | */ |
| 657 | BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 658 | { BOOL32 bReturn = FALSE; |
| 659 | HRESULT hr; |
| 660 | LPSERVICEPROVIDER pSP; |
| 661 | LPDOCKINGWINDOWFRAME pFrame; |
| 662 | |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 663 | WARN(shell,"(%p)->(badd=0x%08x) semi-stub\n",this,bAdd); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 664 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 665 | /* get the browser's IServiceProvider */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 666 | hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 667 | if(SUCCEEDED(hr)) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 668 | { /*get the IDockingWindowFrame pointer*/ |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 669 | hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 670 | if(SUCCEEDED(hr)) |
| 671 | { if(bAdd) |
| 672 | { hr = S_OK; |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 673 | FIXME(shell,"no docking implemented\n"); |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 674 | #if 0 |
| 675 | if(!this->pDockingWindow) |
| 676 | { /* create the toolbar object */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 677 | this->pDockingWindow = DockingWindow_Constructor(this, this->hWnd); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 678 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 679 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 680 | if(this->pDockingWindow) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 681 | { /*add the toolbar object */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 682 | hr = pFrame->lpvtbl->fnAddToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, TOOLBAR_ID, 0); |
| 683 | |
| 684 | if(SUCCEEDED(hr)) |
| 685 | { bReturn = TRUE; |
| 686 | } |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 687 | } |
| 688 | #endif |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 689 | } |
| 690 | else |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 691 | { FIXME(shell,"no docking implemented\n"); |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 692 | #if 0 |
| 693 | if(this->pDockingWindow) |
Juergen Schmied | 6101324 | 1998-10-16 15:40:20 +0000 | [diff] [blame] | 694 | { hr = pFrame->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, DWFRF_NORMAL); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 695 | |
| 696 | if(SUCCEEDED(hr)) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 697 | { /* RemoveToolbar should release the toolbar object which will cause */ |
| 698 | /*it to destroy itself. Our toolbar object is no longer valid at */ |
| 699 | /*this point. */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 700 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 701 | this->pDockingWindow = NULL; |
| 702 | bReturn = TRUE; |
| 703 | } |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 704 | } |
| 705 | #endif |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 706 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 707 | pFrame->lpvtbl->fnRelease(pFrame); |
| 708 | } |
| 709 | pSP->lpvtbl->fnRelease(pSP); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 710 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 711 | return bReturn; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 712 | } |
| 713 | |
| 714 | /************************************************************************** |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 715 | * ShellView_CanDoIDockingWindow() |
| 716 | */ |
| 717 | BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 718 | { BOOL32 bReturn = FALSE; |
| 719 | HRESULT hr; |
| 720 | LPSERVICEPROVIDER pSP; |
| 721 | LPDOCKINGWINDOWFRAME pFrame; |
| 722 | |
| 723 | FIXME(shell,"(%p) stub\n",this); |
| 724 | |
| 725 | /*get the browser's IServiceProvider*/ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 726 | hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 727 | if(hr==S_OK) |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 728 | { hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 729 | if(SUCCEEDED(hr)) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 730 | { bReturn = TRUE; |
| 731 | pFrame->lpvtbl->fnRelease(pFrame); |
| 732 | } |
| 733 | pSP->lpvtbl->fnRelease(pSP); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 734 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 735 | return bReturn; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 736 | } |
| 737 | |
| 738 | /************************************************************************** |
| 739 | * ShellView_UpdateShellSettings() |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 740 | */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 741 | void ShellView_UpdateShellSettings(LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 742 | { FIXME(shell,"(%p) stub\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 743 | return ; |
| 744 | /* |
| 745 | SHELLFLAGSTATE sfs; |
| 746 | HINSTANCE hinstShell32; |
| 747 | */ |
| 748 | /* Since SHGetSettings is not implemented in all versions of the shell, get the |
| 749 | function address manually at run time. This allows the code to run on all |
| 750 | platforms.*/ |
| 751 | /* |
| 752 | ZeroMemory(&sfs, sizeof(sfs)); |
| 753 | */ |
| 754 | /* The default, in case any of the following steps fails, is classic Windows 95 |
| 755 | style.*/ |
| 756 | /* |
| 757 | sfs.fWin95Classic = TRUE; |
| 758 | |
Juergen Schmied | 0bb85b1 | 1998-12-25 08:55:15 +0000 | [diff] [blame] | 759 | hinstShell32 = LoadLibrary("shell32.dll"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 760 | if(hinstShell32) |
| 761 | { PFNSHGETSETTINGSPROC pfnSHGetSettings; |
| 762 | |
| 763 | pfnSHGetSettings = (PFNSHGETSETTINGSPROC)GetProcAddress(hinstShell32, "SHGetSettings"); |
| 764 | if(pfnSHGetSettings) |
| 765 | { (*pfnSHGetSettings)(&sfs, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC); |
| 766 | } |
| 767 | FreeLibrary(hinstShell32); |
| 768 | } |
| 769 | |
| 770 | DWORD dwExStyles = 0; |
| 771 | |
| 772 | if(!sfs.fWin95Classic && !sfs.fDoubleClickInWebView) |
| 773 | dwExStyles |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT | LVS_EX_UNDERLINEHOT; |
| 774 | |
| 775 | ListView_SetExtendedListViewStyle(this->hWndList, dwExStyles); |
| 776 | */ |
| 777 | } |
| 778 | |
| 779 | /************************************************************************** |
| 780 | * ShellView_OnSettingChange() |
| 781 | */ |
| 782 | LRESULT ShellView_OnSettingChange(LPSHELLVIEW this, LPCSTR lpszSection) |
| 783 | { TRACE(shell,"(%p) stub\n",this); |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 784 | /*if(0 == lstrcmpi(lpszSection, "ShellState"))*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 785 | { ShellView_UpdateShellSettings(this); |
| 786 | return 0; |
| 787 | } |
| 788 | return 0; |
| 789 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 790 | /************************************************************************** |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 791 | * ShellView_OnCommand() |
| 792 | */ |
| 793 | LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd) |
| 794 | { TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd); |
| 795 | switch(dwCmdID) |
| 796 | { case IDM_VIEW_FILES: |
| 797 | g_bViewKeys = ! g_bViewKeys; |
| 798 | IShellView_Refresh(this); |
| 799 | break; |
| 800 | |
| 801 | case IDM_VIEW_IDW: |
| 802 | g_bShowIDW = ! g_bShowIDW; |
| 803 | ShellView_AddRemoveDockingWindow(this, g_bShowIDW); |
| 804 | break; |
| 805 | |
| 806 | case IDM_MYFILEITEM: |
| 807 | MessageBeep32(MB_OK); |
| 808 | break; |
| 809 | |
| 810 | case FCIDM_SHVIEW_SMALLICON: |
| 811 | this->FolderSettings.ViewMode = FVM_SMALLICON; |
| 812 | SetStyle (this, LVS_SMALLICON, LVS_TYPEMASK); |
| 813 | break; |
| 814 | |
| 815 | case FCIDM_SHVIEW_BIGICON: |
| 816 | this->FolderSettings.ViewMode = FVM_ICON; |
| 817 | SetStyle (this, LVS_ICON, LVS_TYPEMASK); |
| 818 | break; |
| 819 | |
| 820 | case FCIDM_SHVIEW_LISTVIEW: |
| 821 | this->FolderSettings.ViewMode = FVM_LIST; |
| 822 | SetStyle (this, LVS_LIST, LVS_TYPEMASK); |
| 823 | break; |
| 824 | |
| 825 | case FCIDM_SHVIEW_REPORTVIEW: |
| 826 | this->FolderSettings.ViewMode = FVM_DETAILS; |
| 827 | SetStyle (this, LVS_REPORT, LVS_TYPEMASK); |
| 828 | break; |
| 829 | |
| 830 | default: |
| 831 | FIXME(shell,"-- COMMAND unhandled\n"); |
| 832 | } |
| 833 | return 0; |
| 834 | } |
| 835 | |
| 836 | /************************************************************************** |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 837 | * ShellView_GetSelections() |
| 838 | * |
| 839 | * RETURNS |
| 840 | * number of selected items |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 841 | */ |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 842 | UINT32 ShellView_GetSelections(LPSHELLVIEW this) |
| 843 | { LVITEM32A lvItem; |
| 844 | UINT32 i; |
| 845 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 846 | this->uSelected = ListView_GetSelectedCount(this->hWndList); |
| 847 | this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST)); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 848 | |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 849 | TRACE(shell,"selected=%i\n", this->uSelected); |
| 850 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 851 | if(this->aSelectedItems) |
| 852 | { TRACE(shell,"-- Items selected =%u\n", this->uSelected); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 853 | ZeroMemory(&lvItem, sizeof(lvItem)); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 854 | lvItem.mask = LVIF_STATE | LVIF_PARAM; |
| 855 | lvItem.stateMask = LVIS_SELECTED; |
| 856 | lvItem.iItem = 0; |
| 857 | |
| 858 | i = 0; |
| 859 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 860 | while(ListView_GetItem32A(this->hWndList, &lvItem) && (i < this->uSelected)) |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 861 | { if(lvItem.state & LVIS_SELECTED) |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 862 | { this->aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 863 | i++; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 864 | TRACE(shell,"-- selected Item found\n"); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 865 | } |
| 866 | lvItem.iItem++; |
| 867 | } |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 868 | } |
| 869 | return this->uSelected; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 870 | |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 871 | } |
| 872 | /************************************************************************** |
| 873 | * ShellView_DoContextMenu() |
| 874 | */ |
| 875 | void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault) |
| 876 | { UINT32 uCommand; |
| 877 | DWORD wFlags; |
| 878 | HMENU32 hMenu; |
| 879 | BOOL32 fExplore = FALSE; |
| 880 | HWND32 hwndTree = 0; |
| 881 | INT32 nMenuIndex; |
| 882 | MENUITEMINFO32A mii; |
| 883 | LPCONTEXTMENU pContextMenu = NULL; |
| 884 | CMINVOKECOMMANDINFO32 cmi; |
| 885 | |
| 886 | TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault); |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 887 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 888 | /* look, what's selected and create a context menu object of it*/ |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 889 | if(ShellView_GetSelections(this)) |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 890 | { this->pSFParent->lpvtbl->fnGetUIObjectOf( this->pSFParent, this->hWndParent, this->uSelected, |
| 891 | this->aSelectedItems, (REFIID)&IID_IContextMenu, |
| 892 | NULL, (LPVOID *)&pContextMenu); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 893 | |
| 894 | if(pContextMenu) |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 895 | { TRACE(shell,"-- pContextMenu\n"); |
| 896 | hMenu = CreatePopupMenu32(); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 897 | |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 898 | if( hMenu ) |
| 899 | { /* See if we are in Explore or Open mode. If the browser's tree |
| 900 | is present, then we are in Explore mode.*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 901 | |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 902 | if(SUCCEEDED(IShellBrowser_GetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree) |
| 903 | { TRACE(shell,"-- explore mode\n"); |
| 904 | fExplore = TRUE; |
| 905 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 906 | |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 907 | wFlags = CMF_NORMAL | (this->uSelected != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 908 | |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 909 | if (SUCCEEDED(pContextMenu->lpvtbl->fnQueryContextMenu( pContextMenu, hMenu, 0, MENU_OFFSET, MENU_MAX, wFlags ))) |
| 910 | { if( fDefault ) |
| 911 | { TRACE(shell,"-- get menu default command\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 912 | |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 913 | uCommand = nMenuIndex = 0; |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 914 | ZeroMemory(&mii, sizeof(mii)); |
| 915 | mii.cbSize = sizeof(mii); |
| 916 | mii.fMask = MIIM_STATE | MIIM_ID; |
| 917 | |
| 918 | while(GetMenuItemInfo32A(hMenu, nMenuIndex, TRUE, &mii)) /*find the default item in the menu*/ |
| 919 | { if(mii.fState & MFS_DEFAULT) |
| 920 | { uCommand = mii.wID; |
| 921 | break; |
| 922 | } |
| 923 | nMenuIndex++; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 924 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 925 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 926 | else |
| 927 | { TRACE(shell,"-- track popup\n"); |
| 928 | uCommand = TrackPopupMenu32( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL); |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 929 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 930 | |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 931 | if(uCommand > 0) |
| 932 | { TRACE(shell,"-- uCommand=%u\n", uCommand); |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 933 | if (IsInCommDlg(this) && (((uCommand-MENU_OFFSET)==IDM_EXPLORE) || ((uCommand-MENU_OFFSET)==IDM_OPEN))) |
| 934 | { TRACE(shell,"-- dlg: OnDefaultCommand\n"); |
| 935 | OnDefaultCommand(this); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 936 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 937 | else |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 938 | { TRACE(shell,"-- explore -- invoke command\n"); |
| 939 | ZeroMemory(&cmi, sizeof(cmi)); |
| 940 | cmi.cbSize = sizeof(cmi); |
| 941 | cmi.hwnd = this->hWndParent; |
| 942 | cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET); |
| 943 | pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 944 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 945 | } |
| 946 | DestroyMenu32(hMenu); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 947 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 948 | } |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 949 | if (pContextMenu) |
| 950 | pContextMenu->lpvtbl->fnRelease(pContextMenu); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 951 | } |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 952 | SHFree(this->aSelectedItems); |
| 953 | this->aSelectedItems=NULL; |
| 954 | this->uSelected=0; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 955 | } |
Juergen Schmied | baae7c4 | 1998-12-11 11:06:50 +0000 | [diff] [blame] | 956 | else /* background context menu */ |
| 957 | { hMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_002_0_data); |
| 958 | uCommand = TrackPopupMenu32( GetSubMenu32(hMenu,0),TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL); |
| 959 | ShellView_OnCommand(this, uCommand, 0,0); |
| 960 | DestroyMenu32(hMenu); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 961 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 962 | } |
| 963 | |
| 964 | /************************************************************************** |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 965 | * ShellView_OnNotify() |
| 966 | */ |
| 967 | |
| 968 | LRESULT ShellView_OnNotify(LPSHELLVIEW this, UINT32 CtlID, LPNMHDR lpnmh) |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 969 | { NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh; |
| 970 | NMLVDISPINFO32A *lpdi = (NMLVDISPINFO32A *)lpnmh; |
| 971 | LPITEMIDLIST pidl; |
| 972 | DWORD dwCursor; |
| 973 | STRRET str; |
| 974 | UINT32 uFlags; |
| 975 | IExtractIcon *pei; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 976 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 977 | TRACE(shell,"%p CtlID=%u lpnmh->code=%x\n",this,CtlID,lpnmh->code); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 978 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 979 | switch(lpnmh->code) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 980 | { case NM_SETFOCUS: |
| 981 | TRACE(shell,"-- NM_SETFOCUS %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 982 | ShellView_OnSetFocus(this); |
| 983 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 984 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 985 | case NM_KILLFOCUS: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 986 | TRACE(shell,"-- NM_KILLFOCUS %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 987 | ShellView_OnDeactivate(this); |
| 988 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 989 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 990 | case HDN_ENDTRACK32A: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 991 | TRACE(shell,"-- HDN_ENDTRACK32A %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 992 | /*nColumn1 = ListView_GetColumnWidth(this->hWndList, 0); |
| 993 | nColumn2 = ListView_GetColumnWidth(this->hWndList, 1);*/ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 994 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 995 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 996 | case LVN_DELETEITEM: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 997 | TRACE(shell,"-- LVN_DELETEITEM %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 998 | SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/ |
| 999 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1000 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1001 | case NM_DBLCLK: |
| 1002 | case NM_RETURN: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1003 | TRACE(shell,"-- NM_RETURN|NM_DBLCLK ignored, waiting for LVN_ITEMACTIVATE\n"); |
| 1004 | break; |
| 1005 | |
| 1006 | case LVN_ITEMACTIVATE: |
| 1007 | TRACE(shell,"-- LVN_ITEMACTIVATE %p\n",this); |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1008 | OnStateChange(this, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */ |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1009 | ShellView_DoContextMenu(this, 0, 0, TRUE); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1010 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1011 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1012 | case NM_RCLICK: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1013 | TRACE(shell,"-- NM_RCLICK %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1014 | dwCursor = GetMessagePos(); |
| 1015 | ShellView_DoContextMenu(this, LOWORD(dwCursor), HIWORD(dwCursor), FALSE); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1016 | break; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1017 | |
| 1018 | case LVN_GETDISPINFO32A: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1019 | TRACE(shell,"-- LVN_GETDISPINFO32A %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1020 | pidl = (LPITEMIDLIST)lpdi->item.lParam; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1021 | |
| 1022 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1023 | if(lpdi->item.iSubItem) /*is the sub-item information being requested?*/ |
| 1024 | { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/ |
| 1025 | { if(_ILIsValue(pidl)) /*is this a value or a folder?*/ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1026 | { switch (lpdi->item.iSubItem) |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 1027 | { case 1: /* size */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1028 | _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax); |
| 1029 | break; |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 1030 | case 2: /* extension */ |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1031 | { char sTemp[64]; |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 1032 | if (_ILGetExtension (pidl, sTemp, 64)) |
| 1033 | { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64) |
| 1034 | && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax ))) |
| 1035 | { strncpy (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax); |
| 1036 | strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax); |
| 1037 | } |
| 1038 | } |
| 1039 | else /* no extension found */ |
| 1040 | { lpdi->item.pszText[0]=0x00; |
| 1041 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1042 | } |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1043 | break; |
Juergen Schmied | bcd05e9 | 1998-11-25 16:47:05 +0000 | [diff] [blame] | 1044 | case 3: /* date */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1045 | _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax); |
| 1046 | break; |
| 1047 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1048 | } |
| 1049 | else /*its a folder*/ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1050 | { switch (lpdi->item.iSubItem) |
| 1051 | { case 1: |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1052 | strcpy(lpdi->item.pszText, ""); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1053 | break; |
| 1054 | case 2: |
| 1055 | strncpy (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax); |
| 1056 | break; |
| 1057 | case 3: |
| 1058 | _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax); |
| 1059 | break; |
| 1060 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1061 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1062 | TRACE(shell,"-- text=%s\n",lpdi->item.pszText); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1063 | } |
| 1064 | } |
| 1065 | else /*the item text is being requested*/ |
| 1066 | { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/ |
| 1067 | { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetDisplayNameOf(this->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str))) |
| 1068 | { if(STRRET_WSTR == str.uType) |
| 1069 | { WideCharToLocal32(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax); |
| 1070 | SHFree(str.u.pOleStr); |
| 1071 | } |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1072 | else if(STRRET_CSTRA == str.uType) |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1073 | { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax); |
| 1074 | } |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1075 | else |
| 1076 | { FIXME(shell,"type wrong\n"); |
| 1077 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1078 | } |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1079 | TRACE(shell,"-- text=%s\n",lpdi->item.pszText); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1080 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1081 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1082 | if(lpdi->item.mask & LVIF_IMAGE) /*is the image being requested?*/ |
| 1083 | { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent,this->hWnd,1, |
| 1084 | (LPCITEMIDLIST*)&pidl, (REFIID)&IID_IExtractIcon, NULL, (LPVOID*)&pei))) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1085 | { pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1086 | pei->lpvtbl->fnRelease(pei); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1087 | TRACE(shell,"-- image=%x\n",lpdi->item.iImage); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1088 | } |
| 1089 | } |
| 1090 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1091 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1092 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1093 | case NM_CLICK: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1094 | WARN(shell,"-- NM_CLICK %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1095 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1096 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1097 | case LVN_ITEMCHANGING: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1098 | WARN(shell,"-- LVN_ITEMCHANGING %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1099 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1100 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1101 | case LVN_ITEMCHANGED: |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1102 | TRACE(shell,"-- LVN_ITEMCHANGED %p\n",this); |
| 1103 | ShellView_GetSelections(this); |
| 1104 | OnStateChange(this, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1105 | break; |
| 1106 | |
| 1107 | case LVN_DELETEALLITEMS: |
| 1108 | WARN(shell,"-- LVN_DELETEALLITEMS %p\n",this); |
| 1109 | break; |
| 1110 | |
| 1111 | case LVN_INSERTITEM: |
| 1112 | WARN(shell,"-- LVN_INSERTITEM %p\n",this); |
| 1113 | break; |
| 1114 | |
| 1115 | case LVN_BEGINDRAG: |
| 1116 | WARN(shell,"-- LVN_BEGINDRAG %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1117 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1118 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1119 | case NM_CUSTOMDRAW: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1120 | WARN(shell,"NM_CUSTOMDRAW %p\n",this); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1121 | break; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1122 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1123 | default: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1124 | FIXME (shell,"-- WM_NOTIFY unhandled\n"); |
| 1125 | break;; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1126 | } |
| 1127 | return 0; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1128 | } |
| 1129 | |
| 1130 | /************************************************************************** |
| 1131 | * ShellView_WndProc |
| 1132 | */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1133 | |
| 1134 | LRESULT CALLBACK ShellView_WndProc(HWND32 hWnd, UINT32 uMessage, WPARAM32 wParam, LPARAM lParam) |
| 1135 | { LPSHELLVIEW pThis = (LPSHELLVIEW)GetWindowLong32A(hWnd, GWL_USERDATA); |
| 1136 | LPCREATESTRUCT32A lpcs; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1137 | DWORD dwCursor; |
| 1138 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1139 | TRACE(shell,"(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1140 | |
| 1141 | switch (uMessage) |
| 1142 | { case WM_NCCREATE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1143 | { TRACE(shell,"-- WM_NCCREATE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1144 | lpcs = (LPCREATESTRUCT32A)lParam; |
| 1145 | pThis = (LPSHELLVIEW)(lpcs->lpCreateParams); |
| 1146 | SetWindowLong32A(hWnd, GWL_USERDATA, (LONG)pThis); |
| 1147 | pThis->hWnd = hWnd; /*set the window handle*/ |
| 1148 | } |
| 1149 | break; |
| 1150 | |
| 1151 | case WM_SIZE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1152 | TRACE(shell,"-- WM_SIZE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1153 | return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam)); |
| 1154 | |
| 1155 | case WM_SETFOCUS: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1156 | TRACE(shell,"-- WM_SETFOCUS\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1157 | return ShellView_OnSetFocus(pThis); |
| 1158 | |
| 1159 | case WM_KILLFOCUS: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1160 | TRACE(shell,"-- WM_KILLFOCUS\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1161 | return ShellView_OnKillFocus(pThis); |
| 1162 | |
| 1163 | case WM_CREATE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1164 | TRACE(shell,"-- WM_CREATE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1165 | return ShellView_OnCreate(pThis); |
| 1166 | |
| 1167 | case WM_SHOWWINDOW: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1168 | TRACE(shell,"-- WM_SHOWWINDOW\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1169 | UpdateWindow32(pThis->hWndList); |
| 1170 | break; |
| 1171 | |
| 1172 | case WM_ACTIVATE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1173 | TRACE(shell,"-- WM_ACTIVATE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1174 | return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS); |
| 1175 | |
| 1176 | case WM_COMMAND: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1177 | TRACE(shell,"-- WM_COMMAND\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1178 | return ShellView_OnCommand(pThis, GET_WM_COMMAND_ID(wParam, lParam), |
| 1179 | GET_WM_COMMAND_CMD(wParam, lParam), |
| 1180 | GET_WM_COMMAND_HWND(wParam, lParam)); |
| 1181 | |
| 1182 | case WM_INITMENUPOPUP: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1183 | TRACE(shell,"-- WM_INITMENUPOPUP\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1184 | return ShellView_UpdateMenu(pThis, (HMENU32)wParam); |
| 1185 | |
| 1186 | case WM_NOTIFY: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1187 | TRACE(shell,"-- WM_NOTIFY\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1188 | return ShellView_OnNotify(pThis,(UINT32)wParam, (LPNMHDR)lParam); |
| 1189 | |
| 1190 | case WM_SETTINGCHANGE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1191 | TRACE(shell,"-- WM_SETTINGCHANGE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1192 | return ShellView_OnSettingChange(pThis,(LPCSTR)lParam); |
| 1193 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1194 | case WM_PARENTNOTIFY: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1195 | TRACE(shell,"-- WM_PARENTNOTIFY\n"); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1196 | if ( LOWORD(wParam) == WM_RBUTTONDOWN ) /* fixme: should not be handled here*/ |
| 1197 | { dwCursor = GetMessagePos(); |
| 1198 | ShellView_DoContextMenu(pThis, LOWORD(dwCursor), HIWORD(dwCursor), FALSE); |
| 1199 | return TRUE; |
| 1200 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1201 | break; |
| 1202 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1203 | /* -------------*/ |
| 1204 | case WM_MOVE: |
| 1205 | WARN(shell,"-- WM_MOVE\n"); |
| 1206 | break; |
| 1207 | |
| 1208 | case WM_ACTIVATEAPP: |
| 1209 | WARN(shell,"-- WM_ACTIVATEAPP\n"); |
| 1210 | break; |
| 1211 | |
| 1212 | case WM_NOTIFYFORMAT: |
| 1213 | WARN(shell,"-- WM_NOTIFYFORMAT\n"); |
| 1214 | break; |
| 1215 | |
| 1216 | case WM_NCPAINT: |
| 1217 | WARN(shell,"-- WM_NCPAINT\n"); |
| 1218 | break; |
| 1219 | |
| 1220 | case WM_ERASEBKGND: |
| 1221 | WARN(shell,"-- WM_ERASEBKGND\n"); |
| 1222 | break; |
| 1223 | |
| 1224 | case WM_PAINT: |
| 1225 | WARN(shell,"-- WM_PAINT\n"); |
| 1226 | break; |
| 1227 | |
| 1228 | case WM_NCCALCSIZE: |
| 1229 | WARN(shell,"-- WM_NCCALCSIZE\n"); |
| 1230 | break; |
| 1231 | |
| 1232 | case WM_WINDOWPOSCHANGING: |
| 1233 | WARN(shell,"-- WM_WINDOWPOSCHANGING\n"); |
| 1234 | break; |
| 1235 | |
| 1236 | case WM_WINDOWPOSCHANGED: |
| 1237 | WARN(shell,"-- WM_WINDOWPOSCHANGED\n"); |
| 1238 | break; |
| 1239 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1240 | case WM_MOUSEACTIVATE: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1241 | WARN(shell,"-- WM_MOUSEACTIVATE\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1242 | break; |
| 1243 | |
| 1244 | case WM_SETCURSOR: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1245 | WARN(shell,"-- WM_SETCURSOR\n"); |
| 1246 | break; |
| 1247 | |
| 1248 | case WM_DESTROY: |
| 1249 | WARN(shell,"-- WM_DESTROY\n"); |
| 1250 | break; |
| 1251 | |
| 1252 | case WM_NCDESTROY: |
| 1253 | WARN(shell,"-- WM_NCDESTROY\n"); |
| 1254 | break; |
| 1255 | |
| 1256 | case WM_CONTEXTMENU: |
| 1257 | WARN(shell,"-- WM_CONTEXTMENU\n"); |
| 1258 | break; |
| 1259 | |
| 1260 | case WM_MENUSELECT: |
| 1261 | WARN(shell,"-- WM_MENUSELECT\n"); |
| 1262 | break; |
| 1263 | |
| 1264 | case WM_CAPTURECHANGED: |
| 1265 | WARN(shell,"-- WM_CAPTURECHANGED\n"); |
| 1266 | break; |
| 1267 | |
| 1268 | case WM_CHILDACTIVATE: |
| 1269 | WARN(shell,"-- WM_CHILDACTIVATE\n"); |
| 1270 | break; |
| 1271 | |
| 1272 | case WM_ENTERIDLE: |
| 1273 | WARN(shell,"-- WM_ENTERIDLE\n"); |
| 1274 | break; |
| 1275 | |
| 1276 | default: |
| 1277 | FIXME(shell,"-- MESSAGE unhandled\n"); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1278 | break; |
| 1279 | } |
| 1280 | return DefWindowProc32A (hWnd, uMessage, wParam, lParam); |
| 1281 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1282 | /************************************************************************** |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1283 | * |
| 1284 | * |
| 1285 | * The INTERFACE of the IShellView object |
| 1286 | * |
| 1287 | * |
| 1288 | *************************************************************************** |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1289 | * IShellView_QueryInterface |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1290 | */ |
| 1291 | static HRESULT WINAPI IShellView_QueryInterface(LPSHELLVIEW this,REFIID riid, LPVOID *ppvObj) |
| 1292 | { char xriid[50]; |
| 1293 | WINE_StringFromCLSID((LPCLSID)riid,xriid); |
| 1294 | TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); |
| 1295 | |
| 1296 | *ppvObj = NULL; |
| 1297 | |
| 1298 | if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ |
| 1299 | { *ppvObj = this; |
| 1300 | } |
| 1301 | else if(IsEqualIID(riid, &IID_IShellView)) /*IShellView*/ |
| 1302 | { *ppvObj = (IShellView*)this; |
| 1303 | } |
| 1304 | |
| 1305 | if(*ppvObj) |
| 1306 | { (*(LPSHELLVIEW*)ppvObj)->lpvtbl->fnAddRef(this); |
| 1307 | TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); |
| 1308 | return S_OK; |
| 1309 | } |
| 1310 | TRACE(shell,"-- Interface: E_NOINTERFACE\n"); |
| 1311 | return E_NOINTERFACE; |
| 1312 | } |
| 1313 | /************************************************************************** |
| 1314 | * IShellView::AddRef |
| 1315 | */ |
| 1316 | static ULONG WINAPI IShellView_AddRef(LPSHELLVIEW this) |
| 1317 | { TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); |
| 1318 | return ++(this->ref); |
| 1319 | } |
| 1320 | /************************************************************************** |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1321 | * IShellView_Release |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1322 | */ |
| 1323 | static ULONG WINAPI IShellView_Release(LPSHELLVIEW this) |
| 1324 | { TRACE(shell,"(%p)->()\n",this); |
| 1325 | if (!--(this->ref)) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1326 | { TRACE(shell," destroying IShellView(%p)\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1327 | |
| 1328 | if(this->pSFParent) |
| 1329 | this->pSFParent->lpvtbl->fnRelease(this->pSFParent); |
| 1330 | |
| 1331 | HeapFree(GetProcessHeap(),0,this); |
| 1332 | return 0; |
| 1333 | } |
| 1334 | return this->ref; |
| 1335 | } |
| 1336 | /************************************************************************** |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1337 | * ShellView_GetWindow |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1338 | */ |
| 1339 | static HRESULT WINAPI IShellView_GetWindow(LPSHELLVIEW this,HWND32 * phWnd) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1340 | { TRACE(shell,"(%p) stub\n",this); |
| 1341 | *phWnd = this->hWnd; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1342 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1343 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1344 | } |
| 1345 | static HRESULT WINAPI IShellView_ContextSensitiveHelp(LPSHELLVIEW this,BOOL32 fEnterMode) |
| 1346 | { FIXME(shell,"(%p) stub\n",this); |
| 1347 | return E_NOTIMPL; |
| 1348 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1349 | /************************************************************************** |
| 1350 | * IShellView_TranslateAccelerator |
| 1351 | * |
| 1352 | * FIXME: |
| 1353 | * use the accel functions |
| 1354 | */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1355 | static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW this,LPMSG32 lpmsg) |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1356 | { FIXME(shell,"(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",this,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam); |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1357 | |
| 1358 | |
| 1359 | switch (lpmsg->message) |
| 1360 | { case WM_KEYDOWN: TRACE(shell,"-- key=0x04%x",lpmsg->wParam) ; |
| 1361 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1362 | return S_FALSE; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1363 | } |
| 1364 | static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW this,BOOL32 fEnable) |
| 1365 | { FIXME(shell,"(%p) stub\n",this); |
| 1366 | return E_NOTIMPL; |
| 1367 | } |
| 1368 | static HRESULT WINAPI IShellView_UIActivate(LPSHELLVIEW this,UINT32 uState) |
| 1369 | { CHAR szName[MAX_PATH]; |
| 1370 | LRESULT lResult; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1371 | int nPartArray[1] = {-1}; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1372 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1373 | TRACE(shell,"(%p)->(state=%x) stub\n",this, uState); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1374 | /*don't do anything if the state isn't really changing*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1375 | if(this->uState == uState) |
| 1376 | { return S_OK; |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1377 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1378 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1379 | /*OnActivate handles the menu merging and internal state*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1380 | ShellView_OnActivate(this, uState); |
| 1381 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1382 | /*remove the docking window*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1383 | if(g_bShowIDW) |
| 1384 | { ShellView_AddRemoveDockingWindow(this, FALSE); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1385 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1386 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1387 | /*only do this if we are active*/ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1388 | if(uState != SVUIA_DEACTIVATE) |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 1389 | { /*update the status bar */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1390 | strcpy(szName, "dummy32"); |
| 1391 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1392 | this->pSFParent->lpvtbl->fnGetFolderPath( this->pSFParent, |
| 1393 | szName + strlen(szName), |
| 1394 | sizeof(szName) - strlen(szName)); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1395 | |
| 1396 | /* set the number of parts */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1397 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1, |
| 1398 | (LPARAM)nPartArray, &lResult); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1399 | |
| 1400 | /* set the text for the parts */ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1401 | IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETTEXT32A, |
| 1402 | 0, (LPARAM)szName, &lResult); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1403 | |
Marcus Meissner | 73458b0 | 1998-12-26 12:54:29 +0000 | [diff] [blame] | 1404 | /*add the docking window if necessary */ |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1405 | if(g_bShowIDW) |
| 1406 | { ShellView_AddRemoveDockingWindow(this, TRUE); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1407 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1408 | } |
| 1409 | return S_OK; |
| 1410 | } |
| 1411 | static HRESULT WINAPI IShellView_Refresh(LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1412 | { TRACE(shell,"(%p)\n",this); |
| 1413 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1414 | ListView_DeleteAllItems(this->hWndList); |
| 1415 | ShellView_FillList(this); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1416 | |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1417 | return S_OK; |
| 1418 | } |
| 1419 | static HRESULT WINAPI IShellView_CreateViewWindow(LPSHELLVIEW this, IShellView *lpPrevView, |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1420 | LPCFOLDERSETTINGS lpfs, IShellBrowser * psb, RECT32 * prcView, HWND32 *phWnd) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1421 | { WNDCLASS32A wc; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1422 | /* LRESULT dwResult;*/ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1423 | *phWnd = 0; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1424 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1425 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1426 | TRACE(shell,"(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",this, lpPrevView,lpfs, psb, prcView, phWnd); |
| 1427 | TRACE(shell,"-- 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); |
| 1428 | |
| 1429 | /*set up the member variables*/ |
| 1430 | this->pShellBrowser = psb; |
| 1431 | this->FolderSettings = *lpfs; |
| 1432 | |
| 1433 | /*get our parent window*/ |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1434 | IShellBrowser_AddRef(this->pShellBrowser); |
| 1435 | IShellBrowser_GetWindow(this->pShellBrowser, &(this->hWndParent)); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1436 | |
| 1437 | /* try to get the ICommDlgBrowserInterface */ |
| 1438 | this->pCommDlgBrowser=NULL; |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1439 | if ( SUCCEEDED (IShellBrowser_QueryInterface( this->pShellBrowser, |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1440 | (REFIID)&IID_ICommDlgBrowser, |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1441 | (LPVOID*) &this->pCommDlgBrowser))) |
| 1442 | { TRACE(shell,"-- CommDlgBrowser\n"); |
| 1443 | } |
| 1444 | |
| 1445 | /*if our window class has not been registered, then do so*/ |
| 1446 | if(!GetClassInfo32A(shell32_hInstance, SV_CLASS_NAME, &wc)) |
| 1447 | { ZeroMemory(&wc, sizeof(wc)); |
| 1448 | wc.style = CS_HREDRAW | CS_VREDRAW; |
| 1449 | wc.lpfnWndProc = (WNDPROC32) ShellView_WndProc; |
| 1450 | wc.cbClsExtra = 0; |
| 1451 | wc.cbWndExtra = 0; |
| 1452 | wc.hInstance = shell32_hInstance; |
| 1453 | wc.hIcon = 0; |
| 1454 | wc.hCursor = LoadCursor32A (0, IDC_ARROW32A); |
| 1455 | wc.hbrBackground = (HBRUSH32) (COLOR_WINDOW + 1); |
| 1456 | wc.lpszMenuName = NULL; |
| 1457 | wc.lpszClassName = SV_CLASS_NAME; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1458 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1459 | if(!RegisterClass32A(&wc)) |
| 1460 | return E_FAIL; |
| 1461 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1462 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1463 | *phWnd = CreateWindowEx32A(0, SV_CLASS_NAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1464 | prcView->left, prcView->top, prcView->right - prcView->left, prcView->bottom - prcView->top, |
| 1465 | this->hWndParent, 0, shell32_hInstance, (LPVOID)this); |
| 1466 | |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1467 | MergeToolBar(this); |
| 1468 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1469 | if(!*phWnd) |
| 1470 | return E_FAIL; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1471 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1472 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1473 | } |
| 1474 | |
| 1475 | static HRESULT WINAPI IShellView_DestroyViewWindow(LPSHELLVIEW this) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1476 | { TRACE(shell,"(%p)\n",this); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1477 | |
| 1478 | /*Make absolutely sure all our UI is cleaned up.*/ |
| 1479 | IShellView_UIActivate(this, SVUIA_DEACTIVATE); |
| 1480 | if(this->hMenu) |
| 1481 | { DestroyMenu32(this->hMenu); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 1482 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1483 | DestroyWindow32(this->hWnd); |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1484 | IShellBrowser_Release(this->pShellBrowser); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1485 | return S_OK; |
| 1486 | } |
| 1487 | static HRESULT WINAPI IShellView_GetCurrentInfo(LPSHELLVIEW this, LPFOLDERSETTINGS lpfs) |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1488 | { TRACE(shell,"(%p)->(%p) vmode=%x flags=%x\n",this, lpfs, |
| 1489 | this->FolderSettings.ViewMode, this->FolderSettings.fFlags); |
| 1490 | |
| 1491 | if (lpfs) |
| 1492 | { *lpfs = this->FolderSettings; |
| 1493 | return NOERROR; |
| 1494 | } |
| 1495 | else |
| 1496 | return E_INVALIDARG; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1497 | } |
| 1498 | static HRESULT WINAPI IShellView_AddPropertySheetPages(LPSHELLVIEW this, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam) |
| 1499 | { FIXME(shell,"(%p) stub\n",this); |
| 1500 | return E_NOTIMPL; |
| 1501 | } |
| 1502 | static HRESULT WINAPI IShellView_SaveViewState(LPSHELLVIEW this) |
| 1503 | { FIXME(shell,"(%p) stub\n",this); |
| 1504 | return S_OK; |
| 1505 | } |
| 1506 | static HRESULT WINAPI IShellView_SelectItem(LPSHELLVIEW this, LPCITEMIDLIST pidlItem, UINT32 uFlags) |
| 1507 | { FIXME(shell,"(%p)->(pidl=%p, 0x%08x) stub\n",this, pidlItem, uFlags); |
| 1508 | return E_NOTIMPL; |
| 1509 | } |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 1510 | static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW this, UINT32 uItem, REFIID riid, LPVOID *ppvOut) |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1511 | { LPUNKNOWN pObj = NULL; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1512 | char xriid[50]; |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1513 | |
| 1514 | WINE_StringFromCLSID((LPCLSID)riid,xriid); |
| 1515 | TRACE(shell,"(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",this, uItem, xriid, ppvOut); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1516 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1517 | *ppvOut = NULL; |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1518 | if(IsEqualIID(riid, &IID_IContextMenu)) |
Juergen Schmied | cf5faa6 | 1998-11-15 13:27:16 +0000 | [diff] [blame] | 1519 | { pObj =(LPUNKNOWN)IContextMenu_Constructor(this->pSFParent,this->aSelectedItems,this->uSelected); |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1520 | } |
| 1521 | else if (IsEqualIID(riid, &IID_IDataObject)) |
Juergen Schmied | 47a8004 | 1998-11-22 18:29:50 +0000 | [diff] [blame] | 1522 | { ShellView_GetSelections(this); |
| 1523 | pObj =(LPUNKNOWN)IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected); |
| 1524 | SHFree(this->aSelectedItems); |
| 1525 | this->aSelectedItems=NULL; |
| 1526 | this->uSelected=0; |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1527 | } |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1528 | |
Juergen Schmied | 6acd059 | 1998-10-11 15:50:14 +0000 | [diff] [blame] | 1529 | TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut); |
| 1530 | |
Juergen Schmied | e8d281d | 1998-10-24 09:22:57 +0000 | [diff] [blame] | 1531 | if(!pObj) |
| 1532 | return E_OUTOFMEMORY; |
| 1533 | *ppvOut = pObj; |
| 1534 | return S_OK; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 1535 | } |