[BROWSEUI]
[reactos.git] / reactos / dll / win32 / browseui / basebar.cpp
index 16a2ea4..bd84b4a 100644 (file)
@@ -30,11 +30,10 @@ provides resizing abilities.
 */
 /*
 TODO:
-  **Make base bar support resizing
+  **Make base bar support resizing -- almost done (need to support integral ?)
     Add context menu for base bar
     Fix base bar to correctly initialize fVertical field
-    Fix base bar to correctly reposition its base bar site when resized
-
+    Fix base bar to correctly reposition its base bar site when resized -- done ?
 */
 
 class CBaseBar :
@@ -51,7 +50,7 @@ class CBaseBar :
     public IPersistPropertyBag,
     public IObjectWithSite
 {
-public:
+private:
     CComPtr<IUnknown>                       fSite;
     CComPtr<IUnknown>                       fClient;
     HWND                                    fClientWindow;
@@ -65,6 +64,8 @@ public:
 public:
     CBaseBar();
     ~CBaseBar();
+    HRESULT Initialize(BOOL);
+
 public:
     HRESULT ReserveBorderSpace();
 
@@ -172,6 +173,12 @@ CBaseBar::~CBaseBar()
 {
 }
 
+HRESULT CBaseBar::Initialize(BOOL vert)
+{
+    fVertical = (vert == TRUE);
+    return S_OK;
+}
+
 HRESULT CBaseBar::ReserveBorderSpace()
 {
     CComPtr<IDockingWindowSite>             dockingWindowSite;
@@ -233,8 +240,7 @@ HRESULT STDMETHODCALLTYPE CBaseBar::ContextSensitiveHelp(BOOL fEnterMode)
 
 HRESULT STDMETHODCALLTYPE CBaseBar::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus)
 {
-    // forward to owner
-    return E_NOTIMPL;
+    return IUnknown_OnFocusChangeIS(fSite, punkObj, fSetFocus);
 }
 
 HRESULT STDMETHODCALLTYPE CBaseBar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds,
@@ -248,6 +254,7 @@ HRESULT STDMETHODCALLTYPE CBaseBar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID
 {
     if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
     {
+        // pass through to the explorer ?
     }
     else if (IsEqualIID(*pguidCmdGroup, IID_IDeskBarClient))
     {
@@ -257,6 +264,7 @@ HRESULT STDMETHODCALLTYPE CBaseBar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID
                 // hide current band
                 break;
             case 2:
+                // switch bands
                 break;
             case 3:
                 break;
@@ -283,20 +291,17 @@ HRESULT STDMETHODCALLTYPE CBaseBar::QueryService(REFGUID guidService, REFIID rii
 
 HRESULT STDMETHODCALLTYPE CBaseBar::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
 {
-    // forward to contained bar
-    return S_OK;
+    return IUnknown_UIActivateIO(fClient, fActivate, lpMsg);
 }
 
 HRESULT STDMETHODCALLTYPE CBaseBar::HasFocusIO()
 {
-    // forward to contained bar
-    return S_OK;
+    return IUnknown_HasFocusIO(fClient);
 }
 
 HRESULT STDMETHODCALLTYPE CBaseBar::TranslateAcceleratorIO(LPMSG lpMsg)
 {
-    // forward to contained bar
-    return S_FALSE;
+    return IUnknown_TranslateAcceleratorIO(fClient, lpMsg);
 }
 
 HRESULT STDMETHODCALLTYPE CBaseBar::SetClient(IUnknown *punkClient)
@@ -305,9 +310,10 @@ HRESULT STDMETHODCALLTYPE CBaseBar::SetClient(IUnknown *punkClient)
     HWND                                    ownerWindow;
     HRESULT                                 hResult;
 
-    if (punkClient == NULL)
-        fClient.Release();
-    else
+    /* Clean up old client */
+    fClient = NULL;
+
+    if (punkClient)
     {
         hResult = punkClient->QueryInterface(IID_PPV_ARG(IUnknown, &fClient));
         if (FAILED_UNEXPECTEDLY(hResult))
@@ -322,6 +328,10 @@ HRESULT STDMETHODCALLTYPE CBaseBar::SetClient(IUnknown *punkClient)
             WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW);
         ReserveBorderSpace();
     }
+    else
+    {
+        DestroyWindow();
+    }
     return S_OK;
 }
 
@@ -350,14 +360,18 @@ HRESULT STDMETHODCALLTYPE CBaseBar::OnPosRectChangeDB(LPRECT prc)
 HRESULT STDMETHODCALLTYPE CBaseBar::ShowDW(BOOL fShow)
 {
     fVisible = fShow ? true : false;
+    ShowWindow(fShow);
     ReserveBorderSpace();
     return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CBaseBar::CloseDW(DWORD dwReserved)
 {
-    fVisible = false;
-    ReserveBorderSpace();
+    ShowDW(0);
+    // Detach from our client
+    SetClient(NULL);
+    // Destroy our site
+    SetSite(NULL);
     return S_OK;
 }
 
@@ -430,6 +444,31 @@ HRESULT STDMETHODCALLTYPE CBaseBar::Save(IPropertyBag *pPropBag, BOOL fClearDirt
 
 LRESULT CBaseBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
+    DWORD                                   dwWidth;
+    DWORD                                   dwHeight;
+    CComPtr<IOleWindow>                     pClient;
+    HWND                                    clientHwnd;
+    HRESULT                                 hr;
+
+    if (fVisible)
+    {
+        dwWidth = LOWORD(lParam);
+        dwHeight = HIWORD(lParam);
+
+        // substract resizing grips to child's window size
+        if (fVertical)
+            dwWidth -= GetSystemMetrics(SM_CXFRAME);
+        else
+            dwHeight -= GetSystemMetrics(SM_CXFRAME);
+        hr = fClient->QueryInterface(IID_PPV_ARG(IOleWindow, &pClient));
+        if (FAILED_UNEXPECTEDLY(hr))
+            return 0;
+        hr = pClient->GetWindow(&clientHwnd);
+        if (FAILED_UNEXPECTEDLY(hr))
+            return 0;
+        ::SetWindowPos(clientHwnd, NULL, 0, (fVertical) ? 0 : GetSystemMetrics(SM_CXFRAME), dwWidth, dwHeight, NULL);
+        bHandled = TRUE;
+    }
     return 0;
 }
 
@@ -482,20 +521,21 @@ LRESULT CBaseBar::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHa
 LRESULT CBaseBar::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
     POINT                                   newLocation;
-    //int                                     delta;
+    int                                     delta;
 
     if (fTracking)
     {
         newLocation.x = (short)LOWORD(lParam);
         newLocation.y = (short)HIWORD(lParam);
-#if 0
         if (fVertical)
             delta = newLocation.x - fLastLocation.x;
         else
-            delta = newLocation.y - fLastLocation.y;
-
-#endif
+            delta = fLastLocation.y - newLocation.y;
+        if (fNeededSize + delta < 0)
+            return 0;
+        fNeededSize += delta;
         fLastLocation = newLocation;
+        ReserveBorderSpace();
     }
     return 0;
 }
@@ -512,7 +552,7 @@ LRESULT CBaseBar::OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
     return 0;
 }
 
-HRESULT CreateBaseBar(REFIID riid, void **ppv)
+HRESULT CBaseBar_CreateInstance(REFIID riid, void **ppv, BOOL vertical)
 {
-    return ShellObjectCreator<CBaseBar>(riid, ppv);
+    return ShellObjectCreatorInit<CBaseBar, BOOL>(vertical, riid, ppv);
 }