Changeset 1558 for trunk/src


Ignore:
Timestamp:
Nov 2, 1999, 9:38:48 PM (26 years ago)
Author:
phaller
Message:

Add: update to wine/shell32 1999/11/02 #4

Location:
trunk/src/shell32
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shell32_main.cpp

    r1360 r1558  
    1 /* $Id: shell32_main.cpp,v 1.4 1999-10-19 14:32:14 phaller Exp $ */
     1/* $Id: shell32_main.cpp,v 1.5 1999-11-02 20:38:47 phaller Exp $ */
    22
    33/*
     
    4646#include "shlguid.h"
    4747#include "wine/undocshell.h"
     48#include "shpolicy.h"
    4849
    4950#include <heapstring.h>
     
    159160   {
    160161     pidl = (LPCITEMIDLIST) path;
     162     if (!pidl )
     163     {
     164       dprintf(("pidl is null!\n"));
     165       return FALSE;
     166     }
    161167   }
    162168   else if (!(flags & SHGFI_USEFILEATTRIBUTES))
     
    200206   if (SUCCEEDED(hr) && (flags & SHGFI_TYPENAME))
    201207   {
    202      if(_ILIsValue(pidlLast))
    203      {
    204        char sTemp[64];
    205        if (_ILGetExtension (pidlLast, sTemp, 64))
    206        {
    207          if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
    208              && HCR_MapTypeToValue(sTemp, psfi->szTypeName, 80, FALSE )))
    209          {
    210            lstrcpynA (psfi->szTypeName, sTemp, 74);
    211            strcat (psfi->szTypeName, "-file");
    212          }
    213        }
    214      }
    215      else
    216      {
    217        strcpy(psfi->szTypeName, "Folder");
    218      }
     208     _ILGetFileType(pidlLast, psfi->szTypeName, 80);
    219209   }
    220210
     
    569559 * AboutDlgProc32                           (internal)
    570560 */
    571 
    572561BOOL WINAPI AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
    573562                              LPARAM lParam )
     
    925914       {
    926915         dprintf(("shell32.dll instantiated twice in one address space!\n"));
     916       }
     917       else
     918       {
     919         /* we only want to call this the first time shell32 is instantiated */
     920         SHInitRestricted(NULL, NULL);
    927921       }
    928922
     
    988982       shell32_RefCount--;
    989983
    990        pOleUninitialize();
    991        FreeLibrary(hOle32);
    992        FreeLibrary(hComctl32);
    993 
    994984       if ( !shell32_RefCount )
    995985       {
     
    10101000         }
    10111001       }
     1002
     1003       FreeLibrary(hOle32);
     1004       FreeLibrary(hComctl32);
     1005
    10121006       dprintf(("refcount=%u objcount=%u \n", shell32_RefCount, shell32_ObjCount));
    10131007       break;
  • trunk/src/shell32/shlfolder.cpp

    r1215 r1558  
    1 /* $Id: shlfolder.cpp,v 1.2 1999-10-09 11:17:05 sandervl Exp $ */
     1/* $Id: shlfolder.cpp,v 1.3 1999-11-02 20:38:47 phaller Exp $ */
    22/*
    3  *      Shell Folder stuff
     3 * Shell Folder stuff
    44 *
    5  *      Copyright 1997  Marcus Meissner
    6  *      Copyright 1998, 1999    Juergen Schmied
    7  *     
    8  *      IShellFolder with IDropTarget, IPersistFolder
     5 * Copyright 1997 Marcus Meissner
     6 * Copyright 1998, 1999                  Juergen Schmied
     7 *
     8 * IShellFolder with IDropTarget, IPersistFolder
    99 *
    1010 */
     
    5252
    5353static LPCWSTR GetNextElementW(LPCWSTR pszNext,LPWSTR pszOut,DWORD dwOut)
    54 {       LPCWSTR   pszTail = pszNext;
    55         DWORD dwCopy;
    56         TRACE("(%s %p 0x%08lx)\n",debugstr_w(pszNext),pszOut,dwOut);
    57 
    58         *pszOut=0x0000;
    59        
    60         if(!pszNext || !*pszNext)
    61           return NULL;
    62 
    63         while(*pszTail && (*pszTail != (WCHAR)'\\'))
    64           pszTail++;
    65 
    66         dwCopy = (WCHAR*)pszTail - (WCHAR*)pszNext + 1;
    67         lstrcpynW(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
    68 
    69         if(*pszTail)
    70            pszTail++;
    71         else
    72            pszTail = NULL;
    73 
    74         TRACE("--(%s %s 0x%08lx %p)\n",debugstr_w(pszNext),debugstr_w(pszOut),dwOut,pszTail);
    75         return pszTail;
     54{  LPCWSTR   pszTail = pszNext;
     55   DWORD dwCopy;
     56   TRACE("(%s %p 0x%08lx)\n",debugstr_w(pszNext),pszOut,dwOut);
     57
     58   *pszOut=0x0000;
     59
     60   if(!pszNext || !*pszNext)
     61     return NULL;
     62
     63   while(*pszTail && (*pszTail != (WCHAR)'\\'))
     64     pszTail++;
     65
     66   dwCopy = (WCHAR*)pszTail - (WCHAR*)pszNext + 1;
     67   lstrcpynW(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
     68
     69   if(*pszTail)
     70      pszTail++;
     71   else
     72      pszTail = NULL;
     73
     74   TRACE("--(%s %s 0x%08lx %p)\n",debugstr_w(pszNext),debugstr_w(pszOut),dwOut,pszTail);
     75   return pszTail;
    7676}
    7777
    7878static HRESULT SHELL32_ParseNextElement(
    79         HWND hwndOwner,
    80         IShellFolder * psf,
    81         LPITEMIDLIST * pidlInOut,
    82         LPOLESTR szNext,
    83         DWORD *pEaten,
    84         DWORD *pdwAttributes)
    85 {
    86         HRESULT         hr = E_OUTOFMEMORY;
    87         LPITEMIDLIST    pidlOut, pidlTemp = NULL;
    88         IShellFolder    *psfChild;
    89        
    90         TRACE("(%p %p %s)\n",psf, pidlInOut? *pidlInOut: NULL, debugstr_w(szNext));
    91 
    92 
    93         /* get the shellfolder for the child pidl and let it analyse further */
    94         hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
    95 
    96         if (psfChild)
    97         {
    98           hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes);
    99           IShellFolder_Release(psfChild);
    100 
    101           pidlTemp = ILCombine(*pidlInOut, pidlOut);
    102 
    103           if (pidlOut)
    104             ILFree(pidlOut);
    105         }
    106 
    107         ILFree(*pidlInOut);
    108         *pidlInOut = pidlTemp;
    109 
    110         TRACE("-- pidl=%p ret=0x%08lx\n", pidlInOut? *pidlInOut: NULL, hr);
    111         return hr;     
     79   HWND hwndOwner,
     80   IShellFolder * psf,
     81   LPITEMIDLIST * pidlInOut,
     82   LPOLESTR szNext,
     83   DWORD *pEaten,
     84   DWORD *pdwAttributes)
     85{
     86   HRESULT     hr = E_OUTOFMEMORY;
     87   LPITEMIDLIST   pidlOut, pidlTemp = NULL;
     88   IShellFolder   *psfChild;
     89
     90   TRACE("(%p %p %s)\n",psf, pidlInOut? *pidlInOut: NULL, debugstr_w(szNext));
     91
     92
     93   /* get the shellfolder for the child pidl and let it analyse further */
     94   hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
     95
     96   if (psfChild)
     97   {
     98     hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes);
     99     IShellFolder_Release(psfChild);
     100
     101     pidlTemp = ILCombine(*pidlInOut, pidlOut);
     102
     103     if (pidlOut)
     104       ILFree(pidlOut);
     105   }
     106
     107   ILFree(*pidlInOut);
     108   *pidlInOut = pidlTemp;
     109
     110   TRACE("-- pidl=%p ret=0x%08lx\n", pidlInOut? *pidlInOut: NULL, hr);
     111   return hr;
    112112}
    113113
    114114/***********************************************************************
    115  *      SHELL32_CoCreateInitSF
     115 * SHELL32_CoCreateInitSF
    116116 *
    117  *      creates a initialized shell folder
     117 * creates a initialized shell folder
    118118 */
    119119static HRESULT SHELL32_CoCreateInitSF (
    120         LPITEMIDLIST pidlRoot,
    121         LPITEMIDLIST pidlChild,
    122         REFCLSID clsid,
    123         REFIID iid,
    124         LPVOID * ppvOut)
    125 {
    126         HRESULT hr;
    127         LPITEMIDLIST    absPidl;
    128         IShellFolder    *pShellFolder;
    129         IPersistFolder  *pPersistFolder;
    130 
    131         TRACE("%p %p\n", pidlRoot, pidlChild);
    132 
    133         *ppvOut = NULL;
    134        
    135         /* we have to ask first for IPersistFolder, some special folders are expecting this */
    136         hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
    137         if (SUCCEEDED(hr))
    138         {
    139           hr = IPersistFolder_QueryInterface(pPersistFolder, iid, (LPVOID*)&pShellFolder);
    140           if (SUCCEEDED(hr))
    141           {
    142             absPidl = ILCombine (pidlRoot, pidlChild);
    143             hr = IPersistFolder_Initialize(pPersistFolder, absPidl);
    144             IPersistFolder_Release(pPersistFolder);
    145             SHFree(absPidl);
    146             *ppvOut = pShellFolder;
    147           }
    148         }
    149 
    150         TRACE("-- ret=0x%08lx\n", hr);
    151         return hr;
     120   LPITEMIDLIST pidlRoot,
     121   LPITEMIDLIST pidlChild,
     122   REFCLSID clsid,
     123   REFIID iid,
     124   LPVOID * ppvOut)
     125{
     126   HRESULT hr;
     127   LPITEMIDLIST   absPidl;
     128   IShellFolder   *pShellFolder;
     129   IPersistFolder *pPersistFolder;
     130
     131   TRACE("%p %p\n", pidlRoot, pidlChild);
     132
     133   *ppvOut = NULL;
     134
     135   /* we have to ask first for IPersistFolder, some special folders are expecting this */
     136   hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
     137   if (SUCCEEDED(hr))
     138   {
     139     hr = IPersistFolder_QueryInterface(pPersistFolder, iid, (LPVOID*)&pShellFolder);
     140     if (SUCCEEDED(hr))
     141     {
     142       absPidl = ILCombine (pidlRoot, pidlChild);
     143       hr = IPersistFolder_Initialize(pPersistFolder, absPidl);
     144       IPersistFolder_Release(pPersistFolder);
     145       SHFree(absPidl);
     146       *ppvOut = pShellFolder;
     147     }
     148   }
     149
     150   TRACE("-- ret=0x%08lx\n", hr);
     151   return hr;
    152152}
    153153
    154154static HRESULT SHELL32_GetDisplayNameOfChild(
    155         IShellFolder * psf,
    156         LPCITEMIDLIST pidl,
    157         DWORD dwFlags,
    158         LPSTR szOut,
    159         DWORD dwOutLen)
    160 {
    161         LPITEMIDLIST    pidlFirst, pidlNext;
    162         IShellFolder *  psfChild;
    163         HRESULT         hr = E_OUTOFMEMORY;
    164         STRRET strTemp;
    165        
    166         TRACE("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n",psf,pidl,dwFlags,szOut, dwOutLen);
    167         pdump(pidl);
    168        
    169         if ((pidlFirst = ILCloneFirst(pidl)))
    170         {
    171           hr = IShellFolder_BindToObject(psf, pidlFirst, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
    172           if (SUCCEEDED(hr))
    173           {
    174             pidlNext = ILGetNext(pidl);
    175 
    176             hr = IShellFolder_GetDisplayNameOf(psfChild, pidlNext, dwFlags | SHGDN_INFOLDER, &strTemp);
    177             if (SUCCEEDED(hr))
    178             {
    179               hr = StrRetToStrNA(szOut, dwOutLen, &strTemp, pidlNext);
    180             }
    181 
    182             IShellFolder_Release(psfChild);
    183           }
    184           ILFree(pidlFirst);
    185         }
    186 
    187         TRACE("-- ret=0x%08lx %s\n", hr, szOut);
    188 
    189         return hr;
     155   IShellFolder * psf,
     156   LPCITEMIDLIST pidl,
     157   DWORD dwFlags,
     158   LPSTR szOut,
     159   DWORD dwOutLen)
     160{
     161   LPITEMIDLIST   pidlFirst, pidlNext;
     162   IShellFolder *                        psfChild;
     163   HRESULT     hr = E_OUTOFMEMORY;
     164   STRRET strTemp;
     165
     166   TRACE("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n",psf,pidl,dwFlags,szOut, dwOutLen);
     167   pdump(pidl);
     168
     169   if ((pidlFirst = ILCloneFirst(pidl)))
     170   {
     171     hr = IShellFolder_BindToObject(psf, pidlFirst, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
     172     if (SUCCEEDED(hr))
     173     {
     174       pidlNext = ILGetNext(pidl);
     175
     176       hr = IShellFolder_GetDisplayNameOf(psfChild, pidlNext, dwFlags | SHGDN_INFOLDER, &strTemp);
     177       if (SUCCEEDED(hr))
     178       {
     179         hr = StrRetToStrNA(szOut, dwOutLen, &strTemp, pidlNext);
     180       }
     181
     182       IShellFolder_Release(psfChild);
     183     }
     184     ILFree(pidlFirst);
     185   }
     186
     187   TRACE("-- ret=0x%08lx %s\n", hr, szOut);
     188
     189   return hr;
    190190}
    191191
     
    196196typedef struct
    197197{
    198         ICOM_VTABLE(IShellFolder)*      lpvtbl;
    199         DWORD                           ref;
    200 
    201         ICOM_VTABLE(IPersistFolder)*    lpvtblPersistFolder;
    202         ICOM_VTABLE(IDropTarget)*       lpvtblDropTarget;
    203        
    204         CLSID*                          pclsid;
    205 
    206         LPSTR                           sMyPath;
    207         LPITEMIDLIST                    absPidl;        /* complete pidl */
    208 
    209         UINT            cfShellIDList;                  /* clipboardformat for IDropTarget */
    210         BOOL            fAcceptFmt;                     /* flag for pending Drop */
     198   ICOM_VTABLE(IShellFolder)*            lpvtbl;
     199   DWORD          ref;
     200
     201   ICOM_VTABLE(IPersistFolder)*          lpvtblPersistFolder;
     202   ICOM_VTABLE(IDropTarget)*             lpvtblDropTarget;
     203
     204   CLSID*                                pclsid;
     205
     206   LPSTR          sMyPath;
     207   LPITEMIDLIST                             absPidl; /* complete pidl */
     208
     209   UINT     cfShellIDList;                     /* clipboardformat for IDropTarget */
     210   BOOL     fAcceptFmt;                        /* flag for pending Drop */
    211211} IGenericSFImpl;
    212212
     
    219219#define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder)))
    220220#define _ICOM_THIS_From_IPersistFolder(class, name) class* This = (class*)(((char*)name)-_IPersistFolder_Offset);
    221        
     221
    222222#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget)))
    223223#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
    224224
    225225/**************************************************************************
    226 *       registers clipboardformat once
     226*  registers clipboardformat once
    227227*/
    228228static void SF_RegisterClipFmt (IShellFolder * iface)
    229229{
    230         ICOM_THIS(IGenericSFImpl, iface);
    231 
    232         TRACE("(%p)\n", This);
    233 
    234         if (!This->cfShellIDList)
    235         {
    236           This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
    237         }
    238 }
    239 
    240 /**************************************************************************
    241 *         IShellFolder_Constructor
     230   ICOM_THIS(IGenericSFImpl, iface);
     231
     232   TRACE("(%p)\n", This);
     233
     234   if (!This->cfShellIDList)
     235   {
     236     This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
     237   }
     238}
     239
     240/**************************************************************************
     241*    IShellFolder_Constructor
    242242*
    243243*/
    244244
    245245static IShellFolder * IShellFolder_Constructor(
    246         IShellFolder * psf,
    247         LPITEMIDLIST pidl)
    248 {
    249         IGenericSFImpl *        sf;
    250         IGenericSFImpl *        sfParent = (IGenericSFImpl*) psf;
    251         DWORD                   dwSize=0;
    252 
    253         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    254         sf->ref=1;
    255 
    256         sf->lpvtbl=&sfvt;
    257         sf->lpvtblPersistFolder=&psfvt;
    258         sf->lpvtblDropTarget=&dt2vt;
    259         sf->pclsid = (CLSID*)&CLSID_SFFile;
    260         sf->cfShellIDList=0;
    261         sf->fAcceptFmt=FALSE;
    262 
    263         TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,sfParent, pidl);
    264         pdump(pidl);
    265                
    266         if(pidl)                                                /* do we have a pidl? */
    267         {
    268           int len;
    269 
    270           sf->absPidl = ILCombine(sfParent->absPidl, pidl);     /* build a absolute pidl */
    271 
    272           if (!_ILIsSpecialFolder(pidl))                                /* only file system paths */
    273           {
    274             if(sfParent->sMyPath)                               /* get the size of the parents path */
    275             {
    276               dwSize += strlen(sfParent->sMyPath) ;
    277               TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(sfParent->sMyPath));
    278             }
    279 
    280             dwSize += _ILSimpleGetText(pidl,NULL,0);            /* add the size of our name*/
    281             sf->sMyPath = (char*)SHAlloc(dwSize + 2);                   /* '\0' and backslash */
    282 
    283             if(!sf->sMyPath) return NULL;
    284             *(sf->sMyPath)=0x00;
    285 
    286             if(sfParent->sMyPath)                               /* if the parent has a path, get it*/
    287             {
    288               strcpy(sf->sMyPath, sfParent->sMyPath);
    289               PathAddBackslashA (sf->sMyPath);
    290             }
    291 
    292             len = strlen(sf->sMyPath);
    293             _ILSimpleGetText(pidl, sf->sMyPath + len, dwSize - len + 1);
    294           }
    295 
    296           TRACE("-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->absPidl,debugstr_a(sf->sMyPath));
    297 
    298           pdump (sf->absPidl);
    299         }
    300 
    301         shell32_ObjCount++;
    302         return (IShellFolder *)sf;
     246   IShellFolder * psf,
     247   LPITEMIDLIST pidl)
     248{
     249   IGenericSFImpl *                      sf;
     250   IGenericSFImpl *                      sfParent = (IGenericSFImpl*) psf;
     251   DWORD       dwSize=0;
     252
     253   sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     254   sf->ref=1;
     255
     256   sf->lpvtbl=&sfvt;
     257   sf->lpvtblPersistFolder=&psfvt;
     258   sf->lpvtblDropTarget=&dt2vt;
     259   sf->pclsid = (CLSID*)&CLSID_SFFile;
     260   sf->cfShellIDList=0;
     261   sf->fAcceptFmt=FALSE;
     262
     263   TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,sfParent, pidl);
     264   pdump(pidl);
     265
     266   if(pidl)                                    /* do we have a pidl? */
     267   {
     268     int len;
     269
     270     sf->absPidl = ILCombine(sfParent->absPidl, pidl);  /* build a absolute pidl */
     271
     272     if (!_ILIsSpecialFolder(pidl))               /* only file system paths */
     273     {
     274       if(sfParent->sMyPath)                      /* get the size of the parents path */
     275       {
     276         dwSize += strlen(sfParent->sMyPath) ;
     277         TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(sfParent->sMyPath));
     278       }
     279
     280       dwSize += _ILSimpleGetText(pidl,NULL,0);      /* add the size of our name*/
     281       sf->sMyPath = (char*)SHAlloc(dwSize + 2);        /* '\0' and backslash */
     282
     283       if(!sf->sMyPath) return NULL;
     284       *(sf->sMyPath)=0x00;
     285
     286       if(sfParent->sMyPath)                      /* if the parent has a path, get it*/
     287       {
     288         strcpy(sf->sMyPath, sfParent->sMyPath);
     289         PathAddBackslashA (sf->sMyPath);
     290       }
     291
     292       len = strlen(sf->sMyPath);
     293       _ILSimpleGetText(pidl, sf->sMyPath + len, dwSize - len + 1);
     294     }
     295
     296     TRACE("-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->absPidl,debugstr_a(sf->sMyPath));
     297
     298     pdump (sf->absPidl);
     299   }
     300
     301   shell32_ObjCount++;
     302   return (IShellFolder *)sf;
    303303}
    304304/**************************************************************************
     
    306306 *
    307307 * PARAMETERS
    308  *  REFIID riid         [in ] Requested InterfaceID
    309  *  LPVOID* ppvObject   [out] Interface* to hold the result
     308 *  REFIID riid                          [in ] Requested InterfaceID
     309 *  LPVOID* ppvObject                    [out] Interface* to hold the result
    310310 */
    311311static HRESULT WINAPI IShellFolder_fnQueryInterface(
    312         IShellFolder * iface,
    313         REFIID riid,
    314         LPVOID *ppvObj)
    315 {
    316         ICOM_THIS(IGenericSFImpl, iface);
    317 
    318         char    xriid[50];     
    319         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    320         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    321 
    322         *ppvObj = NULL;
    323 
    324         if(IsEqualIID(riid, &IID_IUnknown))
    325         { *ppvObj = This;
    326         }
    327         else if(IsEqualIID(riid, &IID_IShellFolder))
    328         {
    329           *ppvObj = (IShellFolder*)This;
    330         }
    331         else if(IsEqualIID(riid, &IID_IPersist))
    332         {
    333           *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
    334         }
    335         else if(IsEqualIID(riid, &IID_IPersistFolder))
    336         {
    337           *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
    338         }
    339         else if(IsEqualIID(riid, &IID_IDropTarget))
    340         {
    341           *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
    342           SF_RegisterClipFmt((IShellFolder*)This);
    343         }
    344 
    345         if(*ppvObj)
    346         {
    347           IUnknown_AddRef((IUnknown*)(*ppvObj));
    348           TRACE("-- Interface = %p\n", *ppvObj);
    349           return S_OK;
    350         }
    351         TRACE("-- Interface: E_NOINTERFACE\n");
    352         return E_NOINTERFACE;
     312   IShellFolder * iface,
     313   REFIID riid,
     314   LPVOID *ppvObj)
     315{
     316   ICOM_THIS(IGenericSFImpl, iface);
     317
     318   char  xriid[50];
     319   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     320   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     321
     322   *ppvObj = NULL;
     323
     324   if(IsEqualIID(riid, &IID_IUnknown))
     325   { *ppvObj = This;
     326   }
     327   else if(IsEqualIID(riid, &IID_IShellFolder))
     328   {
     329     *ppvObj = (IShellFolder*)This;
     330   }
     331   else if(IsEqualIID(riid, &IID_IPersist))
     332   {
     333     *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
     334   }
     335   else if(IsEqualIID(riid, &IID_IPersistFolder))
     336   {
     337     *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
     338   }
     339   else if(IsEqualIID(riid, &IID_IDropTarget))
     340   {
     341     *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
     342     SF_RegisterClipFmt((IShellFolder*)This);
     343   }
     344
     345   if(*ppvObj)
     346   {
     347     IUnknown_AddRef((IUnknown*)(*ppvObj));
     348     TRACE("-- Interface = %p\n", *ppvObj);
     349     return S_OK;
     350   }
     351   TRACE("-- Interface: E_NOINTERFACE\n");
     352   return E_NOINTERFACE;
    353353}
    354354
     
    359359static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder * iface)
    360360{
    361         ICOM_THIS(IGenericSFImpl, iface);
     361   ICOM_THIS(IGenericSFImpl, iface);
    362362
    363363#ifdef MEM_DEBUG
    364         TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
     364   TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
    365365#endif
    366         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    367 
    368         shell32_ObjCount++;
    369         return ++(This->ref);
     366   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     367
     368   shell32_ObjCount++;
     369   return ++(This->ref);
    370370}
    371371
     
    375375static ULONG WINAPI IShellFolder_fnRelease(IShellFolder * iface)
    376376{
    377         ICOM_THIS(IGenericSFImpl, iface);
     377   ICOM_THIS(IGenericSFImpl, iface);
    378378
    379379#ifdef MEM_DEBUG
    380         TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
     380   TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
    381381#endif
    382         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    383 
    384         shell32_ObjCount--;
    385         if (!--(This->ref))
    386         { TRACE("-- destroying IShellFolder(%p)\n",This);
    387 
    388           if (pdesktopfolder == iface)
    389           { pdesktopfolder=NULL;
    390             TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
    391           }
    392           if(This->absPidl)
    393           { SHFree(This->absPidl);
    394           }
    395           if(This->sMyPath)
    396           { SHFree(This->sMyPath);
    397           }
    398 
    399           HeapFree(GetProcessHeap(),0,This);
    400 
    401           return 0;
    402         }
    403         return This->ref;
    404 }
    405 /**************************************************************************
    406 *               IShellFolder_fnParseDisplayName
     382   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     383
     384   shell32_ObjCount--;
     385   if (!--(This->ref))
     386   { TRACE("-- destroying IShellFolder(%p)\n",This);
     387
     388     if (pdesktopfolder == iface)
     389     { pdesktopfolder=NULL;
     390       TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
     391     }
     392     if(This->absPidl)
     393     { SHFree(This->absPidl);
     394     }
     395     if(This->sMyPath)
     396     { SHFree(This->sMyPath);
     397     }
     398
     399     HeapFree(GetProcessHeap(),0,This);
     400
     401     return 0;
     402   }
     403   return This->ref;
     404}
     405/**************************************************************************
     406*     IShellFolder_fnParseDisplayName
    407407* PARAMETERS
    408408*  HWND          hwndOwner,      //[in ] Parent window for any message's
     
    418418*  now we can parse into namespaces implemented by shell extensions
    419419*
    420 *  behaviour on win98:  lpszDisplayName=NULL -> chrash
    421 *                       lpszDisplayName="" -> returns mycoputer-pidl
     420*  behaviour on win98:                   lpszDisplayName=NULL -> chrash
     421*        lpszDisplayName="" -> returns mycoputer-pidl
    422422*
    423423* FIXME:
     
    426426*/
    427427static HRESULT WINAPI IShellFolder_fnParseDisplayName(
    428         IShellFolder * iface,
    429         HWND hwndOwner,
    430         LPBC pbcReserved,
    431         LPOLESTR lpszDisplayName,
    432         DWORD *pchEaten,
    433         LPITEMIDLIST *ppidl,
    434         DWORD *pdwAttributes)
    435 {
    436         ICOM_THIS(IGenericSFImpl, iface);
    437 
    438         HRESULT         hr = E_OUTOFMEMORY;
    439         LPCWSTR         szNext=NULL;
    440         WCHAR           szElement[MAX_PATH];
    441         CHAR            szTempA[MAX_PATH], szPath[MAX_PATH];
    442         LPITEMIDLIST    pidlTemp=NULL;
    443        
    444         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    445         This,hwndOwner,pbcReserved,lpszDisplayName,
    446         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    447 
    448         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    449        
    450         if (*lpszDisplayName)
    451         {       
    452           /* get the next element */
    453           szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
    454 
    455           /* build the full pathname to the element */
    456           WideCharToLocal(szTempA, szElement, lstrlenW(szElement) + 1);
    457           strcpy(szPath, This->sMyPath);
    458           PathAddBackslashA(szPath);
    459           strcat(szPath, szTempA);
    460 
    461           /* get the pidl */
    462           pidlTemp = SHSimpleIDListFromPathA(szPath);
    463 
    464           if (pidlTemp)
    465           {
    466             /* try to analyse the next element */
    467             if (szNext && *szNext)
    468             {
    469               hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    470             }
    471             else
    472             {
    473                hr = S_OK;
    474             }
    475           }
    476         }
    477 
    478         *ppidl = pidlTemp;
    479 
    480         TRACE("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl? *ppidl:0, hr);
    481 
    482         return hr;     
    483 }
    484 
    485 /**************************************************************************
    486 *               IShellFolder_fnEnumObjects
     428   IShellFolder * iface,
     429   HWND hwndOwner,
     430   LPBC pbcReserved,
     431   LPOLESTR lpszDisplayName,
     432   DWORD *pchEaten,
     433   LPITEMIDLIST *ppidl,
     434   DWORD *pdwAttributes)
     435{
     436   ICOM_THIS(IGenericSFImpl, iface);
     437
     438   HRESULT     hr = E_OUTOFMEMORY;
     439   LPCWSTR     szNext=NULL;
     440   WCHAR    szElement[MAX_PATH];
     441   CHAR     szTempA[MAX_PATH], szPath[MAX_PATH];
     442   LPITEMIDLIST   pidlTemp=NULL;
     443
     444   TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     445   This,hwndOwner,pbcReserved,lpszDisplayName,
     446   debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     447
     448   if (!lpszDisplayName || !ppidl) return E_INVALIDARG;
     449
     450   if (pchEaten) *pchEaten = 0;          /* strange but like the original */
     451
     452   if (*lpszDisplayName)
     453   {
     454     /* get the next element */
     455     szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
     456
     457     /* build the full pathname to the element */
     458     WideCharToLocal(szTempA, szElement, lstrlenW(szElement) + 1);
     459     strcpy(szPath, This->sMyPath);
     460     PathAddBackslashA(szPath);
     461     strcat(szPath, szTempA);
     462
     463     /* get the pidl */
     464     pidlTemp = SHSimpleIDListFromPathA(szPath);
     465
     466     if (pidlTemp)
     467     {
     468       /* try to analyse the next element */
     469       if (szNext && *szNext)
     470       {
     471         hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     472       }
     473       else
     474       {
     475          hr = S_OK;
     476       }
     477     }
     478   }
     479
     480   *ppidl = pidlTemp;
     481
     482   TRACE("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl? *ppidl:0, hr);
     483
     484   return hr;
     485}
     486
     487/**************************************************************************
     488*     IShellFolder_fnEnumObjects
    487489* PARAMETERS
    488490*  HWND          hwndOwner,    //[in ] Parent Window
     
    491493*/
    492494static HRESULT WINAPI IShellFolder_fnEnumObjects(
    493         IShellFolder * iface,
    494         HWND hwndOwner,
    495         DWORD dwFlags,
    496         LPENUMIDLIST* ppEnumIDList)
    497 {
    498         ICOM_THIS(IGenericSFImpl, iface);
    499 
    500         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    501 
    502         *ppEnumIDList = NULL;
    503         *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE);
    504 
    505         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    506 
    507         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    508 
    509         return S_OK;           
    510 }
    511 
    512 /**************************************************************************
    513 *               IShellFolder_fnBindToObject
     495   IShellFolder * iface,
     496   HWND hwndOwner,
     497   DWORD dwFlags,
     498   LPENUMIDLIST* ppEnumIDList)
     499{
     500   ICOM_THIS(IGenericSFImpl, iface);
     501
     502   TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     503
     504   *ppEnumIDList = NULL;
     505   *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE);
     506
     507   TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     508
     509   if(!*ppEnumIDList) return E_OUTOFMEMORY;
     510
     511   return S_OK;
     512}
     513
     514/**************************************************************************
     515*     IShellFolder_fnBindToObject
    514516* PARAMETERS
    515517*  LPCITEMIDLIST pidl,       //[in ] relative pidl to open
     
    519521*/
    520522static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder * iface, LPCITEMIDLIST pidl,
    521                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    522 {
    523         ICOM_THIS(IGenericSFImpl, iface);
    524         GUID            const * iid;
    525         char            xriid[50];
    526         IShellFolder    *pShellFolder, *pSubFolder;
    527         IPersistFolder  *pPersistFolder;
    528         LPITEMIDLIST    absPidl;
    529        
    530         WINE_StringFromCLSID(riid,xriid);
    531 
    532         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
    533 
    534         *ppvOut = NULL;
    535 
    536         if ((iid=_ILGetGUIDPointer(pidl)))
    537         {
    538           /* we have to create a alien folder */
    539           if (  SUCCEEDED(SHCoCreateInstance(NULL, iid, NULL, riid, (LPVOID*)&pShellFolder))
    540              && SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&pPersistFolder)))
    541             {
    542               absPidl = ILCombine (This->absPidl, pidl);
    543               IPersistFolder_Initialize(pPersistFolder, absPidl);
    544               IPersistFolder_Release(pPersistFolder);
    545               SHFree(absPidl);
    546             }
    547             else
    548             {
    549               return E_FAIL;
    550             }
    551         }
    552         else
    553         {
    554           LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
    555           pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
    556           ILFree(pidltemp);
    557         }
    558        
    559         if (_ILIsPidlSimple(pidl))
    560         {
    561           *ppvOut = pShellFolder;
    562         }
    563         else
    564         {
    565           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID*)&pSubFolder);
    566           IShellFolder_Release(pShellFolder);
    567           *ppvOut = pSubFolder;
    568         }
    569 
    570         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    571 
    572         return S_OK;
     523         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     524{
     525   ICOM_THIS(IGenericSFImpl, iface);
     526   GUID     const * iid;
     527   char     xriid[50];
     528   IShellFolder   *pShellFolder, *pSubFolder;
     529   IPersistFolder                        *pPersistFolder;
     530   LPITEMIDLIST   absPidl;
     531
     532   WINE_StringFromCLSID(riid,xriid);
     533
     534   TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
     535
     536   if(!pidl || !ppvOut) return E_INVALIDARG;
     537
     538   *ppvOut = NULL;
     539
     540   if ((iid=_ILGetGUIDPointer(pidl)))
     541   {
     542     /* we have to create a alien folder */
     543     if (  SUCCEEDED(SHCoCreateInstance(NULL, iid, NULL, riid, (LPVOID*)&pShellFolder))
     544        && SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&pPersistFolder)))
     545       {
     546         absPidl = ILCombine (This->absPidl, pidl);
     547         IPersistFolder_Initialize(pPersistFolder, absPidl);
     548         IPersistFolder_Release(pPersistFolder);
     549         SHFree(absPidl);
     550       }
     551       else
     552       {
     553         return E_FAIL;
     554       }
     555   }
     556   else
     557   {
     558     LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
     559     pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
     560     ILFree(pidltemp);
     561   }
     562
     563   if (_ILIsPidlSimple(pidl))
     564   {
     565     *ppvOut = pShellFolder;
     566   }
     567   else
     568   {
     569     IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID*)&pSubFolder);
     570     IShellFolder_Release(pShellFolder);
     571     *ppvOut = pSubFolder;
     572   }
     573
     574   TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     575
     576   return S_OK;
    573577}
    574578
     
    582586*/
    583587static HRESULT WINAPI IShellFolder_fnBindToStorage(
    584         IShellFolder * iface,
    585         LPCITEMIDLIST pidl,
    586         LPBC pbcReserved,
    587         REFIID riid,
    588         LPVOID *ppvOut)
    589 {
    590         ICOM_THIS(IGenericSFImpl, iface);
    591 
    592         char xriid[50];
    593         WINE_StringFromCLSID(riid,xriid);
    594 
    595         FIXME("(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",This,pidl,pbcReserved,xriid,ppvOut);
    596 
    597         *ppvOut = NULL;
    598         return E_NOTIMPL;
     588   IShellFolder * iface,
     589   LPCITEMIDLIST pidl,
     590   LPBC pbcReserved,
     591   REFIID riid,
     592   LPVOID *ppvOut)
     593{
     594   ICOM_THIS(IGenericSFImpl, iface);
     595
     596   char xriid[50];
     597   WINE_StringFromCLSID(riid,xriid);
     598
     599   FIXME("(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",This,pidl,pbcReserved,xriid,ppvOut);
     600
     601   *ppvOut = NULL;
     602   return E_NOTIMPL;
    599603}
    600604
     
    616620
    617621static HRESULT WINAPI  IShellFolder_fnCompareIDs(
    618         IShellFolder * iface,
    619         LPARAM lParam,
    620         LPCITEMIDLIST pidl1,
    621         LPCITEMIDLIST pidl2)
    622 {
    623         ICOM_THIS(IGenericSFImpl, iface);
    624 
    625         CHAR szTemp1[MAX_PATH];
    626         CHAR szTemp2[MAX_PATH];
    627         int   nReturn;
    628         IShellFolder * psf;
    629         HRESULT hr = E_OUTOFMEMORY;
    630         LPCITEMIDLIST  pidlTemp;
    631         PIDLTYPE pt1, pt2;
    632 
    633         TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
    634         pdump (pidl1);
    635         pdump (pidl2);
    636        
    637         if (!pidl1 && !pidl2)
    638         {
    639           hr = ResultFromShort(0);
    640         }
    641         else if (!pidl1)
    642         {
    643           hr = ResultFromShort(-1);
    644         }
    645         else if (!pidl2)
    646         {
    647           hr = ResultFromShort(1);
    648         }
    649         else
    650         {
    651           LPPIDLDATA pd1, pd2;
    652           pd1 = _ILGetDataPointer(pidl1);
    653           pd2 = _ILGetDataPointer(pidl2);
    654        
    655           /* compate the types. sort order is the PT_* constant */
    656           pt1 = ( pd1 ? pd1->type: PT_DESKTOP);
    657           pt2 = ( pd2 ? pd2->type: PT_DESKTOP);
    658 
    659           if (pt1 != pt2)
    660           {
    661             hr = ResultFromShort(pt1-pt2);
    662           }
    663           else                                          /* same type of pidl */
    664           {
    665             _ILSimpleGetText(pidl1, szTemp1, MAX_PATH);
    666             _ILSimpleGetText(pidl2, szTemp2, MAX_PATH);
    667             nReturn = strcmp(szTemp1, szTemp2);
    668        
    669             if (nReturn == 0)                           /* first pidl different ? */
    670             {
    671               pidl1 = ILGetNext(pidl1);
    672 
    673               if (pidl1 && pidl1->mkid.cb)              /* go deeper? */       
    674               {
    675                 pidlTemp = ILCloneFirst(pidl1);
    676                 pidl2 = ILGetNext(pidl2);
    677        
    678                 hr = IShellFolder_BindToObject((IShellFolder*)This, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
    679                 if (SUCCEEDED(hr))
    680                 {
    681                   nReturn = IShellFolder_CompareIDs(psf, 0, pidl1, pidl2);
    682                   IShellFolder_Release(psf);
    683                   hr = ResultFromShort(nReturn);
    684                 }
    685                 ILFree(pidlTemp);
    686               }
    687               else
    688               {
    689                 hr = ResultFromShort(nReturn);          /* two equal simple pidls */
    690               }
    691             }
    692             else
    693             {
    694               hr = ResultFromShort(nReturn);            /* two different simple pidls */
    695             }
    696           }
    697         }
    698        
    699         TRACE("-- res=0x%08lx\n", hr);
    700         return hr;
    701 }
    702 
    703 /**************************************************************************
    704 *       IShellFolder_fnCreateViewObject
     622   IShellFolder * iface,
     623   LPARAM lParam,
     624   LPCITEMIDLIST pidl1,
     625   LPCITEMIDLIST pidl2)
     626{
     627   ICOM_THIS(IGenericSFImpl, iface);
     628
     629   CHAR szTemp1[MAX_PATH];
     630   CHAR szTemp2[MAX_PATH];
     631   int   nReturn;
     632   IShellFolder * psf;
     633   HRESULT hr = E_OUTOFMEMORY;
     634   LPCITEMIDLIST  pidlTemp;
     635   PIDLTYPE pt1, pt2;
     636
     637   TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
     638   pdump (pidl1);
     639   pdump (pidl2);
     640
     641   if (!pidl1 && !pidl2)
     642   {
     643     hr = ResultFromShort(0);
     644   }
     645   else if (!pidl1)
     646   {
     647     hr = ResultFromShort(-1);
     648   }
     649   else if (!pidl2)
     650   {
     651     hr = ResultFromShort(1);
     652   }
     653   else
     654   {
     655     LPPIDLDATA pd1, pd2;
     656     pd1 = _ILGetDataPointer(pidl1);
     657     pd2 = _ILGetDataPointer(pidl2);
     658
     659     /* compate the types. sort order is the PT_* constant */
     660     pt1 = ( pd1 ? pd1->type: PT_DESKTOP);
     661     pt2 = ( pd2 ? pd2->type: PT_DESKTOP);
     662
     663     if (pt1 != pt2)
     664     {
     665       hr = ResultFromShort(pt1-pt2);
     666     }
     667     else                                      /* same type of pidl */
     668     {
     669       _ILSimpleGetText(pidl1, szTemp1, MAX_PATH);
     670       _ILSimpleGetText(pidl2, szTemp2, MAX_PATH);
     671       nReturn = strcmp(szTemp1, szTemp2);
     672
     673       if (nReturn == 0)                          /* first pidl different ? */
     674       {
     675         pidl1 = ILGetNext(pidl1);
     676
     677         if (pidl1 && pidl1->mkid.cb)       /* go deeper? */
     678         {
     679           pidlTemp = ILCloneFirst(pidl1);
     680           pidl2 = ILGetNext(pidl2);
     681
     682           hr = IShellFolder_BindToObject((IShellFolder*)This, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
     683           if (SUCCEEDED(hr))
     684           {
     685             nReturn = IShellFolder_CompareIDs(psf, 0, pidl1, pidl2);
     686             IShellFolder_Release(psf);
     687             hr = ResultFromShort(nReturn);
     688           }
     689           ILFree(pidlTemp);
     690         }
     691         else
     692         {
     693           hr = ResultFromShort(nReturn);      /* two equal simple pidls */
     694         }
     695       }
     696       else
     697       {
     698         hr = ResultFromShort(nReturn);     /* two different simple pidls */
     699       }
     700     }
     701   }
     702
     703   TRACE("-- res=0x%08lx\n", hr);
     704   return hr;
     705}
     706
     707/**************************************************************************
     708*  IShellFolder_fnCreateViewObject
    705709*/
    706710static HRESULT WINAPI IShellFolder_fnCreateViewObject( IShellFolder * iface,
    707                 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    708 {
    709         ICOM_THIS(IGenericSFImpl, iface);
    710 
    711         LPSHELLVIEW     pShellView;
    712         char            xriid[50];
    713         HRESULT         hr = E_INVALIDARG;
    714 
    715         WINE_StringFromCLSID(riid,xriid);
    716         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
    717        
    718         if(ppvOut)
    719         {
    720           *ppvOut = NULL;
    721 
    722           if(IsEqualIID(riid, &IID_IDropTarget))
    723           {
    724             hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, ppvOut);
    725           }
    726           else if(IsEqualIID(riid, &IID_IContextMenu))
    727           {
    728             FIXME("IContextMenu not implemented\n");
    729             hr = E_NOTIMPL;
    730           }
    731           else if(IsEqualIID(riid, &IID_IShellView))
    732           {
    733             pShellView = IShellView_Constructor((IShellFolder *) This);
    734             if(pShellView)
    735             {
    736               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    737               IShellView_Release(pShellView);
    738             }
    739           }
    740         }
    741         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    742         return hr;
     711      HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
     712{
     713   ICOM_THIS(IGenericSFImpl, iface);
     714
     715   LPSHELLVIEW pShellView;
     716   char     xriid[50];
     717   HRESULT     hr = E_INVALIDARG;
     718
     719   WINE_StringFromCLSID(riid,xriid);
     720   TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
     721
     722   if(ppvOut)
     723   {
     724     *ppvOut = NULL;
     725
     726     if(IsEqualIID(riid, &IID_IDropTarget))
     727     {
     728       hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, ppvOut);
     729     }
     730     else if(IsEqualIID(riid, &IID_IContextMenu))
     731     {
     732       FIXME("IContextMenu not implemented\n");
     733       hr = E_NOTIMPL;
     734     }
     735     else if(IsEqualIID(riid, &IID_IShellView))
     736     {
     737       pShellView = IShellView_Constructor((IShellFolder *) This);
     738       if(pShellView)
     739       {
     740         hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     741         IShellView_Release(pShellView);
     742       }
     743     }
     744   }
     745   TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     746   return hr;
    743747}
    744748
     
    754758static HRESULT WINAPI IShellFolder_fnGetAttributesOf(IShellFolder * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    755759{
    756         ICOM_THIS(IGenericSFImpl, iface);
    757 
    758         HRESULT hr = S_OK;
    759 
    760         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
    761 
    762         if ( (!cidl) || (!apidl) || (!rgfInOut))
    763           return E_INVALIDARG;
    764 
    765         while (cidl > 0 && *apidl)
    766         {
    767           pdump (*apidl);
    768           if (_ILIsFolder( *apidl))
    769           {
    770             *rgfInOut &= 0xe0000177;
    771             goto next;
    772           }
    773           else if (_ILIsValue( *apidl))
    774           {
    775             *rgfInOut &= 0x40000177;
    776             goto next;
    777           }
    778           hr = E_INVALIDARG;
    779 
    780 next:     apidl++;
    781           cidl--;
    782         }
    783 
    784         TRACE("-- result=0x%08lx\n",*rgfInOut);
    785 
    786         return hr;
     760   ICOM_THIS(IGenericSFImpl, iface);
     761
     762   HRESULT hr = S_OK;
     763
     764   TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
     765
     766   if ( (!cidl) || (!apidl) || (!rgfInOut))
     767     return E_INVALIDARG;
     768
     769   while (cidl > 0 && *apidl)
     770   {
     771     pdump (*apidl);
     772     if (_ILIsFolder( *apidl))
     773     {
     774       *rgfInOut &= 0xe0000177;
     775       goto next;
     776     }
     777     else if (_ILIsValue( *apidl))
     778     {
     779       *rgfInOut &= 0x40000177;
     780       goto next;
     781     }
     782     hr = E_INVALIDARG;
     783
     784next:   apidl++;
     785     cidl--;
     786   }
     787
     788   TRACE("-- result=0x%08lx\n",*rgfInOut);
     789
     790   return hr;
    787791}
    788792/**************************************************************************
     
    808812*/
    809813static HRESULT WINAPI IShellFolder_fnGetUIObjectOf(
    810         IShellFolder *  iface,
    811         HWND            hwndOwner,
    812         UINT            cidl,
    813         LPCITEMIDLIST * apidl,
    814         REFIID          riid,
    815         UINT *          prgfInOut,
    816         LPVOID *        ppvOut)
    817 {       
    818         ICOM_THIS(IGenericSFImpl, iface);
    819 
    820         char            xclsid[50];
    821         LPITEMIDLIST    pidl;
    822         IUnknown*       pObj = NULL;
    823         HRESULT         hr = E_INVALIDARG;
    824        
    825         WINE_StringFromCLSID(riid,xclsid);
    826 
    827         TRACE("(%p)->(%u,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
    828           This,hwndOwner,cidl,apidl,xclsid,prgfInOut,ppvOut);
    829 
    830         if (ppvOut)
    831         {
    832           *ppvOut = NULL;
    833 
    834           if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
    835           {
    836             pObj  = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)This, This->absPidl, apidl, cidl);
    837             hr = S_OK;
    838           }
    839           else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1))
    840           {
    841             pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
    842             hr = S_OK;
    843           }
    844           else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1))
    845           {
    846             pidl = ILCombine(This->absPidl,apidl[0]);
    847             pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
    848             SHFree(pidl);
    849             hr = S_OK;
    850           }
    851           else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
    852           {
    853             hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, (LPVOID*)&pObj);
    854           }
    855           else
    856           {
    857             hr = E_NOINTERFACE;
    858           }
    859 
    860           if(!pObj)
    861             hr = E_OUTOFMEMORY;
    862 
    863           *ppvOut = pObj;
    864         }
    865         TRACE("(%p)->hr=0x%08lx\n",This, hr);
    866         return hr;
     814   IShellFolder * iface,
     815   HWND     hwndOwner,
     816   UINT     cidl,
     817   LPCITEMIDLIST *                       apidl,
     818   REFIID      riid,
     819   UINT *      prgfInOut,
     820   LPVOID * ppvOut)
     821{
     822   ICOM_THIS(IGenericSFImpl, iface);
     823
     824   char     xclsid[50];
     825   LPITEMIDLIST   pidl;
     826   IUnknown*   pObj = NULL;
     827   HRESULT     hr = E_INVALIDARG;
     828
     829   WINE_StringFromCLSID(riid,xclsid);
     830
     831   TRACE("(%p)->(%u,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
     832     This,hwndOwner,cidl,apidl,xclsid,prgfInOut,ppvOut);
     833
     834   if (ppvOut)
     835   {
     836     *ppvOut = NULL;
     837
     838     if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
     839     {
     840       pObj  = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)This, This->absPidl, apidl, cidl);
     841       hr = S_OK;
     842     }
     843     else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1))
     844     {
     845       pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
     846       hr = S_OK;
     847     }
     848     else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1))
     849     {
     850       pidl = ILCombine(This->absPidl,apidl[0]);
     851       pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
     852       SHFree(pidl);
     853       hr = S_OK;
     854     }
     855     else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
     856     {
     857       hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, (LPVOID*)&pObj);
     858     }
     859     else
     860     {
     861       hr = E_NOINTERFACE;
     862     }
     863
     864     if(!pObj)
     865       hr = E_OUTOFMEMORY;
     866
     867     *ppvOut = pObj;
     868   }
     869   TRACE("(%p)->hr=0x%08lx\n",This, hr);
     870   return hr;
    867871}
    868872
     
    883887
    884888static HRESULT WINAPI IShellFolder_fnGetDisplayNameOf(
    885         IShellFolder * iface,
    886         LPCITEMIDLIST pidl,
    887         DWORD dwFlags,
    888         LPSTRRET strRet)
    889 {
    890         ICOM_THIS(IGenericSFImpl, iface);
    891 
    892         CHAR            szPath[MAX_PATH]= "";
    893         int             len = 0;
    894         BOOL            bSimplePidl;
    895                
    896         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    897         pdump(pidl);
    898        
    899         if(!pidl || !strRet) return E_INVALIDARG;
    900        
    901         bSimplePidl = _ILIsPidlSimple(pidl);
    902 
    903         /* take names of special folders only if its only this folder */
    904         if (_ILIsSpecialFolder(pidl))
    905         {
    906           if ( bSimplePidl)
    907           {
    908             _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
    909           }
    910         }
    911         else
    912         {
    913           if (!(dwFlags & SHGDN_INFOLDER) && (dwFlags & SHGDN_FORPARSING) && This->sMyPath)
    914           {
    915             strcpy (szPath, This->sMyPath);                     /* get path to root*/
    916             PathAddBackslashA(szPath);
    917             len = strlen(szPath);
    918           }
    919           _ILSimpleGetText(pidl, szPath + len, MAX_PATH - len); /* append my own path */
    920         }
    921        
    922         if ( (dwFlags & SHGDN_FORPARSING) && !bSimplePidl)      /* go deeper if needed */
    923         {
    924           PathAddBackslashA(szPath);
    925           len = strlen(szPath);
    926 
    927           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags, szPath + len, MAX_PATH - len)))
    928             return E_OUTOFMEMORY;
    929         }
    930         strRet->uType = STRRET_CSTRA;
    931         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    932 
    933         TRACE("-- (%p)->(%s)\n", This, szPath);
    934         return S_OK;
     889   IShellFolder * iface,
     890   LPCITEMIDLIST pidl,
     891   DWORD dwFlags,
     892   LPSTRRET strRet)
     893{
     894   ICOM_THIS(IGenericSFImpl, iface);
     895
     896   CHAR     szPath[MAX_PATH]= "";
     897   int      len = 0;
     898   BOOL     bSimplePidl;
     899
     900   TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     901   pdump(pidl);
     902
     903   if(!pidl || !strRet) return E_INVALIDARG;
     904
     905   bSimplePidl = _ILIsPidlSimple(pidl);
     906
     907   /* take names of special folders only if its only this folder */
     908   if (_ILIsSpecialFolder(pidl))
     909   {
     910     if ( bSimplePidl)
     911     {
     912       _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     913     }
     914   }
     915   else
     916   {
     917     if (!(dwFlags & SHGDN_INFOLDER) && (dwFlags & SHGDN_FORPARSING) && This->sMyPath)
     918     {
     919       strcpy (szPath, This->sMyPath);         /* get path to root*/
     920       PathAddBackslashA(szPath);
     921       len = strlen(szPath);
     922     }
     923     _ILSimpleGetText(pidl, szPath + len, MAX_PATH - len); /* append my own path */
     924   }
     925
     926   if ( (dwFlags & SHGDN_FORPARSING) && !bSimplePidl)   /* go deeper if needed */
     927   {
     928     PathAddBackslashA(szPath);
     929     len = strlen(szPath);
     930
     931     if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags, szPath + len, MAX_PATH - len)))
     932       return E_OUTOFMEMORY;
     933   }
     934   strRet->uType = STRRET_CSTRA;
     935   lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     936
     937   TRACE("-- (%p)->(%s)\n", This, szPath);
     938   return S_OK;
    935939}
    936940
     
    948952*/
    949953static HRESULT WINAPI IShellFolder_fnSetNameOf(
    950         IShellFolder * iface,
    951         HWND hwndOwner,
    952         LPCITEMIDLIST pidl, /*simple pidl*/
    953         LPCOLESTR lpName,
    954         DWORD dw,
    955         LPITEMIDLIST *pPidlOut)
    956 {
    957         ICOM_THIS(IGenericSFImpl, iface);
    958 
    959         FIXME("(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
    960         This,hwndOwner,pidl,debugstr_w(lpName),dw,pPidlOut);
    961 
    962         return E_NOTIMPL;
     954   IShellFolder * iface,
     955   HWND hwndOwner,
     956   LPCITEMIDLIST pidl, /*simple pidl*/
     957   LPCOLESTR lpName,
     958   DWORD dw,
     959   LPITEMIDLIST *pPidlOut)
     960{
     961   ICOM_THIS(IGenericSFImpl, iface);
     962
     963   FIXME("(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
     964   This,hwndOwner,pidl,debugstr_w(lpName),dw,pPidlOut);
     965
     966   return E_NOTIMPL;
    963967}
    964968
     
    968972static HRESULT WINAPI IShellFolder_fnGetFolderPath(IShellFolder * iface, LPSTR lpszOut, DWORD dwOutSize)
    969973{
    970         ICOM_THIS(IGenericSFImpl, iface);
    971        
    972         TRACE("(%p)->(%p %lu)\n",This, lpszOut, dwOutSize);
    973 
    974         if (!lpszOut) return FALSE;
    975 
    976         *lpszOut=0;
    977 
    978         if (! This->sMyPath) return FALSE;
    979 
    980         lstrcpynA(lpszOut, This->sMyPath, dwOutSize);
    981 
    982         TRACE("-- (%p)->(return=%s)\n",This, lpszOut);
    983         return TRUE;
     974   ICOM_THIS(IGenericSFImpl, iface);
     975
     976   TRACE("(%p)->(%p %lu)\n",This, lpszOut, dwOutSize);
     977
     978   if (!lpszOut) return FALSE;
     979
     980   *lpszOut=0;
     981
     982   if (! This->sMyPath) return FALSE;
     983
     984   lstrcpynA(lpszOut, This->sMyPath, dwOutSize);
     985
     986   TRACE("-- (%p)->(return=%s)\n",This, lpszOut);
     987   return TRUE;
    984988}
    985989
    986990ICOM_VTABLE(IShellFolder) sfvt =
    987 {       
    988         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    989         IShellFolder_fnQueryInterface,
    990         IShellFolder_fnAddRef,
    991         IShellFolder_fnRelease,
    992         IShellFolder_fnParseDisplayName,
    993         IShellFolder_fnEnumObjects,
    994         IShellFolder_fnBindToObject,
    995         IShellFolder_fnBindToStorage,
    996         IShellFolder_fnCompareIDs,
    997         IShellFolder_fnCreateViewObject,
    998         IShellFolder_fnGetAttributesOf,
    999         IShellFolder_fnGetUIObjectOf,
    1000         IShellFolder_fnGetDisplayNameOf,
    1001         IShellFolder_fnSetNameOf,
    1002         IShellFolder_fnGetFolderPath
     991{
     992   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     993   IShellFolder_fnQueryInterface,
     994   IShellFolder_fnAddRef,
     995   IShellFolder_fnRelease,
     996   IShellFolder_fnParseDisplayName,
     997   IShellFolder_fnEnumObjects,
     998   IShellFolder_fnBindToObject,
     999   IShellFolder_fnBindToStorage,
     1000   IShellFolder_fnCompareIDs,
     1001   IShellFolder_fnCreateViewObject,
     1002   IShellFolder_fnGetAttributesOf,
     1003   IShellFolder_fnGetUIObjectOf,
     1004   IShellFolder_fnGetDisplayNameOf,
     1005   IShellFolder_fnSetNameOf,
     1006   IShellFolder_fnGetFolderPath
    10031007};
    10041008
    10051009/***********************************************************************
    1006 *       [Desktopfolder] IShellFolder implementation
     1010*  [Desktopfolder]                       IShellFolder implementation
    10071011*/
    10081012extern struct ICOM_VTABLE(IShellFolder) sfdvt;
    10091013
    10101014/**************************************************************************
    1011 *       ISF_Desktop_Constructor
     1015*  ISF_Desktop_Constructor
    10121016*
    10131017*/
    10141018IShellFolder * ISF_Desktop_Constructor()
    10151019{
    1016         IGenericSFImpl *        sf;
    1017 
    1018         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    1019         sf->ref=1;
    1020         sf->lpvtbl=&sfdvt;
    1021         sf->absPidl=_ILCreateDesktop(); /* my qualified pidl */
    1022 
    1023         TRACE("(%p)\n",sf);
    1024 
    1025         shell32_ObjCount++;
    1026         return (IShellFolder *)sf;
    1027 }
    1028 
    1029 /**************************************************************************
    1030  *      ISF_Desktop_fnQueryInterface
     1020   IGenericSFImpl *                      sf;
     1021
     1022   sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     1023   sf->ref=1;
     1024   sf->lpvtbl=&sfdvt;
     1025   sf->absPidl=_ILCreateDesktop();       /* my qualified pidl */
     1026
     1027   TRACE("(%p)\n",sf);
     1028
     1029   shell32_ObjCount++;
     1030   return (IShellFolder *)sf;
     1031}
     1032
     1033/**************************************************************************
     1034 * ISF_Desktop_fnQueryInterface
    10311035 *
    10321036 * NOTES supports not IPersist/IPersistFolder
    10331037 */
    10341038static HRESULT WINAPI ISF_Desktop_fnQueryInterface(
    1035         IShellFolder * iface,
    1036         REFIID riid,
    1037         LPVOID *ppvObj)
    1038 {
    1039         ICOM_THIS(IGenericSFImpl, iface);
    1040 
    1041         char    xriid[50];     
    1042         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1043         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    1044 
    1045         *ppvObj = NULL;
    1046 
    1047         if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
    1048         { *ppvObj = This;
    1049         }
    1050         else if(IsEqualIID(riid, &IID_IShellFolder))  /*IShellFolder*/
    1051         {    *ppvObj = (IShellFolder*)This;
    1052         }
    1053 
    1054         if(*ppvObj)
    1055         {
    1056           IUnknown_AddRef((IUnknown*)(*ppvObj));
    1057           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    1058           return S_OK;
    1059         }
    1060         TRACE("-- Interface: E_NOINTERFACE\n");
    1061         return E_NOINTERFACE;
    1062 }
    1063 
    1064 /**************************************************************************
    1065 *       ISF_Desktop_fnParseDisplayName
     1039   IShellFolder * iface,
     1040   REFIID riid,
     1041   LPVOID *ppvObj)
     1042{
     1043   ICOM_THIS(IGenericSFImpl, iface);
     1044
     1045   char  xriid[50];
     1046   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1047   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     1048
     1049   *ppvObj = NULL;
     1050
     1051   if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     1052   { *ppvObj = This;
     1053   }
     1054   else if(IsEqualIID(riid, &IID_IShellFolder))  /*IShellFolder*/
     1055   {    *ppvObj = (IShellFolder*)This;
     1056   }
     1057
     1058   if(*ppvObj)
     1059   {
     1060     IUnknown_AddRef((IUnknown*)(*ppvObj));
     1061     TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     1062     return S_OK;
     1063   }
     1064   TRACE("-- Interface: E_NOINTERFACE\n");
     1065   return E_NOINTERFACE;
     1066}
     1067
     1068/**************************************************************************
     1069*  ISF_Desktop_fnParseDisplayName
    10661070*
    10671071* NOTES
    1068 *       "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
    1069 *       to MyComputer
     1072*  "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
     1073*  to MyComputer
    10701074*/
    10711075static HRESULT WINAPI ISF_Desktop_fnParseDisplayName(
    1072         IShellFolder * iface,
    1073         HWND hwndOwner,
    1074         LPBC pbcReserved,
    1075         LPOLESTR lpszDisplayName,
    1076         DWORD *pchEaten,
    1077         LPITEMIDLIST *ppidl,
    1078         DWORD *pdwAttributes)
    1079 {
    1080         ICOM_THIS(IGenericSFImpl, iface);
    1081 
    1082         LPCWSTR         szNext=NULL;
    1083         LPITEMIDLIST    pidlTemp=NULL;
    1084         HRESULT         hr=E_OUTOFMEMORY;
    1085        
    1086         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    1087         This,hwndOwner,pbcReserved,lpszDisplayName,
    1088         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    1089 
    1090         *ppidl = 0;
    1091         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    1092        
    1093         /* fixme no real parsing implemented */
    1094         pidlTemp = _ILCreateMyComputer();
    1095         szNext = lpszDisplayName;
    1096 
    1097         if (szNext && *szNext)
    1098         {
    1099           hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    1100         }
    1101         else
    1102         {
    1103           hr = S_OK;
    1104         }
    1105 
    1106         *ppidl = pidlTemp;
    1107 
    1108         TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
    1109 
    1110         return hr;     
    1111 }
    1112 
    1113 /**************************************************************************
    1114 *               ISF_Desktop_fnEnumObjects
     1076   IShellFolder * iface,
     1077   HWND hwndOwner,
     1078   LPBC pbcReserved,
     1079   LPOLESTR lpszDisplayName,
     1080   DWORD *pchEaten,
     1081   LPITEMIDLIST *ppidl,
     1082   DWORD *pdwAttributes)
     1083{
     1084   ICOM_THIS(IGenericSFImpl, iface);
     1085
     1086   LPCWSTR     szNext=NULL;
     1087   LPITEMIDLIST   pidlTemp=NULL;
     1088   HRESULT     hr=E_OUTOFMEMORY;
     1089
     1090   TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     1091   This,hwndOwner,pbcReserved,lpszDisplayName,
     1092   debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     1093
     1094   *ppidl = 0;
     1095   if (pchEaten) *pchEaten = 0;          /* strange but like the original */
     1096
     1097   /* fixme no real parsing implemented */
     1098   pidlTemp = _ILCreateMyComputer();
     1099   szNext = lpszDisplayName;
     1100
     1101   if (szNext && *szNext)
     1102   {
     1103     hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1104   }
     1105   else
     1106   {
     1107     hr = S_OK;
     1108   }
     1109
     1110   *ppidl = pidlTemp;
     1111
     1112   TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
     1113
     1114   return hr;
     1115}
     1116
     1117/**************************************************************************
     1118*     ISF_Desktop_fnEnumObjects
    11151119*/
    11161120static HRESULT WINAPI ISF_Desktop_fnEnumObjects(
    1117         IShellFolder * iface,
    1118         HWND hwndOwner,
    1119         DWORD dwFlags,
    1120         LPENUMIDLIST* ppEnumIDList)
    1121 {
    1122         ICOM_THIS(IGenericSFImpl, iface);
    1123 
    1124         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    1125 
    1126         *ppEnumIDList = NULL;
    1127         *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_DESK);
    1128 
    1129         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    1130 
    1131         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    1132 
    1133         return S_OK;           
    1134 }
    1135 
    1136 /**************************************************************************
    1137 *               ISF_Desktop_fnBindToObject
     1121   IShellFolder * iface,
     1122   HWND hwndOwner,
     1123   DWORD dwFlags,
     1124   LPENUMIDLIST* ppEnumIDList)
     1125{
     1126   ICOM_THIS(IGenericSFImpl, iface);
     1127
     1128   TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     1129
     1130   *ppEnumIDList = NULL;
     1131   *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_DESK);
     1132
     1133   TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     1134
     1135   if(!*ppEnumIDList) return E_OUTOFMEMORY;
     1136
     1137   return S_OK;
     1138}
     1139
     1140/**************************************************************************
     1141*     ISF_Desktop_fnBindToObject
    11381142*/
    11391143static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder * iface, LPCITEMIDLIST pidl,
    1140                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    1141 {
    1142         ICOM_THIS(IGenericSFImpl, iface);
    1143         GUID            const * clsid;
    1144         char            xriid[50];
    1145         IShellFolder    *pShellFolder, *pSubFolder;
    1146        
    1147         WINE_StringFromCLSID(riid,xriid);
    1148 
    1149         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
    1150 
    1151         *ppvOut = NULL;
    1152 
    1153         if ((clsid=_ILGetGUIDPointer(pidl)))
    1154         {
    1155           if ( IsEqualIID(clsid, &IID_MyComputer))
    1156           {
    1157             pShellFolder = ISF_MyComputer_Constructor();
    1158           }
    1159           else
    1160           {
    1161              /* shell extension */
    1162              if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
    1163              {
    1164                return E_INVALIDARG;
    1165              }
    1166           }
    1167         }
    1168         else
    1169         {
    1170           /* file system folder on the desktop */
    1171           LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
    1172           pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
    1173           ILFree(pidltemp);
    1174         }
    1175        
    1176         if (_ILIsPidlSimple(pidl))      /* no sub folders */
    1177         {
    1178           *ppvOut = pShellFolder;
    1179         }
    1180         else                            /* go deeper */
    1181         {
    1182           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, riid, (LPVOID*)&pSubFolder);
    1183           IShellFolder_Release(pShellFolder);
    1184           *ppvOut = pSubFolder;
    1185         }
    1186 
    1187         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    1188 
    1189         return S_OK;
    1190 }
    1191 
    1192 /**************************************************************************
    1193 *       ISF_Desktop_fnCreateViewObject
     1144         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     1145{
     1146   ICOM_THIS(IGenericSFImpl, iface);
     1147   GUID     const * clsid;
     1148   char     xriid[50];
     1149   IShellFolder   *pShellFolder, *pSubFolder;
     1150
     1151   WINE_StringFromCLSID(riid,xriid);
     1152
     1153   TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
     1154
     1155   *ppvOut = NULL;
     1156
     1157   if ((clsid=_ILGetGUIDPointer(pidl)))
     1158   {
     1159     if ( IsEqualIID(clsid, &IID_MyComputer))
     1160     {
     1161       pShellFolder = ISF_MyComputer_Constructor();
     1162     }
     1163     else
     1164     {
     1165        /* shell extension */
     1166        if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
     1167        {
     1168          return E_INVALIDARG;
     1169        }
     1170     }
     1171   }
     1172   else
     1173   {
     1174     /* file system folder on the desktop */
     1175     LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
     1176     pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
     1177     ILFree(pidltemp);
     1178   }
     1179
     1180   if (_ILIsPidlSimple(pidl))            /* no sub folders */
     1181   {
     1182     *ppvOut = pShellFolder;
     1183   }
     1184   else           /* go deeper */
     1185   {
     1186     IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, riid, (LPVOID*)&pSubFolder);
     1187     IShellFolder_Release(pShellFolder);
     1188     *ppvOut = pSubFolder;
     1189   }
     1190
     1191   TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     1192
     1193   return S_OK;
     1194}
     1195
     1196/**************************************************************************
     1197*  ISF_Desktop_fnCreateViewObject
    11941198*/
    11951199static HRESULT WINAPI ISF_Desktop_fnCreateViewObject( IShellFolder * iface,
    1196                 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    1197 {
    1198         ICOM_THIS(IGenericSFImpl, iface);
    1199 
    1200         LPSHELLVIEW     pShellView;
    1201         char            xriid[50];
    1202         HRESULT         hr = E_INVALIDARG;
    1203 
    1204         WINE_StringFromCLSID(riid,xriid);
    1205         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
    1206        
    1207         if(ppvOut)
    1208         {
    1209           *ppvOut = NULL;
    1210 
    1211           if(IsEqualIID(riid, &IID_IDropTarget))
    1212           {
    1213             FIXME("IDropTarget not implemented\n");
    1214             hr = E_NOTIMPL;
    1215           }
    1216           else if(IsEqualIID(riid, &IID_IContextMenu))
    1217           {
    1218             FIXME("IContextMenu not implemented\n");
    1219             hr = E_NOTIMPL;
    1220           }
    1221           else if(IsEqualIID(riid, &IID_IShellView))
    1222           {
    1223             pShellView = IShellView_Constructor((IShellFolder *) This);
    1224             if(pShellView)
    1225             {
    1226               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    1227               IShellView_Release(pShellView);
    1228             }
    1229           }
    1230         }
    1231         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    1232         return hr;
     1200      HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
     1201{
     1202   ICOM_THIS(IGenericSFImpl, iface);
     1203
     1204   LPSHELLVIEW pShellView;
     1205   char     xriid[50];
     1206   HRESULT     hr = E_INVALIDARG;
     1207
     1208   WINE_StringFromCLSID(riid,xriid);
     1209   TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
     1210
     1211   if(ppvOut)
     1212   {
     1213     *ppvOut = NULL;
     1214
     1215     if(IsEqualIID(riid, &IID_IDropTarget))
     1216     {
     1217       FIXME("IDropTarget not implemented\n");
     1218       hr = E_NOTIMPL;
     1219     }
     1220     else if(IsEqualIID(riid, &IID_IContextMenu))
     1221     {
     1222       FIXME("IContextMenu not implemented\n");
     1223       hr = E_NOTIMPL;
     1224     }
     1225     else if(IsEqualIID(riid, &IID_IShellView))
     1226     {
     1227       pShellView = IShellView_Constructor((IShellFolder *) This);
     1228       if(pShellView)
     1229       {
     1230         hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     1231         IShellView_Release(pShellView);
     1232       }
     1233     }
     1234   }
     1235   TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     1236   return hr;
    12331237}
    12341238
     
    12381242static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    12391243{
    1240         ICOM_THIS(IGenericSFImpl, iface);
    1241 
    1242         GUID            const * clsid;
    1243         DWORD           attributes;
    1244         HRESULT         hr = S_OK;
    1245 
    1246         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl, *rgfInOut);
    1247 
    1248         if ( (!cidl) || (!apidl) || (!rgfInOut))
    1249           return E_INVALIDARG;
    1250 
    1251         while (cidl > 0 && *apidl)
    1252         {
    1253           pdump (*apidl);
    1254 
    1255           if ((clsid=_ILGetGUIDPointer(*apidl)))
    1256           {
    1257             if (IsEqualIID(clsid, &IID_MyComputer))
    1258             {
    1259               *rgfInOut &= 0xb0000154;
    1260               goto next;
    1261             }
    1262             else if (HCR_GetFolderAttributes(clsid, &attributes))
    1263             {
    1264               *rgfInOut &= attributes;
    1265               goto next;
    1266             }
    1267             else
    1268             { /* some shell-extension */
    1269               *rgfInOut &= 0xb0000154;
    1270             }
    1271           }
    1272           else if (_ILIsFolder( *apidl))
    1273           {
    1274             *rgfInOut &= 0xe0000177;
    1275             goto next;
    1276           }
    1277           else if (_ILIsValue( *apidl))
    1278           {
    1279             *rgfInOut &= 0x40000177;
    1280             goto next;
    1281           }
    1282           hr = E_INVALIDARG;
    1283 
    1284 next:     apidl++;
    1285           cidl--;
    1286         }
    1287 
    1288         TRACE("-- result=0x%08lx\n",*rgfInOut);
    1289 
    1290         return hr;
    1291 }
    1292 
    1293 /**************************************************************************
    1294 *       ISF_Desktop_fnGetDisplayNameOf
     1244   ICOM_THIS(IGenericSFImpl, iface);
     1245
     1246   GUID     const * clsid;
     1247   DWORD    attributes;
     1248   HRESULT     hr = S_OK;
     1249
     1250   TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl, *rgfInOut);
     1251
     1252   if ( (!cidl) || (!apidl) || (!rgfInOut))
     1253     return E_INVALIDARG;
     1254
     1255   while (cidl > 0 && *apidl)
     1256   {
     1257     pdump (*apidl);
     1258
     1259     if ((clsid=_ILGetGUIDPointer(*apidl)))
     1260     {
     1261       if (IsEqualIID(clsid, &IID_MyComputer))
     1262       {
     1263         *rgfInOut &= 0xb0000154;
     1264         goto next;
     1265       }
     1266       else if (HCR_GetFolderAttributes(clsid, &attributes))
     1267       {
     1268         *rgfInOut &= attributes;
     1269         goto next;
     1270       }
     1271       else
     1272       { /* some shell-extension */
     1273         *rgfInOut &= 0xb0000154;
     1274       }
     1275     }
     1276     else if (_ILIsFolder( *apidl))
     1277     {
     1278       *rgfInOut &= 0xe0000177;
     1279       goto next;
     1280     }
     1281     else if (_ILIsValue( *apidl))
     1282     {
     1283       *rgfInOut &= 0x40000177;
     1284       goto next;
     1285     }
     1286     hr = E_INVALIDARG;
     1287
     1288next:   apidl++;
     1289     cidl--;
     1290   }
     1291
     1292   TRACE("-- result=0x%08lx\n",*rgfInOut);
     1293
     1294   return hr;
     1295}
     1296
     1297/**************************************************************************
     1298*  ISF_Desktop_fnGetDisplayNameOf
    12951299*
    12961300* NOTES
    1297 *       special case: pidl = null gives desktop-name back
     1301*  special case: pidl = null gives desktop-name back
    12981302*/
    12991303static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf(
    1300         IShellFolder * iface,
    1301         LPCITEMIDLIST pidl,
    1302         DWORD dwFlags,
    1303         LPSTRRET strRet)
    1304 {
    1305         ICOM_THIS(IGenericSFImpl, iface);
    1306 
    1307         CHAR            szPath[MAX_PATH]= "";
    1308                
    1309         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    1310         pdump(pidl);
    1311        
    1312         if(!strRet) return E_INVALIDARG;
    1313        
    1314         if(!pidl)
    1315         {
    1316           HCR_GetClassName(&CLSID_ShellDesktop, szPath, MAX_PATH);
    1317         }
    1318         else if ( _ILIsPidlSimple(pidl) )
    1319         {
    1320           _ILSimpleGetText(pidl, szPath, MAX_PATH);
    1321         }
    1322         else
    1323         {
    1324           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags, szPath, MAX_PATH)))
    1325             return E_OUTOFMEMORY;
    1326         }
    1327         strRet->uType = STRRET_CSTRA;
    1328         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    1329 
    1330 
    1331         TRACE("-- (%p)->(%s)\n", This, szPath);
    1332         return S_OK;
     1304   IShellFolder * iface,
     1305   LPCITEMIDLIST pidl,
     1306   DWORD dwFlags,
     1307   LPSTRRET strRet)
     1308{
     1309   ICOM_THIS(IGenericSFImpl, iface);
     1310
     1311   CHAR     szPath[MAX_PATH]= "";
     1312
     1313   TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     1314   pdump(pidl);
     1315
     1316   if(!strRet) return E_INVALIDARG;
     1317
     1318   if(!pidl)
     1319   {
     1320     HCR_GetClassName(&CLSID_ShellDesktop, szPath, MAX_PATH);
     1321   }
     1322   else if ( _ILIsPidlSimple(pidl) )
     1323   {
     1324     _ILSimpleGetText(pidl, szPath, MAX_PATH);
     1325   }
     1326   else
     1327   {
     1328     if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags, szPath, MAX_PATH)))
     1329       return E_OUTOFMEMORY;
     1330   }
     1331   strRet->uType = STRRET_CSTRA;
     1332   lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     1333
     1334
     1335   TRACE("-- (%p)->(%s)\n", This, szPath);
     1336   return S_OK;
    13331337}
    13341338
    13351339ICOM_VTABLE(IShellFolder) sfdvt =
    1336 {       
    1337         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1338         ISF_Desktop_fnQueryInterface,
    1339         IShellFolder_fnAddRef,
    1340         IShellFolder_fnRelease,
    1341         ISF_Desktop_fnParseDisplayName,
    1342         ISF_Desktop_fnEnumObjects,
    1343         ISF_Desktop_fnBindToObject,
    1344         IShellFolder_fnBindToStorage,
    1345         IShellFolder_fnCompareIDs,
    1346         ISF_Desktop_fnCreateViewObject,
    1347         ISF_Desktop_fnGetAttributesOf,
    1348         IShellFolder_fnGetUIObjectOf,
    1349         ISF_Desktop_fnGetDisplayNameOf,
    1350         IShellFolder_fnSetNameOf,
    1351         IShellFolder_fnGetFolderPath
     1340{
     1341   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1342   ISF_Desktop_fnQueryInterface,
     1343   IShellFolder_fnAddRef,
     1344   IShellFolder_fnRelease,
     1345   ISF_Desktop_fnParseDisplayName,
     1346   ISF_Desktop_fnEnumObjects,
     1347   ISF_Desktop_fnBindToObject,
     1348   IShellFolder_fnBindToStorage,
     1349   IShellFolder_fnCompareIDs,
     1350   ISF_Desktop_fnCreateViewObject,
     1351   ISF_Desktop_fnGetAttributesOf,
     1352   IShellFolder_fnGetUIObjectOf,
     1353   ISF_Desktop_fnGetDisplayNameOf,
     1354   IShellFolder_fnSetNameOf,
     1355   IShellFolder_fnGetFolderPath
    13521356};
    13531357
     
    13601364
    13611365/**************************************************************************
    1362 *       ISF_MyComputer_Constructor
     1366*  ISF_MyComputer_Constructor
    13631367*/
    13641368static IShellFolder * ISF_MyComputer_Constructor(void)
    13651369{
    1366         IGenericSFImpl *        sf;
    1367 
    1368         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    1369         sf->ref=1;
    1370 
    1371         sf->lpvtbl = &sfmcvt;
    1372         sf->lpvtblPersistFolder = &psfvt;
    1373         sf->pclsid = (CLSID*)&CLSID_SFMyComp;
    1374         sf->absPidl=_ILCreateMyComputer();      /* my qualified pidl */
    1375 
    1376         TRACE("(%p)\n",sf);
    1377 
    1378         shell32_ObjCount++;
    1379         return (IShellFolder *)sf;
    1380 }
    1381 
    1382 /**************************************************************************
    1383 *       ISF_MyComputer_fnParseDisplayName
     1370   IGenericSFImpl *                      sf;
     1371
     1372   sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     1373   sf->ref=1;
     1374
     1375   sf->lpvtbl = &sfmcvt;
     1376   sf->lpvtblPersistFolder = &psfvt;
     1377   sf->pclsid = (CLSID*)&CLSID_SFMyComp;
     1378   sf->absPidl=_ILCreateMyComputer();    /* my qualified pidl */
     1379
     1380   TRACE("(%p)\n",sf);
     1381
     1382   shell32_ObjCount++;
     1383   return (IShellFolder *)sf;
     1384}
     1385
     1386/**************************************************************************
     1387*  ISF_MyComputer_fnParseDisplayName
    13841388*/
    13851389static HRESULT WINAPI ISF_MyComputer_fnParseDisplayName(
    1386         IShellFolder * iface,
    1387         HWND hwndOwner,
    1388         LPBC pbcReserved,
    1389         LPOLESTR lpszDisplayName,
    1390         DWORD *pchEaten,
    1391         LPITEMIDLIST *ppidl,
    1392         DWORD *pdwAttributes)
    1393 {
    1394         ICOM_THIS(IGenericSFImpl, iface);
    1395 
    1396         HRESULT         hr = E_OUTOFMEMORY;
    1397         LPCWSTR         szNext=NULL;
    1398         WCHAR           szElement[MAX_PATH];
    1399         CHAR            szTempA[MAX_PATH];
    1400         LPITEMIDLIST    pidlTemp;
    1401        
    1402         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    1403         This,hwndOwner,pbcReserved,lpszDisplayName,
    1404         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    1405 
    1406         *ppidl = 0;
    1407         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    1408        
    1409         if (PathIsRootW(lpszDisplayName))
    1410         {
    1411           szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
    1412           WideCharToLocal(szTempA, szElement, lstrlenW(szElement) + 1);
    1413           pidlTemp = _ILCreateDrive(szTempA);
    1414 
    1415           if (szNext && *szNext)
    1416           {
    1417             hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    1418           }
    1419           else
    1420           {
    1421             hr = S_OK;
    1422           }
    1423           *ppidl = pidlTemp;
    1424         }
    1425 
    1426         TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
    1427 
    1428         return hr;     
    1429 }
    1430 
    1431 /**************************************************************************
    1432 *               ISF_MyComputer_fnEnumObjects
     1390   IShellFolder * iface,
     1391   HWND hwndOwner,
     1392   LPBC pbcReserved,
     1393   LPOLESTR lpszDisplayName,
     1394   DWORD *pchEaten,
     1395   LPITEMIDLIST *ppidl,
     1396   DWORD *pdwAttributes)
     1397{
     1398   ICOM_THIS(IGenericSFImpl, iface);
     1399
     1400   HRESULT     hr = E_OUTOFMEMORY;
     1401   LPCWSTR     szNext=NULL;
     1402   WCHAR    szElement[MAX_PATH];
     1403   CHAR     szTempA[MAX_PATH];
     1404   LPITEMIDLIST   pidlTemp;
     1405
     1406   TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     1407   This,hwndOwner,pbcReserved,lpszDisplayName,
     1408   debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     1409
     1410   *ppidl = 0;
     1411   if (pchEaten) *pchEaten = 0;          /* strange but like the original */
     1412
     1413   if (PathIsRootW(lpszDisplayName))
     1414   {
     1415     szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
     1416     WideCharToLocal(szTempA, szElement, lstrlenW(szElement) + 1);
     1417     pidlTemp = _ILCreateDrive(szTempA);
     1418
     1419     if (szNext && *szNext)
     1420     {
     1421       hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1422     }
     1423     else
     1424     {
     1425       hr = S_OK;
     1426     }
     1427     *ppidl = pidlTemp;
     1428   }
     1429
     1430   TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
     1431
     1432   return hr;
     1433}
     1434
     1435/**************************************************************************
     1436*     ISF_MyComputer_fnEnumObjects
    14331437*/
    14341438static HRESULT WINAPI ISF_MyComputer_fnEnumObjects(
    1435         IShellFolder * iface,
    1436         HWND hwndOwner,
    1437         DWORD dwFlags,
    1438         LPENUMIDLIST* ppEnumIDList)
    1439 {
    1440         ICOM_THIS(IGenericSFImpl, iface);
    1441 
    1442         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    1443 
    1444         *ppEnumIDList = NULL;
    1445         *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP);
    1446 
    1447         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    1448 
    1449         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    1450 
    1451         return S_OK;           
    1452 }
    1453 
    1454 /**************************************************************************
    1455 *               ISF_MyComputer_fnBindToObject
     1439   IShellFolder * iface,
     1440   HWND hwndOwner,
     1441   DWORD dwFlags,
     1442   LPENUMIDLIST* ppEnumIDList)
     1443{
     1444   ICOM_THIS(IGenericSFImpl, iface);
     1445
     1446   TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     1447
     1448   *ppEnumIDList = NULL;
     1449   *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP);
     1450
     1451   TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     1452
     1453   if(!*ppEnumIDList) return E_OUTOFMEMORY;
     1454
     1455   return S_OK;
     1456}
     1457
     1458/**************************************************************************
     1459*     ISF_MyComputer_fnBindToObject
    14561460*/
    14571461static HRESULT WINAPI ISF_MyComputer_fnBindToObject( IShellFolder * iface, LPCITEMIDLIST pidl,
    1458                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    1459 {
    1460         ICOM_THIS(IGenericSFImpl, iface);
    1461         GUID            const * clsid;
    1462         char            xriid[50];
    1463         IShellFolder    *pShellFolder, *pSubFolder;
    1464         LPITEMIDLIST    pidltemp;
    1465        
    1466         WINE_StringFromCLSID(riid,xriid);
    1467 
    1468         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
    1469 
    1470         *ppvOut = NULL;
    1471 
    1472         if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &IID_MyComputer))
    1473         {
    1474            if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
    1475            {
    1476              return E_FAIL;
    1477            }
    1478         }
    1479         else
    1480         {
    1481           if (!_ILIsDrive(pidl)) return E_INVALIDARG;
    1482 
    1483           pidltemp = ILCloneFirst(pidl);
    1484           pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
    1485           ILFree(pidltemp);
    1486         }
    1487 
    1488         if (_ILIsPidlSimple(pidl))      /* no sub folders */
    1489         {
    1490           *ppvOut = pShellFolder;
    1491         }
    1492         else                            /* go deeper */
    1493         {
    1494           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID*)&pSubFolder);
    1495           IShellFolder_Release(pShellFolder);
    1496           *ppvOut = pSubFolder;
    1497         }
    1498 
    1499         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    1500 
    1501         return S_OK;
    1502 }
    1503 
    1504 /**************************************************************************
    1505 *       ISF_MyComputer_fnCreateViewObject
     1462         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     1463{
     1464   ICOM_THIS(IGenericSFImpl, iface);
     1465   GUID     const * clsid;
     1466   char     xriid[50];
     1467   IShellFolder   *pShellFolder, *pSubFolder;
     1468   LPITEMIDLIST   pidltemp;
     1469
     1470   WINE_StringFromCLSID(riid,xriid);
     1471
     1472   TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
     1473
     1474   if(!pidl || !ppvOut) return E_INVALIDARG;
     1475
     1476   *ppvOut = NULL;
     1477
     1478   if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &IID_MyComputer))
     1479   {
     1480      if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
     1481      {
     1482        return E_FAIL;
     1483      }
     1484   }
     1485   else
     1486   {
     1487     if (!_ILIsDrive(pidl)) return E_INVALIDARG;
     1488
     1489     pidltemp = ILCloneFirst(pidl);
     1490     pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
     1491     ILFree(pidltemp);
     1492   }
     1493
     1494   if (_ILIsPidlSimple(pidl))            /* no sub folders */
     1495   {
     1496     *ppvOut = pShellFolder;
     1497   }
     1498   else           /* go deeper */
     1499   {
     1500     IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID*)&pSubFolder);
     1501     IShellFolder_Release(pShellFolder);
     1502     *ppvOut = pSubFolder;
     1503   }
     1504
     1505   TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     1506
     1507   return S_OK;
     1508}
     1509
     1510/**************************************************************************
     1511*  ISF_MyComputer_fnCreateViewObject
    15061512*/
    15071513static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject( IShellFolder * iface,
    1508                 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    1509 {
    1510         ICOM_THIS(IGenericSFImpl, iface);
    1511 
    1512         LPSHELLVIEW     pShellView;
    1513         char            xriid[50];
    1514         HRESULT         hr = E_INVALIDARG;
    1515 
    1516         WINE_StringFromCLSID(riid,xriid);
    1517         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
    1518        
    1519         if(ppvOut)
    1520         {
    1521           *ppvOut = NULL;
    1522 
    1523           if(IsEqualIID(riid, &IID_IDropTarget))
    1524           {
    1525             FIXME("IDropTarget not implemented\n");
    1526             hr = E_NOTIMPL;
    1527           }
    1528           else if(IsEqualIID(riid, &IID_IContextMenu))
    1529           {
    1530             FIXME("IContextMenu not implemented\n");
    1531             hr = E_NOTIMPL;
    1532           }
    1533           else if(IsEqualIID(riid, &IID_IShellView))
    1534           {
    1535             pShellView = IShellView_Constructor((IShellFolder *) This);
    1536             if(pShellView)
    1537             {
    1538               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    1539               IShellView_Release(pShellView);
    1540             }
    1541           }
    1542         }
    1543         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    1544         return hr;
     1514      HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
     1515{
     1516   ICOM_THIS(IGenericSFImpl, iface);
     1517
     1518   LPSHELLVIEW pShellView;
     1519   char     xriid[50];
     1520   HRESULT     hr = E_INVALIDARG;
     1521
     1522   WINE_StringFromCLSID(riid,xriid);
     1523   TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
     1524
     1525   if(ppvOut)
     1526   {
     1527     *ppvOut = NULL;
     1528
     1529     if(IsEqualIID(riid, &IID_IDropTarget))
     1530     {
     1531       FIXME("IDropTarget not implemented\n");
     1532       hr = E_NOTIMPL;
     1533     }
     1534     else if(IsEqualIID(riid, &IID_IContextMenu))
     1535     {
     1536       FIXME("IContextMenu not implemented\n");
     1537       hr = E_NOTIMPL;
     1538     }
     1539     else if(IsEqualIID(riid, &IID_IShellView))
     1540     {
     1541       pShellView = IShellView_Constructor((IShellFolder *) This);
     1542       if(pShellView)
     1543       {
     1544         hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     1545         IShellView_Release(pShellView);
     1546       }
     1547     }
     1548   }
     1549   TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     1550   return hr;
    15451551}
    15461552
     
    15501556static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(IShellFolder * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    15511557{
    1552         ICOM_THIS(IGenericSFImpl, iface);
    1553 
    1554         GUID            const * clsid;
    1555         DWORD           attributes;
    1556         HRESULT         hr = S_OK;
    1557 
    1558         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
    1559 
    1560         if ( (!cidl) || (!apidl) || (!rgfInOut))
    1561           return E_INVALIDARG;
    1562 
    1563         *rgfInOut = 0xffffffff;
    1564 
    1565         while (cidl > 0 && *apidl)
    1566         {
    1567           pdump (*apidl);
    1568 
    1569           if (_ILIsDrive(*apidl))
    1570           {
    1571             *rgfInOut &= 0xf0000144;
    1572             goto next;
    1573           }
    1574           else if ((clsid=_ILGetGUIDPointer(*apidl)))
    1575           {
    1576             if (HCR_GetFolderAttributes(clsid, &attributes))
    1577             {
    1578               *rgfInOut &= attributes;
    1579               goto next;
    1580             }
    1581           }
    1582           hr = E_INVALIDARG;
    1583 
    1584 next:     apidl++;
    1585           cidl--;
    1586         }
    1587 
    1588         TRACE("-- result=0x%08lx\n",*rgfInOut);
    1589         return hr;
    1590 }
    1591 
    1592 /**************************************************************************
    1593 *       ISF_MyComputer_fnGetDisplayNameOf
     1558   ICOM_THIS(IGenericSFImpl, iface);
     1559
     1560   GUID     const * clsid;
     1561   DWORD    attributes;
     1562   HRESULT     hr = S_OK;
     1563
     1564   TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
     1565
     1566   if ( (!cidl) || (!apidl) || (!rgfInOut))
     1567     return E_INVALIDARG;
     1568
     1569   *rgfInOut = 0xffffffff;
     1570
     1571   while (cidl > 0 && *apidl)
     1572   {
     1573     pdump (*apidl);
     1574
     1575     if (_ILIsDrive(*apidl))
     1576     {
     1577       *rgfInOut &= 0xf0000144;
     1578       goto next;
     1579     }
     1580     else if ((clsid=_ILGetGUIDPointer(*apidl)))
     1581     {
     1582       if (HCR_GetFolderAttributes(clsid, &attributes))
     1583       {
     1584         *rgfInOut &= attributes;
     1585         goto next;
     1586       }
     1587     }
     1588     hr = E_INVALIDARG;
     1589
     1590next:   apidl++;
     1591     cidl--;
     1592   }
     1593
     1594   TRACE("-- result=0x%08lx\n",*rgfInOut);
     1595   return hr;
     1596}
     1597
     1598/**************************************************************************
     1599*  ISF_MyComputer_fnGetDisplayNameOf
    15941600*
    15951601* NOTES
    1596 *       The desktopfolder creates only complete paths (SHGDN_FORPARSING).
    1597 *       SHGDN_INFOLDER makes no sense.
     1602*  The desktopfolder creates only complete paths (SHGDN_FORPARSING).
     1603*  SHGDN_INFOLDER makes no sense.
    15981604*/
    15991605static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf(
    1600         IShellFolder * iface,
    1601         LPCITEMIDLIST pidl,
    1602         DWORD dwFlags,
    1603         LPSTRRET strRet)
    1604 {
    1605         ICOM_THIS(IGenericSFImpl, iface);
    1606 
    1607         char            szPath[MAX_PATH], szDrive[18];
    1608         int             len = 0;
    1609         BOOL            bSimplePidl;
    1610                
    1611         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    1612         pdump(pidl);
    1613        
    1614         if(!strRet) return E_INVALIDARG;
    1615        
    1616         szPath[0]=0x00; szDrive[0]=0x00;
    1617        
    1618        
    1619         bSimplePidl = _ILIsPidlSimple(pidl);
    1620        
    1621         if (_ILIsSpecialFolder(pidl))
    1622         {
    1623           /* take names of special folders only if its only this folder */
    1624           if ( bSimplePidl )
    1625           {
    1626             _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
    1627           }
    1628         }
    1629         else
    1630         {
    1631           if (!_ILIsDrive(pidl))
    1632           {
    1633             ERR("Wrong pidl type\n");
    1634             return E_INVALIDARG;
    1635           }
    1636 
    1637           _ILSimpleGetText(pidl, szPath, MAX_PATH);     /* append my own path */
    1638 
    1639           /* long view "lw_name (C:)" */
    1640           if ( bSimplePidl && !(dwFlags & SHGDN_FORPARSING))
    1641           {
    1642             DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
    1643 
    1644             GetVolumeInformationA(szPath,szDrive,12,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
    1645             strcat (szDrive," (");
    1646             strncat (szDrive, szPath, 2);
    1647             strcat (szDrive,")");
    1648             strcpy (szPath, szDrive);
    1649           }
    1650         }
    1651        
    1652         if (!bSimplePidl)       /* go deeper if needed */
    1653         {
    1654           PathAddBackslashA(szPath);
    1655           len = strlen(szPath);
    1656 
    1657           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len)))
    1658             return E_OUTOFMEMORY;
    1659         }
    1660         strRet->uType = STRRET_CSTRA;
    1661         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    1662 
    1663 
    1664         TRACE("-- (%p)->(%s)\n", This, szPath);
    1665         return S_OK;
     1606   IShellFolder * iface,
     1607   LPCITEMIDLIST pidl,
     1608   DWORD dwFlags,
     1609   LPSTRRET strRet)
     1610{
     1611   ICOM_THIS(IGenericSFImpl, iface);
     1612
     1613   char     szPath[MAX_PATH], szDrive[18];
     1614   int      len = 0;
     1615   BOOL     bSimplePidl;
     1616
     1617   TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     1618   pdump(pidl);
     1619
     1620   if(!strRet) return E_INVALIDARG;
     1621
     1622   szPath[0]=0x00; szDrive[0]=0x00;
     1623
     1624
     1625   bSimplePidl = _ILIsPidlSimple(pidl);
     1626
     1627   if (_ILIsSpecialFolder(pidl))
     1628   {
     1629     /* take names of special folders only if its only this folder */
     1630     if ( bSimplePidl )
     1631     {
     1632       _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     1633     }
     1634   }
     1635   else
     1636   {
     1637     if (!_ILIsDrive(pidl))
     1638     {
     1639       ERR("Wrong pidl type\n");
     1640       return E_INVALIDARG;
     1641     }
     1642
     1643     _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     1644
     1645     /* long view "lw_name (C:)" */
     1646     if ( bSimplePidl && !(dwFlags & SHGDN_FORPARSING))
     1647     {
     1648       DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
     1649
     1650       GetVolumeInformationA(szPath,szDrive,12,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
     1651       strcat (szDrive," (");
     1652       strncat (szDrive, szPath, 2);
     1653       strcat (szDrive,")");
     1654       strcpy (szPath, szDrive);
     1655     }
     1656   }
     1657
     1658   if (!bSimplePidl)                     /* go deeper if needed */
     1659   {
     1660     PathAddBackslashA(szPath);
     1661     len = strlen(szPath);
     1662
     1663     if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder*)This, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len)))
     1664       return E_OUTOFMEMORY;
     1665   }
     1666   strRet->uType = STRRET_CSTRA;
     1667   lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     1668
     1669
     1670   TRACE("-- (%p)->(%s)\n", This, szPath);
     1671   return S_OK;
    16661672}
    16671673
    16681674ICOM_VTABLE(IShellFolder) sfmcvt =
    1669 {       
    1670         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1671         IShellFolder_fnQueryInterface,
    1672         IShellFolder_fnAddRef,
    1673         IShellFolder_fnRelease,
    1674         ISF_MyComputer_fnParseDisplayName,
    1675         ISF_MyComputer_fnEnumObjects,
    1676         ISF_MyComputer_fnBindToObject,
    1677         IShellFolder_fnBindToStorage,
    1678         IShellFolder_fnCompareIDs,
    1679         ISF_MyComputer_fnCreateViewObject,
    1680         ISF_MyComputer_fnGetAttributesOf,
    1681         IShellFolder_fnGetUIObjectOf,
    1682         ISF_MyComputer_fnGetDisplayNameOf,
    1683         IShellFolder_fnSetNameOf,
    1684         IShellFolder_fnGetFolderPath
     1675{
     1676   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1677   IShellFolder_fnQueryInterface,
     1678   IShellFolder_fnAddRef,
     1679   IShellFolder_fnRelease,
     1680   ISF_MyComputer_fnParseDisplayName,
     1681   ISF_MyComputer_fnEnumObjects,
     1682   ISF_MyComputer_fnBindToObject,
     1683   IShellFolder_fnBindToStorage,
     1684   IShellFolder_fnCompareIDs,
     1685   ISF_MyComputer_fnCreateViewObject,
     1686   ISF_MyComputer_fnGetAttributesOf,
     1687   IShellFolder_fnGetUIObjectOf,
     1688   ISF_MyComputer_fnGetDisplayNameOf,
     1689   IShellFolder_fnSetNameOf,
     1690   IShellFolder_fnGetFolderPath
    16851691};
    16861692
     
    16911697 */
    16921698static HRESULT WINAPI ISFPersistFolder_QueryInterface(
    1693         IPersistFolder *        iface,
    1694         REFIID                  iid,
    1695         LPVOID*                 ppvObj)
    1696 {
    1697         _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
    1698 
    1699         TRACE("(%p)\n", This);
    1700 
    1701         return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
     1699   IPersistFolder *                      iface,
     1700   REFIID         iid,
     1701   LPVOID*        ppvObj)
     1702{
     1703   _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
     1704
     1705   TRACE("(%p)\n", This);
     1706
     1707   return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
    17021708}
    17031709
     
    17071713 */
    17081714static ULONG WINAPI ISFPersistFolder_AddRef(
    1709         IPersistFolder *        iface)
    1710 {
    1711         _ICOM_THIS_From_IPersistFolder(IShellFolder, iface);
    1712 
    1713         TRACE("(%p)\n", This);
    1714 
    1715         return IShellFolder_AddRef((IShellFolder*)This);
     1715   IPersistFolder *                      iface)
     1716{
     1717   _ICOM_THIS_From_IPersistFolder(IShellFolder, iface);
     1718
     1719   TRACE("(%p)\n", This);
     1720
     1721   return IShellFolder_AddRef((IShellFolder*)This);
    17161722}
    17171723
     
    17211727 */
    17221728static ULONG WINAPI ISFPersistFolder_Release(
    1723         IPersistFolder *        iface)
    1724 {
    1725         _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
    1726 
    1727         TRACE("(%p)\n", This);
    1728 
    1729         return IShellFolder_Release((IShellFolder*)This);
     1729   IPersistFolder *                      iface)
     1730{
     1731   _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
     1732
     1733   TRACE("(%p)\n", This);
     1734
     1735   return IShellFolder_Release((IShellFolder*)This);
    17301736}
    17311737
     
    17341740 */
    17351741static HRESULT WINAPI ISFPersistFolder_GetClassID(
    1736         IPersistFolder *        iface,
    1737         CLSID *                 lpClassId)
    1738 {
    1739         _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
    1740 
    1741         TRACE("(%p)\n", This);
    1742 
    1743         if (!lpClassId) return E_POINTER;
    1744         *lpClassId = *This->pclsid;
    1745 
    1746         return S_OK;
     1742   IPersistFolder *                      iface,
     1743   CLSID *        lpClassId)
     1744{
     1745   _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
     1746
     1747   TRACE("(%p)\n", This);
     1748
     1749   if (!lpClassId) return E_POINTER;
     1750   *lpClassId = *This->pclsid;
     1751
     1752   return S_OK;
    17471753}
    17481754
     
    17541760 */
    17551761static HRESULT WINAPI ISFPersistFolder_Initialize(
    1756         IPersistFolder *        iface,
    1757         LPCITEMIDLIST           pidl)
    1758 {
    1759         _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
    1760 
    1761         TRACE("(%p)\n", This);
    1762 
    1763         if(This->absPidl)
    1764         {
    1765           SHFree(This->absPidl);
    1766           This->absPidl = NULL;
    1767         }
    1768         This->absPidl = ILClone(pidl);
    1769         return S_OK;
     1762   IPersistFolder *                      iface,
     1763   LPCITEMIDLIST                         pidl)
     1764{
     1765   _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
     1766
     1767   TRACE("(%p)\n", This);
     1768
     1769   if(This->absPidl)
     1770   {
     1771     SHFree(This->absPidl);
     1772     This->absPidl = NULL;
     1773   }
     1774   This->absPidl = ILClone(pidl);
     1775   return S_OK;
    17701776}
    17711777
    17721778ICOM_VTABLE(IPersistFolder) psfvt =
    17731779{
    1774         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1775         ISFPersistFolder_QueryInterface,
    1776         ISFPersistFolder_AddRef,
    1777         ISFPersistFolder_Release,
    1778         ISFPersistFolder_GetClassID,
    1779         ISFPersistFolder_Initialize
     1780   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1781   ISFPersistFolder_QueryInterface,
     1782   ISFPersistFolder_AddRef,
     1783   ISFPersistFolder_Release,
     1784   ISFPersistFolder_GetClassID,
     1785   ISFPersistFolder_Initialize
    17801786};
    17811787
     
    17841790 */
    17851791static BOOL ISFDropTarget_QueryDrop(
    1786         IDropTarget *iface,
    1787         DWORD dwKeyState,
    1788         LPDWORD pdwEffect)
    1789 {
    1790         DWORD dwEffect = *pdwEffect;
    1791 
    1792         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1793        
    1794         *pdwEffect = DROPEFFECT_NONE;
    1795 
    1796         if (This->fAcceptFmt)
    1797         { /* Does our interpretation of the keystate ... */
    1798           *pdwEffect = KeyStateToDropEffect(dwKeyState);
    1799        
    1800           /* ... matches the desired effect ? */
    1801           if (dwEffect & *pdwEffect)
    1802           {
    1803             return TRUE;
    1804           }
    1805         }
    1806         return FALSE;
     1792   IDropTarget *iface,
     1793   DWORD dwKeyState,
     1794   LPDWORD pdwEffect)
     1795{
     1796   DWORD dwEffect = *pdwEffect;
     1797
     1798   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1799
     1800   *pdwEffect = DROPEFFECT_NONE;
     1801
     1802   if (This->fAcceptFmt)
     1803   { /* Does our interpretation of the keystate ... */
     1804     *pdwEffect = KeyStateToDropEffect(dwKeyState);
     1805
     1806     /* ... matches the desired effect ? */
     1807     if (dwEffect & *pdwEffect)
     1808     {
     1809       return TRUE;
     1810     }
     1811   }
     1812   return FALSE;
    18071813}
    18081814
    18091815static HRESULT WINAPI ISFDropTarget_QueryInterface(
    1810         IDropTarget *iface,
    1811         REFIID riid,
    1812         LPVOID *ppvObj)
    1813 {
    1814         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1815 
    1816         TRACE("(%p)\n", This);
    1817 
    1818         return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
     1816   IDropTarget *iface,
     1817   REFIID riid,
     1818   LPVOID *ppvObj)
     1819{
     1820   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1821
     1822   TRACE("(%p)\n", This);
     1823
     1824   return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
    18191825}
    18201826
    18211827static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface)
    18221828{
    1823         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1824 
    1825         TRACE("(%p)\n", This);
    1826 
    1827         return IShellFolder_AddRef((IShellFolder*)This);
     1829   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1830
     1831   TRACE("(%p)\n", This);
     1832
     1833   return IShellFolder_AddRef((IShellFolder*)This);
    18281834}
    18291835
    18301836static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface)
    18311837{
    1832         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1833 
    1834         TRACE("(%p)\n", This);
    1835 
    1836         return IShellFolder_Release((IShellFolder*)This);
     1838   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1839
     1840   TRACE("(%p)\n", This);
     1841
     1842   return IShellFolder_Release((IShellFolder*)This);
    18371843}
    18381844
    18391845static HRESULT WINAPI ISFDropTarget_DragEnter(
    1840         IDropTarget     *iface,
    1841         IDataObject     *pDataObject,
    1842         DWORD           dwKeyState,
    1843         POINTL          pt,
    1844         DWORD           *pdwEffect)
    1845 {       
    1846         FORMATETC       fmt;
    1847        
    1848         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1849 
    1850         TRACE("(%p)->(DataObject=%p)\n",This,pDataObject);
    1851 
    1852         InitFormatEtc(fmt, This->cfShellIDList, TYMED_HGLOBAL);
    1853 
    1854         This->fAcceptFmt = (S_OK == IDataObject_QueryGetData(pDataObject, &fmt)) ? TRUE : FALSE;
    1855 
    1856         ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
    1857 
    1858         return S_OK;
     1846   IDropTarget    *iface,
     1847   IDataObject *pDataObject,
     1848   DWORD    dwKeyState,
     1849   POINTL      pt,
     1850   DWORD    *pdwEffect)
     1851{
     1852   FORMATETC   fmt;
     1853
     1854   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1855
     1856   TRACE("(%p)->(DataObject=%p)\n",This,pDataObject);
     1857
     1858   InitFormatEtc(fmt, This->cfShellIDList, TYMED_HGLOBAL);
     1859
     1860   This->fAcceptFmt = (S_OK == IDataObject_QueryGetData(pDataObject, &fmt)) ? TRUE : FALSE;
     1861
     1862   ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
     1863
     1864   return S_OK;
    18591865}
    18601866
    18611867static HRESULT WINAPI ISFDropTarget_DragOver(
    1862         IDropTarget     *iface,
    1863         DWORD           dwKeyState,
    1864         POINTL          pt,
    1865         DWORD           *pdwEffect)
    1866 {
    1867         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1868 
    1869         TRACE("(%p)\n",This);
    1870        
    1871         if(!pdwEffect) return E_INVALIDARG;
    1872 
    1873         ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
    1874 
    1875         return S_OK;
     1868   IDropTarget *iface,
     1869   DWORD    dwKeyState,
     1870   POINTL      pt,
     1871   DWORD    *pdwEffect)
     1872{
     1873   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1874
     1875   TRACE("(%p)\n",This);
     1876
     1877   if(!pdwEffect) return E_INVALIDARG;
     1878
     1879   ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
     1880
     1881   return S_OK;
    18761882}
    18771883
    18781884static HRESULT WINAPI ISFDropTarget_DragLeave(
    1879         IDropTarget     *iface)
    1880 {
    1881         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1882 
    1883         TRACE("(%p)\n",This);
    1884 
    1885         This->fAcceptFmt = FALSE;
    1886        
    1887         return S_OK;
     1885   IDropTarget *iface)
     1886{
     1887   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1888
     1889   TRACE("(%p)\n",This);
     1890
     1891   This->fAcceptFmt = FALSE;
     1892
     1893   return S_OK;
    18881894}
    18891895
    18901896static HRESULT WINAPI ISFDropTarget_Drop(
    1891         IDropTarget     *iface,
    1892         IDataObject*    pDataObject,
    1893         DWORD           dwKeyState,
    1894         POINTL          pt,
    1895         DWORD           *pdwEffect)
    1896 {
    1897         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    1898 
    1899         FIXME("(%p) object dropped\n",This);
    1900 
    1901         return E_NOTIMPL;
     1897   IDropTarget *iface,
     1898   IDataObject*   pDataObject,
     1899   DWORD    dwKeyState,
     1900   POINTL      pt,
     1901   DWORD    *pdwEffect)
     1902{
     1903   _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     1904
     1905   FIXME("(%p) object dropped\n",This);
     1906
     1907   return E_NOTIMPL;
    19021908}
    19031909
    19041910struct ICOM_VTABLE(IDropTarget) dt2vt =
    19051911{
    1906         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1907         ISFDropTarget_QueryInterface,
    1908         ISFDropTarget_AddRef,
    1909         ISFDropTarget_Release,
    1910         ISFDropTarget_DragEnter,
    1911         ISFDropTarget_DragOver,
    1912         ISFDropTarget_DragLeave,
    1913         ISFDropTarget_Drop
     1912   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1913   ISFDropTarget_QueryInterface,
     1914   ISFDropTarget_AddRef,
     1915   ISFDropTarget_Release,
     1916   ISFDropTarget_DragEnter,
     1917   ISFDropTarget_DragOver,
     1918   ISFDropTarget_DragLeave,
     1919   ISFDropTarget_Drop
    19141920};
    19151921
  • trunk/src/shell32/shlmenu.cpp

    r1470 r1558  
    1 /* $Id: shlmenu.cpp,v 1.3 1999-10-27 09:33:48 phaller Exp $ */
     1/* $Id: shlmenu.cpp,v 1.4 1999-11-02 20:38:47 phaller Exp $ */
    22
    33/*
     
    6060
    6161typedef struct
    62 {  BOOL     bInitialized;
    63    BOOL     bIsMagic;
     62{
     63   BOOL     bInitialized;
     64   BOOL     bFixedItems;
    6465
    6566   /* create */
     
    165166     return 0;
    166167
     168   pidl = ((pAlternatePidl) ? pAlternatePidl : menudata->pidl);
     169   if (!pidl)
     170      return 0;
     171
    167172   uID = menudata->uID;
    168    pidl = ((pAlternatePidl) ? pAlternatePidl : menudata->pidl);
    169173   uFlags = menudata->uFlags;
    170174   uEnumFlags = menudata->uEnumFlags;
     
    264268
    265269   menudata = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
    266    menudata->bIsMagic = TRUE;
    267270   menudata->crBorderColor = crBorderColor;
    268271   menudata->nBorderWidth = nBorderWidth;
     
    317320   MENUITEMINFOA  mii;
    318321   LPFMITEM myItem;
     322   LPFMINFO menudata;
     323   MENUINFO MenuInfo;
    319324
    320325   TRACE("0x%08x %s 0x%08x 0x%08x 0x%08x 0x%08x\n",
     
    357362   InsertMenuItemA (hMenu, (UINT)-1, TRUE, &mii);
    358363
     364   /* set bFixedItems to true */
     365   MenuInfo.cbSize = sizeof(MENUINFO);
     366   MenuInfo.fMask = MIM_MENUDATA;
     367
     368   if (! GetMenuInfo(hMenu, &MenuInfo))
     369     return FALSE;
     370
     371   menudata = (LPFMINFO)MenuInfo.dwMenuData;
     372   assert ((menudata != 0) && (MenuInfo.cbSize == sizeof(MENUINFO)));
     373   menudata->bFixedItems = TRUE;
     374   SetMenuInfo(hMenu, &MenuInfo);
     375
    359376   return TRUE;
    360377
     
    549566   /* add the menubitmap */
    550567   menuinfo = FM_GetMenuInfo(pMyItem->hMenu);
    551    if (menuinfo->bIsMagic)
     568   if (menuinfo->nBorderWidth)
    552569     lpmis->itemWidth += menuinfo->nBorderWidth;
    553570
     
    587604   /* add the menubitmap */
    588605   menuinfo = FM_GetMenuInfo(pMyItem->hMenu);
    589    if (menuinfo->bIsMagic)
     606   if (menuinfo->nBorderWidth)
    590607     TextRect.left += menuinfo->nBorderWidth;
    591608
     
    979996}
    980997
    981 
  • trunk/src/shell32/shlview.cpp

    r1431 r1558  
    1 /* $Id: shlview.cpp,v 1.3 1999-10-24 22:50:46 sandervl Exp $ */
     1/* $Id: shlview.cpp,v 1.4 1999-11-02 20:38:48 phaller Exp $ */
    22/*
    3  *      ShellView
     3 * ShellView
    44 *
    5  *      Copyright 1998,1999     <juergen.schmied@metronet.de>
     5 * Copyright 1998,1999                   <juergen.schmied@metronet.de>
    66 *
    77 *  FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
     
    2828#include "wine/obj_dragdrop.h"
    2929#include "wine/undocshell.h"
    30 #include "docobj.h"
    3130#include "shresdef.h"
    3231#include "spy.h"
     
    3433#include "winerror.h"
    3534
     35#include "docobj.h"
    3636#include "pidl.h"
    3737#include "shell32_main.h"
     
    4141DEFAULT_DEBUG_CHANNEL(shell)
    4242
    43 
    4443typedef struct
    45 {       ICOM_VTABLE(IShellView)* lpvtbl;
    46         DWORD           ref;
    47         ICOM_VTABLE(IOleCommandTarget)* lpvtblOleCommandTarget;
    48         ICOM_VTABLE(IDropTarget)*       lpvtblDropTarget;
    49         ICOM_VTABLE(IDropSource)*       lpvtblDropSource;
    50         ICOM_VTABLE(IViewObject)*       lpvtblViewObject;
    51         IShellFolder*   pSFParent;
    52         IShellBrowser*  pShellBrowser;
    53         ICommDlgBrowser*        pCommDlgBrowser;
    54         HWND            hWnd;
    55         HWND            hWndList;
    56         HWND            hWndParent;
    57         FOLDERSETTINGS  FolderSettings;
    58         HMENU           hMenu;
    59         UINT            uState;
    60         UINT            cidl;
    61         LPITEMIDLIST    *apidl;
     44{   BOOL    bIsAscending;
     45    INT     nHeaderID;
     46    INT     nLastHeaderID;
     47}LISTVIEW_SORT_INFO, *LPLISTVIEW_SORT_INFO;
     48
     49typedef struct
     50{  ICOM_VTABLE(IShellView)* lpvtbl;
     51   DWORD    ref;
     52   ICOM_VTABLE(IOleCommandTarget)*       lpvtblOleCommandTarget;
     53   ICOM_VTABLE(IDropTarget)*             lpvtblDropTarget;
     54   ICOM_VTABLE(IDropSource)*             lpvtblDropSource;
     55   ICOM_VTABLE(IViewObject)*             lpvtblViewObject;
     56   IShellFolder*  pSFParent;
     57   IShellBrowser* pShellBrowser;
     58   ICommDlgBrowser*                      pCommDlgBrowser;
     59   HWND     hWnd;
     60   HWND     hWndList;
     61   HWND     hWndParent;
     62   FOLDERSETTINGS FolderSettings;
     63   HMENU    hMenu;
     64   UINT     uState;
     65   UINT     cidl;
     66   LPITEMIDLIST   *apidl;
     67   LISTVIEW_SORT_INFO ListViewSortInfo;
    6268} IShellViewImpl;
    6369
     
    7884#define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject)))
    7985#define _ICOM_THIS_From_IViewObject(myClass, name) myClass* This = (myClass*)(((char*)name)-_IViewObject_Offset);
     86
     87/* ListView Header ID's */
     88#define LISTVIEW_COLUMN_NAME 0
     89#define LISTVIEW_COLUMN_SIZE 1
     90#define LISTVIEW_COLUMN_TYPE 2
     91#define LISTVIEW_COLUMN_TIME 3
     92#define LISTVIEW_COLUMN_ATTRIB 4
    8093
    8194/*menu items */
     
    94107#define WM_SETTINGCHANGE                WM_WININICHANGE
    95108extern void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition,
    96                         UINT wID, UINT fType, LPSTR dwTypeData, UINT fState);
     109         UINT wID, UINT fType, LPSTR dwTypeData, UINT fState);
    97110
    98111/*
     
    120133
    121134/**********************************************************
    122  *      IShellView_Constructor
     135 * IShellView_Constructor
    123136 */
    124137IShellView * IShellView_Constructor( IShellFolder * pFolder)
    125 {       IShellViewImpl * sv;
    126         sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl));
    127         sv->ref=1;
    128         sv->lpvtbl=&svvt;
    129         sv->lpvtblOleCommandTarget=&ctvt;
    130         sv->lpvtblDropTarget=&dtvt;
    131         sv->lpvtblDropSource=&dsvt;
    132         sv->lpvtblViewObject=&vovt;
    133 
    134         sv->pSFParent   = pFolder;
    135 
    136         if(pFolder)
    137           IShellFolder_AddRef(pFolder);
    138 
    139         TRACE("(%p)->(%p)\n",sv, pFolder);
    140         shell32_ObjCount++;
    141         return (IShellView *) sv;
     138{  IShellViewImpl * sv;
     139   sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl));
     140   sv->ref=1;
     141   sv->lpvtbl=&svvt;
     142   sv->lpvtblOleCommandTarget=&ctvt;
     143   sv->lpvtblDropTarget=&dtvt;
     144   sv->lpvtblDropSource=&dsvt;
     145   sv->lpvtblViewObject=&vovt;
     146
     147   sv->pSFParent  = pFolder;
     148
     149   if(pFolder)
     150     IShellFolder_AddRef(pFolder);
     151
     152   TRACE("(%p)->(%p)\n",sv, pFolder);
     153   shell32_ObjCount++;
     154   return (IShellView *) sv;
    142155}
    143156
     
    147160 */
    148161static BOOL IsInCommDlg(IShellViewImpl * This)
    149 {       return(This->pCommDlgBrowser != NULL);
     162{  return(This->pCommDlgBrowser != NULL);
    150163}
    151164
    152165static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
    153166{
    154         HRESULT ret = S_OK;
    155        
    156         if ( IsInCommDlg(This) )
    157         {
    158           TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
    159           ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl);
    160           TRACE("--0x%08lx\n", ret);
    161         }
    162         return ret;
     167   HRESULT ret = S_OK;
     168
     169   if ( IsInCommDlg(This) )
     170   {
     171     TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
     172     ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl);
     173     TRACE("--0x%08lx\n", ret);
     174   }
     175   return ret;
    163176}
    164177
    165178static HRESULT OnDefaultCommand(IShellViewImpl * This)
    166179{
    167         HRESULT ret = S_FALSE;
    168        
    169         if (IsInCommDlg(This))
    170         {
    171           TRACE("ICommDlgBrowser::OnDefaultCommand\n");
    172           ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This);
    173           TRACE("--\n");
    174         }
    175         return ret;
     180   HRESULT ret = S_FALSE;
     181
     182   if (IsInCommDlg(This))
     183   {
     184     TRACE("ICommDlgBrowser::OnDefaultCommand\n");
     185     ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This);
     186     TRACE("--\n");
     187   }
     188   return ret;
    176189}
    177190
    178191static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
    179192{
    180         HRESULT ret = S_FALSE;
    181 
    182         if (IsInCommDlg(This))
    183         {
    184           TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
    185           ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags);
    186           TRACE("--\n");
    187         }
    188         return ret;
     193   HRESULT ret = S_FALSE;
     194
     195   if (IsInCommDlg(This))
     196   {
     197     TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
     198     ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags);
     199     TRACE("--\n");
     200   }
     201   return ret;
    189202}
    190203/**********************************************************
     
    193206 */
    194207/**********************************************************
    195  *      set the toolbar buttons
     208 * set the toolbar buttons
    196209 */
    197210static void CheckToolbar(IShellViewImpl * This)
    198211{
    199         LRESULT result;
    200 
    201         TRACE("\n");
    202        
    203         IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
    204                 FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
    205         IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
    206                 FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
    207         IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
    208                 FCIDM_TB_SMALLICON, TRUE, &result);
    209         IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
    210                 FCIDM_TB_REPORTVIEW, TRUE, &result);
    211 }
    212 
    213 /**********************************************************
    214  *      change the style of the listview control
     212   LRESULT result;
     213
     214   TRACE("\n");
     215
     216   IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
     217      FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
     218   IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
     219      FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
     220   IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
     221      FCIDM_TB_SMALLICON, TRUE, &result);
     222   IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
     223      FCIDM_TB_REPORTVIEW, TRUE, &result);
     224}
     225
     226/**********************************************************
     227 * change the style of the listview control
    215228 */
    216229
    217230static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
    218231{
    219         DWORD tmpstyle;
    220 
    221         TRACE("(%p)\n", This);
    222 
    223         tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
    224         SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
     232   DWORD tmpstyle;
     233
     234   TRACE("(%p)\n", This);
     235
     236   tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
     237   SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
    225238}
    226239
     
    230243*/
    231244static BOOL ShellView_CreateList (IShellViewImpl * This)
    232 {       DWORD dwStyle;
    233 
    234         TRACE("%p\n",This);
    235 
    236         dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
    237                   LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE;
    238 
    239         switch (This->FolderSettings.ViewMode)
    240         {
    241           case FVM_ICON:        dwStyle |= LVS_ICON;            break;
    242           case FVM_DETAILS:     dwStyle |= LVS_REPORT;          break;
    243           case FVM_SMALLICON:   dwStyle |= LVS_SMALLICON;       break;
    244           case FVM_LIST:        dwStyle |= LVS_LIST;            break;
    245           default:              dwStyle |= LVS_LIST;            break;
    246         }
    247 
    248         if (This->FolderSettings.fFlags && FWF_AUTOARRANGE)     dwStyle |= LVS_AUTOARRANGE;
    249         /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
    250         if (This->FolderSettings.fFlags && FWF_SINGLESEL)       dwStyle |= LVS_SINGLESEL;
    251 
    252         This->hWndList=CreateWindowExA( WS_EX_CLIENTEDGE,
    253                                         WC_LISTVIEWA,
    254                                         NULL,
    255                                         dwStyle,
    256                                         0,0,0,0,
    257                                         This->hWnd,
    258                                         (HMENU)ID_LISTVIEW,
    259                                         shell32_hInstance,
    260                                         NULL);
    261 
    262         if(!This->hWndList)
    263           return FALSE;
    264 
    265         /*  UpdateShellSettings(); */
    266         return TRUE;
     245{  DWORD dwStyle;
     246
     247   TRACE("%p\n",This);
     248
     249   dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
     250        LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE;
     251
     252   switch (This->FolderSettings.ViewMode)
     253   {
     254     case FVM_ICON:                      dwStyle |= LVS_ICON;    break;
     255     case FVM_DETAILS:                   dwStyle |= LVS_REPORT;     break;
     256     case FVM_SMALLICON:                 dwStyle |= LVS_SMALLICON;  break;
     257     case FVM_LIST:                      dwStyle |= LVS_LIST;    break;
     258     default:     dwStyle |= LVS_LIST;      break;
     259   }
     260
     261   if (This->FolderSettings.fFlags && FWF_AUTOARRANGE)  dwStyle |= LVS_AUTOARRANGE;
     262   /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
     263   if (This->FolderSettings.fFlags && FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
     264
     265   This->hWndList=CreateWindowExA( WS_EX_CLIENTEDGE,
     266               WC_LISTVIEWA,
     267               NULL,
     268               dwStyle,
     269               0,0,0,0,
     270               This->hWnd,
     271               (HMENU)ID_LISTVIEW,
     272               shell32_hInstance,
     273               NULL);
     274
     275   if(!This->hWndList)
     276     return FALSE;
     277
     278        This->ListViewSortInfo.bIsAscending = TRUE;
     279        This->ListViewSortInfo.nHeaderID = -1;
     280        This->ListViewSortInfo.nLastHeaderID = -1;
     281
     282   /*  UpdateShellSettings(); */
     283   return TRUE;
    267284}
    268285/**********************************************************
     
    271288static BOOL ShellView_InitList(IShellViewImpl * This)
    272289{
    273         LVCOLUMNA lvColumn;
    274         CHAR        szString[50];
    275 
    276         TRACE("%p\n",This);
    277 
    278         ListView_DeleteAllItems(This->hWndList);
    279 
    280         /*initialize the columns */
    281         lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;      /*  |  LVCF_SUBITEM;*/
    282         lvColumn.fmt = LVCFMT_LEFT;
    283         lvColumn.pszText = szString;
    284 
    285         lvColumn.cx = 120;
    286         LoadStringA(shell32_hInstance, IDS_SHV_COLUMN1, szString, sizeof(szString));
    287         ListView_InsertColumnA(This->hWndList, 0, &lvColumn);
    288 
    289         lvColumn.cx = 80;
    290         LoadStringA(shell32_hInstance, IDS_SHV_COLUMN2, szString, sizeof(szString));
    291         ListView_InsertColumnA(This->hWndList, 1, &lvColumn);
    292 
    293         lvColumn.cx = 170;
    294         LoadStringA(shell32_hInstance, IDS_SHV_COLUMN3, szString, sizeof(szString));
    295         ListView_InsertColumnA(This->hWndList, 2, &lvColumn);
    296 
    297         lvColumn.cx = 60;
    298         LoadStringA(shell32_hInstance, IDS_SHV_COLUMN4, szString, sizeof(szString));
    299         ListView_InsertColumnA(This->hWndList, 3, &lvColumn);
    300 
    301         ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL);
    302         ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL);
    303 
    304         return TRUE;
     290   LVCOLUMNA lvColumn;
     291   CHAR        szString[50];
     292
     293   TRACE("%p\n",This);
     294
     295   ListView_DeleteAllItems(This->hWndList);
     296
     297   /*initialize the columns */
     298   lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;   /*  |  LVCF_SUBITEM;*/
     299   lvColumn.fmt = LVCFMT_LEFT;
     300   lvColumn.pszText = szString;
     301
     302   lvColumn.cx = 120;
     303   LoadStringA(shell32_hInstance, IDS_SHV_COLUMN1, szString, sizeof(szString));
     304   ListView_InsertColumnA(This->hWndList, 0, &lvColumn);
     305
     306   lvColumn.cx = 80;
     307   LoadStringA(shell32_hInstance, IDS_SHV_COLUMN2, szString, sizeof(szString));
     308   ListView_InsertColumnA(This->hWndList, 1, &lvColumn);
     309
     310   lvColumn.cx = 170;
     311   LoadStringA(shell32_hInstance, IDS_SHV_COLUMN3, szString, sizeof(szString));
     312   ListView_InsertColumnA(This->hWndList, 2, &lvColumn);
     313
     314   lvColumn.cx = 60;
     315   LoadStringA(shell32_hInstance, IDS_SHV_COLUMN4, szString, sizeof(szString));
     316   ListView_InsertColumnA(This->hWndList, 3, &lvColumn);
     317
     318   ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL);
     319   ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL);
     320
     321   return TRUE;
    305322}
    306323/**********************************************************
     
    312329static INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
    313330{
    314         int ret;
    315         TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
    316 
    317         if(!lpData) return 0;
    318 
    319         ret =  (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2));
    320         TRACE("ret=%i\n",ret);
    321         return ret;
     331   int ret;
     332   TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
     333
     334   if(!lpData) return 0;
     335
     336   ret =  (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2));
     337   TRACE("ret=%i\n",ret);
     338   return ret;
     339}
     340
     341
     342/*************************************************************************
     343 * ShellView_ListViewCompareItems
     344 *
     345 * Compare Function for the Listview (FileOpen Dialog)
     346 *
     347 * PARAMS
     348 *     lParam1       [I] the first ItemIdList to compare with
     349 *     lParam2       [I] the second ItemIdList to compare with
     350 *     lpData        [I] The column ID for the header Ctrl to process
     351 *
     352 * RETURNS
     353 *     A negative value if the first item should precede the second,
     354 *     a positive value if the first item should follow the second,
     355 *     or zero if the two items are equivalent
     356 *
     357 * NOTES
     358 *
     359 */
     360static INT CALLBACK ShellView_ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
     361{
     362    INT nDiff=0;
     363    FILETIME fd1, fd2;
     364    char strName1[MAX_PATH], strName2[MAX_PATH];
     365    BOOL bIsFolder1, bIsFolder2,bIsBothFolder;
     366    LPITEMIDLIST pItemIdList1 = (LPITEMIDLIST) lParam1;
     367    LPITEMIDLIST pItemIdList2 = (LPITEMIDLIST) lParam2;
     368    LISTVIEW_SORT_INFO *pSortInfo = (LPLISTVIEW_SORT_INFO) lpData;
     369
     370
     371    bIsFolder1 = _ILIsFolder(pItemIdList1);
     372    bIsFolder2 = _ILIsFolder(pItemIdList2);
     373    bIsBothFolder = bIsFolder1 && bIsFolder2;
     374
     375    /* When sorting between a File and a Folder, the Folder gets sorted first */
     376    if( (bIsFolder1 || bIsFolder2) && !bIsBothFolder)
     377    {
     378        nDiff = bIsFolder1 ? -1 : 1;
     379    }
     380    else
     381    {
     382        /* Sort by Time: Folders or Files can be sorted */
     383
     384        if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME)
     385        {
     386            _ILGetFileDateTime(pItemIdList1, &fd1);
     387            _ILGetFileDateTime(pItemIdList2, &fd2);
     388            nDiff = CompareFileTime(&fd2, &fd1);
     389        }
     390        /* Sort by Attribute: Folder or Files can be sorted */
     391        else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB)
     392        {
     393            _ILGetAttributeStr(pItemIdList1, strName1, MAX_PATH);
     394            _ILGetAttributeStr(pItemIdList2, strName2, MAX_PATH);
     395            nDiff = strcmp(strName1, strName2);
     396        }
     397        /* Sort by FileName: Folder or Files can be sorted */
     398        else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder)
     399        {
     400            /* Sort by Text */
     401            _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
     402            _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
     403            nDiff = strcmp(strName1, strName2);
     404        }
     405        /* Sort by File Size, Only valid for Files */
     406        else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE)
     407        {
     408            nDiff = (INT)(_ILGetFileSize(pItemIdList1, NULL, 0) - _ILGetFileSize(pItemIdList2, NULL, 0));
     409        }
     410        /* Sort by File Type, Only valid for Files */
     411        else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE)
     412        {
     413            /* Sort by Type */
     414            _ILGetFileType(pItemIdList1, strName1, MAX_PATH);
     415            _ILGetFileType(pItemIdList2, strName2, MAX_PATH);
     416            nDiff = strcmp(strName1, strName2);
     417        }
     418    }
     419    /*  If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
     420
     421    if(nDiff == 0)
     422    {
     423        _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH);
     424        _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH);
     425        nDiff = strcmp(strName1, strName2);
     426    }
     427
     428    if(!pSortInfo->bIsAscending)
     429    {
     430        nDiff = -nDiff;
     431    }
     432
     433    return nDiff;
     434
    322435}
    323436
     
    331444static HRESULT ShellView_FillList(IShellViewImpl * This)
    332445{
    333         LPENUMIDLIST    pEnumIDList;
    334         LPITEMIDLIST    pidl;
    335         DWORD           dwFetched;
    336         UINT            i;
    337         LVITEMA lvItem;
    338         HRESULT         hRes;
    339         HDPA            hdpa;
    340 
    341         TRACE("%p\n",This);
    342 
    343         /* get the itemlist from the shfolder*/
    344         hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
    345         if (hRes != S_OK)
    346         {
    347           if (hRes==S_FALSE)
    348             return(NOERROR);
    349           return(hRes);
    350         }
    351 
    352         /* create a pointer array */   
    353         hdpa = pDPA_Create(16);
    354         if (!hdpa)
    355         {
    356           return(E_OUTOFMEMORY);
    357         }
    358 
    359         /* copy the items into the array*/
    360         while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
    361         {
    362           if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
    363           {
    364             SHFree(pidl);
    365           }
    366         }
    367 
    368         /*sort the array*/
    369         pDPA_Sort(hdpa, (PFNDPACOMPARE)ShellView_CompareItems, (LPARAM)This->pSFParent);
    370 
    371         /*turn the listview's redrawing off*/
    372         SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
    373 
    374         for (i=0; i < DPA_GetPtrCount(hdpa); ++i)       /* DPA_GetPtrCount is a macro*/
    375         {
    376           pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
    377           if (IncludeObject(This, pidl) == S_OK)        /* in a commdlg This works as a filemask*/
    378           {
    379             ZeroMemory(&lvItem, sizeof(lvItem));        /* create the listviewitem*/
    380             lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;          /*set the mask*/
    381             lvItem.iItem = ListView_GetItemCount(This->hWndList);       /*add the item to the end of the list*/
    382             lvItem.lParam = (LPARAM) pidl;                              /*set the item's data*/
    383             lvItem.pszText = LPSTR_TEXTCALLBACKA;                       /*get text on a callback basis*/
    384             lvItem.iImage = I_IMAGECALLBACK;                            /*get the image on a callback basis*/
    385             ListView_InsertItemA(This->hWndList, &lvItem);
    386           }
    387           else
    388             SHFree(pidl);       /* the listview has the COPY*/
    389         }
    390 
    391         /*turn the listview's redrawing back on and force it to draw*/
    392         SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
    393         InvalidateRect(This->hWndList, NULL, TRUE);
    394         UpdateWindow(This->hWndList);
    395 
    396         IEnumIDList_Release(pEnumIDList); /* destroy the list*/
    397         pDPA_Destroy(hdpa);
    398        
    399         return S_OK;
     446   LPENUMIDLIST   pEnumIDList;
     447   LPITEMIDLIST   pidl;
     448   DWORD    dwFetched;
     449   UINT     i;
     450   LVITEMA  lvItem;
     451   HRESULT     hRes;
     452   HDPA     hdpa;
     453
     454   TRACE("%p\n",This);
     455
     456   /* get the itemlist from the shfolder*/
     457   hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
     458   if (hRes != S_OK)
     459   {
     460     if (hRes==S_FALSE)
     461       return(NOERROR);
     462     return(hRes);
     463   }
     464
     465   /* create a pointer array */
     466   hdpa = pDPA_Create(16);
     467   if (!hdpa)
     468   {
     469     return(E_OUTOFMEMORY);
     470   }
     471
     472   /* copy the items into the array*/
     473   while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
     474   {
     475     if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
     476     {
     477       SHFree(pidl);
     478     }
     479   }
     480
     481   /*sort the array*/
     482   pDPA_Sort(hdpa, (PFNDPACOMPARE)ShellView_CompareItems, (LPARAM)This->pSFParent);
     483
     484   /*turn the listview's redrawing off*/
     485   SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
     486
     487   for (i=0; i < DPA_GetPtrCount(hdpa); ++i)   /* DPA_GetPtrCount is a macro*/
     488   {
     489     pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
     490     if (IncludeObject(This, pidl) == S_OK) /* in a commdlg This works as a filemask*/
     491     {
     492       ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/
     493       lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;     /*set the mask*/
     494       lvItem.iItem = ListView_GetItemCount(This->hWndList);  /*add the item to the end of the list*/
     495       lvItem.lParam = (LPARAM) pidl;             /*set the item's data*/
     496       lvItem.pszText = LPSTR_TEXTCALLBACKA;         /*get text on a callback basis*/
     497       lvItem.iImage = I_IMAGECALLBACK;           /*get the image on a callback basis*/
     498       ListView_InsertItemA(This->hWndList, &lvItem);
     499     }
     500     else
     501       SHFree(pidl);                     /* the listview has the COPY*/
     502   }
     503
     504   /*turn the listview's redrawing back on and force it to draw*/
     505   SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
     506   InvalidateRect(This->hWndList, NULL, TRUE);
     507   UpdateWindow(This->hWndList);
     508
     509   IEnumIDList_Release(pEnumIDList); /* destroy the list*/
     510   pDPA_Destroy(hdpa);
     511
     512   return S_OK;
    400513}
    401514
     
    406519{
    407520#if 0
    408         IDropTarget* pdt;
     521   IDropTarget* pdt;
    409522#endif
    410         TRACE("%p\n",This);
    411 
    412         if(ShellView_CreateList(This))
    413         {
    414           if(ShellView_InitList(This))
    415           {
    416             ShellView_FillList(This);
    417           }
    418         }
    419        
     523   TRACE("%p\n",This);
     524
     525   if(ShellView_CreateList(This))
     526   {
     527     if(ShellView_InitList(This))
     528     {
     529       ShellView_FillList(This);
     530     }
     531   }
     532
    420533#if 0
    421         /* This makes a chrash since we havn't called OleInititialize. But if we
    422         do this call in DllMain it breaks some apps. The native shell32 does not
    423         call OleInitialize and not even depend on ole32.dll.
    424         But for some apps it works...*/
    425         if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt)))
    426         {
    427           pRegisterDragDrop(This->hWnd, pdt);
    428           IDropTarget_Release(pdt);
    429         }
     534   /* This makes a chrash since we havn't called OleInititialize. But if we
     535   do this call in DllMain it breaks some apps. The native shell32 does not
     536   call OleInitialize and not even depend on ole32.dll.
     537   But for some apps it works...*/
     538   if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt)))
     539   {
     540     pRegisterDragDrop(This->hWnd, pdt);
     541     IDropTarget_Release(pdt);
     542   }
    430543#endif
    431         return S_OK;
    432 }
    433 
    434 /**********************************************************
    435  *      #### Handling of the menus ####
     544   return S_OK;
     545}
     546
     547/**********************************************************
     548 * #### Handling of the menus ####
    436549 */
    437550
     
    440553*/
    441554static HMENU ShellView_BuildFileMenu(IShellViewImpl * This)
    442 {       CHAR    szText[MAX_PATH];
    443         MENUITEMINFOA   mii;
    444         int     nTools,i;
    445         HMENU   hSubMenu;
    446 
    447         TRACE("(%p)\n",This);
    448 
    449         hSubMenu = CreatePopupMenu();
    450         if(hSubMenu)
    451         { /*get the number of items in our global array*/
    452           for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){}
    453 
    454           /*add the menu items*/
    455           for(i = 0; i < nTools; i++)
    456           {
    457             LoadStringA(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
    458 
    459             ZeroMemory(&mii, sizeof(mii));
    460             mii.cbSize = sizeof(mii);
    461             mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
    462 
    463             if(TBSTYLE_SEP != Tools[i].bStyle) /* no seperator*/
    464             {
    465               mii.fType = MFT_STRING;
    466               mii.fState = MFS_ENABLED;
    467               mii.dwTypeData = szText;
    468               mii.wID = Tools[i].idCommand;
    469             }
    470             else
    471             {
    472               mii.fType = MFT_SEPARATOR;
    473             }
    474             /* tack This item onto the end of the menu */
    475             InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
    476           }
    477         }
    478         TRACE("-- return (menu=0x%x)\n",hSubMenu);
    479         return hSubMenu;
     555{  CHAR  szText[MAX_PATH];
     556   MENUITEMINFOA  mii;
     557   int   nTools,i;
     558   HMENU hSubMenu;
     559
     560   TRACE("(%p)\n",This);
     561
     562   hSubMenu = CreatePopupMenu();
     563   if(hSubMenu)
     564   { /*get the number of items in our global array*/
     565     for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){}
     566
     567     /*add the menu items*/
     568     for(i = 0; i < nTools; i++)
     569     {
     570       LoadStringA(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
     571
     572       ZeroMemory(&mii, sizeof(mii));
     573       mii.cbSize = sizeof(mii);
     574       mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
     575
     576       if(TBSTYLE_SEP != Tools[i].bStyle) /* no seperator*/
     577       {
     578         mii.fType = MFT_STRING;
     579         mii.fState = MFS_ENABLED;
     580         mii.dwTypeData = szText;
     581         mii.wID = Tools[i].idCommand;
     582       }
     583       else
     584       {
     585         mii.fType = MFT_SEPARATOR;
     586       }
     587       /* tack This item onto the end of the menu */
     588       InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
     589     }
     590   }
     591   TRACE("-- return (menu=0x%x)\n",hSubMenu);
     592   return hSubMenu;
    480593}
    481594/**********************************************************
     
    483596*/
    484597static void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu)
    485 {       TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
    486 
    487         if(hSubMenu)
    488         { /*insert This item at the beginning of the menu */
    489           _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
    490           _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
    491 
    492         }
    493         TRACE("--\n"); 
     598{  TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
     599
     600   if(hSubMenu)
     601   { /*insert This item at the beginning of the menu */
     602     _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
     603     _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
     604
     605   }
     606   TRACE("--\n");
    494607}
    495608
     
    499612
    500613static void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu)
    501 {       MENUITEMINFOA   mii;
    502 
    503         TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
    504 
    505         if(hSubMenu)
    506         { /*add a separator at the correct position in the menu*/
    507           _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
    508 
    509           ZeroMemory(&mii, sizeof(mii));
    510           mii.cbSize = sizeof(mii);
    511           mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
    512           mii.fType = MFT_STRING;
    513           mii.dwTypeData = "View";
    514           mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
    515           InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
    516         }
     614{  MENUITEMINFOA  mii;
     615
     616   TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
     617
     618   if(hSubMenu)
     619   { /*add a separator at the correct position in the menu*/
     620     _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
     621
     622     ZeroMemory(&mii, sizeof(mii));
     623     mii.cbSize = sizeof(mii);
     624     mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
     625     mii.fType = MFT_STRING;
     626     mii.dwTypeData = "View";
     627     mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
     628     InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
     629   }
    517630}
    518631
     
    525638static UINT ShellView_GetSelections(IShellViewImpl * This)
    526639{
    527         LVITEMA lvItem;
    528         UINT    i = 0;
    529 
    530         if (This->apidl)
    531         {
    532           SHFree(This->apidl);
    533         }
    534 
    535         This->cidl = ListView_GetSelectedCount(This->hWndList);
    536         This->apidl = (LPITEMIDLIST*)SHAlloc(This->cidl * sizeof(LPITEMIDLIST));
    537 
    538         TRACE("selected=%i\n", This->cidl);
    539        
    540         if(This->apidl)
    541         {
    542           TRACE("-- Items selected =%u\n", This->cidl);
    543 
    544           ZeroMemory(&lvItem, sizeof(lvItem));
    545           lvItem.mask = LVIF_STATE | LVIF_PARAM;
    546           lvItem.stateMask = LVIS_SELECTED;
    547 
    548           while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->cidl))
    549           {
    550             if(lvItem.state & LVIS_SELECTED)
    551             {
    552               This->apidl[i] = (LPITEMIDLIST)lvItem.lParam;
    553               i++;
    554               TRACE("-- selected Item found\n");
    555             }
    556             lvItem.iItem++;
    557           }
    558         }
    559         return This->cidl;
    560 
    561 }
    562 /**********************************************************
    563  *      ShellView_DoContextMenu()
     640   LVITEMA  lvItem;
     641   UINT  i = 0;
     642
     643   if (This->apidl)
     644   {
     645     SHFree(This->apidl);
     646   }
     647
     648   This->cidl = ListView_GetSelectedCount(This->hWndList);
     649   This->apidl = (LPITEMIDLIST*)SHAlloc(This->cidl * sizeof(LPITEMIDLIST));
     650
     651   TRACE("selected=%i\n", This->cidl);
     652
     653   if(This->apidl)
     654   {
     655     TRACE("-- Items selected =%u\n", This->cidl);
     656
     657     ZeroMemory(&lvItem, sizeof(lvItem));
     658     lvItem.mask = LVIF_STATE | LVIF_PARAM;
     659     lvItem.stateMask = LVIS_SELECTED;
     660
     661     while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->cidl))
     662     {
     663       if(lvItem.state & LVIS_SELECTED)
     664       {
     665         This->apidl[i] = (LPITEMIDLIST)lvItem.lParam;
     666         i++;
     667         TRACE("-- selected Item found\n");
     668       }
     669       lvItem.iItem++;
     670     }
     671   }
     672   return This->cidl;
     673
     674}
     675/**********************************************************
     676 * ShellView_DoContextMenu()
    564677 */
    565678static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault)
    566 {       UINT    uCommand;
    567         DWORD   wFlags;
    568         HMENU   hMenu;
    569         BOOL    fExplore = FALSE;
    570         HWND    hwndTree = 0;
    571         LPCONTEXTMENU   pContextMenu = NULL;
    572         IContextMenu *  pCM = NULL;
    573         CMINVOKECOMMANDINFO     cmi;
    574        
    575         TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
    576 
    577         /* look, what's selected and create a context menu object of it*/
    578         if( ShellView_GetSelections(This) )
    579         {
    580           IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, This->apidl,
    581                                         (REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
    582 
    583           if(pContextMenu)
    584           {
    585             TRACE("-- pContextMenu\n");
    586             hMenu = CreatePopupMenu();
    587 
    588             if( hMenu )
    589             {
    590               /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
    591               if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
    592               {
    593                 TRACE("-- explore mode\n");
    594                 fExplore = TRUE;
    595               }
    596 
    597               /* build the flags depending on what we can do with the selected item */
    598               wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
    599 
    600               /* let the ContextMenu merge its items in */
    601               if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
    602               {
    603                 if( bDefault )
    604                 {
    605                   TRACE("-- get menu default command\n");
    606                   uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
    607                 }
    608                 else
    609                 {
    610                   TRACE("-- track popup\n");
    611                   uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
    612                 }               
    613 
    614                 if(uCommand > 0)
    615                 {
    616                   TRACE("-- uCommand=%u\n", uCommand);
    617                   if (IsInCommDlg(This) && ((uCommand==IDM_EXPLORE) || (uCommand==IDM_OPEN)))
    618                   {
    619                     TRACE("-- dlg: OnDefaultCommand\n");
    620                     OnDefaultCommand(This);
    621                   }
    622                   else
    623                   {
    624                     TRACE("-- explore -- invoke command\n");
    625                     ZeroMemory(&cmi, sizeof(cmi));
    626                     cmi.cbSize = sizeof(cmi);
    627                     cmi.hwnd = This->hWndParent;
    628                     cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
    629                     IContextMenu_InvokeCommand(pContextMenu, &cmi);
    630                   }
    631                 }
    632                 DestroyMenu(hMenu);
    633               }
    634             }
    635             if (pContextMenu)
    636               IContextMenu_Release(pContextMenu);
    637           }
    638         }
    639         else    /* background context menu */
    640         {
    641           hMenu = CreatePopupMenu();
    642 
    643           pCM = ISvBgCm_Constructor();
    644           IContextMenu_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
    645 
    646           uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
    647           DestroyMenu(hMenu);
    648 
    649           TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
    650 
    651           ZeroMemory(&cmi, sizeof(cmi));
    652           cmi.cbSize = sizeof(cmi);
    653           cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
    654           cmi.hwnd = This->hWndParent;
    655           IContextMenu_InvokeCommand(pCM, &cmi);
    656 
    657           IContextMenu_Release(pCM);
    658         }
    659 }
    660 
    661 /**********************************************************
    662  *      ##### message handling #####
     679{  UINT  uCommand;
     680   DWORD wFlags;
     681   HMENU hMenu;
     682   BOOL  fExplore = FALSE;
     683   HWND  hwndTree = 0;
     684   LPCONTEXTMENU  pContextMenu = NULL;
     685   IContextMenu * pCM = NULL;
     686   CMINVOKECOMMANDINFO                   cmi;
     687
     688   TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
     689
     690   /* look, what's selected and create a context menu object of it*/
     691   if( ShellView_GetSelections(This) )
     692   {
     693     IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, This->apidl,
     694               (REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
     695
     696     if(pContextMenu)
     697     {
     698       TRACE("-- pContextMenu\n");
     699       hMenu = CreatePopupMenu();
     700
     701       if( hMenu )
     702       {
     703         /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
     704         if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
     705         {
     706           TRACE("-- explore mode\n");
     707           fExplore = TRUE;
     708         }
     709
     710         /* build the flags depending on what we can do with the selected item */
     711         wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
     712
     713         /* let the ContextMenu merge its items in */
     714         if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
     715         {
     716      if( bDefault )
     717      {
     718        TRACE("-- get menu default command\n");
     719        uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
     720      }
     721      else
     722      {
     723        TRACE("-- track popup\n");
     724        uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
     725      }
     726
     727      if(uCommand > 0)
     728      {
     729        TRACE("-- uCommand=%u\n", uCommand);
     730        if (IsInCommDlg(This) && ((uCommand==IDM_EXPLORE) || (uCommand==IDM_OPEN)))
     731        {
     732          TRACE("-- dlg: OnDefaultCommand\n");
     733          OnDefaultCommand(This);
     734        }
     735        else
     736        {
     737          TRACE("-- explore -- invoke command\n");
     738          ZeroMemory(&cmi, sizeof(cmi));
     739          cmi.cbSize = sizeof(cmi);
     740          cmi.hwnd = This->hWndParent;
     741          cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
     742          IContextMenu_InvokeCommand(pContextMenu, &cmi);
     743        }
     744      }
     745      DestroyMenu(hMenu);
     746         }
     747       }
     748       if (pContextMenu)
     749         IContextMenu_Release(pContextMenu);
     750     }
     751   }
     752   else  /* background context menu */
     753   {
     754     hMenu = CreatePopupMenu();
     755
     756     pCM = ISvBgCm_Constructor();
     757     IContextMenu_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
     758
     759     uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
     760     DestroyMenu(hMenu);
     761
     762     TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
     763
     764     ZeroMemory(&cmi, sizeof(cmi));
     765     cmi.cbSize = sizeof(cmi);
     766     cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
     767     cmi.hwnd = This->hWndParent;
     768     IContextMenu_InvokeCommand(pCM, &cmi);
     769
     770     IContextMenu_Release(pCM);
     771   }
     772}
     773
     774/**********************************************************
     775 * ##### message handling #####
    663776 */
    664777
     
    668781static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
    669782{
    670         TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
    671 
    672         /*resize the ListView to fit our window*/
    673         if(This->hWndList)
    674         {
    675           MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
    676         }
    677 
    678         return S_OK;
     783   TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
     784
     785   /*resize the ListView to fit our window*/
     786   if(This->hWndList)
     787   {
     788     MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
     789   }
     790
     791   return S_OK;
    679792}
    680793/**********************************************************
     
    686799static void ShellView_OnDeactivate(IShellViewImpl * This)
    687800{
    688         TRACE("%p\n",This);
    689 
    690         if(This->uState != SVUIA_DEACTIVATE)
    691         {
    692           if(This->hMenu)
    693           {
    694             IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
    695             IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
    696             DestroyMenu(This->hMenu);
    697             This->hMenu = 0;
    698           }
    699 
    700           This->uState = SVUIA_DEACTIVATE;
    701         }
     801   TRACE("%p\n",This);
     802
     803   if(This->uState != SVUIA_DEACTIVATE)
     804   {
     805     if(This->hMenu)
     806     {
     807       IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
     808       IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
     809       DestroyMenu(This->hMenu);
     810       This->hMenu = 0;
     811     }
     812
     813     This->uState = SVUIA_DEACTIVATE;
     814   }
    702815}
    703816
     
    706819*/
    707820static LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState)
    708 {       OLEMENUGROUPWIDTHS   omw = { {0, 0, 0, 0, 0, 0} };
    709         MENUITEMINFOA         mii;
    710         CHAR                szText[MAX_PATH];
    711 
    712         TRACE("%p uState=%x\n",This,uState);
    713 
    714         /*don't do anything if the state isn't really changing */
    715         if(This->uState == uState)
    716         {
    717           return S_OK;
    718         }
    719 
    720         ShellView_OnDeactivate(This);
    721 
    722         /*only do This if we are active */
    723         if(uState != SVUIA_DEACTIVATE)
    724         {
    725           /*merge the menus */
    726           This->hMenu = CreateMenu();
    727 
    728           if(This->hMenu)
    729           {
    730             IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
    731             TRACE("-- after fnInsertMenusSB\n");
    732 
    733             /*build the top level menu get the menu item's text*/
    734             strcpy(szText,"dummy 31");
    735 
    736             ZeroMemory(&mii, sizeof(mii));
    737             mii.cbSize = sizeof(mii);
    738             mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
    739             mii.fType = MFT_STRING;
    740             mii.fState = MFS_ENABLED;
    741             mii.dwTypeData = szText;
    742             mii.hSubMenu = ShellView_BuildFileMenu(This);
    743 
    744             /*insert our menu into the menu bar*/
    745             if(mii.hSubMenu)
    746             {
    747               InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
    748             }
    749 
    750             /*get the view menu so we can merge with it*/
    751             ZeroMemory(&mii, sizeof(mii));
    752             mii.cbSize = sizeof(mii);
    753             mii.fMask = MIIM_SUBMENU;
    754 
    755             if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
    756             {
    757               ShellView_MergeViewMenu(This, mii.hSubMenu);
    758             }
    759 
    760             /*add the items that should only be added if we have the focus*/
    761             if(SVUIA_ACTIVATE_FOCUS == uState)
    762             {
    763               /*get the file menu so we can merge with it */
    764               ZeroMemory(&mii, sizeof(mii));
    765               mii.cbSize = sizeof(mii);
    766               mii.fMask = MIIM_SUBMENU;
    767 
    768               if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
    769               {
    770                 ShellView_MergeFileMenu(This, mii.hSubMenu);
    771               }
    772             }
    773             TRACE("-- before fnSetMenuSB\n");
    774             IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
    775           }
    776         }
    777         This->uState = uState;
    778         TRACE("--\n");
    779         return S_OK;
     821{  OLEMENUGROUPWIDTHS   omw = { {0, 0, 0, 0, 0, 0} };
     822   MENUITEMINFOA         mii;
     823   CHAR                szText[MAX_PATH];
     824
     825   TRACE("%p uState=%x\n",This,uState);
     826
     827   /*don't do anything if the state isn't really changing */
     828   if(This->uState == uState)
     829   {
     830     return S_OK;
     831   }
     832
     833   ShellView_OnDeactivate(This);
     834
     835   /*only do This if we are active */
     836   if(uState != SVUIA_DEACTIVATE)
     837   {
     838     /*merge the menus */
     839     This->hMenu = CreateMenu();
     840
     841     if(This->hMenu)
     842     {
     843       IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
     844       TRACE("-- after fnInsertMenusSB\n");
     845
     846       /*build the top level menu get the menu item's text*/
     847       strcpy(szText,"dummy 31");
     848
     849       ZeroMemory(&mii, sizeof(mii));
     850       mii.cbSize = sizeof(mii);
     851       mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
     852       mii.fType = MFT_STRING;
     853       mii.fState = MFS_ENABLED;
     854       mii.dwTypeData = szText;
     855       mii.hSubMenu = ShellView_BuildFileMenu(This);
     856
     857       /*insert our menu into the menu bar*/
     858       if(mii.hSubMenu)
     859       {
     860         InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
     861       }
     862
     863       /*get the view menu so we can merge with it*/
     864       ZeroMemory(&mii, sizeof(mii));
     865       mii.cbSize = sizeof(mii);
     866       mii.fMask = MIIM_SUBMENU;
     867
     868       if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
     869       {
     870         ShellView_MergeViewMenu(This, mii.hSubMenu);
     871       }
     872
     873       /*add the items that should only be added if we have the focus*/
     874       if(SVUIA_ACTIVATE_FOCUS == uState)
     875       {
     876         /*get the file menu so we can merge with it */
     877         ZeroMemory(&mii, sizeof(mii));
     878         mii.cbSize = sizeof(mii);
     879         mii.fMask = MIIM_SUBMENU;
     880
     881         if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
     882         {
     883           ShellView_MergeFileMenu(This, mii.hSubMenu);
     884         }
     885       }
     886       TRACE("-- before fnSetMenuSB\n");
     887       IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
     888     }
     889   }
     890   This->uState = uState;
     891   TRACE("--\n");
     892   return S_OK;
    780893}
    781894
     
    786899static LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
    787900{
    788         TRACE("%p\n",This);
    789 
    790         /* Tell the browser one of our windows has received the focus. This
    791         should always be done before merging menus (OnActivate merges the
    792         menus) if one of our windows has the focus.*/
    793 
    794         IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
    795         ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
    796 
    797         /* Set the focus to the listview */
    798         SetFocus(This->hWndList);
    799 
    800         /* Notify the ICommDlgBrowser interface */
    801         OnStateChange(This,CDBOSC_SETFOCUS);
    802 
    803         return 0;
     901   TRACE("%p\n",This);
     902
     903   /* Tell the browser one of our windows has received the focus. This
     904   should always be done before merging menus (OnActivate merges the
     905   menus) if one of our windows has the focus.*/
     906
     907   IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
     908   ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
     909
     910   /* Set the focus to the listview */
     911   SetFocus(This->hWndList);
     912
     913   /* Notify the ICommDlgBrowser interface */
     914   OnStateChange(This,CDBOSC_SETFOCUS);
     915
     916   return 0;
    804917}
    805918
     
    809922static LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
    810923{
    811         TRACE("(%p) stub\n",This);
    812 
    813         ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
    814         /* Notify the ICommDlgBrowser */
    815         OnStateChange(This,CDBOSC_KILLFOCUS);
    816 
    817         return 0;
     924   TRACE("(%p) stub\n",This);
     925
     926   ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
     927   /* Notify the ICommDlgBrowser */
     928   OnStateChange(This,CDBOSC_KILLFOCUS);
     929
     930   return 0;
    818931}
    819932
    820933/**********************************************************
    821934* ShellView_OnCommand()
     935*
     936* NOTES
     937*  the CmdID's are the ones from the context menu
    822938*/
    823939static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
    824940{
    825         TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
    826 
    827         switch(dwCmdID)
    828         {
    829           case FCIDM_SHVIEW_SMALLICON:
    830             This->FolderSettings.ViewMode = FVM_SMALLICON;
    831             SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
    832             break;
    833 
    834           case FCIDM_SHVIEW_BIGICON:
    835             This->FolderSettings.ViewMode = FVM_ICON;
    836             SetStyle (This, LVS_ICON, LVS_TYPEMASK);
    837             break;
    838 
    839           case FCIDM_SHVIEW_LISTVIEW:
    840             This->FolderSettings.ViewMode = FVM_LIST;
    841             SetStyle (This, LVS_LIST, LVS_TYPEMASK);
    842             break;
    843 
    844           case FCIDM_SHVIEW_REPORTVIEW:
    845             This->FolderSettings.ViewMode = FVM_DETAILS;
    846             SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
    847             break;
    848 
    849           default:
    850             TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
    851         }
    852         return 0;
     941   TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
     942
     943   switch(dwCmdID)
     944   {
     945     case FCIDM_SHVIEW_SMALLICON:
     946       This->FolderSettings.ViewMode = FVM_SMALLICON;
     947       SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
     948       break;
     949
     950     case FCIDM_SHVIEW_BIGICON:
     951       This->FolderSettings.ViewMode = FVM_ICON;
     952       SetStyle (This, LVS_ICON, LVS_TYPEMASK);
     953       break;
     954
     955     case FCIDM_SHVIEW_LISTVIEW:
     956       This->FolderSettings.ViewMode = FVM_LIST;
     957       SetStyle (This, LVS_LIST, LVS_TYPEMASK);
     958       break;
     959
     960     case FCIDM_SHVIEW_REPORTVIEW:
     961       This->FolderSettings.ViewMode = FVM_DETAILS;
     962       SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
     963       break;
     964
     965     /* the menu-ID's for sorting are 0x30... see shrec.rc */
     966     case 0x30:
     967     case 0x31:
     968     case 0x32:
     969     case 0x33:
     970       ListView_SortItems(This->hWndList, ShellView_ListViewCompareItems, (LPARAM) (dwCmdID - 0x30));
     971       break;
     972
     973     default:
     974       TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
     975   }
     976   return 0;
    853977}
    854978
     
    858982
    859983static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
    860 {       NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
    861         NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
    862         LPITEMIDLIST pidl;
    863         STRRET   str;
    864 
    865         TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
    866 
    867         switch(lpnmh->code)
    868         {
    869           case NM_SETFOCUS:
    870             TRACE("-- NM_SETFOCUS %p\n",This);
    871             ShellView_OnSetFocus(This);
    872             break;
    873 
    874           case NM_KILLFOCUS:
    875             TRACE("-- NM_KILLFOCUS %p\n",This);
    876             ShellView_OnDeactivate(This);
    877             /* Notify the ICommDlgBrowser interface */
    878             OnStateChange(This,CDBOSC_KILLFOCUS);
    879             break;
    880 
    881           case HDN_ENDTRACKA:
    882             TRACE("-- HDN_ENDTRACKA %p\n",This);
    883             /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
    884             nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
    885             break;
    886 
    887           case LVN_DELETEITEM:
    888             TRACE("-- LVN_DELETEITEM %p\n",This);
    889             SHFree((LPITEMIDLIST)lpnmlv->lParam);     /*delete the pidl because we made a copy of it*/
    890             break;
    891 
    892           case LVN_ITEMACTIVATE:
    893             TRACE("-- LVN_ITEMACTIVATE %p\n",This);
    894             OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
    895             ShellView_DoContextMenu(This, 0, 0, TRUE);
    896             break;
    897 
    898           case LVN_GETDISPINFOA:
    899             TRACE("-- LVN_GETDISPINFOA %p\n",This);
    900             pidl = (LPITEMIDLIST)lpdi->item.lParam;
    901 
    902 
    903             if(lpdi->item.iSubItem)               /*is the sub-item information being requested?*/
    904             { if(lpdi->item.mask & LVIF_TEXT)    /*is the text being requested?*/
    905               { if(_ILIsValue(pidl))    /*is This a value or a folder?*/
    906                 { switch (lpdi->item.iSubItem)
    907                   { case 1:     /* size */
    908                       _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
    909                       break;
    910                     case 2:     /* extension */
    911                       { char sTemp[64];
    912                         if (_ILGetExtension (pidl, sTemp, 64))
    913                         { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
    914                                  && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax, FALSE )))
    915                           { lstrcpynA (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax);
    916                             strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax);
    917                           }
    918                         }
    919                         else    /* no extension found */
    920                         { lpdi->item.pszText[0]=0x00;
    921                         }
    922                       }
    923                       break;
    924                     case 3:     /* date */
    925                       _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
    926                       break;
    927                   }
    928                 }
    929                 else  /*its a folder*/
    930                 { switch (lpdi->item.iSubItem)
    931                   { case 1:
    932                       strcpy(lpdi->item.pszText, "");
    933                       break;
    934                     case 2:
    935                       lstrcpynA (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
    936                       break;
    937                     case 3:
    938                       _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
    939                       break;
    940                   }
    941                 }
    942                 TRACE("-- text=%s\n",lpdi->item.pszText);               
    943               }
    944             }
    945             else           /*the item text is being requested*/
    946             {
    947               if(lpdi->item.mask & LVIF_TEXT)      /*is the text being requested?*/
    948               {
    949                 if(SUCCEEDED(IShellFolder_GetDisplayNameOf(This->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
    950                 {
    951                   StrRetToStrNA(lpdi->item.pszText, lpdi->item.cchTextMax, &str, pidl);
    952                 }
    953                 TRACE("-- text=%s\n",lpdi->item.pszText);
    954               }
    955 
    956               if(lpdi->item.mask & LVIF_IMAGE)          /*is the image being requested?*/
    957               {
    958                 lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
    959               }
    960             }
    961             break;
    962 
    963           case LVN_ITEMCHANGED:
    964             TRACE("-- LVN_ITEMCHANGED %p\n",This);
    965             OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
    966             break;
    967 
    968           case LVN_BEGINDRAG:
    969           case LVN_BEGINRDRAG:
    970 
    971             if (ShellView_GetSelections(This))
    972             {
    973               IDataObject * pda;
    974               DWORD dwAttributes;
    975               DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
    976        
    977               if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
    978               {
    979                 IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource);    /* own DropSource interface */
    980 
    981                 if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, This->apidl, &dwAttributes)))
    982                 {
    983                   if (dwAttributes & SFGAO_CANLINK)
    984                   {
    985                     dwEffect |= DROPEFFECT_LINK;
    986                   }
    987                 }
    988                
    989                 if (pds)
    990                 {
    991                   DWORD dwEffect;
    992                   pDoDragDrop(pda, pds, dwEffect, &dwEffect);
    993                 }
    994 
    995                 IDataObject_Release(pda);
    996               }
    997             }
    998             break;
    999 
    1000           case LVN_BEGINLABELEDITA:
    1001           case LVN_ENDLABELEDITA:
    1002              FIXME("labeledit\n");
    1003              break;
    1004        
    1005           default:
    1006 //          TRACE("-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
    1007             break;;
    1008         }
    1009         return 0;
     984{  LPNMLISTVIEW  lpnmlv = (LPNMLISTVIEW)lpnmh;
     985   NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
     986   LPITEMIDLIST pidl;
     987   STRRET   str;
     988
     989   TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
     990
     991   switch(lpnmh->code)
     992   {
     993     case NM_SETFOCUS:
     994       TRACE("-- NM_SETFOCUS %p\n",This);
     995       ShellView_OnSetFocus(This);
     996       break;
     997
     998     case NM_KILLFOCUS:
     999       TRACE("-- NM_KILLFOCUS %p\n",This);
     1000       ShellView_OnDeactivate(This);
     1001       /* Notify the ICommDlgBrowser interface */
     1002       OnStateChange(This,CDBOSC_KILLFOCUS);
     1003       break;
     1004
     1005     case HDN_ENDTRACKA:
     1006       TRACE("-- HDN_ENDTRACKA %p\n",This);
     1007       /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
     1008       nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
     1009       break;
     1010
     1011     case LVN_DELETEITEM:
     1012       TRACE("-- LVN_DELETEITEM %p\n",This);
     1013       SHFree((LPITEMIDLIST)lpnmlv->lParam);     /*delete the pidl because we made a copy of it*/
     1014       break;
     1015
     1016     case LVN_ITEMACTIVATE:
     1017       TRACE("-- LVN_ITEMACTIVATE %p\n",This);
     1018       OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
     1019       ShellView_DoContextMenu(This, 0, 0, TRUE);
     1020       break;
     1021
     1022     case LVN_COLUMNCLICK:
     1023     {
     1024            This->ListViewSortInfo.nHeaderID = lpnmlv->iSubItem;
     1025            if(This->ListViewSortInfo.nLastHeaderID == This->ListViewSortInfo.nHeaderID)
     1026            {
     1027                This->ListViewSortInfo.bIsAscending = !This->ListViewSortInfo.bIsAscending;
     1028            }
     1029            else
     1030            {
     1031                This->ListViewSortInfo.bIsAscending = TRUE;
     1032            }
     1033            This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
     1034
     1035       ListView_SortItems(lpnmlv->hdr.hwndFrom, ShellView_ListViewCompareItems, (LPARAM) (&(This->ListViewSortInfo)));
     1036
     1037       break;
     1038     }
     1039
     1040     case LVN_GETDISPINFOA:
     1041       TRACE("-- LVN_GETDISPINFOA %p\n",This);
     1042       pidl = (LPITEMIDLIST)lpdi->item.lParam;
     1043
     1044
     1045       if(lpdi->item.iSubItem)                /*is the sub-item information being requested?*/
     1046       { if(lpdi->item.mask & LVIF_TEXT)  /*is the text being requested?*/
     1047         { if(_ILIsValue(pidl))          /*is This a value or a folder?*/
     1048           { switch (lpdi->item.iSubItem)
     1049        { case 1: /* size */
     1050            _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
     1051            break;
     1052          case 2: /* extension */
     1053            {  char sTemp[64];
     1054              if (_ILGetExtension (pidl, sTemp, 64))
     1055         { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
     1056                  && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax, FALSE )))
     1057           { lstrcpynA (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax);
     1058             strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax);
     1059           }
     1060         }
     1061         else  /* no extension found */
     1062         { lpdi->item.pszText[0]=0x00;
     1063         }
     1064            }
     1065            break;
     1066          case 3: /* date */
     1067            _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
     1068            break;
     1069        }
     1070           }
     1071           else  /*its a folder*/
     1072           { switch (lpdi->item.iSubItem)
     1073        { case 1:
     1074            strcpy(lpdi->item.pszText, "");
     1075            break;
     1076               case 2:
     1077            lstrcpynA (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
     1078            break;
     1079          case 3:
     1080            _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
     1081            break;
     1082        }
     1083           }
     1084           TRACE("-- text=%s\n",lpdi->item.pszText);
     1085         }
     1086       }
     1087       else    /*the item text is being requested*/
     1088       {
     1089         if(lpdi->item.mask & LVIF_TEXT)    /*is the text being requested?*/
     1090         {
     1091           if(SUCCEEDED(IShellFolder_GetDisplayNameOf(This->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
     1092           {
     1093        StrRetToStrNA(lpdi->item.pszText, lpdi->item.cchTextMax, &str, pidl);
     1094           }
     1095           TRACE("-- text=%s\n",lpdi->item.pszText);
     1096         }
     1097
     1098         if(lpdi->item.mask & LVIF_IMAGE)      /*is the image being requested?*/
     1099         {
     1100           lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
     1101         }
     1102       }
     1103       break;
     1104
     1105     case LVN_ITEMCHANGED:
     1106       TRACE("-- LVN_ITEMCHANGED %p\n",This);
     1107       OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
     1108       break;
     1109
     1110     case LVN_BEGINDRAG:
     1111     case LVN_BEGINRDRAG:
     1112
     1113       if (ShellView_GetSelections(This))
     1114       {
     1115         IDataObject * pda;
     1116         DWORD dwAttributes;
     1117         DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
     1118
     1119         if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
     1120         {
     1121           IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource);   /* own DropSource interface */
     1122
     1123      if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, This->apidl, &dwAttributes)))
     1124      {
     1125        if (dwAttributes & SFGAO_CANLINK)
     1126        {
     1127          dwEffect |= DROPEFFECT_LINK;
     1128        }
     1129      }
     1130
     1131           if (pds)
     1132           {
     1133             DWORD dwEffect;
     1134        pDoDragDrop(pda, pds, dwEffect, &dwEffect);
     1135      }
     1136
     1137           IDataObject_Release(pda);
     1138         }
     1139       }
     1140       break;
     1141
     1142     case LVN_BEGINLABELEDITA:
     1143     case LVN_ENDLABELEDITA:
     1144        FIXME("labeledit\n");
     1145        break;
     1146
     1147     default:
     1148//     TRACE("-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
     1149       break;;
     1150   }
     1151   return 0;
    10101152}
    10111153
     
    10161158static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
    10171159{
    1018         IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongA(hWnd, GWL_USERDATA);
    1019         LPCREATESTRUCTA lpcs;
    1020 
    1021         TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
    1022 
    1023         switch (uMessage)
    1024         {
    1025           case WM_NCCREATE:
    1026             lpcs = (LPCREATESTRUCTA)lParam;
    1027             pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
    1028             SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
    1029             pThis->hWnd = hWnd;        /*set the window handle*/
    1030             break;
    1031 
    1032           case WM_SIZE:         return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
    1033           case WM_SETFOCUS:     return ShellView_OnSetFocus(pThis);
    1034           case WM_KILLFOCUS:    return ShellView_OnKillFocus(pThis);
    1035           case WM_CREATE:       return ShellView_OnCreate(pThis);
    1036           case WM_ACTIVATE:     return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
    1037           case WM_NOTIFY:       return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
    1038           case WM_COMMAND:      return ShellView_OnCommand(pThis,
    1039                                         GET_WM_COMMAND_ID(wParam, lParam),
    1040                                         GET_WM_COMMAND_CMD(wParam, lParam),
    1041                                         GET_WM_COMMAND_HWND(wParam, lParam));
    1042 
    1043           case WM_CONTEXTMENU:  ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
    1044                                 return 0;
    1045 
    1046           case WM_SHOWWINDOW:   UpdateWindow(pThis->hWndList);
    1047                                 break;
    1048 
    1049           case WM_GETDLGCODE:   return SendMessageA(pThis->hWndList,uMessage,0,0);
    1050 
    1051           case WM_DESTROY:      pRevokeDragDrop(pThis->hWnd);
    1052                                 break;
    1053         }
    1054 
    1055         return DefWindowProcA (hWnd, uMessage, wParam, lParam);
     1160   IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongA(hWnd, GWL_USERDATA);
     1161   LPCREATESTRUCTA lpcs;
     1162
     1163   TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
     1164
     1165   switch (uMessage)
     1166   {
     1167     case WM_NCCREATE:
     1168       lpcs = (LPCREATESTRUCTA)lParam;
     1169       pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
     1170       SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
     1171       pThis->hWnd = hWnd;        /*set the window handle*/
     1172       break;
     1173
     1174     case WM_SIZE:                          return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
     1175     case WM_SETFOCUS:                   return ShellView_OnSetFocus(pThis);
     1176     case WM_KILLFOCUS:                  return ShellView_OnKillFocus(pThis);
     1177     case WM_CREATE:                     return ShellView_OnCreate(pThis);
     1178     case WM_ACTIVATE:                   return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
     1179     case WM_NOTIFY:                     return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
     1180     case WM_COMMAND:      return ShellView_OnCommand(pThis,
     1181               GET_WM_COMMAND_ID(wParam, lParam),
     1182               GET_WM_COMMAND_CMD(wParam, lParam),
     1183               GET_WM_COMMAND_HWND(wParam, lParam));
     1184
     1185     case WM_CONTEXTMENU:  ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
     1186                           return 0;
     1187
     1188     case WM_SHOWWINDOW:                 UpdateWindow(pThis->hWndList);
     1189            break;
     1190
     1191     case WM_GETDLGCODE:                 return SendMessageA(pThis->hWndList,uMessage,0,0);
     1192
     1193     case WM_DESTROY:                    pRevokeDragDrop(pThis->hWnd);
     1194                           break;
     1195   }
     1196
     1197   return DefWindowProcA (hWnd, uMessage, wParam, lParam);
    10561198}
    10571199/**********************************************************
     
    10661208static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj)
    10671209{
    1068         ICOM_THIS(IShellViewImpl, iface);
    1069 
    1070         char    xriid[50];
    1071         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1072         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    1073 
    1074         *ppvObj = NULL;
    1075 
    1076         if(IsEqualIID(riid, &IID_IUnknown))
    1077         {
    1078           *ppvObj = This;
    1079         }
    1080         else if(IsEqualIID(riid, &IID_IShellView))
    1081         {
    1082           *ppvObj = (IShellView*)This;
    1083         }
    1084         else if(IsEqualIID(riid, &IID_IOleCommandTarget))
    1085         {
    1086           *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
    1087         }
    1088         else if(IsEqualIID(riid, &IID_IDropTarget))
    1089         {
    1090           *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
    1091         }
    1092         else if(IsEqualIID(riid, &IID_IDropSource))
    1093         {
    1094           *ppvObj = (IDropSource*)&(This->lpvtblDropSource);
    1095         }
    1096         else if(IsEqualIID(riid, &IID_IViewObject))
    1097         {
    1098           *ppvObj = (IViewObject*)&(This->lpvtblViewObject);
    1099         }
    1100 
    1101         if(*ppvObj)
    1102         {
    1103           IUnknown_AddRef( (IUnknown*)*ppvObj );
    1104           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    1105           return S_OK;
    1106         }
    1107         TRACE("-- Interface: E_NOINTERFACE\n");
    1108         return E_NOINTERFACE;
     1210   ICOM_THIS(IShellViewImpl, iface);
     1211
     1212   char    xriid[50];
     1213   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1214   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     1215
     1216   *ppvObj = NULL;
     1217
     1218   if(IsEqualIID(riid, &IID_IUnknown))
     1219   {
     1220     *ppvObj = This;
     1221   }
     1222   else if(IsEqualIID(riid, &IID_IShellView))
     1223   {
     1224     *ppvObj = (IShellView*)This;
     1225   }
     1226   else if(IsEqualIID(riid, &IID_IOleCommandTarget))
     1227   {
     1228     *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
     1229   }
     1230   else if(IsEqualIID(riid, &IID_IDropTarget))
     1231   {
     1232     *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
     1233   }
     1234   else if(IsEqualIID(riid, &IID_IDropSource))
     1235   {
     1236     *ppvObj = (IDropSource*)&(This->lpvtblDropSource);
     1237   }
     1238   else if(IsEqualIID(riid, &IID_IViewObject))
     1239   {
     1240     *ppvObj = (IViewObject*)&(This->lpvtblViewObject);
     1241   }
     1242
     1243   if(*ppvObj)
     1244   {
     1245     IUnknown_AddRef( (IUnknown*)*ppvObj );
     1246     TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     1247     return S_OK;
     1248   }
     1249   TRACE("-- Interface: E_NOINTERFACE\n");
     1250   return E_NOINTERFACE;
    11091251}
    11101252
     
    11141256static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
    11151257{
    1116         ICOM_THIS(IShellViewImpl, iface);
    1117 
    1118         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1119 
    1120         shell32_ObjCount++;
    1121         return ++(This->ref);
     1258   ICOM_THIS(IShellViewImpl, iface);
     1259
     1260   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1261
     1262   shell32_ObjCount++;
     1263   return ++(This->ref);
    11221264}
    11231265/**********************************************************
     
    11261268static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
    11271269{
    1128         ICOM_THIS(IShellViewImpl, iface);
    1129 
    1130         TRACE("(%p)->()\n",This);
    1131 
    1132         shell32_ObjCount--;
    1133 
    1134         if (!--(This->ref))
    1135         {
    1136           TRACE(" destroying IShellView(%p)\n",This);
    1137 
    1138           if(This->pSFParent)
    1139             IShellFolder_Release(This->pSFParent);
    1140 
    1141           if (This->apidl)
    1142             SHFree(This->apidl);
    1143 
    1144           if (This->pCommDlgBrowser)
    1145             ICommDlgBrowser_Release(This->pCommDlgBrowser);
    1146 
    1147           HeapFree(GetProcessHeap(),0,This);
    1148           return 0;
    1149         }
    1150         return This->ref;
     1270   ICOM_THIS(IShellViewImpl, iface);
     1271
     1272   TRACE("(%p)->()\n",This);
     1273
     1274   shell32_ObjCount--;
     1275
     1276   if (!--(This->ref))
     1277   {
     1278     TRACE(" destroying IShellView(%p)\n",This);
     1279
     1280     if(This->pSFParent)
     1281       IShellFolder_Release(This->pSFParent);
     1282
     1283     if (This->apidl)
     1284       SHFree(This->apidl);
     1285
     1286     if (This->pCommDlgBrowser)
     1287       ICommDlgBrowser_Release(This->pCommDlgBrowser);
     1288
     1289     HeapFree(GetProcessHeap(),0,This);
     1290     return 0;
     1291   }
     1292   return This->ref;
    11511293}
    11521294
     
    11561298static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd)
    11571299{
    1158         ICOM_THIS(IShellViewImpl, iface);
    1159 
    1160         TRACE("(%p)\n",This);
    1161 
    1162         *phWnd = This->hWnd;
    1163 
    1164         return S_OK;
     1300   ICOM_THIS(IShellViewImpl, iface);
     1301
     1302   TRACE("(%p)\n",This);
     1303
     1304   *phWnd = This->hWnd;
     1305
     1306   return S_OK;
    11651307}
    11661308
    11671309static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode)
    11681310{
    1169         ICOM_THIS(IShellViewImpl, iface);
    1170 
    1171         FIXME("(%p) stub\n",This);
    1172 
    1173         return E_NOTIMPL;
     1311   ICOM_THIS(IShellViewImpl, iface);
     1312
     1313   FIXME("(%p) stub\n",This);
     1314
     1315   return E_NOTIMPL;
    11741316}
    11751317
     
    11821324static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg)
    11831325{
    1184         ICOM_THIS(IShellViewImpl, iface);
    1185 
    1186         FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
    1187 
    1188        
    1189         switch (lpmsg->message)
    1190         { case WM_KEYDOWN:      TRACE("-- key=0x04%x",lpmsg->wParam) ;
    1191         }
    1192         return NOERROR;
     1326   ICOM_THIS(IShellViewImpl, iface);
     1327
     1328   FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
     1329
     1330
     1331   switch (lpmsg->message)
     1332   { case WM_KEYDOWN:                    TRACE("-- key=0x04%x",lpmsg->wParam) ;
     1333   }
     1334   return NOERROR;
    11931335}
    11941336
    11951337static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable)
    11961338{
    1197         ICOM_THIS(IShellViewImpl, iface);
    1198 
    1199         FIXME("(%p) stub\n",This);
    1200 
    1201         return E_NOTIMPL;
     1339   ICOM_THIS(IShellViewImpl, iface);
     1340
     1341   FIXME("(%p) stub\n",This);
     1342
     1343   return E_NOTIMPL;
    12021344}
    12031345
    12041346static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState)
    12051347{
    1206         ICOM_THIS(IShellViewImpl, iface);
    1207 
    1208         CHAR    szName[MAX_PATH];
    1209         LRESULT lResult;
    1210         int     nPartArray[1] = {-1};
    1211 
    1212         TRACE("(%p)->(state=%x) stub\n",This, uState);
    1213 
    1214         /*don't do anything if the state isn't really changing*/
    1215         if(This->uState == uState)
    1216         {
    1217           return S_OK;
    1218         }
    1219 
    1220         /*OnActivate handles the menu merging and internal state*/
    1221         ShellView_OnActivate(This, uState);
    1222 
    1223         /*only do This if we are active*/
    1224         if(uState != SVUIA_DEACTIVATE)
    1225         {
    1226 
    1227           IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
    1228 
    1229           /* set the number of parts */
    1230           IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
    1231                                                         (LPARAM)nPartArray, &lResult);
    1232 
    1233           /* set the text for the parts */
    1234           IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
    1235                                                         0, (LPARAM)szName, &lResult);
    1236         }
    1237 
    1238         return S_OK;
     1348   ICOM_THIS(IShellViewImpl, iface);
     1349
     1350   CHAR  szName[MAX_PATH];
     1351   LRESULT  lResult;
     1352   int   nPartArray[1] = {-1};
     1353
     1354   TRACE("(%p)->(state=%x) stub\n",This, uState);
     1355
     1356   /*don't do anything if the state isn't really changing*/
     1357   if(This->uState == uState)
     1358   {
     1359     return S_OK;
     1360   }
     1361
     1362   /*OnActivate handles the menu merging and internal state*/
     1363   ShellView_OnActivate(This, uState);
     1364
     1365   /*only do This if we are active*/
     1366   if(uState != SVUIA_DEACTIVATE)
     1367   {
     1368
     1369     IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
     1370
     1371     /* set the number of parts */
     1372     IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
     1373                                         (LPARAM)nPartArray, &lResult);
     1374
     1375     /* set the text for the parts */
     1376     IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
     1377                                         0, (LPARAM)szName, &lResult);
     1378   }
     1379
     1380   return S_OK;
    12391381}
    12401382
    12411383static HRESULT WINAPI IShellView_fnRefresh(IShellView * iface)
    12421384{
    1243         ICOM_THIS(IShellViewImpl, iface);
    1244 
    1245         TRACE("(%p)\n",This);
    1246 
    1247         ListView_DeleteAllItems(This->hWndList);
    1248         ShellView_FillList(This);
    1249 
    1250         return S_OK;
     1385   ICOM_THIS(IShellViewImpl, iface);
     1386
     1387   TRACE("(%p)\n",This);
     1388
     1389   ListView_DeleteAllItems(This->hWndList);
     1390   ShellView_FillList(This);
     1391
     1392   return S_OK;
    12511393}
    12521394
    12531395static HRESULT WINAPI IShellView_fnCreateViewWindow(
    1254         IShellView * iface,
    1255         IShellView *lpPrevView,
    1256         LPCFOLDERSETTINGS lpfs,
    1257         IShellBrowser * psb,
    1258         RECT * prcView,
    1259         HWND  *phWnd)
    1260 {
    1261         ICOM_THIS(IShellViewImpl, iface);
    1262 
    1263         WNDCLASSA wc;
    1264         *phWnd = 0;
    1265 
    1266        
    1267         TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
    1268         TRACE("-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
    1269 
    1270         /*set up the member variables*/
    1271         This->pShellBrowser = psb;
    1272         This->FolderSettings = *lpfs;
    1273 
    1274         /*get our parent window*/
    1275         IShellBrowser_AddRef(This->pShellBrowser);
    1276         IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent));
    1277 
    1278         /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
    1279         This->pCommDlgBrowser=NULL;
    1280         if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser,
    1281                         (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
    1282         {
    1283           TRACE("-- CommDlgBrowser\n");
    1284         }
    1285 
    1286         /*if our window class has not been registered, then do so*/
     1396   IShellView * iface,
     1397   IShellView *lpPrevView,
     1398   LPCFOLDERSETTINGS lpfs,
     1399   IShellBrowser * psb,
     1400   RECT * prcView,
     1401   HWND  *phWnd)
     1402{
     1403   ICOM_THIS(IShellViewImpl, iface);
     1404
     1405   WNDCLASSA wc;
     1406   *phWnd = 0;
     1407
     1408
     1409   TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
     1410   TRACE("-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
     1411
     1412   /*set up the member variables*/
     1413   This->pShellBrowser = psb;
     1414   This->FolderSettings = *lpfs;
     1415
     1416   /*get our parent window*/
     1417   IShellBrowser_AddRef(This->pShellBrowser);
     1418   IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent));
     1419
     1420   /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
     1421   This->pCommDlgBrowser=NULL;
     1422   if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser,
     1423         (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
     1424   {
     1425     TRACE("-- CommDlgBrowser\n");
     1426   }
     1427
     1428   /*if our window class has not been registered, then do so*/
    12871429//SvL: Don't check this now
    1288 //      if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc))
    1289 //      {
    1290           ZeroMemory(&wc, sizeof(wc));
    1291           wc.style              = CS_HREDRAW | CS_VREDRAW;
    1292           wc.lpfnWndProc        = (WNDPROC) ShellView_WndProc;
    1293           wc.cbClsExtra         = 0;
    1294           wc.cbWndExtra         = 0;
    1295           wc.hInstance          = shell32_hInstance;
    1296           wc.hIcon              = 0;
    1297           wc.hCursor            = LoadCursorA (0, IDC_ARROWA);
    1298           wc.hbrBackground      = (HBRUSH) (COLOR_WINDOW + 1);
    1299           wc.lpszMenuName       = NULL;
    1300           wc.lpszClassName      = SV_CLASS_NAME;
    1301 
    1302           if(!RegisterClassA(&wc))
    1303             return E_FAIL;
    1304 //      }
    1305 
    1306         *phWnd = CreateWindowExA(0,
    1307                                 SV_CLASS_NAME,
    1308                                 NULL,
    1309                                 WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP,
    1310                                 prcView->left,
    1311                                 prcView->top,
    1312                                 prcView->right - prcView->left,
    1313                                 prcView->bottom - prcView->top,
    1314                                 This->hWndParent,
    1315                                 0,
    1316                                 shell32_hInstance,
    1317                                 (LPVOID)This);
    1318 
    1319         CheckToolbar(This);
    1320        
    1321         if(!*phWnd)
    1322           return E_FAIL;
    1323 
    1324         return S_OK;
     1430// if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc))
     1431// {
     1432     ZeroMemory(&wc, sizeof(wc));
     1433     wc.style     = CS_HREDRAW | CS_VREDRAW;
     1434     wc.lpfnWndProc                      = (WNDPROC) ShellView_WndProc;
     1435     wc.cbClsExtra                          = 0;
     1436     wc.cbWndExtra                          = 0;
     1437     wc.hInstance                        = shell32_hInstance;
     1438     wc.hIcon     = 0;
     1439     wc.hCursor                          = LoadCursorA (0, IDC_ARROWA);
     1440     wc.hbrBackground                    = (HBRUSH) (COLOR_WINDOW + 1);
     1441     wc.lpszMenuName                     = NULL;
     1442     wc.lpszClassName                    = SV_CLASS_NAME;
     1443
     1444     if(!RegisterClassA(&wc))
     1445       return E_FAIL;
     1446// }
     1447
     1448   *phWnd = CreateWindowExA(0,
     1449            SV_CLASS_NAME,
     1450            NULL,
     1451            WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP,
     1452            prcView->left,
     1453            prcView->top,
     1454            prcView->right - prcView->left,
     1455            prcView->bottom - prcView->top,
     1456            This->hWndParent,
     1457            0,
     1458            shell32_hInstance,
     1459            (LPVOID)This);
     1460
     1461   CheckToolbar(This);
     1462
     1463   if(!*phWnd)
     1464     return E_FAIL;
     1465
     1466   return S_OK;
    13251467}
    13261468
    13271469static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface)
    13281470{
    1329         ICOM_THIS(IShellViewImpl, iface);
    1330 
    1331         TRACE("(%p)\n",This);
    1332 
    1333         /*Make absolutely sure all our UI is cleaned up.*/
    1334         IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
    1335 
    1336         if(This->hMenu)
    1337         {
    1338           DestroyMenu(This->hMenu);
    1339         }
    1340 
    1341         DestroyWindow(This->hWnd);
    1342         IShellBrowser_Release(This->pShellBrowser);
    1343 
    1344         return S_OK;
     1471   ICOM_THIS(IShellViewImpl, iface);
     1472
     1473   TRACE("(%p)\n",This);
     1474
     1475   /*Make absolutely sure all our UI is cleaned up.*/
     1476   IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
     1477
     1478   if(This->hMenu)
     1479   {
     1480     DestroyMenu(This->hMenu);
     1481   }
     1482
     1483   DestroyWindow(This->hWnd);
     1484   IShellBrowser_Release(This->pShellBrowser);
     1485
     1486   return S_OK;
    13451487}
    13461488
    13471489static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView * iface, LPFOLDERSETTINGS lpfs)
    13481490{
    1349         ICOM_THIS(IShellViewImpl, iface);
    1350 
    1351         TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
    1352                 This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
    1353 
    1354         if (!lpfs) return E_INVALIDARG;
    1355 
    1356         *lpfs = This->FolderSettings;
    1357         return NOERROR;
     1491   ICOM_THIS(IShellViewImpl, iface);
     1492
     1493   TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
     1494      This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
     1495
     1496   if (!lpfs) return E_INVALIDARG;
     1497
     1498   *lpfs = This->FolderSettings;
     1499   return NOERROR;
    13581500}
    13591501
    13601502static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView * iface, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
    13611503{
    1362         ICOM_THIS(IShellViewImpl, iface);
    1363 
    1364         FIXME("(%p) stub\n",This);
    1365 
    1366         return E_NOTIMPL;
     1504   ICOM_THIS(IShellViewImpl, iface);
     1505
     1506   FIXME("(%p) stub\n",This);
     1507
     1508   return E_NOTIMPL;
    13671509}
    13681510
    13691511static HRESULT WINAPI IShellView_fnSaveViewState(IShellView * iface)
    13701512{
    1371         ICOM_THIS(IShellViewImpl, iface);
    1372 
    1373         FIXME("(%p) stub\n",This);
    1374 
    1375         return S_OK;
     1513   ICOM_THIS(IShellViewImpl, iface);
     1514
     1515   FIXME("(%p) stub\n",This);
     1516
     1517   return S_OK;
    13761518}
    13771519
    13781520static HRESULT WINAPI IShellView_fnSelectItem(IShellView * iface, LPCITEMIDLIST pidlItem, UINT uFlags)
    1379 {       ICOM_THIS(IShellViewImpl, iface);
    1380        
    1381         FIXME("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
    1382 
    1383         return E_NOTIMPL;
     1521{  ICOM_THIS(IShellViewImpl, iface);
     1522
     1523   FIXME("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
     1524
     1525   return E_NOTIMPL;
    13841526}
    13851527
    13861528static HRESULT WINAPI IShellView_fnGetItemObject(IShellView * iface, UINT uItem, REFIID riid, LPVOID *ppvOut)
    13871529{
    1388         ICOM_THIS(IShellViewImpl, iface);
    1389 
    1390         char    xriid[50];
    1391        
    1392         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1393         TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
    1394 
    1395         *ppvOut = NULL;
    1396 
    1397         switch(uItem)
    1398         {
    1399           case SVGIO_BACKGROUND:
    1400             *ppvOut = ISvBgCm_Constructor();
    1401             break;
    1402 
    1403           case SVGIO_SELECTION:
    1404             ShellView_GetSelections(This);
    1405             IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, riid, 0, ppvOut);
    1406             break;
    1407         }
    1408         TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut);
    1409 
    1410         if(!*ppvOut) return E_OUTOFMEMORY;
    1411 
    1412         return S_OK;
     1530   ICOM_THIS(IShellViewImpl, iface);
     1531
     1532   char    xriid[50];
     1533
     1534   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1535   TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
     1536
     1537   *ppvOut = NULL;
     1538
     1539   switch(uItem)
     1540   {
     1541     case SVGIO_BACKGROUND:
     1542       *ppvOut = ISvBgCm_Constructor();
     1543       break;
     1544
     1545     case SVGIO_SELECTION:
     1546       ShellView_GetSelections(This);
     1547       IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, riid, 0, ppvOut);
     1548       break;
     1549   }
     1550   TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut);
     1551
     1552   if(!*ppvOut) return E_OUTOFMEMORY;
     1553
     1554   return S_OK;
    14131555}
    14141556
    14151557struct ICOM_VTABLE(IShellView) svvt =
    1416 {       
    1417         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1418         IShellView_fnQueryInterface,
    1419         IShellView_fnAddRef,
    1420         IShellView_fnRelease,
    1421         IShellView_fnGetWindow,
    1422         IShellView_fnContextSensitiveHelp,
    1423         IShellView_fnTranslateAccelerator,
    1424         IShellView_fnEnableModeless,
    1425         IShellView_fnUIActivate,
    1426         IShellView_fnRefresh,
    1427         IShellView_fnCreateViewWindow,
    1428         IShellView_fnDestroyViewWindow,
    1429         IShellView_fnGetCurrentInfo,
    1430         IShellView_fnAddPropertySheetPages,
    1431         IShellView_fnSaveViewState,
    1432         IShellView_fnSelectItem,
    1433         IShellView_fnGetItemObject
     1558{
     1559   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1560   IShellView_fnQueryInterface,
     1561   IShellView_fnAddRef,
     1562   IShellView_fnRelease,
     1563   IShellView_fnGetWindow,
     1564   IShellView_fnContextSensitiveHelp,
     1565   IShellView_fnTranslateAccelerator,
     1566   IShellView_fnEnableModeless,
     1567   IShellView_fnUIActivate,
     1568   IShellView_fnRefresh,
     1569   IShellView_fnCreateViewWindow,
     1570   IShellView_fnDestroyViewWindow,
     1571   IShellView_fnGetCurrentInfo,
     1572   IShellView_fnAddPropertySheetPages,
     1573   IShellView_fnSaveViewState,
     1574   IShellView_fnSelectItem,
     1575   IShellView_fnGetItemObject
    14341576};
    14351577
     
    14391581 */
    14401582static HRESULT WINAPI ISVOleCmdTarget_QueryInterface(
    1441         IOleCommandTarget *     iface,
    1442         REFIID                  iid,
    1443         LPVOID*                 ppvObj)
    1444 {
    1445         _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
    1446 
    1447         return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
     1583   IOleCommandTarget *                   iface,
     1584   REFIID         iid,
     1585   LPVOID*        ppvObj)
     1586{
     1587   _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
     1588
     1589   return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
    14481590}
    14491591
     
    14521594 */
    14531595static ULONG WINAPI ISVOleCmdTarget_AddRef(
    1454         IOleCommandTarget *     iface)
    1455 {
    1456         _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface);
    1457 
    1458         return IShellFolder_AddRef((IShellFolder*)This);
     1596   IOleCommandTarget *                   iface)
     1597{
     1598   _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface);
     1599
     1600   return IShellFolder_AddRef((IShellFolder*)This);
    14591601}
    14601602
     
    14631605 */
    14641606static ULONG WINAPI ISVOleCmdTarget_Release(
    1465         IOleCommandTarget *     iface)
    1466 {
    1467         _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
    1468 
    1469         return IShellFolder_Release((IShellFolder*)This);
     1607   IOleCommandTarget *                   iface)
     1608{
     1609   _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
     1610
     1611   return IShellFolder_Release((IShellFolder*)This);
    14701612}
    14711613
     
    14741616 */
    14751617static HRESULT WINAPI ISVOleCmdTarget_QueryStatus(
    1476         IOleCommandTarget *iface,
    1477         const GUID* pguidCmdGroup,
    1478         ULONG cCmds,
    1479         OLECMD * prgCmds,
    1480         OLECMDTEXT* pCmdText)
    1481 {
    1482         char    xguid[50];
    1483 
    1484         _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
    1485 
    1486         WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
    1487 
    1488         FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n", This, pguidCmdGroup, xguid, cCmds, prgCmds, pCmdText);
    1489         return E_NOTIMPL;
     1618   IOleCommandTarget *iface,
     1619   const GUID* pguidCmdGroup,
     1620   ULONG cCmds,
     1621   OLECMD * prgCmds,
     1622   OLECMDTEXT* pCmdText)
     1623{
     1624   char    xguid[50];
     1625
     1626   _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
     1627
     1628   WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
     1629
     1630   FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n", This, pguidCmdGroup, xguid, cCmds, prgCmds, pCmdText);
     1631   return E_NOTIMPL;
    14901632}
    14911633
     
    14961638 */
    14971639static HRESULT WINAPI ISVOleCmdTarget_Exec(
    1498         IOleCommandTarget *iface,
    1499         const GUID* pguidCmdGroup,
    1500         DWORD nCmdID,
    1501         DWORD nCmdexecopt,
    1502         VARIANT* pvaIn,
    1503         VARIANT* pvaOut)
    1504 {
    1505         char    xguid[50];
    1506 
    1507         _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
    1508 
    1509         WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
    1510 
    1511         FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n", This, xguid, nCmdID, nCmdexecopt, pvaIn, pvaOut);
    1512         return E_NOTIMPL;
     1640   IOleCommandTarget *iface,
     1641   const GUID* pguidCmdGroup,
     1642   DWORD nCmdID,
     1643   DWORD nCmdexecopt,
     1644   VARIANT* pvaIn,
     1645   VARIANT* pvaOut)
     1646{
     1647   char    xguid[50];
     1648
     1649   _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
     1650
     1651   WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
     1652
     1653   FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n", This, xguid, nCmdID, nCmdexecopt, pvaIn, pvaOut);
     1654   return E_NOTIMPL;
    15131655}
    15141656
    15151657ICOM_VTABLE(IOleCommandTarget) ctvt =
    15161658{
    1517         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1518         ISVOleCmdTarget_QueryInterface,
    1519         ISVOleCmdTarget_AddRef,
    1520         ISVOleCmdTarget_Release,
    1521         ISVOleCmdTarget_QueryStatus,
    1522         ISVOleCmdTarget_Exec
     1659   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1660   ISVOleCmdTarget_QueryInterface,
     1661   ISVOleCmdTarget_AddRef,
     1662   ISVOleCmdTarget_Release,
     1663   ISVOleCmdTarget_QueryStatus,
     1664   ISVOleCmdTarget_Exec
    15231665};
    15241666
     
    15281670
    15291671static HRESULT WINAPI ISVDropTarget_QueryInterface(
    1530         IDropTarget *iface,
    1531         REFIID riid,
    1532         LPVOID *ppvObj)
    1533 {
    1534         char    xriid[50];
    1535 
    1536         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1537 
    1538         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1539 
    1540         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    1541 
    1542         return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
     1672   IDropTarget *iface,
     1673   REFIID riid,
     1674   LPVOID *ppvObj)
     1675{
     1676   char  xriid[50];
     1677
     1678   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1679
     1680   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1681
     1682   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     1683
     1684   return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
    15431685}
    15441686
    15451687static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface)
    15461688{
    1547         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1548 
    1549         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1550 
    1551         return IShellFolder_AddRef((IShellFolder*)This);
     1689   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1690
     1691   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1692
     1693   return IShellFolder_AddRef((IShellFolder*)This);
    15521694}
    15531695
    15541696static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
    15551697{
    1556         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1557 
    1558         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1559 
    1560         return IShellFolder_Release((IShellFolder*)This);
     1698   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1699
     1700   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1701
     1702   return IShellFolder_Release((IShellFolder*)This);
    15611703}
    15621704
    15631705static HRESULT WINAPI ISVDropTarget_DragEnter(
    1564         IDropTarget     *iface,
    1565         IDataObject     *pDataObject,
    1566         DWORD           grfKeyState,
    1567         POINTL          pt,
    1568         DWORD           *pdwEffect)
    1569 {       
    1570 
    1571         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1572 
    1573         FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
    1574 
    1575         return E_NOTIMPL;
     1706   IDropTarget    *iface,
     1707   IDataObject *pDataObject,
     1708   DWORD    grfKeyState,
     1709   POINTL      pt,
     1710   DWORD    *pdwEffect)
     1711{
     1712
     1713   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1714
     1715   FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
     1716
     1717   return E_NOTIMPL;
    15761718}
    15771719
    15781720static HRESULT WINAPI ISVDropTarget_DragOver(
    1579         IDropTarget     *iface,
    1580         DWORD           grfKeyState,
    1581         POINTL          pt,
    1582         DWORD           *pdwEffect)
    1583 {
    1584         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1585 
    1586         FIXME("Stub: This=%p\n",This);
    1587 
    1588         return E_NOTIMPL;
     1721   IDropTarget *iface,
     1722   DWORD    grfKeyState,
     1723   POINTL      pt,
     1724   DWORD    *pdwEffect)
     1725{
     1726   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1727
     1728   FIXME("Stub: This=%p\n",This);
     1729
     1730   return E_NOTIMPL;
    15891731}
    15901732
    15911733static HRESULT WINAPI ISVDropTarget_DragLeave(
    1592         IDropTarget     *iface)
    1593 {
    1594         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1595 
    1596         FIXME("Stub: This=%p\n",This);
    1597 
    1598         return E_NOTIMPL;
     1734   IDropTarget *iface)
     1735{
     1736   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1737
     1738   FIXME("Stub: This=%p\n",This);
     1739
     1740   return E_NOTIMPL;
    15991741}
    16001742
    16011743static HRESULT WINAPI ISVDropTarget_Drop(
    1602         IDropTarget     *iface,
    1603         IDataObject*    pDataObject,
    1604         DWORD           grfKeyState,
    1605         POINTL          pt,
    1606         DWORD           *pdwEffect)
    1607 {
    1608         _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
    1609 
    1610         FIXME("Stub: This=%p\n",This);
    1611 
    1612         return E_NOTIMPL;
     1744   IDropTarget *iface,
     1745   IDataObject*   pDataObject,
     1746   DWORD    grfKeyState,
     1747   POINTL      pt,
     1748   DWORD    *pdwEffect)
     1749{
     1750   _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
     1751
     1752   FIXME("Stub: This=%p\n",This);
     1753
     1754   return E_NOTIMPL;
    16131755}
    16141756
    16151757struct ICOM_VTABLE(IDropTarget) dtvt =
    16161758{
    1617         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1618         ISVDropTarget_QueryInterface,
    1619         ISVDropTarget_AddRef,
    1620         ISVDropTarget_Release,
    1621         ISVDropTarget_DragEnter,
    1622         ISVDropTarget_DragOver,
    1623         ISVDropTarget_DragLeave,
    1624         ISVDropTarget_Drop
     1759   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1760   ISVDropTarget_QueryInterface,
     1761   ISVDropTarget_AddRef,
     1762   ISVDropTarget_Release,
     1763   ISVDropTarget_DragEnter,
     1764   ISVDropTarget_DragOver,
     1765   ISVDropTarget_DragLeave,
     1766   ISVDropTarget_Drop
    16251767};
    16261768
     
    16301772
    16311773static HRESULT WINAPI ISVDropSource_QueryInterface(
    1632         IDropSource *iface,
    1633         REFIID riid,
    1634         LPVOID *ppvObj)
    1635 {
    1636         char    xriid[50];
    1637 
    1638         _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
    1639 
    1640         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1641 
    1642         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    1643 
    1644         return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
     1774   IDropSource *iface,
     1775   REFIID riid,
     1776   LPVOID *ppvObj)
     1777{
     1778   char  xriid[50];
     1779
     1780   _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
     1781
     1782   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1783
     1784   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     1785
     1786   return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
    16451787}
    16461788
    16471789static ULONG WINAPI ISVDropSource_AddRef( IDropSource *iface)
    16481790{
    1649         _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
    1650 
    1651         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1652 
    1653         return IShellFolder_AddRef((IShellFolder*)This);
     1791   _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
     1792
     1793   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1794
     1795   return IShellFolder_AddRef((IShellFolder*)This);
    16541796}
    16551797
    16561798static ULONG WINAPI ISVDropSource_Release( IDropSource *iface)
    16571799{
    1658         _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
    1659 
    1660         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1661 
    1662         return IShellFolder_Release((IShellFolder*)This);
     1800   _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
     1801
     1802   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1803
     1804   return IShellFolder_Release((IShellFolder*)This);
    16631805}
    16641806static HRESULT WINAPI ISVDropSource_QueryContinueDrag(
    1665         IDropSource *iface,
    1666         BOOL fEscapePressed,
    1667         DWORD grfKeyState)
    1668 {
    1669         _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
    1670         TRACE("(%p)\n",This);
    1671 
    1672         if (fEscapePressed)
    1673           return DRAGDROP_S_CANCEL;
    1674         else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
    1675           return DRAGDROP_S_DROP;
    1676         else
    1677           return NOERROR;
     1807   IDropSource *iface,
     1808   BOOL fEscapePressed,
     1809   DWORD grfKeyState)
     1810{
     1811   _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
     1812   TRACE("(%p)\n",This);
     1813
     1814   if (fEscapePressed)
     1815     return DRAGDROP_S_CANCEL;
     1816   else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
     1817     return DRAGDROP_S_DROP;
     1818   else
     1819     return NOERROR;
    16781820}
    16791821
    16801822static HRESULT WINAPI ISVDropSource_GiveFeedback(
    1681         IDropSource *iface,
    1682         DWORD dwEffect)
    1683 {
    1684         _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
    1685         TRACE("(%p)\n",This);
    1686 
    1687         return DRAGDROP_S_USEDEFAULTCURSORS;
     1823   IDropSource *iface,
     1824   DWORD dwEffect)
     1825{
     1826   _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
     1827   TRACE("(%p)\n",This);
     1828
     1829   return DRAGDROP_S_USEDEFAULTCURSORS;
    16881830}
    16891831
    16901832struct ICOM_VTABLE(IDropSource) dsvt =
    16911833{
    1692         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1693         ISVDropSource_QueryInterface,
    1694         ISVDropSource_AddRef,
    1695         ISVDropSource_Release,
    1696         ISVDropSource_QueryContinueDrag,
    1697         ISVDropSource_GiveFeedback
     1834   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1835   ISVDropSource_QueryInterface,
     1836   ISVDropSource_AddRef,
     1837   ISVDropSource_Release,
     1838   ISVDropSource_QueryContinueDrag,
     1839   ISVDropSource_GiveFeedback
    16981840};
    16991841/**********************************************************
     
    17021844
    17031845static HRESULT WINAPI ISVViewObject_QueryInterface(
    1704         IViewObject *iface,
    1705         REFIID riid,
    1706         LPVOID *ppvObj)
    1707 {
    1708         char    xriid[50];
    1709 
    1710         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1711 
    1712         WINE_StringFromCLSID((LPCLSID)riid,xriid);
    1713 
    1714         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
    1715 
    1716         return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
     1846   IViewObject *iface,
     1847   REFIID riid,
     1848   LPVOID *ppvObj)
     1849{
     1850   char  xriid[50];
     1851
     1852   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1853
     1854   WINE_StringFromCLSID((LPCLSID)riid,xriid);
     1855
     1856   TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
     1857
     1858   return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
    17171859}
    17181860
    17191861static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface)
    17201862{
    1721         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1722 
    1723         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1724 
    1725         return IShellFolder_AddRef((IShellFolder*)This);
     1863   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1864
     1865   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1866
     1867   return IShellFolder_AddRef((IShellFolder*)This);
    17261868}
    17271869
    17281870static ULONG WINAPI ISVViewObject_Release( IViewObject *iface)
    17291871{
    1730         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1731 
    1732         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    1733 
    1734         return IShellFolder_Release((IShellFolder*)This);
     1872   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1873
     1874   TRACE("(%p)->(count=%lu)\n",This,This->ref);
     1875
     1876   return IShellFolder_Release((IShellFolder*)This);
    17351877}
    17361878
    17371879static HRESULT WINAPI ISVViewObject_Draw(
    1738         IViewObject     *iface,
    1739         DWORD dwDrawAspect,
    1740         LONG lindex,
    1741         void* pvAspect,
    1742         DVTARGETDEVICE* ptd,
    1743         HDC hdcTargetDev,
    1744         HDC hdcDraw,
    1745         LPCRECTL lprcBounds,
    1746         LPCRECTL lprcWBounds,
    1747         IVO_ContCallback pfnContinue,
    1748         DWORD dwContinue)
    1749 {       
    1750 
    1751         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1752 
    1753         FIXME("Stub: This=%p\n",This);
    1754 
    1755         return E_NOTIMPL;
     1880   IViewObject    *iface,
     1881   DWORD dwDrawAspect,
     1882   LONG lindex,
     1883   void* pvAspect,
     1884   DVTARGETDEVICE* ptd,
     1885   HDC hdcTargetDev,
     1886   HDC hdcDraw,
     1887   LPCRECTL lprcBounds,
     1888   LPCRECTL lprcWBounds,
     1889   IVO_ContCallback pfnContinue,
     1890   DWORD dwContinue)
     1891{
     1892
     1893   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1894
     1895   FIXME("Stub: This=%p\n",This);
     1896
     1897   return E_NOTIMPL;
    17561898}
    17571899static HRESULT WINAPI ISVViewObject_GetColorSet(
    1758         IViewObject     *iface,
    1759         DWORD dwDrawAspect,
    1760         LONG lindex,
    1761         void *pvAspect,
    1762         DVTARGETDEVICE* ptd,
    1763         HDC hicTargetDevice,
    1764         tagLOGPALETTE** ppColorSet)
    1765 {       
    1766 
    1767         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1768 
    1769         FIXME("Stub: This=%p\n",This);
    1770 
    1771         return E_NOTIMPL;
     1900   IViewObject    *iface,
     1901   DWORD dwDrawAspect,
     1902   LONG lindex,
     1903   void *pvAspect,
     1904   DVTARGETDEVICE* ptd,
     1905   HDC hicTargetDevice,
     1906   tagLOGPALETTE** ppColorSet)
     1907{
     1908
     1909   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1910
     1911   FIXME("Stub: This=%p\n",This);
     1912
     1913   return E_NOTIMPL;
    17721914}
    17731915static HRESULT WINAPI ISVViewObject_Freeze(
    1774         IViewObject     *iface,
    1775         DWORD dwDrawAspect,
    1776         LONG lindex,
    1777         void* pvAspect,
    1778         DWORD* pdwFreeze)
    1779 {       
    1780 
    1781         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1782 
    1783         FIXME("Stub: This=%p\n",This);
    1784 
    1785         return E_NOTIMPL;
     1916   IViewObject    *iface,
     1917   DWORD dwDrawAspect,
     1918   LONG lindex,
     1919   void* pvAspect,
     1920   DWORD* pdwFreeze)
     1921{
     1922
     1923   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1924
     1925   FIXME("Stub: This=%p\n",This);
     1926
     1927   return E_NOTIMPL;
    17861928}
    17871929static HRESULT WINAPI ISVViewObject_Unfreeze(
    1788         IViewObject     *iface,
    1789         DWORD dwFreeze)
    1790 {       
    1791 
    1792         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1793 
    1794         FIXME("Stub: This=%p\n",This);
    1795 
    1796         return E_NOTIMPL;
     1930   IViewObject    *iface,
     1931   DWORD dwFreeze)
     1932{
     1933
     1934   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1935
     1936   FIXME("Stub: This=%p\n",This);
     1937
     1938   return E_NOTIMPL;
    17971939}
    17981940static HRESULT WINAPI ISVViewObject_SetAdvise(
    1799         IViewObject     *iface,
    1800         DWORD aspects,
    1801         DWORD advf,
    1802         IAdviseSink* pAdvSink)
    1803 {       
    1804 
    1805         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1806 
    1807         FIXME("Stub: This=%p\n",This);
    1808 
    1809         return E_NOTIMPL;
     1941   IViewObject    *iface,
     1942   DWORD aspects,
     1943   DWORD advf,
     1944   IAdviseSink* pAdvSink)
     1945{
     1946
     1947   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1948
     1949   FIXME("Stub: This=%p\n",This);
     1950
     1951   return E_NOTIMPL;
    18101952}
    18111953static HRESULT WINAPI ISVViewObject_GetAdvise(
    1812         IViewObject     *iface,
    1813         DWORD* pAspects,
    1814         DWORD* pAdvf,
    1815         IAdviseSink** ppAdvSink)
    1816 {       
    1817 
    1818         _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
    1819 
    1820         FIXME("Stub: This=%p\n",This);
    1821 
    1822         return E_NOTIMPL;
     1954   IViewObject    *iface,
     1955   DWORD* pAspects,
     1956   DWORD* pAdvf,
     1957   IAdviseSink** ppAdvSink)
     1958{
     1959
     1960   _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
     1961
     1962   FIXME("Stub: This=%p\n",This);
     1963
     1964   return E_NOTIMPL;
    18231965}
    18241966
     
    18261968struct ICOM_VTABLE(IViewObject) vovt =
    18271969{
    1828         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1829         ISVViewObject_QueryInterface,
    1830         ISVViewObject_AddRef,
    1831         ISVViewObject_Release,
    1832         ISVViewObject_Draw,
    1833         ISVViewObject_GetColorSet,
    1834         ISVViewObject_Freeze,
    1835         ISVViewObject_Unfreeze,
    1836         ISVViewObject_SetAdvise,
    1837         ISVViewObject_GetAdvise
     1970   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1971   ISVViewObject_QueryInterface,
     1972   ISVViewObject_AddRef,
     1973   ISVViewObject_Release,
     1974   ISVViewObject_Draw,
     1975   ISVViewObject_GetColorSet,
     1976   ISVViewObject_Freeze,
     1977   ISVViewObject_Unfreeze,
     1978   ISVViewObject_SetAdvise,
     1979   ISVViewObject_GetAdvise
    18381980};
    18391981
  • trunk/src/shell32/shv_bg_cmenu.cpp

    r1214 r1558  
    1 /* $Id: shv_bg_cmenu.cpp,v 1.1 1999-10-09 11:13:25 sandervl Exp $ */
     1/* $Id: shv_bg_cmenu.cpp,v 1.2 1999-11-02 20:38:48 phaller Exp $ */
    22
    33/*
     
    88
    99/*
    10  *      IContextMenu
    11  *      ShellView Background Context Menu (shv_bg_cm)
     10 * IContextMenu
     11 * ShellView Background Context Menu (shv_bg_cm)
    1212 *
    13  *      Copyright 1999  Juergen Schmied <juergen.schmied@metronet.de>
     13 * Copyright 1999 Juergen Schmied <juergen.schmied@metronet.de>
    1414 */
    1515
     
    4545*/
    4646typedef struct
    47 {       ICOM_VTABLE(IContextMenu)* lpvtbl;
    48         DWORD           ref;
     47{  ICOM_VTABLE(IContextMenu)* lpvtbl;
     48   DWORD    ref;
    4949} BgCmImpl;
    5050
     
    5757static HRESULT WINAPI ISVBgCm_fnQueryInterface(IContextMenu *iface, REFIID riid, LPVOID *ppvObj)
    5858{
    59         ICOM_THIS(BgCmImpl, iface);
    60 
    61         char    xriid[50];
    62         WINE_StringFromCLSID((LPCLSID)riid,xriid);
     59   ICOM_THIS(BgCmImpl, iface);
     60
     61   char    xriid[50];
     62   WINE_StringFromCLSID((LPCLSID)riid,xriid);
    6363
    6464  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnQueryInterface(%08xh,%s,%08xh)\n",
     
    6767           ppvObj));
    6868
    69         *ppvObj = NULL;
    70 
    71         if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
    72         {
    73           *ppvObj = This;
    74         }
    75         else if(IsEqualIID(riid, &IID_IContextMenu))  /*IContextMenu*/
    76         {
    77           *ppvObj = This;
    78         }
    79         else if(IsEqualIID(riid, &IID_IShellExtInit))  /*IShellExtInit*/
    80         {
    81           FIXME("-- LPSHELLEXTINIT pointer requested\n");
    82         }
    83 
    84         if(*ppvObj)
    85         {
    86           IUnknown_AddRef((IUnknown*)*ppvObj);
    87           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    88           return S_OK;
    89         }
    90         TRACE("-- Interface: E_NOINTERFACE\n");
    91         return E_NOINTERFACE;
     69   *ppvObj = NULL;
     70
     71   if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     72   {
     73     *ppvObj = This;
     74   }
     75   else if(IsEqualIID(riid, &IID_IContextMenu))  /*IContextMenu*/
     76   {
     77     *ppvObj = This;
     78   }
     79   else if(IsEqualIID(riid, &IID_IShellExtInit))  /*IShellExtInit*/
     80   {
     81     FIXME("-- LPSHELLEXTINIT pointer requested\n");
     82   }
     83
     84   if(*ppvObj)
     85   {
     86     IUnknown_AddRef((IUnknown*)*ppvObj);
     87     TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     88     return S_OK;
     89   }
     90   TRACE("-- Interface: E_NOINTERFACE\n");
     91   return E_NOINTERFACE;
    9292}
    9393
     
    9797static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu *iface)
    9898{
    99         ICOM_THIS(BgCmImpl, iface);
     99   ICOM_THIS(BgCmImpl, iface);
    100100
    101101  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnAddRef(%08xh,%u)\n",
     
    103103           This->ref));
    104104
    105         shell32_ObjCount++;
    106         return ++(This->ref);
     105   shell32_ObjCount++;
     106   return ++(This->ref);
    107107}
    108108
     
    112112static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu *iface)
    113113{
    114         ICOM_THIS(BgCmImpl, iface);
     114   ICOM_THIS(BgCmImpl, iface);
    115115
    116116  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnRelease(%08xh)\n",
    117117           This));
    118118
    119         shell32_ObjCount--;
    120 
    121         if (!--(This->ref))
    122         { TRACE(" destroying IContextMenu(%p)\n",This);
    123 
    124           HeapFree(GetProcessHeap(),0,This);
    125           return 0;
    126         }
    127         return This->ref;
     119   shell32_ObjCount--;
     120
     121   if (!--(This->ref))
     122   { TRACE(" destroying IContextMenu(%p)\n",This);
     123
     124     HeapFree(GetProcessHeap(),0,This);
     125     return 0;
     126   }
     127   return This->ref;
    128128}
    129129
     
    133133
    134134static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
    135         IContextMenu *iface,
    136         HMENU hMenu,
    137         UINT indexMenu,
    138         UINT idCmdFirst,
    139         UINT idCmdLast,
    140         UINT uFlags)
    141 {
    142         HMENU   hMyMenu;
    143         UINT    idMax;
    144        
    145         ICOM_THIS(BgCmImpl, iface);
     135   IContextMenu *iface,
     136   HMENU hMenu,
     137   UINT indexMenu,
     138   UINT idCmdFirst,
     139   UINT idCmdLast,
     140   UINT uFlags)
     141{
     142   HMENU hMyMenu;
     143   UINT  idMax;
     144
     145   ICOM_THIS(BgCmImpl, iface);
    146146
    147147  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnQueryContextMenu(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
     
    153153           uFlags));
    154154
    155         hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
    156 
    157         idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
    158 
    159         DestroyMenu(hMyMenu);
    160 
    161         return ResultFromShort(idMax - idCmdFirst);
     155   hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
     156
     157   idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
     158
     159   DestroyMenu(hMyMenu);
     160
     161   return ResultFromShort(idMax - idCmdFirst);
    162162}
    163163
     
    166166*/
    167167static HRESULT WINAPI ISVBgCm_fnInvokeCommand(
    168         IContextMenu *iface,
    169         LPCMINVOKECOMMANDINFO lpcmi)
    170 {
    171         ICOM_THIS(BgCmImpl, iface);
    172 
    173         LPSHELLBROWSER  lpSB;
    174         LPSHELLVIEW     lpSV;
    175         HWND    hWndSV;
     168   IContextMenu *iface,
     169   LPCMINVOKECOMMANDINFO lpcmi)
     170{
     171   ICOM_THIS(BgCmImpl, iface);
     172
     173   LPSHELLBROWSER lpSB;
     174   LPSHELLVIEW lpSV;
     175   HWND  hWndSV;
    176176
    177177  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnInvokeCommand((%p)->(invcom=%p verb=%p wnd=%x)\n",
     
    181181           lpcmi->hwnd));
    182182
    183         /* get the active IShellView */
    184         lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0);
    185         IShellBrowser_QueryActiveShellView(lpSB, &lpSV);
    186         IShellView_GetWindow(lpSV, &hWndSV);
    187 
    188         if(HIWORD(lpcmi->lpVerb))
    189         {
    190           TRACE("%s\n",lpcmi->lpVerb);
    191 
    192           if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA))
    193           {
    194             FIXME("%s not implemented\n",lpcmi->lpVerb);
    195           }
    196           else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA))
    197           {
    198             SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
    199           }
    200           else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA))
    201           {
    202             SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
    203           }
    204           else
    205           {
    206             FIXME("please report: unknown verb %s\n",lpcmi->lpVerb);
    207           }
    208         }
    209         else
    210         {
    211           switch(LOWORD(lpcmi->lpVerb))
    212           {
    213             case FCIDM_SHVIEW_BIGICON:
    214               SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_BIGICON,0),0 );
    215               break;
    216 
    217             case FCIDM_SHVIEW_SMALLICON:
    218               SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_SMALLICON,0),0 );
    219 
    220             case FCIDM_SHVIEW_LISTVIEW:
    221               SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
    222               break;
    223 
    224             case FCIDM_SHVIEW_REPORTVIEW:
    225               SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
    226               break;
    227           }
    228         }
    229        
    230         IShellView_Release(lpSV);       /* QueryActiveShellView does AddRef*/
    231         return NOERROR;
     183   /* get the active IShellView */
     184   lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0);
     185   IShellBrowser_QueryActiveShellView(lpSB, &lpSV);
     186   IShellView_GetWindow(lpSV, &hWndSV);
     187
     188   if(HIWORD(lpcmi->lpVerb))
     189   {
     190     TRACE("%s\n",lpcmi->lpVerb);
     191
     192     if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA))
     193     {
     194       FIXME("%s not implemented\n",lpcmi->lpVerb);
     195     }
     196     else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA))
     197     {
     198       SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
     199     }
     200     else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA))
     201     {
     202       SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
     203     }
     204     else
     205     {
     206       FIXME("please report: unknown verb %s\n",lpcmi->lpVerb);
     207     }
     208   }
     209   else
     210   {
     211     /* if it's a id just pass it to the parent shv */
     212     SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 );
     213   }
     214
     215   IShellView_Release(lpSV);             /* QueryActiveShellView does AddRef*/
     216   return NOERROR;
    232217}
    233218
     
    237222 */
    238223static HRESULT WINAPI ISVBgCm_fnGetCommandString(
    239         IContextMenu *iface,
    240         UINT idCommand,
    241         UINT uFlags,
    242         LPUINT lpReserved,
    243         LPSTR lpszName,
    244         UINT uMaxNameLen)
    245 {       
    246         ICOM_THIS(BgCmImpl, iface);
     224   IContextMenu *iface,
     225   UINT idCommand,
     226   UINT uFlags,
     227   LPUINT lpReserved,
     228   LPSTR lpszName,
     229   UINT uMaxNameLen)
     230{
     231   ICOM_THIS(BgCmImpl, iface);
    247232
    248233  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnGetCommandString((%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",
     
    254239           uMaxNameLen));
    255240
    256         /* test the existance of the menu items, the file dialog enables
    257            the buttons according to this */
    258         if (uFlags == GCS_VALIDATEA)
    259         {
    260           if(HIWORD(idCommand))
    261           {
    262             if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
    263                 !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
    264                 !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
    265             {   
    266               return NOERROR;
    267             }
    268           }
    269         }
    270 
    271         FIXME("unknown command string\n");
    272         return E_FAIL;
     241   /* test the existance of the menu items, the file dialog enables
     242      the buttons according to this */
     243   if (uFlags == GCS_VALIDATEA)
     244   {
     245     if(HIWORD(idCommand))
     246     {
     247       if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
     248           !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
     249           !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
     250       {
     251         return NOERROR;
     252       }
     253     }
     254   }
     255
     256   FIXME("unknown command string\n");
     257   return E_FAIL;
    273258}
    274259
     
    277262*/
    278263static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg(
    279         IContextMenu *iface,
    280         UINT uMsg,
    281         WPARAM wParam,
    282         LPARAM lParam)
    283 {
    284         ICOM_THIS(BgCmImpl, iface);
     264   IContextMenu *iface,
     265   UINT uMsg,
     266   WPARAM wParam,
     267   LPARAM lParam)
     268{
     269   ICOM_THIS(BgCmImpl, iface);
    285270
    286271  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_fnHandleMenuMsg((%p)->(msg=%x wp=%x lp=%lx)\n",
     
    290275           lParam));
    291276
    292         return E_NOTIMPL;
     277   return E_NOTIMPL;
    293278}
    294279
     
    298283*/
    299284static struct ICOM_VTABLE(IContextMenu) cmvt =
    300 {       
    301         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    302         ISVBgCm_fnQueryInterface,
    303         ISVBgCm_fnAddRef,
    304         ISVBgCm_fnRelease,
    305         ISVBgCm_fnQueryContextMenu,
    306         ISVBgCm_fnInvokeCommand,
    307         ISVBgCm_fnGetCommandString,
    308         ISVBgCm_fnHandleMenuMsg,
    309         (void *) 0xdeadbabe     /* just paranoia (IContextMenu3) */
     285{
     286   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     287   ISVBgCm_fnQueryInterface,
     288   ISVBgCm_fnAddRef,
     289   ISVBgCm_fnRelease,
     290   ISVBgCm_fnQueryContextMenu,
     291   ISVBgCm_fnInvokeCommand,
     292   ISVBgCm_fnGetCommandString,
     293   ISVBgCm_fnHandleMenuMsg,
     294   (void *) 0xdeadbabe                   /* just paranoia (IContextMenu3) */
    310295};
    311296
     
    315300IContextMenu *ISvBgCm_Constructor(void)
    316301{
    317         BgCmImpl* cm;
    318 
    319         cm = (BgCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BgCmImpl));
    320         cm->lpvtbl=&cmvt;
    321         cm->ref = 1;
     302   BgCmImpl* cm;
     303
     304   cm = (BgCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BgCmImpl));
     305   cm->lpvtbl=&cmvt;
     306   cm->ref = 1;
    322307
    323308  dprintf(("SHELL32:shv_bg_cmenu: ISVBgCm_Constructor(%p)\n",
    324309           cm));
    325310
    326         shell32_ObjCount++;
    327         return (IContextMenu*)cm;
    328 }
    329 
    330 
     311   shell32_ObjCount++;
     312   return (IContextMenu*)cm;
     313}
     314
     315
Note: See TracChangeset for help on using the changeset viewer.