4 #include "wine/winuser16.h"
10 #include "sysmetrics.h"
18 #include "wine/obj_base.h"
19 #include "wine/obj_enumidlist.h"
20 #include "wine/obj_shellfolder.h"
24 #include "shell32_main.h"
26 #define IDD_TREEVIEW 99
28 static HWND hwndTreeView
;
29 static LPBROWSEINFOA lpBrowseInfo
;
30 static LPITEMIDLIST pidlRet
;
32 static void FillTreeView(LPSHELLFOLDER lpsf
, LPITEMIDLIST lpifq
, HTREEITEM hParent
);
34 static void InitializeTreeView(HWND hwndParent
)
36 HIMAGELIST hImageList
;
40 hwndTreeView
= GetDlgItem (hwndParent
, IDD_TREEVIEW
);
41 Shell_GetImageList(NULL
, &hImageList
);
43 TRACE(shell
,"dlg=%x tree=%x\n", hwndParent
, hwndTreeView
);
45 if (hImageList
&& hwndTreeView
)
46 { TreeView_SetImageList(hwndTreeView
, hImageList
, 0);
49 hr
= SHGetDesktopFolder(&lpsf
);
51 if (SUCCEEDED(hr
) && hwndTreeView
)
52 { TreeView_DeleteAllItems(hwndTreeView
);
53 FillTreeView(lpsf
, NULL
, TVI_ROOT
);
57 { IShellFolder_Release(lpsf
);
61 static int GetIcon(LPITEMIDLIST lpi
, UINT uFlags
)
63 SHGetFileInfoA((LPCSTR
)lpi
,0,&sfi
, sizeof(SHFILEINFOA
), uFlags
);
67 static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq
,LPTVITEMA lpTV_ITEM
)
68 { TRACE (shell
,"%p %p\n",lpifq
, lpTV_ITEM
);
70 lpTV_ITEM
->iImage
= GetIcon(lpifq
, SHGFI_PIDL
| SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
);
71 lpTV_ITEM
->iSelectedImage
= GetIcon(lpifq
, SHGFI_PIDL
| SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
| SHGFI_OPENICON
);
78 LPSHELLFOLDER lpsfParent
;
81 } TV_ITEMDATA
, *LPTV_ITEMDATA
;
83 static BOOL
GetName(LPSHELLFOLDER lpsf
, LPITEMIDLIST lpi
, DWORD dwFlags
, LPSTR lpFriendlyName
)
88 TRACE(shell
,"%p %p %lx %p\n", lpsf
, lpi
, dwFlags
, lpFriendlyName
);
89 if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf
, lpi
, dwFlags
, &str
)))
90 { bSuccess
= StrRetToStrN (lpFriendlyName
, MAX_PATH
, &str
, lpi
);
95 TRACE(shell
,"-- %s\n",lpFriendlyName
);
99 static void FillTreeView(IShellFolder
* lpsf
, LPITEMIDLIST pidl
, HTREEITEM hParent
)
102 TVINSERTSTRUCTA tvins
;
105 LPITEMIDLIST pidlTemp
=0;
106 LPTV_ITEMDATA lptvid
=0;
110 HWND hwnd
=GetParent(hwndTreeView
);
112 TRACE(shell
, "%p %p %x\n",lpsf
, pidl
, (INT
)hParent
);
114 SetCapture(GetParent(hwndTreeView
));
115 SetCursor(LoadCursorA(0, IDC_WAITA
));
117 hr
=IShellFolder_EnumObjects(lpsf
,hwnd
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
,&lpe
);
120 { while (NOERROR
== IEnumIDList_Next(lpe
,1,&pidlTemp
,&ulFetched
))
121 { ULONG ulAttrs
= SFGAO_HASSUBFOLDER
| SFGAO_FOLDER
;
122 IShellFolder_GetAttributesOf(lpsf
, 1, &pidlTemp
, &ulAttrs
);
123 if (ulAttrs
& (SFGAO_HASSUBFOLDER
| SFGAO_FOLDER
))
124 { if (ulAttrs
& SFGAO_FOLDER
)
125 { tvi
.mask
= TVIF_TEXT
| TVIF_IMAGE
| TVIF_SELECTEDIMAGE
| TVIF_PARAM
;
127 if (ulAttrs
& SFGAO_HASSUBFOLDER
)
129 tvi
.mask
|= TVIF_CHILDREN
;
132 if (! ( lptvid
= (LPTV_ITEMDATA
)SHAlloc(sizeof(TV_ITEMDATA
)) ) )
135 if (!GetName(lpsf
, pidlTemp
, SHGDN_NORMAL
, szBuff
))
138 tvi
.pszText
= szBuff
;
139 tvi
.cchTextMax
= MAX_PATH
;
140 tvi
.lParam
= (LPARAM
)lptvid
;
142 IShellFolder_AddRef(lpsf
);
143 lptvid
->lpsfParent
= lpsf
;
144 lptvid
->lpi
= ILClone(pidlTemp
);
145 lptvid
->lpifq
= ILCombine(pidl
, pidlTemp
);
146 GetNormalAndSelectedIcons(lptvid
->lpifq
, &tvi
);
148 tvins
.DUMMYUNIONNAME
.item
= tvi
;
149 tvins
.hInsertAfter
= hPrev
;
150 tvins
.hParent
= hParent
;
152 hPrev
= (HTREEITEM
)TreeView_InsertItemA (hwndTreeView
, &tvins
);
156 SHFree(pidlTemp
); //Finally, free the pidl that the shell gave us...
163 SetCursor(LoadCursorA(0, IDC_ARROWA
));
166 lpe
->lpvtbl
->fnRelease(lpe
);
171 static LRESULT
MsgNotify(HWND hWnd
, UINT CtlID
, LPNMHDR lpnmh
)
173 NMTREEVIEWA
*pnmtv
= (NMTREEVIEWA
*)lpnmh
;
174 LPTV_ITEMDATA lptvid
; //Long pointer to TreeView item data
175 IShellFolder
* lpsf2
=0;
178 TRACE(shell
,"%x %x %p msg=%x\n", hWnd
, CtlID
, lpnmh
, pnmtv
->hdr
.code
);
180 switch (pnmtv
->hdr
.idFrom
)
182 switch (pnmtv
->hdr
.code
)
183 { case TVN_DELETEITEM
:
184 { FIXME(shell
,"TVN_DELETEITEM\n");
185 lptvid
=(LPTV_ITEMDATA
)pnmtv
->itemOld
.lParam
;
186 IShellFolder_Release(lptvid
->lpsfParent
);
188 SHFree(lptvid
->lpifq
);
193 case TVN_ITEMEXPANDING
:
194 { FIXME(shell
,"TVN_ITEMEXPANDING\n");
195 if ((pnmtv
->itemNew
.state
& TVIS_EXPANDEDONCE
))
198 lptvid
=(LPTV_ITEMDATA
)pnmtv
->itemNew
.lParam
;
199 if (SUCCEEDED(IShellFolder_BindToObject(lptvid
->lpsfParent
, lptvid
->lpi
,0,(REFIID
)&IID_IShellFolder
,(LPVOID
*)&lpsf2
)))
200 { FillTreeView( lpsf2
, lptvid
->lpifq
, pnmtv
->itemNew
.hItem
);
202 TreeView_SortChildren(hwndTreeView
, pnmtv
->itemNew
.hItem
, FALSE
);
206 lptvid
=(LPTV_ITEMDATA
)pnmtv
->itemNew
.lParam
;
207 pidlRet
= lptvid
->lpifq
;
211 FIXME(shell
,"unhandled\n");
224 /*************************************************************************
225 * BrsFolderDlgProc32 (not an exported API function)
227 BOOL WINAPI
BrsFolderDlgProc( HWND hWnd
, UINT msg
, WPARAM wParam
,
229 { TRACE(shell
,"hwnd=%i msg=%i 0x%08x 0x%08lx\n", hWnd
, msg
, wParam
, lParam
);
232 { case WM_INITDIALOG
:
234 lpBrowseInfo
= (LPBROWSEINFOA
) lParam
;
235 if (lpBrowseInfo
->lpfn
)
236 FIXME(shell
,"Callbacks not implemented\n");
237 if (lpBrowseInfo
->ulFlags
)
238 FIXME(shell
,"flag %x not implemented\n", lpBrowseInfo
->ulFlags
);
239 if (lpBrowseInfo
->lpszTitle
)
240 FIXME(shell
,"title %s not displayed\n", lpBrowseInfo
->lpszTitle
);
241 if ( lpBrowseInfo
->pidlRoot
)
242 FIXME(shell
,"root is desktop\n");
244 InitializeTreeView ( hWnd
);
248 MsgNotify( hWnd
, (UINT
)wParam
, (LPNMHDR
)lParam
);
255 _ILGetPidlPath (pidlRet
, lpBrowseInfo
->pszDisplayName
, MAX_PATH
);
256 EndDialog(hWnd
, (DWORD
) ILClone(pidlRet
));
268 extern LPCVOID _Resource_Dlg_SHBRSFORFOLDER_MSGBOX_0_data
;
269 /*************************************************************************
270 * SHBrowseForFolderA [SHELL32.209]
273 LPITEMIDLIST WINAPI
SHBrowseForFolderA (LPBROWSEINFOA lpbi
)
275 TRACE(shell
, "(%lx,%s) empty stub!\n", (DWORD
)lpbi
, lpbi
->lpszTitle
);
277 return (LPITEMIDLIST
) DialogBoxIndirectParamA( 0,
278 &_Resource_Dlg_SHBRSFORFOLDER_MSGBOX_0_data
, 0,
279 BrsFolderDlgProc
, (INT
)lpbi
);