Nikolay Sivov : shell32: Fallback to IShellDetails while filling shell view columns if IShellFolder2 is missed .

Alexandre Julliard julliard at winehq.org
Mon Apr 19 11:51:19 CDT 2010


Module: wine
Branch: master
Commit: 066063541ddf79422c600144f9e3d9bc6dd67c98
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=066063541ddf79422c600144f9e3d9bc6dd67c98

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Apr 18 18:51:45 2010 +0400

shell32: Fallback to IShellDetails while filling shell view columns if IShellFolder2 is missed.

---

 dlls/shell32/shlview.c |   39 +++++++++++++++++++++++----------------
 include/shlobj.h       |   22 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index 938ec13..c7d9ee8 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -389,40 +389,47 @@ static BOOL ShellView_CreateList (IShellViewImpl * This)
 */
 static void ShellView_InitList(IShellViewImpl *This)
 {
+    IShellDetails *details = NULL;
     LVCOLUMNW lvColumn;
     SHELLDETAILS sd;
     WCHAR nameW[50];
+    HRESULT hr;
+    INT i;
 
     TRACE("(%p)\n", This);
 
     SendMessageW(This->hWndList, LVM_DELETEALLITEMS, 0, 0);
+    SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ShellSmallIconList);
+    SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)ShellBigIconList);
 
     lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
     lvColumn.pszText = nameW;
 
-    if (This->pSF2Parent)
+    if (!This->pSF2Parent)
     {
-        HRESULT hr;
-        INT i;
-
-        for (i = 0; 1; i++)
+        hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IShellDetails, (void**)&details);
+        if (hr != S_OK)
         {
-            hr = IShellFolder2_GetDetailsOf(This->pSF2Parent, NULL, i, &sd);
-            if (FAILED(hr)) break;
-
-	    lvColumn.fmt = sd.fmt;
-	    lvColumn.cx = sd.cxChar*8; /* chars->pixel */
-	    StrRetToStrNW(nameW, sizeof(nameW)/sizeof(WCHAR), &sd.str, NULL);
-	    SendMessageW(This->hWndList, LVM_INSERTCOLUMNW, i, (LPARAM) &lvColumn);
+            WARN("IShellFolder2/IShellDetails not supported\n");
+            return;
         }
     }
-    else
+
+    for (i = 0; 1; i++)
     {
-        FIXME("no SF2\n");
+        if (This->pSFParent)
+            hr = IShellFolder2_GetDetailsOf(This->pSF2Parent, NULL, i, &sd);
+        else
+            hr = IShellDetails_GetDetailsOf(details, NULL, i, &sd);
+        if (FAILED(hr)) break;
+
+        lvColumn.fmt = sd.fmt;
+	lvColumn.cx = sd.cxChar*8; /* chars->pixel */
+	StrRetToStrNW(nameW, sizeof(nameW)/sizeof(WCHAR), &sd.str, NULL);
+	SendMessageW(This->hWndList, LVM_INSERTCOLUMNW, i, (LPARAM) &lvColumn);
     }
 
-    SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ShellSmallIconList);
-    SendMessageW(This->hWndList, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)ShellBigIconList);
+    if (details) IShellDetails_Release(details);
 }
 
 /**********************************************************
diff --git a/include/shlobj.h b/include/shlobj.h
index 9f87a0a..a463ca1 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -346,6 +346,28 @@ typedef struct
 #define FCIDM_TOOLBAR      (FCIDM_BROWSERFIRST + 0)
 #define FCIDM_STATUS       (FCIDM_BROWSERFIRST + 1)
 
+#define INTERFACE IShellDetails
+DECLARE_INTERFACE_(IShellDetails, IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+    /*** IShellDetails methods ***/
+    STDMETHOD(GetDetailsOf)(THIS_ PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *pDetails) PURE;
+    STDMETHOD(ColumnClick)(THIS_ UINT iColumn) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IShellDetails_QueryInterface(p,a,b)    (p)->lpVtbl->QueryInterface(p,a,b)
+#define IShellDetails_AddRef(p)                (p)->lpVtbl->AddRef(p)
+#define IShellDetails_Release(p)               (p)->lpVtbl->Release(p)
+/*** IShellDetails methods ***/
+#define IShellDetails_GetDetailsOf(p,a,b,c)    (p)->lpVtbl->GetDetailsOf(p,a,b,c)
+#define IShellDetails_ColumnClick(p,a)         (p)->lpVtbl->ColumnClick(p,a)
+#endif
 
 /****************************************************************************
  * IShellIcon interface




More information about the wine-cvs mailing list