Author: gadamopoulos
Date: Wed Jun  1 21:12:17 2016
New Revision: 71492

URL: http://svn.reactos.org/svn/reactos?rev=71492&view=rev
Log:
[BROWSEUI]
- CExplorerBand: Implement IOleWindow, IDockingWindow, IDeskBand, 
IObjectWithSite, IInputObject and IPersist interfaces. This creates and shows 
an empty tree view control in the bar.
- CShellBrowser: Restore the hack to use the local CExplorerBand instead of the 
system one.

Modified:
    trunk/reactos/dll/win32/browseui/explorerband.cpp
    trunk/reactos/dll/win32/browseui/explorerband.h
    trunk/reactos/dll/win32/browseui/shellbrowser.cpp

Modified: trunk/reactos/dll/win32/browseui/explorerband.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/explorerband.cpp?rev=71492&r1=71491&r2=71492&view=diff
==============================================================================
--- trunk/reactos/dll/win32/browseui/explorerband.cpp   [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/browseui/explorerband.cpp   [iso-8859-1] Wed Jun  1 
21:12:17 2016
@@ -12,19 +12,32 @@
     return ShellObjectCreator<CExplorerBand>(riid, ppv);
 }
 
-CExplorerBand::CExplorerBand()
+CExplorerBand::CExplorerBand() :
+    pSite(NULL), fVisible(FALSE), dwBandID(0)
 {
 }
 
 CExplorerBand::~CExplorerBand()
 {
+}
+
+void CExplorerBand::InitializeExplorerBand()
+{
+
+}
+
+void CExplorerBand::DestroyExplorerBand()
+{
+
 }
 
 // *** IOleWindow methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::GetWindow(HWND *lphwnd)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    if (!lphwnd)
+        return E_INVALIDARG;
+    *lphwnd = m_hWnd;
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::ContextSensitiveHelp(BOOL fEnterMode)
@@ -37,42 +50,135 @@
 // *** IDockingWindow methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::CloseDW(DWORD dwReserved)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    // We do nothing, we don't have anything to save yet
+    TRACE("CloseDW called\n");
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::ResizeBorderDW(const RECT *prcBorder, 
IUnknown *punkToolbarSite, BOOL fReserved)
 {
-    UNIMPLEMENTED;
+    /* Must return E_NOTIMPL according to MSDN */
     return E_NOTIMPL;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::ShowDW(BOOL fShow)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    fVisible = fShow;
+    ShowWindow(fShow);
+    return S_OK;
 }
 
 
 // *** IDeskBand methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::GetBandInfo(DWORD dwBandID, DWORD 
dwViewMode, DESKBANDINFO *pdbi)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    if (!pdbi)
+    {
+        return E_INVALIDARG;
+    }
+    this->dwBandID = dwBandID;
+
+    if (pdbi->dwMask & DBIM_MINSIZE)
+    {
+        pdbi->ptMinSize.x = 200;
+        pdbi->ptMinSize.y = 30;
+    }
+
+    if (pdbi->dwMask & DBIM_MAXSIZE)
+    {
+        pdbi->ptMaxSize.y = -1;
+    }
+
+    if (pdbi->dwMask & DBIM_INTEGRAL)
+    {
+        pdbi->ptIntegral.y = 1;
+    }
+
+    if (pdbi->dwMask & DBIM_ACTUAL)
+    {
+        pdbi->ptActual.x = 200;
+        pdbi->ptActual.y = 30;
+    }
+
+    if (pdbi->dwMask & DBIM_TITLE)
+    {
+        lstrcpyW(pdbi->wszTitle, L"Explorer");
+    }
+
+    if (pdbi->dwMask & DBIM_MODEFLAGS)
+    {
+        pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
+    }
+
+    if (pdbi->dwMask & DBIM_BKCOLOR)
+    {
+        pdbi->dwMask &= ~DBIM_BKCOLOR;
+    }
+    return S_OK;
 }
 
 
 // *** IObjectWithSite methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::SetSite(IUnknown *pUnkSite)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    HRESULT hr;
+    HWND parentWnd;
+
+    if (pUnkSite == pSite)
+        return S_OK;
+
+    TRACE("SetSite called \n");
+    if (!pUnkSite)
+    {
+        DestroyExplorerBand();
+        DestroyWindow();
+        m_hWnd = NULL;
+    }
+
+    if (pUnkSite != pSite)
+    {
+        pSite = NULL;
+    }
+
+    if(!pUnkSite)
+        return S_OK;
+
+    hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
+    if (!SUCCEEDED(hr))
+    {
+        ERR("Could not get parent's window ! Status: %08lx\n", hr);
+        return E_INVALIDARG;
+    }
+
+    pSite = pUnkSite;    
+
+    if (m_hWnd)
+    {
+        // Change its parent
+        SetParent(parentWnd);
+    }
+    else
+    {
+        HWND wnd = CreateWindow(WC_TREEVIEW, NULL,
+            WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TVS_HASLINES | 
TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS /* | TVS_SINGLEEXPAND*/ , 
// remove TVS_SINGLEEXPAND for now since it has strange behaviour
+            0, 0, 0, 0, parentWnd, NULL, _AtlBaseModule.GetModuleInstance(), 
NULL);
+
+        // Subclass the window
+        SubclassWindow(wnd);
+
+        // Initialize our treeview now
+        InitializeExplorerBand();
+        RegisterDragDrop(m_hWnd, dynamic_cast<IDropTarget*>(this));
+    }
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::GetSite(REFIID riid, void **ppvSite)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    if (!ppvSite)
+        return E_POINTER;
+    *ppvSite = pSite;
+    return S_OK;
 }
 
 
@@ -101,28 +207,40 @@
 // *** IInputObject methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::UIActivateIO(BOOL fActivate, LPMSG 
lpMsg)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    if (fActivate)
+    {
+        //SetFocus();
+        SetActiveWindow();
+    }
+    // TODO: handle message
+    if(lpMsg)
+    {
+        TranslateMessage(lpMsg);
+        DispatchMessage(lpMsg);
+    }
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::HasFocusIO()
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    return bFocused ? S_OK : S_FALSE;
 }
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::TranslateAcceleratorIO(LPMSG lpMsg)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    TranslateMessage(lpMsg);
+    DispatchMessage(lpMsg);
+    return S_OK;
 }
 
 
 // *** IPersist methods ***
 HRESULT STDMETHODCALLTYPE CExplorerBand::GetClassID(CLSID *pClassID)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    if (!pClassID)
+        return E_POINTER;
+    memcpy(pClassID, &CLSID_ExplorerBand, sizeof(CLSID));
+    return S_OK;
 }
 
 
@@ -161,8 +279,7 @@
 
 HRESULT STDMETHODCALLTYPE CExplorerBand::IsWindowOwner(HWND hWnd)
 {
-    UNIMPLEMENTED;
-    return E_NOTIMPL;
+    return (hWnd == m_hWnd) ? S_OK : S_FALSE;
 }
 
 // *** IBandNavigate methods ***

Modified: trunk/reactos/dll/win32/browseui/explorerband.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/explorerband.h?rev=71492&r1=71491&r2=71492&view=diff
==============================================================================
--- trunk/reactos/dll/win32/browseui/explorerband.h     [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/browseui/explorerband.h     [iso-8859-1] Wed Jun  1 
21:12:17 2016
@@ -29,6 +29,17 @@
         LPITEMIDLIST relativePidl;
         BOOL expanded;
     };
+
+    // *** BaseBarSite information ***
+    CComPtr<IUnknown> pSite;
+
+    // *** tree explorer band stuff ***
+    BOOL fVisible;
+    BOOL bFocused;
+    DWORD dwBandID;
+
+    void InitializeExplorerBand();
+    void DestroyExplorerBand();
 
 public:
     CExplorerBand();

Modified: trunk/reactos/dll/win32/browseui/shellbrowser.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/shellbrowser.cpp?rev=71492&r1=71491&r2=71492&view=diff
==============================================================================
--- trunk/reactos/dll/win32/browseui/shellbrowser.cpp   [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/browseui/shellbrowser.cpp   [iso-8859-1] Wed Jun  1 
21:12:17 2016
@@ -24,7 +24,7 @@
 #include <htiframe.h>
 #include <strsafe.h>
 
-#define USE_CUSTOM_EXPLORERBAND 0
+#define USE_CUSTOM_EXPLORERBAND 1
 
 extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
 
@@ -1237,9 +1237,23 @@
     
     if (!IsBandLoaded(classID, vertical, &dwBandID))
     {
-        hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, 
IID_PPV_ARG(IUnknown, &newBand));
-        if (FAILED_UNEXPECTEDLY(hResult))
-            return hResult;
+#if USE_CUSTOM_EXPLORERBAND
+        TRACE("ShowBand called for CLSID %s, vertical=%d...\n", 
wine_dbgstr_guid(&classID), vertical);
+        if (IsEqualCLSID(CLSID_ExplorerBand, classID))
+        {
+            TRACE("CLSID_ExplorerBand requested, building internal band.\n");
+            hResult = CExplorerBand_Constructor(IID_PPV_ARG(IUnknown, 
&newBand));
+            if (FAILED_UNEXPECTEDLY(hResult))
+                return hResult;
+        }
+        else
+#endif
+        {
+            TRACE("A different CLSID requested, using CoCreateInstance.\n");
+            hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, 
IID_PPV_ARG(IUnknown, &newBand));
+            if (FAILED_UNEXPECTEDLY(hResult))
+                return hResult;
+        }
     }
     else
     {


Reply via email to