Changeset 1145 for trunk/src/shell32/new/brsfolder.cpp
- Timestamp:
- Oct 5, 1999, 9:33:37 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/new/brsfolder.cpp
r1122 r1145 1 /* $Id: brsfolder.cpp,v 1.5 1999-10-05 19:33:36 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 1 17 #include <stdlib.h> 2 18 #include <string.h> 3 19 #include <odin.h> 20 #include <odinwrap.h> 21 #include <os2sel.h> 4 22 5 23 #define ICOM_CINTERFACE 1 … … 31 49 32 50 33 DEFAULT_DEBUG_CHANNEL(shell) 34 35 #define IDD_TREEVIEW 99 36 37 static HWND hwndTreeView; 51 /***************************************************************************** 52 * Local Variables * 53 *****************************************************************************/ 54 55 ODINDEBUGCHANNEL(shell32-brsfolder) 56 57 #define IDD_TREEVIEW 99 58 59 static HWND hwndTreeView; 38 60 static LPBROWSEINFOA lpBrowseInfo; 39 static LPITEMIDLIST 61 static LPITEMIDLIST pidlRet; 40 62 41 63 static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent); 42 64 65 66 /***************************************************************************** 67 * Implementation * 68 *****************************************************************************/ 69 43 70 static void InitializeTreeView(HWND hwndParent) 44 71 { 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 } 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 } 68 96 } 69 97 70 98 static int GetIcon(LPITEMIDLIST lpi, UINT uFlags) 71 { SHFILEINFOA sfi; 72 SHGetFileInfoA((LPCSTR)lpi,0,&sfi, sizeof(SHFILEINFOA), uFlags); 73 return sfi.iIcon; 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; 74 108 } 75 109 76 110 static 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; 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; 83 120 } 84 121 … … 92 129 static BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName) 93 130 { 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; 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; 110 152 } 111 153 112 154 static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST pidl, HTREEITEM hParent) 113 155 { 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 } 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 } 172 218 173 219 Done: 174 175 176 177 178 179 180 220 ReleaseCapture(); 221 SetCursor(LoadCursorA(0, IDC_ARROWA)); 222 223 if (lpe) 224 lpe->lpvtbl->fnRelease(lpe); 225 if (pidlTemp ) 226 SHFree(pidlTemp); 181 227 } 182 228 183 229 static 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; 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; 233 282 } 234 283 … … 237 286 * BrsFolderDlgProc32 (not an exported API function) 238 287 */ 239 static 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; 288 ODINFUNCTION4(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; 278 328 } 279 329 … … 282 332 * 283 333 */ 284 LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOAlpbi)285 { 286 287 288 289 290 291 } 334 ODINFUNCTION1(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 TracChangeset
for help on using the changeset viewer.