[Libreoffice-commits] core.git: extras/source icon-themes/galaxy include/sfx2 include/vcl sfx2/Library_sfx.mk sfx2/source vcl/inc vcl/source

Szymon Kłos eszkadev at gmail.com
Fri Jul 22 09:00:27 UTC 2016


 extras/source/glade/libreoffice-catalog.xml.in   |    4 -
 icon-themes/galaxy/res/notebookbar.png           |binary
 include/sfx2/notebookbar/SfxNotebookBar.hxx      |   12 +++
 include/vcl/notebookbar.hxx                      |    4 -
 include/vcl/tabctrl.hxx                          |   10 ++
 sfx2/Library_sfx.mk                              |    1 
 sfx2/source/dialog/backingcomp.cxx               |    4 -
 sfx2/source/dialog/dialog.src                    |   49 +++++++++++++
 sfx2/source/inc/sfxlocal.hrc                     |    2 
 sfx2/source/notebookbar/NotebookBarPopupMenu.cxx |   82 +++++++++++++++++++++++
 sfx2/source/notebookbar/NotebookBarPopupMenu.hxx |   23 ++++++
 sfx2/source/notebookbar/SfxNotebookBar.cxx       |   61 +++++++++++++++++
 vcl/inc/svids.hrc                                |    1 
 vcl/source/control/notebookbar.cxx               |    8 +-
 vcl/source/control/tabctrl.cxx                   |   37 +++++++++-
 vcl/source/src/images.src                        |    5 +
 16 files changed, 290 insertions(+), 13 deletions(-)

New commits:
commit b949604b91f77dee3b2737ea09e1ac3ade4eed1c
Author: Szymon Kłos <eszkadev at gmail.com>
Date:   Wed Jul 20 16:08:38 2016 +0200

    GSoC notebookbar: file menu
    
    + added icon to the notebookbar, after click the file menu will appear
    
    Change-Id: I30e1ed7e2c4a194e150c7196652904fd4e5c9e8e
    Reviewed-on: https://gerrit.libreoffice.org/27347
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>

diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index 10b3d02..bf49a28 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -807,8 +807,8 @@
     <glade-widget-class title="Show Text" name="cuilo-SvxShowText"
                         generic-name="ShowText" parent="GtkDrawingArea"
                         icon-name="widget-gtk-drawingarea"/>
-    <glade-widget-class title="Notebookbar with context" name="vcllo-ContextTabControl"
-                        generic-name="ContextTabControl" parent="GtkNotebook"
+    <glade-widget-class title="Notebook switching tabs depending on context" name="vcllo-NotebookbarTabControl"
+                        generic-name="NotebookbarTabControl" parent="GtkNotebook"
                         icon-name="widget-gtk-notebook"/>
     <glade-widget-class title="Slide Transition Pane" name="sdlo-SlideTransitionBox"
                         generic-name="ShowText" parent="GtkToolButton"
diff --git a/icon-themes/galaxy/res/notebookbar.png b/icon-themes/galaxy/res/notebookbar.png
new file mode 100644
index 0000000..94abb95
Binary files /dev/null and b/icon-themes/galaxy/res/notebookbar.png differ
diff --git a/include/sfx2/notebookbar/SfxNotebookBar.hxx b/include/sfx2/notebookbar/SfxNotebookBar.hxx
index d76b35e..d3387a2 100644
--- a/include/sfx2/notebookbar/SfxNotebookBar.hxx
+++ b/include/sfx2/notebookbar/SfxNotebookBar.hxx
@@ -11,6 +11,8 @@
 #define INCLUDED_SFX2_NOTEBOOKBAR_SFXNOTEBOOKBAR_HXX
 
 #include <sfx2/dllapi.h>
+#include <com/sun/star/frame/XLayoutManager.hpp>
+#include <vcl/notebookbar.hxx>
 
 class SfxBindings;
 
@@ -22,6 +24,7 @@ class SFX2_DLLPUBLIC SfxNotebookBar
 {
 public:
     static void CloseMethod(SfxBindings& rBindings);
+    static void CloseMethod(SystemWindow* pSysWindow);
 
     /// Function to be called from the sdi's ExecMethod.
     static void ExecMethod(SfxBindings& rBindings);
@@ -33,6 +36,15 @@ public:
                             const OUString& rUIFile);
 
     static void RemoveListeners(SystemWindow* pSysWindow);
+
+    static void ShowMenubar(bool bShow);
+
+private:
+    static bool m_bLock;
+    static css::uno::Reference<css::frame::XLayoutManager> m_xLayoutManager;
+    static css::uno::Reference<css::frame::XFrame> m_xFrame;
+
+    DECL_STATIC_LINK_TYPED(SfxNotebookBar, ToggleMenubar, NotebookBar*, void);
 };
 
 } // namespace sfx2
diff --git a/include/vcl/notebookbar.hxx b/include/vcl/notebookbar.hxx
index 05c91a8..51f32aa 100644
--- a/include/vcl/notebookbar.hxx
+++ b/include/vcl/notebookbar.hxx
@@ -17,7 +17,7 @@
 #include <com/sun/star/ui/XContextChangeEventListener.hpp>
 
 /// This implements Widget Layout-based notebook-like menu bar.
-class NotebookBar : public Control, public VclBuilderContainer
+class VCL_DLLPUBLIC NotebookBar : public Control, public VclBuilderContainer
 {
 friend class NotebookBarContextChangeEventListener;
 public:
@@ -28,6 +28,8 @@ public:
     virtual Size GetOptimalSize() const SAL_OVERRIDE;
     virtual void setPosSizePixel(long nX, long nY, long nWidth, long nHeight, PosSizeFlags nFlags = PosSizeFlags::All) SAL_OVERRIDE;
 
+    void SetIconClickHdl(Link<NotebookBar*, void> aHdl);
+
     virtual void StateChanged(StateChangedType nType) override;
 
     const css::uno::Reference<css::ui::XContextChangeEventListener>& getContextChangeEventListener() const { return m_pEventListener; }
diff --git a/include/vcl/tabctrl.hxx b/include/vcl/tabctrl.hxx
index a708161..14974e7 100644
--- a/include/vcl/tabctrl.hxx
+++ b/include/vcl/tabctrl.hxx
@@ -132,10 +132,10 @@ public:
     sal_uInt16          GetPageId( const TabPage& rPage ) const;
     sal_uInt16          GetPageId( const OString& rName ) const;
 
-    void                SetCurPageId( sal_uInt16 nPageId );
+    virtual void        SetCurPageId( sal_uInt16 nPageId );
     sal_uInt16          GetCurPageId() const;
 
-    void                SelectTabPage( sal_uInt16 nPageId );
+    virtual void        SelectTabPage( sal_uInt16 nPageId );
 
     void                SetTabPage( sal_uInt16 nPageId, TabPage* pPage );
     TabPage*            GetTabPage( sal_uInt16 nPageId ) const;
@@ -194,14 +194,19 @@ public:
     virtual void queue_resize(StateChangedType eReason = StateChangedType::Layout) override;
 };
 
+class NotebookBar;
+
 class VCL_DLLPUBLIC NotebookbarTabControl : public TabControl
 {
 public:
     NotebookbarTabControl( vcl::Window* pParent, WinBits nStyle = WB_STDTABCONTROL );
 
     void SetContext( vcl::EnumContext::Context eContext );
+    void SetIconClickHdl( Link<NotebookBar*, void> aHdl );
 
     virtual sal_uInt16  GetPageId( const Point& rPos ) const override;
+    virtual void        SelectTabPage( sal_uInt16 nPageId ) override;
+    virtual void        SetCurPageId( sal_uInt16 nPageId ) override;
 
 protected:
     virtual bool ImplPlaceTabs( long nWidth ) override;
@@ -209,6 +214,7 @@ protected:
 
 private:
     vcl::EnumContext::Context eLastContext;
+    Link<NotebookBar*,void> m_aIconClickHdl;
 };
 
 #endif // INCLUDED_VCL_TABCTRL_HXX
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 1a28afd..5ee2773 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -235,6 +235,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
     sfx2/source/explorer/nochaos \
     sfx2/source/inet/inettbc \
     sfx2/source/notebookbar/DropdownBox \
+    sfx2/source/notebookbar/NotebookBarPopupMenu \
     sfx2/source/notebookbar/PriorityHBox \
     sfx2/source/notebookbar/SfxNotebookBar \
     sfx2/source/notify/eventsupplier \
diff --git a/sfx2/source/dialog/backingcomp.cxx b/sfx2/source/dialog/backingcomp.cxx
index 937501b..8767519 100644
--- a/sfx2/source/dialog/backingcomp.cxx
+++ b/sfx2/source/dialog/backingcomp.cxx
@@ -603,9 +603,7 @@ void SAL_CALL BackingComp::dispose()
         VclPtr< WorkWindow > pParent = static_cast<WorkWindow*>(VCLUnoHelper::GetWindow(xParentWindow).get());
 
         // hide NotebookBar
-        SystemWindow* pSysWindow = static_cast<SystemWindow*>(pParent);
-        if (pSysWindow && pSysWindow->GetNotebookBar())
-            pSysWindow->GetNotebookBar()->Hide();
+        sfx2::SfxNotebookBar::CloseMethod(static_cast<SystemWindow*>(pParent));
     }
 
     // stop listening at the window
diff --git a/sfx2/source/dialog/dialog.src b/sfx2/source/dialog/dialog.src
index a3ed837..c66f447 100644
--- a/sfx2/source/dialog/dialog.src
+++ b/sfx2/source/dialog/dialog.src
@@ -121,4 +121,53 @@ String STR_FONT_TABPAGE
   Text [ en-US ] = "Font" ;
 };
 
+Menu RID_MENU_NOTEBOOKBAR
+{
+    ItemList =
+    {
+        MenuItem
+        {
+            Identifier = SID_OPENDOC;
+            Command = ".uno:Open";
+            Text [ en-US ] = "Open..." ;
+        };
+        MenuItem
+        {
+            Identifier = SID_SAVEDOC;
+            Command = ".uno:Save";
+            Text [ en-US ] = "Save" ;
+        };
+        MenuItem
+        {
+            Identifier = SID_UNDO;
+            Command = ".uno:Undo";
+            Text [ en-US ] = "Undo" ;
+        };
+        MenuItem
+        {
+            Identifier = SID_REDO;
+            Command = ".uno:Redo";
+            Text [ en-US ] = "Redo" ;
+        };
+        MenuItem
+        {
+            Identifier = SID_PRINTDOC;
+            Command = ".uno:Print";
+            Text [ en-US ] = "Print" ;
+        };
+        MenuItem
+        {
+            Identifier = SID_OPTIONS;
+            Command = ".uno:OptionsTreeDialog";
+            Text [ en-US ] = "Options" ;
+        };
+        MenuItem
+        {
+            Identifier = SID_CLOSEDOC;
+            Command = ".uno:CloseDoc";
+            Text [ en-US ] = "Close" ;
+        };
+    };
+};
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/inc/sfxlocal.hrc b/sfx2/source/inc/sfxlocal.hrc
index 33eb941..65360c9 100644
--- a/sfx2/source/inc/sfxlocal.hrc
+++ b/sfx2/source/inc/sfxlocal.hrc
@@ -47,6 +47,8 @@
 #define SFX_IMG_PROPERTY_REMOVE             (RID_SFX_SFXLOCAL_START +  0)
 #define SFX_IMG_CLOSE_DOC                   (RID_SFX_SFXLOCAL_START +  2)
 
+#define RID_MENU_NOTEBOOKBAR                (RID_SFX_SFXLOCAL_START + 10)
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx b/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx
new file mode 100644
index 0000000..d0cd103
--- /dev/null
+++ b/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sfx2/dispatch.hxx>
+#include <vcl/notebookbar.hxx>
+#include <vcl/menu.hxx>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <sfxlocal.hrc>
+#include <sfx2/sfxresid.hxx>
+#include "NotebookBarPopupMenu.hxx"
+
+using namespace sfx2;
+using namespace css::uno;
+using namespace css::ui;
+
+NotebookBarPopupMenu::NotebookBarPopupMenu(ResId aRes)
+    : PopupMenu(aRes)
+{
+    if (SfxViewFrame::Current())
+    {
+        for (int i = 0; i < GetItemCount(); ++i)
+        {
+            const SfxPoolItem* pItem;
+            SfxItemState eState = SfxViewFrame::Current()->GetBindings().GetDispatcher()->QueryState(GetItemId(i), pItem);
+            if (eState == SfxItemState::DISABLED)
+                this->EnableItem(GetItemId(i), false);
+            else
+                this->EnableItem(GetItemId(i));
+        }
+    }
+    else
+    {
+        HideItem(SID_UNDO);
+        HideItem(SID_REDO);
+        HideItem(SID_PRINTDOC);
+        HideItem(SID_SAVEDOC);
+    }
+    EnableItem(SID_OPTIONS);
+}
+
+void NotebookBarPopupMenu::Execute(NotebookBar* pNotebookbar,
+                            css::uno::Reference<css::frame::XFrame>& xFrame)
+{
+    if (pNotebookbar)
+    {
+        sal_uInt16 nSelected = PopupMenu::Execute(pNotebookbar, Point(0, 40));
+
+        if (nSelected)
+        {
+            OUString aCommandURL = GetItemCommand(nSelected);
+            css::util::URL aUrl;
+            aUrl.Complete = aCommandURL;
+
+            Reference<css::util::XURLTransformer> xURLTransformer(
+                css::util::URLTransformer::create(comphelper::getProcessComponentContext()));
+            if (xURLTransformer.is())
+                xURLTransformer->parseStrict(aUrl);
+
+            css::uno::Reference<css::frame::XDispatch> xDispatch;
+            css::uno::Reference<css::frame::XDispatchProvider> xDispatchProvider(xFrame, UNO_QUERY);
+
+            if (xDispatchProvider.is())
+            {
+                xDispatch = xDispatchProvider->queryDispatch(aUrl, OUString(), 0);
+            }
+            if (xDispatch.is())
+            {
+                Sequence<com::sun::star::beans::PropertyValue> aArgs;
+                xDispatch->dispatch(aUrl, aArgs);
+            }
+        }
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/notebookbar/NotebookBarPopupMenu.hxx b/sfx2/source/notebookbar/NotebookBarPopupMenu.hxx
new file mode 100644
index 0000000..2fca135
--- /dev/null
+++ b/sfx2/source/notebookbar/NotebookBarPopupMenu.hxx
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <vcl/notebookbar.hxx>
+#include <vcl/menu.hxx>
+#include <sfxlocal.hrc>
+#include <sfx2/sfxresid.hxx>
+
+class NotebookBarPopupMenu : public PopupMenu
+{
+public:
+    NotebookBarPopupMenu(ResId aRes);
+    void Execute(NotebookBar* pNotebookbar,
+                css::uno::Reference<css::frame::XFrame>& xFrame);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/notebookbar/SfxNotebookBar.cxx b/sfx2/source/notebookbar/SfxNotebookBar.cxx
index 2ae984d..dc20c75 100644
--- a/sfx2/source/notebookbar/SfxNotebookBar.cxx
+++ b/sfx2/source/notebookbar/SfxNotebookBar.cxx
@@ -13,20 +13,40 @@
 #include <unotools/viewoptions.hxx>
 #include <vcl/notebookbar.hxx>
 #include <vcl/syswin.hxx>
+#include <vcl/menu.hxx>
 #include <sfx2/viewfrm.hxx>
 #include <comphelper/processfactory.hxx>
 #include <com/sun/star/ui/ContextChangeEventMultiplexer.hpp>
 #include <com/sun/star/ui/XContextChangeEventMultiplexer.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/frame/XLayoutManager.hpp>
+#include "NotebookBarPopupMenu.hxx"
 
 using namespace sfx2;
 using namespace css::uno;
 using namespace css::ui;
 
+#define MENUBAR_STR "private:resource/menubar/menubar"
+
+bool SfxNotebookBar::m_bLock = false;
+Reference<css::frame::XLayoutManager> SfxNotebookBar::m_xLayoutManager;
+css::uno::Reference<css::frame::XFrame> SfxNotebookBar::m_xFrame;
+
 void SfxNotebookBar::CloseMethod(SfxBindings& rBindings)
 {
     SfxFrame& rFrame = rBindings.GetDispatcher_Impl()->GetFrame()->GetFrame();
     if (rFrame.GetSystemWindow()->GetNotebookBar())
         rFrame.GetSystemWindow()->CloseNotebookBar();
+    m_xLayoutManager.clear();
+    m_xFrame.clear();
+}
+
+void SfxNotebookBar::CloseMethod(SystemWindow* pSysWindow)
+{
+    if (pSysWindow && pSysWindow->GetNotebookBar())
+        pSysWindow->CloseNotebookBar();
+    m_xLayoutManager.clear();
+    m_xFrame.clear();
 }
 
 void SfxNotebookBar::ExecMethod(SfxBindings& rBindings)
@@ -51,6 +71,19 @@ void SfxNotebookBar::StateMethod(SystemWindow* pSysWindow,
 {
     assert(pSysWindow);
 
+    m_xFrame = xFrame;
+
+    if (!m_xLayoutManager.is())
+    {
+        Reference<css::beans::XPropertySet> xPropSet(xFrame, UNO_QUERY);
+
+        if (xPropSet.is())
+        {
+            Any aValue = xPropSet->getPropertyValue("LayoutManager");
+            aValue >>= m_xLayoutManager;
+        }
+    }
+
     SvtViewOptions aViewOpt(E_WINDOW, "notebookbar");
 
     if (aViewOpt.IsVisible())
@@ -61,6 +94,7 @@ void SfxNotebookBar::StateMethod(SystemWindow* pSysWindow,
         pSysWindow->SetNotebookBar(rUIFile, xFrame);
 
         pSysWindow->GetNotebookBar()->Show();
+        pSysWindow->GetNotebookBar()->SetIconClickHdl(LINK(nullptr, SfxNotebookBar, ToggleMenubar));
 
         SfxViewFrame* pView = SfxViewFrame::Current();
 
@@ -95,4 +129,31 @@ void SfxNotebookBar::RemoveListeners(SystemWindow* pSysWindow)
     }
 }
 
+IMPL_STATIC_LINK_TYPED(SfxNotebookBar, ToggleMenubar, NotebookBar*, pNotebookbar, void)
+{
+    if (pNotebookbar)
+    {
+        VclPtr<NotebookBarPopupMenu> pMenu = VclPtr<NotebookBarPopupMenu>::Create(SfxResId(RID_MENU_NOTEBOOKBAR));
+        pMenu->Execute(pNotebookbar, m_xFrame);
+        pMenu->Clear();
+    }
+}
+
+void SfxNotebookBar::ShowMenubar(bool bShow)
+{
+    if (!m_bLock && m_xLayoutManager.is())
+    {
+        m_bLock = true;
+        m_xLayoutManager->lock();
+
+        if (m_xLayoutManager->getElement(MENUBAR_STR).is() && !bShow)
+            m_xLayoutManager->destroyElement(MENUBAR_STR);
+        else if(!m_xLayoutManager->getElement(MENUBAR_STR).is() && bShow)
+            m_xLayoutManager->createElement(MENUBAR_STR);
+
+        m_xLayoutManager->unlock();
+        m_bLock = false;
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/svids.hrc b/vcl/inc/svids.hrc
index 7c81ecc..efb3490 100644
--- a/vcl/inc/svids.hrc
+++ b/vcl/inc/svids.hrc
@@ -43,6 +43,7 @@
 #define SV_RESID_BITMAP_CLOSEDOC                     1052
 #define SV_RESID_BITMAP_INDEX                        1053
 #define SV_RESID_BITMAP_REFRESH                      1054
+#define SV_RESID_BITMAP_NOTEBOOKBAR                  1055
 
 #define SV_DISCLOSURE_PLUS                           1060
 #define SV_DISCLOSURE_MINUS                          1061
diff --git a/vcl/source/control/notebookbar.cxx b/vcl/source/control/notebookbar.cxx
index 413cb57..a47cb03 100644
--- a/vcl/source/control/notebookbar.cxx
+++ b/vcl/source/control/notebookbar.cxx
@@ -90,6 +90,11 @@ void NotebookBar::setPosSizePixel(long nX, long nY, long nWidth, long nHeight, P
         VclContainer::setLayoutAllocation(*pChild, Point(0, 0), Size(nWidth, nHeight));
 }
 
+void NotebookBar::SetIconClickHdl(Link<NotebookBar*, void> aHdl)
+{
+    m_pTabControl->SetIconClickHdl(aHdl);
+}
+
 void NotebookBar::StateChanged(StateChangedType nType)
 {
     if (nType == StateChangedType::Visible)
@@ -104,7 +109,8 @@ void NotebookBar::StateChanged(StateChangedType nType)
 void SAL_CALL NotebookBarContextChangeEventListener::notifyContextChangeEvent(const css::ui::ContextChangeEventObject& rEvent)
         throw (css::uno::RuntimeException, std::exception)
 {
-    mpParent->m_pTabControl->SetContext(vcl::EnumContext::GetContextEnum(rEvent.ContextName));
+    if (mpParent && mpParent->m_pTabControl)
+        mpParent->m_pTabControl->SetContext(vcl::EnumContext::GetContextEnum(rEvent.ContextName));
 }
 
 
diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx
index d532a5e..93b3b20 100644
--- a/vcl/source/control/tabctrl.cxx
+++ b/vcl/source/control/tabctrl.cxx
@@ -33,6 +33,7 @@
 #include <vcl/settings.hxx>
 #include <vcl/uitest/uiobject.hxx>
 #include <vcl/builderfactory.hxx>
+#include <svids.hrc>
 
 #include "controldata.hxx"
 #include "svdata.hxx"
@@ -2206,6 +2207,15 @@ NotebookbarTabControl::NotebookbarTabControl(vcl::Window* pParent, WinBits nStyl
     : TabControl(pParent, nStyle)
     , eLastContext( vcl::EnumContext::Context::Context_Any )
 {
+    LanguageTag aLocale( Application::GetSettings().GetUILanguageTag());
+    ResMgr* pResMgr = ResMgr::SearchCreateResMgr( "vcl", aLocale );
+
+    Bitmap aBitmap;
+    if( pResMgr )
+        aBitmap = Bitmap( ResId( SV_RESID_BITMAP_NOTEBOOKBAR, *pResMgr ) );
+
+    InsertPage(1, "");
+    SetPageImage(1, Image(aBitmap));
 }
 
 void NotebookbarTabControl::SetContext( vcl::EnumContext::Context eContext )
@@ -2217,30 +2227,49 @@ void NotebookbarTabControl::SetContext( vcl::EnumContext::Context eContext )
             TabPage* pPage = static_cast<TabPage*>(GetChild(nChild));
 
             if (pPage->HasContext(eContext) || pPage->HasContext(vcl::EnumContext::Context::Context_Any))
-                EnablePage(nChild + 1);
+                EnablePage(nChild + 2);
             else
-                EnablePage(nChild + 1, false);
+                EnablePage(nChild + 2, false);
 
             if (pPage->HasContext(eContext) && eContext != vcl::EnumContext::Context::Context_Any)
-                SetCurPageId(nChild + 1);
+                SetCurPageId(nChild + 2);
         }
 
         eLastContext = eContext;
     }
 }
 
+void NotebookbarTabControl::SetIconClickHdl( Link<NotebookBar*, void> aHdl )
+{
+    m_aIconClickHdl = aHdl;
+}
+
 sal_uInt16 NotebookbarTabControl::GetPageId( const Point& rPos ) const
 {
     for( size_t i = 0; i < mpTabCtrlData->maItemList.size(); ++i )
     {
         if ( const_cast<NotebookbarTabControl*>(this)->ImplGetTabRect( static_cast<sal_uInt16>(i) ).IsInside( rPos ) )
-            if (  mpTabCtrlData->maItemList[ i ].mbEnabled )
+            if ( mpTabCtrlData->maItemList[ i ].mbEnabled )
                 return mpTabCtrlData->maItemList[ i ].mnId;
     }
 
     return 0;
 }
 
+void NotebookbarTabControl::SelectTabPage( sal_uInt16 nPageId )
+{
+    if ( nPageId == 1 )
+        m_aIconClickHdl.Call( static_cast<NotebookBar*>(GetParent()) );
+    else
+        TabControl::SelectTabPage( nPageId );
+}
+
+void NotebookbarTabControl::SetCurPageId( sal_uInt16 nPageId )
+{
+    if ( nPageId != 1 )
+        TabControl::SetCurPageId( nPageId );
+}
+
 bool NotebookbarTabControl::ImplPlaceTabs( long nWidth )
 {
     if ( nWidth <= 0 )
diff --git a/vcl/source/src/images.src b/vcl/source/src/images.src
index 88d35c1..77cfb39 100644
--- a/vcl/source/src/images.src
+++ b/vcl/source/src/images.src
@@ -284,4 +284,9 @@ Bitmap SV_DISCLOSURE_MINUS
     File = "minus.png";
 };
 
+Bitmap SV_RESID_BITMAP_NOTEBOOKBAR
+{
+    File = "notebookbar.png";
+};
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list