[Libreoffice-commits] core.git: include/vcl sfx2/source vcl/source

Gökhan Gurbetoğlu gokhan.gurbetoglu at pardus.org.tr
Mon Aug 14 18:30:31 UTC 2017


 include/vcl/tabctrl.hxx                           |    3 
 sfx2/source/notebookbar/NotebookbarTabControl.cxx |    3 
 vcl/source/control/tabctrl.cxx                    |  108 +++++++++-------------
 3 files changed, 54 insertions(+), 60 deletions(-)

New commits:
commit 16b3a46ce0c94f7dfba8d391dd48ee82ba0f1d0f
Author: Gökhan Gurbetoğlu <gokhan.gurbetoglu at pardus.org.tr>
Date:   Mon Jul 3 19:07:21 2017 +0300

    Creating a button for the hamburger menu
    
    Things done in this commit:
    - Created a hamburger menu button on the right.
    - Moved the opening menu to match the new hamburger button.
    - Added 1 pixel at the end of shortcut toolbox so no overlapping with
    the tabs would occur.
    
    Change-Id: I3d05eec72e260575563e4d016945af0777541cfb
    Reviewed-on: https://gerrit.libreoffice.org/38450
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>

diff --git a/include/vcl/tabctrl.hxx b/include/vcl/tabctrl.hxx
index 0e195f10890d..4b48874ab40e 100644
--- a/include/vcl/tabctrl.hxx
+++ b/include/vcl/tabctrl.hxx
@@ -23,6 +23,7 @@
 #include <vcl/dllapi.h>
 #include <vcl/ctrl.hxx>
 #include <vcl/toolbox.hxx>
+#include <vcl/button.hxx>
 #include <vcl/EnumContext.hxx>
 #include <sfx2/notebookbar/NotebookbarContextControl.hxx>
 
@@ -221,6 +222,8 @@ private:
     Link<NotebookBar*,void> m_aIconClickHdl;
     static sal_uInt16 m_nHeaderHeight;
     VclPtr<ToolBox> m_pShortcuts;
+    VclPtr<PushButton> m_pOpenMenu;
+    DECL_LINK(OpenMenu, Button*, void);
 };
 
 #endif // INCLUDED_VCL_TABCTRL_HXX
diff --git a/sfx2/source/notebookbar/NotebookbarTabControl.cxx b/sfx2/source/notebookbar/NotebookbarTabControl.cxx
index bd6c147b87c5..87c05ae9179c 100644
--- a/sfx2/source/notebookbar/NotebookbarTabControl.cxx
+++ b/sfx2/source/notebookbar/NotebookbarTabControl.cxx
@@ -130,6 +130,7 @@ public:
 
 NotebookbarTabControl::NotebookbarTabControl( Window* pParent )
 : NotebookbarTabControlBase( pParent )
+, m_pListener( nullptr )
 , m_bInitialized( false )
 , m_bInvalidate( true )
 {
@@ -255,7 +256,7 @@ IMPL_LINK(NotebookbarTabControl, OpenNotebookbarPopupMenu, NotebookBar*, pNotebo
         xPopupController->setPopupMenu(xPopupMenu);
         VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation(xPopupMenu);
         PopupMenu* pVCLMenu = static_cast<PopupMenu*>(pAwtMenu->GetMenu());
-        Point aPos(0, NotebookbarTabControl::GetHeaderHeight());
+        Point aPos(pNotebookbar->GetSizePixel().getWidth(), NotebookbarTabControl::GetHeaderHeight() - ICON_SIZE + 10);
         pVCLMenu->Execute(pNotebookbar, tools::Rectangle(aPos, aPos),PopupMenuFlags::ExecuteDown|PopupMenuFlags::NoMouseUpClose);
 
         Reference<css::lang::XComponent> xComponent(xPopupController, UNO_QUERY);
diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx
index 746c6c0acc4e..aa87d4800bd4 100644
--- a/vcl/source/control/tabctrl.cxx
+++ b/vcl/source/control/tabctrl.cxx
@@ -50,7 +50,7 @@ struct ImplTabItem
     OUString            maHelpText;
     OString             maHelpId;
     OString             maTabName;
-    tools::Rectangle           maRect;
+    tools::Rectangle    maRect;
     sal_uInt16          mnLine;
     bool                mbFullVisible;
     bool                mbEnabled;
@@ -73,6 +73,7 @@ struct ImplTabCtrlData
 
 // for the Tab positions
 #define TAB_PAGERECT        0xFFFF
+#define HAMBURGER_DIM       28
 
 void TabControl::ImplInit( vcl::Window* pParent, WinBits nStyle )
 {
@@ -1179,7 +1180,7 @@ void TabControl::ImplPaint(vcl::RenderContext& rRenderContext, const tools::Rect
         ImplTabItem* pLastTab = nullptr;
         size_t idx;
 
-        // Event though there is a tab overlap with GTK+, the first tab is not
+        // Even though there is a tab overlap with GTK+, the first tab is not
         // overlapped on the left side. Other toolkits ignore this option.
         if (bDrawTabsRTL)
         {
@@ -2201,14 +2202,23 @@ FactoryFunction TabControl::GetUITestFactory() const
 
 sal_uInt16 NotebookbarTabControlBase::m_nHeaderHeight = 0;
 
+IMPL_LINK_NOARG(NotebookbarTabControlBase, OpenMenu, Button*, void)
+{
+    m_aIconClickHdl.Call(static_cast<NotebookBar*>(GetParent()->GetParent()));
+}
+
 NotebookbarTabControlBase::NotebookbarTabControlBase(vcl::Window* pParent)
     : TabControl(pParent, WB_STDTABCONTROL)
     , bLastContextWasSupported(true)
     , eLastContext(vcl::EnumContext::Context::Any)
 {
     BitmapEx aBitmap(SV_RESID_BITMAP_NOTEBOOKBAR);
-    InsertPage(1, "");
-    SetPageImage(1, Image(aBitmap));
+
+    m_pOpenMenu = VclPtr<PushButton>::Create(this);
+    m_pOpenMenu->SetSizePixel(Size(HAMBURGER_DIM, HAMBURGER_DIM));
+    m_pOpenMenu->SetClickHdl(LINK(this, NotebookbarTabControlBase, OpenMenu));
+    m_pOpenMenu->SetModeImage(Image(aBitmap));
+    m_pOpenMenu->Show();
 }
 
 NotebookbarTabControlBase::~NotebookbarTabControlBase()
@@ -2258,6 +2268,7 @@ void NotebookbarTabControlBase::SetContext( vcl::EnumContext::Context eContext )
 void NotebookbarTabControlBase::dispose()
 {
     m_pShortcuts.disposeAndClear();
+    m_pOpenMenu.disposeAndClear();
     TabControl::dispose();
 }
 
@@ -2285,22 +2296,14 @@ sal_uInt16 NotebookbarTabControlBase::GetPageId( const Point& rPos ) const
 
 void NotebookbarTabControlBase::SelectTabPage( sal_uInt16 nPageId )
 {
-    if ( nPageId == 1 )
-        m_aIconClickHdl.Call( static_cast<NotebookBar*>(GetParent()->GetParent()) );
-    else
-    {
-        TabControl::SelectTabPage( nPageId );
-        Resize();
-    }
+    TabControl::SelectTabPage( nPageId );
+    Resize();
 }
 
 void NotebookbarTabControlBase::SetCurPageId( sal_uInt16 nPageId )
 {
-    if ( nPageId != 1 )
-    {
-        TabControl::SetCurPageId( nPageId );
-        Resize();
-    }
+    TabControl::SetCurPageId( nPageId );
+    Resize();
     if ( nPageId == GetPageCount() )
         ImplActivateTabPage( true );
 }
@@ -2350,10 +2353,10 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
     if ( mpTabCtrlData->maItemList.empty() )
         return false;
 
-    long nMaxWidth = nWidth;
-    long nShortcutsWidth = m_pShortcuts != nullptr ? m_pShortcuts->GetSizePixel().getWidth() : 0;
+    long nMaxWidth = nWidth - HAMBURGER_DIM;
+    long nShortcutsWidth = m_pShortcuts != nullptr ? m_pShortcuts->GetSizePixel().getWidth() + 1 : 0;
 
-    const long nOffsetX = 2 + GetItemsOffset().X();
+    const long nOffsetX = 2 + GetItemsOffset().X() + nShortcutsWidth;
     const long nOffsetY = 2 + GetItemsOffset().Y();
 
     //fdo#66435 throw Knuth/Tex minimum raggedness algorithm at the problem
@@ -2361,14 +2364,18 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
 
     //collect widths
     std::vector<sal_Int32> aWidths;
-    aWidths.push_back(ImplGetItemSize( &(*(mpTabCtrlData->maItemList.begin())), nMaxWidth ).Width() + nShortcutsWidth);
-    for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin() + 1;
+    for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin();
          it != mpTabCtrlData->maItemList.end(); ++it )
     {
-        long aSize = ImplGetItemSize( &(*it), nMaxWidth ).getWidth();
-        if( !it->maText.isEmpty() && aSize < 100)
-            aSize = 100;
-        aWidths.push_back(aSize);
+        if( it->mbEnabled )
+        {
+            long aSize = ImplGetItemSize( &(*it), nMaxWidth ).getWidth();
+            if( !it->maText.isEmpty() && aSize < 100)
+                aSize = 100;
+            aWidths.push_back(aSize);
+        }
+        else
+            aWidths.push_back(0);
     }
 
     //aBreakIndexes will contain the indexes of the last tab on each row
@@ -2391,7 +2398,6 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
 
     size_t nIndex = 0;
     sal_uInt16 nPos = 0;
-    sal_uInt16 nHiddenWidth = 0;
 
     for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin();
          it != mpTabCtrlData->maItemList.end(); ++it, ++nIndex )
@@ -2417,6 +2423,13 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
             nLinePosAry[nLines] = nPos;
         }
 
+        if ( !it->mbEnabled )
+        {
+            nPos++;
+            continue;
+        }
+
+        // set minimum tab size
         if( !it->maText.isEmpty() && aSize.getWidth() < 100)
             aSize.Width() = 100;
 
@@ -2427,13 +2440,6 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
         if ( mbSmallInvalidate && (it->maRect != aNewRect) )
             mbSmallInvalidate = false;
 
-        // don't show empty space when tab is hidden, move next tabs to the left
-        if ( it->mpTabPage && !it->mpTabPage->HasContext(vcl::EnumContext::Context::Any) )
-        {
-            aNewRect.setX(aNewRect.getX() - nHiddenWidth);
-            nHiddenWidth += aNewRect.getWidth();
-        }
-
         it->maRect = aNewRect;
         it->mnLine = nLines;
         it->mbFullVisible = true;
@@ -2441,12 +2447,6 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
         nLineWidthAry[nLines] += aSize.Width();
         nX += aSize.Width();
 
-        if( it == mpTabCtrlData->maItemList.begin() )
-        {
-            nLineWidthAry[nLines] += nShortcutsWidth;
-            nX += nShortcutsWidth;
-        }
-
         if ( it->mnId == mnCurPageId )
             nCurLine = nLines;
 
@@ -2485,8 +2485,9 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
                 nIDX = 0;
                 if( nLinePosAry[n+1]-i > 0 )
                 {
-                    nDX = ( nWidth - nOffsetX - nLineWidthAry[n] ) / ( nLinePosAry[n+1] - i );
-                    nModDX = ( nWidth - nOffsetX - nLineWidthAry[n] ) % ( nLinePosAry[n+1] - i );
+                    long nAvailableWidth = nWidth - nOffsetX - nLineWidthAry[n] - HAMBURGER_DIM;
+                    nDX = nAvailableWidth / ( nLinePosAry[n+1] - i );
+                    nModDX = nAvailableWidth % ( nLinePosAry[n+1] - i );
                 }
                 else
                 {
@@ -2498,20 +2499,11 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
             }
 
             it->maRect.Left() += nIDX;
-            if( it == mpTabCtrlData->maItemList.begin() )
-                it->maRect.Right() += nIDX;
-            else
-                it->maRect.Right() += nIDX + nDX;
+            it->maRect.Right() += nIDX + nDX;
             it->maRect.Top() = nLineHeightAry[n-1];
             it->maRect.Bottom() = nLineHeightAry[n-1] + nIH;
             nIDX += nDX;
 
-            if( m_pShortcuts && ( it == mpTabCtrlData->maItemList.begin() ) )
-            {
-                Point aPos(it->maRect.Right(), nLineHeightAry[n-1]);
-                m_pShortcuts->SetPosPixel(aPos);
-            }
-
             if ( nModDX )
             {
                 nIDX++;
@@ -2524,14 +2516,6 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
     }
     else
     { // only one line
-
-        if( m_pShortcuts && mpTabCtrlData
-            && mpTabCtrlData->maItemList.begin() != mpTabCtrlData->maItemList.end() )
-        {
-            Point aPos(mpTabCtrlData->maItemList.begin()->maRect.Right(), 0);
-            m_pShortcuts->SetPosPixel(aPos);
-        }
-
         if(ImplGetSVData()->maNWFData.mbCenteredTabs)
         {
             int nRightSpace = nMaxWidth;//space left on the right by the tabs
@@ -2549,6 +2533,12 @@ bool NotebookbarTabControlBase::ImplPlaceTabs( long nWidth )
         }
     }
 
+    // potition the shortcutbox
+    m_pShortcuts->SetPosPixel(Point(0, 0));
+
+    // position the menu
+    m_pOpenMenu->SetPosPixel(Point(nWidth - HAMBURGER_DIM, 0));
+
     return true;
 }
 


More information about the Libreoffice-commits mailing list