source: trunk/src/shell32/brsfolder.cpp@ 2013

Last change on this file since 2013 was 1553, checked in by phaller, 26 years ago

Add: update to wine/shell32 1999/11/02 #3

File size: 10.0 KB
Line 
1/* $Id: brsfolder.cpp,v 1.2 1999-11-02 20:05:33 phaller Exp $ */
2
3/*
4 * Win32 SHELL32 for OS/2
5 *
6 * Copyright 1997 Marcus Meissner
7 * Copyright 1999 Patrick Haller (haller@zebra.fh-weingarten.de)
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12
13/*****************************************************************************
14 * Includes *
15 *****************************************************************************/
16
17#include <stdlib.h>
18#include <string.h>
19#include <odin.h>
20#include <odinwrap.h>
21#include <os2sel.h>
22
23#define ICOM_CINTERFACE 1
24
25#include <winbase.h>
26#include "winerror.h"
27#include "heap.h"
28#include "resource.h"
29#include "dlgs.h"
30#include "win.h"
31#include "sysmetrics.h"
32#include "debugtools.h"
33#include "winreg.h"
34#include "authors.h"
35#include "winnls.h"
36#include "commctrl.h"
37#include "spy.h"
38
39#include "wine/obj_base.h"
40#include "wine/obj_enumidlist.h"
41#include "wine/obj_shellfolder.h"
42#include "wine/undocshell.h"
43
44#include "pidl.h"
45#include "shell32_main.h"
46#include "shellapi.h"
47
48#include <misc.h>
49
50
51/*****************************************************************************
52 * Local Variables *
53 *****************************************************************************/
54
55ODINDEBUGCHANNEL(shell32-brsfolder)
56
57#define IDD_TREEVIEW 99
58
59static HWND hwndTreeView;
60static LPBROWSEINFOA lpBrowseInfo;
61static LPITEMIDLIST pidlRet;
62
63static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent);
64
65
66/*****************************************************************************
67 * Implementation *
68 *****************************************************************************/
69
70static void InitializeTreeView(HWND hwndParent)
71{
72 HIMAGELIST hImageList;
73 IShellFolder * lpsf;
74 HRESULT hr;
75
76 dprintf(("SHELL32:brsfolder:InitializeTreeView(%08xh)\n",
77 hwndParent));
78
79 hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW);
80 Shell_GetImageList(NULL, &hImageList);
81
82 if (hImageList && hwndTreeView)
83 { TreeView_SetImageList(hwndTreeView, hImageList, 0);
84 }
85
86 hr = SHGetDesktopFolder(&lpsf);
87
88 if (SUCCEEDED(hr) && hwndTreeView)
89 { TreeView_DeleteAllItems(hwndTreeView);
90 FillTreeView(lpsf, NULL, TVI_ROOT);
91 }
92
93 if (SUCCEEDED(hr))
94 { IShellFolder_Release(lpsf);
95 }
96}
97
98static int GetIcon(LPITEMIDLIST lpi, UINT uFlags)
99{
100 SHFILEINFOA sfi;
101
102 dprintf(("SHELL32:brsfolder:GetIcon(%08xh,%08xh)\n",
103 lpi,
104 uFlags));
105
106 SHGetFileInfoA((LPCSTR)lpi,0,&sfi, sizeof(SHFILEINFOA), uFlags);
107 return sfi.iIcon;
108}
109
110static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTVITEMA lpTV_ITEM)
111{
112 dprintf(("SHELL32:brsfolder:GetNormalAndSelectedIcons(%08xh,%08xh)\n",
113 lpifq,
114 lpTV_ITEM));
115
116 lpTV_ITEM->iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
117 lpTV_ITEM->iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
118
119 return;
120}
121
122typedef struct tagID
123{
124 LPSHELLFOLDER lpsfParent;
125 LPITEMIDLIST lpi;
126 LPITEMIDLIST lpifq;
127} TV_ITEMDATA, *LPTV_ITEMDATA;
128
129static BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName)
130{
131 BOOL bSuccess=TRUE;
132 STRRET str;
133
134 dprintf(("SHELL32:brsfolder:GetName(%08xh,%08xh,%08xh,%08xh)\n",
135 lpsf,
136 lpi,
137 dwFlags,
138 lpFriendlyName));
139
140 if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str)))
141 {
142 if(FAILED(StrRetToStrNA (lpFriendlyName, MAX_PATH, &str, lpi)))
143 {
144 bSuccess = FALSE;
145 }
146 }
147 else
148 bSuccess = FALSE;
149
150 TRACE("-- %s\n",lpFriendlyName);
151 return bSuccess;
152}
153
154static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST pidl, HTREEITEM hParent)
155{
156 TVITEMA tvi;
157 TVINSERTSTRUCTA tvins;
158 HTREEITEM hPrev = 0;
159 LPENUMIDLIST lpe=0;
160 LPITEMIDLIST pidlTemp=0;
161 LPTV_ITEMDATA lptvid=0;
162 ULONG ulFetched;
163 HRESULT hr;
164 char szBuff[256];
165 HWND hwnd=GetParent(hwndTreeView);
166
167 dprintf(("SHELL32:brsfolder:FillTreeView(%08xh,%08xh,%08xh)\n",
168 lpsf,
169 pidl,
170 hParent));
171
172 SetCapture(GetParent(hwndTreeView));
173 SetCursor(LoadCursorA(0, IDC_WAITA));
174
175 hr=IShellFolder_EnumObjects(lpsf,hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,&lpe);
176
177 if (SUCCEEDED(hr))
178 { while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched))
179 { ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
180 IShellFolder_GetAttributesOf(lpsf, 1, &pidlTemp, &ulAttrs);
181 if (ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
182 { if (ulAttrs & SFGAO_FOLDER)
183 { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
184
185 if (ulAttrs & SFGAO_HASSUBFOLDER)
186 { tvi.cChildren=1;
187 tvi.mask |= TVIF_CHILDREN;
188 }
189
190 if (! ( lptvid = (LPTV_ITEMDATA)SHAlloc(sizeof(TV_ITEMDATA)) ) )
191 goto Done;
192
193 if (!GetName(lpsf, pidlTemp, SHGDN_NORMAL, szBuff))
194 goto Done;
195
196 tvi.pszText = szBuff;
197 tvi.cchTextMax = MAX_PATH;
198 tvi.lParam = (LPARAM)lptvid;
199
200 IShellFolder_AddRef(lpsf);
201 lptvid->lpsfParent = lpsf;
202 lptvid->lpi = ILClone(pidlTemp);
203 lptvid->lpifq = ILCombine(pidl, pidlTemp);
204 GetNormalAndSelectedIcons(lptvid->lpifq, &tvi);
205
206 tvins.DUMMYUNIONNAME.item = tvi;
207 tvins.hInsertAfter = hPrev;
208 tvins.hParent = hParent;
209
210 hPrev = (HTREEITEM)TreeView_InsertItemA (hwndTreeView, &tvins);
211
212 }
213 }
214 SHFree(pidlTemp); /* Finally, free the pidl that the shell gave us... */
215 pidlTemp=0;
216 }
217 }
218
219Done:
220 ReleaseCapture();
221 SetCursor(LoadCursorA(0, IDC_ARROWA));
222
223 if (lpe)
224 IEnumIDList_Release(lpe);
225 if (pidlTemp )
226 SHFree(pidlTemp);
227}
228
229static LRESULT MsgNotify(HWND hWnd, UINT CtlID, LPNMHDR lpnmh)
230{
231 NMTREEVIEWA *pnmtv = (NMTREEVIEWA *)lpnmh;
232 LPTV_ITEMDATA lptvid; /* Long pointer to TreeView item data */
233 IShellFolder * lpsf2=0;
234
235
236 dprintf(("SHELL32:brsfolder:MsgNotify(%08xh,%08xh,%08xh)\n",
237 hWnd,
238 CtlID,
239 lpnmh));
240
241 switch (pnmtv->hdr.idFrom)
242 { case IDD_TREEVIEW:
243 switch (pnmtv->hdr.code)
244 { case TVN_DELETEITEM:
245 { FIXME("TVN_DELETEITEM\n");
246 lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
247 IShellFolder_Release(lptvid->lpsfParent);
248 SHFree(lptvid->lpi);
249 SHFree(lptvid->lpifq);
250 SHFree(lptvid);
251 }
252 break;
253
254 case TVN_ITEMEXPANDING:
255 { FIXME("TVN_ITEMEXPANDING\n");
256 if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
257 break;
258
259 lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
260 if (SUCCEEDED(IShellFolder_BindToObject(lptvid->lpsfParent, lptvid->lpi,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2)))
261 { FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem );
262 }
263 TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
264 }
265 break;
266 case TVN_SELCHANGED:
267 lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
268 pidlRet = lptvid->lpifq;
269 break;
270
271 default:
272 FIXME("unhandled\n");
273 break;
274 }
275 break;
276
277 default:
278 break;
279 }
280
281 return 0;
282}
283
284
285/*************************************************************************
286 * BrsFolderDlgProc32 (not an exported API function)
287 */
288ODINFUNCTION4(BOOL, BrsFolderDlgProc, HWND, hWnd,
289 UINT, msg,
290 WPARAM, wParam,
291 LPARAM, lParam)
292{
293 switch(msg)
294 { case WM_INITDIALOG:
295 pidlRet = NULL;
296 lpBrowseInfo = (LPBROWSEINFOA) lParam;
297 if (lpBrowseInfo->lpfn)
298 FIXME("Callbacks not implemented\n");
299 if (lpBrowseInfo->ulFlags)
300 FIXME("flag %x not implemented\n", lpBrowseInfo->ulFlags);
301 if (lpBrowseInfo->lpszTitle)
302 FIXME("title %s not displayed\n", lpBrowseInfo->lpszTitle);
303 if ( lpBrowseInfo->pidlRoot )
304 FIXME("root is desktop\n");
305
306 InitializeTreeView ( hWnd);
307 return 1;
308
309 case WM_NOTIFY:
310 MsgNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam);
311 break;
312
313 case WM_COMMAND:
314 switch (wParam)
315 { case IDOK:
316 pdump ( pidlRet );
317 SHGetPathFromIDListA(pidlRet, lpBrowseInfo->pszDisplayName);
318 EndDialog(hWnd, (DWORD) ILClone(pidlRet));
319 return TRUE;
320
321 case IDCANCEL:
322 EndDialog(hWnd, 0);
323 return TRUE;
324 }
325 break;
326 }
327 return 0;
328}
329
330/*************************************************************************
331 * SHBrowseForFolderA [SHELL32.209]
332 *
333 */
334ODINFUNCTION1(LPITEMIDLIST, SHBrowseForFolderA, LPBROWSEINFOA, lpbi)
335{
336 TRACE("(%lx,%s) empty stub!\n", (DWORD)lpbi, lpbi->lpszTitle);
337
338 return (LPITEMIDLIST) DialogBoxParamA( shell32_hInstance,
339 "SHBRSFORFOLDER_MSGBOX", 0,
340 BrsFolderDlgProc, (INT)lpbi );
341}
Note: See TracBrowser for help on using the repository browser.