Ignore:
Timestamp:
Oct 5, 1999, 9:33:37 PM (26 years ago)
Author:
phaller
Message:

Add: debug information

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
    117#include <stdlib.h>
    218#include <string.h>
    319#include <odin.h>
     20#include <odinwrap.h>
     21#include <os2sel.h>
    422
    523#define ICOM_CINTERFACE 1
     
    3149
    3250
    33 DEFAULT_DEBUG_CHANNEL(shell)
    34 
    35 #define         IDD_TREEVIEW 99
    36 
    37 static HWND             hwndTreeView;
     51/*****************************************************************************
     52 * Local Variables                                                           *
     53 *****************************************************************************/
     54
     55ODINDEBUGCHANNEL(shell32-brsfolder)
     56
     57#define         IDD_TREEVIEW 99
     58
     59static HWND             hwndTreeView;
    3860static LPBROWSEINFOA  lpBrowseInfo;
    39 static LPITEMIDLIST     pidlRet;
     61static LPITEMIDLIST     pidlRet;
    4062
    4163static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpifq, HTREEITEM hParent);
    4264
     65
     66/*****************************************************************************
     67 * Implementation                                                            *
     68 *****************************************************************************/
     69
    4370static void InitializeTreeView(HWND hwndParent)
    4471{
    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        }
    6896}
    6997
    7098static 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;
    74108}
    75109
    76110static 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;
    83120}
    84121
     
    92129static BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName)
    93130{
    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;
    110152}
    111153
    112154static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST  pidl, HTREEITEM hParent)
    113155{
    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        }
    172218
    173219Done:
    174         ReleaseCapture();
    175         SetCursor(LoadCursorA(0, IDC_ARROWA));
    176 
    177         if (lpe)
    178           lpe->lpvtbl->fnRelease(lpe);
    179         if (pidlTemp )
    180           SHFree(pidlTemp);
     220        ReleaseCapture();
     221        SetCursor(LoadCursorA(0, IDC_ARROWA));
     222
     223        if (lpe)
     224          lpe->lpvtbl->fnRelease(lpe);
     225        if (pidlTemp )
     226          SHFree(pidlTemp);
    181227}
    182228
    183229static 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;
    233282}
    234283
     
    237286 *             BrsFolderDlgProc32  (not an exported API function)
    238287 */
    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;
     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;
    278328}
    279329
     
    282332 *
    283333 */
    284 LPITEMIDLIST 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 }
     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 TracChangeset for help on using the changeset viewer.