source: trunk/src/shell32/brsfolder.c@ 7904

Last change on this file since 7904 was 7904, checked in by sandervl, 24 years ago

extended logging added

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