source: trunk/src/shell32/new/brsfolder.cpp@ 1122

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

Fix: conflict with win32type.h

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