Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hi,

Here is a patch to use gtk vseparator instead of native ones in the
toolbar, which are just a black line, and doesn't fit with gtk separator
which can have nice gradients, and a custom color.

The separator height is not handled yet, but I think it isn't very
complicated, I will try to provide a patch for this as soon as possible.

And I clean up a little salnativewidgets.hxx, wich used some tabs.

This patch is under LGPLv3+/MPL.


I also plan to use them for the status bar, which definitively looks bad
with some theme.

Lucas

PS: I didn't test with the other integrations (like windows and aqua),
but I think it shouldn't cause any problem.
From 27cb96d3f7b472270ef6f770150b16aecaee43af Mon Sep 17 00:00:00 2001
From: Lucas Baudin <xapantu@gmail.com>
Date: Sat, 29 Jan 2011 21:20:45 +0100
Subject: [PATCH] GTK: Use gtk vseparator instead of native one for the toolbar

---
 vcl/inc/vcl/salnativewidgets.hxx         |   33 ++++----
 vcl/inc/vcl/toolbox.hxx                  |    1 +
 vcl/source/window/toolbox.cxx            |  125 ++++++++++++++++++------------
 vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx |   20 +++++
 4 files changed, 114 insertions(+), 65 deletions(-)

diff --git a/vcl/inc/vcl/salnativewidgets.hxx b/vcl/inc/vcl/salnativewidgets.hxx
index be3eeb6..78cdfb7 100644
--- a/vcl/inc/vcl/salnativewidgets.hxx
+++ b/vcl/inc/vcl/salnativewidgets.hxx
@@ -157,22 +157,23 @@ typedef sal_uInt32                ControlType;
 
 typedef sal_uInt32             ControlPart;
 
-#define PART_ENTIRE_CONTROL            1
-#define PART_WINDOW             5       // the static listbox window containing the list
-#define PART_BUTTON                            100
-#define PART_BUTTON_UP                 101
-#define PART_BUTTON_DOWN                       102     // Also for ComboBoxes/ListBoxes
-#define PART_BUTTON_LEFT                       103
-#define PART_BUTTON_RIGHT              104
-#define PART_ALL_BUTTONS               105
-#define PART_TRACK_HORZ_LEFT           200
-#define PART_TRACK_VERT_UPPER          201
-#define PART_TRACK_HORZ_RIGHT          202
-#define PART_TRACK_VERT_LOWER          203
-#define PART_TRACK_HORZ_AREA           204
-#define PART_TRACK_VERT_AREA           205
-#define PART_THUMB_HORZ                        210 // Also used as toolbar grip
-#define PART_THUMB_VERT                        211 // Also used as toolbar grip
+#define PART_ENTIRE_CONTROL         1
+#define PART_WINDOW                 5       // the static listbox window containing the list
+#define PART_BUTTON                 100
+#define PART_BUTTON_UP              101
+#define PART_BUTTON_DOWN            102        // Also for ComboBoxes/ListBoxes
+#define PART_BUTTON_LEFT            103
+#define PART_BUTTON_RIGHT           104
+#define PART_ALL_BUTTONS            105
+#define PART_SEPARATOR              106
+#define PART_TRACK_HORZ_LEFT        200
+#define PART_TRACK_VERT_UPPER       201
+#define PART_TRACK_HORZ_RIGHT       202
+#define PART_TRACK_VERT_LOWER       203
+#define PART_TRACK_HORZ_AREA        204
+#define PART_TRACK_VERT_AREA        205
+#define PART_THUMB_HORZ             210 // Also used as toolbar grip
+#define PART_THUMB_VERT             211 // Also used as toolbar grip
 #define PART_MENU_ITEM              250
 #define PART_MENU_ITEM_CHECK_MARK   251
 #define PART_MENU_ITEM_RADIO_MARK   252
diff --git a/vcl/inc/vcl/toolbox.hxx b/vcl/inc/vcl/toolbox.hxx
index 8196642..eb4f36a 100644
--- a/vcl/inc/vcl/toolbox.hxx
+++ b/vcl/inc/vcl/toolbox.hxx
@@ -260,6 +260,7 @@ private:
     SAL_DLLPRIVATE void            ImplFormat( BOOL bResize = FALSE );
     SAL_DLLPRIVATE void            ImplDrawSpin( BOOL bUpperIn, BOOL bLowerIn );
     SAL_DLLPRIVATE void            ImplDrawNext( BOOL bIn );
+    SAL_DLLPRIVATE void            ImplDrawSeparator( USHORT nPos, Rectangle rRect );
     SAL_DLLPRIVATE void            ImplDrawItem( USHORT nPos, BOOL bHighlight = FALSE, BOOL bPaint 
= FALSE, BOOL bLayout = FALSE );
     using Window::ImplInvalidate;
     SAL_DLLPRIVATE void            ImplInvalidate( BOOL bNewCalc = FALSE, BOOL bFullPaint = FALSE 
);
diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx
index b931585..ecd6505 100644
--- a/vcl/source/window/toolbox.cxx
+++ b/vcl/source/window/toolbox.cxx
@@ -3403,6 +3403,54 @@ void ToolBox::ImplDrawNext( BOOL bIn )
 
 // -----------------------------------------------------------------------
 
+void ToolBox::ImplDrawSeparator( USHORT nPos, Rectangle rRect )
+{
+    BOOL bNativeOk = FALSE;
+    ImplToolItem* pItem = &mpData->m_aItems[nPos];
+
+    if( IsNativeControlSupported( CTRL_TOOLBAR, PART_SEPARATOR ) )
+    {
+        ImplControlValue    aControlValue;
+        ControlState        nState = 0;
+        bNativeOk = DrawNativeControl( CTRL_TOOLBAR, PART_SEPARATOR,
+                                       rRect, nState, aControlValue, rtl::OUString() );
+    }
+
+    /* Draw the widget only if it can't be drawn natively. */
+    if( !bNativeOk )
+    {
+        const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+        ImplToolItem* pTempItem = &mpData->m_aItems[nPos-1];
+
+        // no separator before or after windows or at breaks
+        if ( pTempItem && !pTempItem->mbShowWindow && nPos < mpData->m_aItems.size()-1 )
+        {
+            pTempItem = &mpData->m_aItems[nPos+1];
+            if ( !pTempItem->mbShowWindow && !pTempItem->mbBreak )
+            {
+                long nCenterPos, nSlim;
+                SetLineColor( rStyleSettings.GetSeparatorColor() );
+                if ( IsHorizontal() )
+                {
+                    nSlim = (pItem->maRect.Bottom() - pItem->maRect.Top ()) / 4;
+                    nCenterPos = pItem->maRect.Center().X();
+                    DrawLine( Point( nCenterPos, pItem->maRect.Top() + nSlim ),
+                              Point( nCenterPos, pItem->maRect.Bottom() - nSlim ) );
+                }
+                else
+                {
+                    nSlim = (pItem->maRect.Right() - pItem->maRect.Left ()) / 4;
+                    nCenterPos = pItem->maRect.Center().Y();
+                    DrawLine( Point( pItem->maRect.Left() + nSlim, nCenterPos ),
+                              Point( pItem->maRect.Right() - nSlim, nCenterPos ) );
+                }
+            }
+        }
+    }
+}
+
+// -----------------------------------------------------------------------
+
 static void ImplDrawButton( ToolBox* pThis, const Rectangle &rRect, USHORT highlight, BOOL 
bChecked, BOOL bEnabled, BOOL bIsWindow )
 {
     // draws toolbar button background either native or using a coloured selection
@@ -3462,6 +3510,33 @@ void ToolBox::ImplDrawItem( USHORT nPos, BOOL bHighlight, BOOL bPaint, BOOL 
bLay
     if( rStyleSettings.GetFaceColor() == Color( COL_WHITE ) )
         bHighContrastWhite = TRUE;
 
+    // Compute buttons area.
+    Size    aBtnSize    = pItem->maRect.GetSize();
+    if( ImplGetSVData()->maNWFData.mbToolboxDropDownSeparate )
+    {
+        // separate button not for dropdown only where the whole button is painted
+        if ( pItem->mnBits & TIB_DROPDOWN &&
+            ((pItem->mnBits & TIB_DROPDOWNONLY) != TIB_DROPDOWNONLY) )
+        {
+            Rectangle aArrowRect = pItem->GetDropDownRect( mbHorz );
+            if( aArrowRect.Top() == pItem->maRect.Top() ) // dropdown arrow on right side
+                aBtnSize.Width() -= aArrowRect.GetWidth();
+            else // dropdown arrow on bottom side
+                aBtnSize.Height() -= aArrowRect.GetHeight();
+        }
+    }
+
+    /* Compute the button/separator rectangle here, we'll need it for
+     * both the buttons and the separators. */
+    Rectangle aButtonRect( pItem->maRect.TopLeft(), aBtnSize );
+    long    nOffX       = SMALLBUTTON_OFF_NORMAL_X;
+    long    nOffY       = SMALLBUTTON_OFF_NORMAL_Y;
+    long    nImageOffX  = 0;
+    long    nImageOffY  = 0;
+    long    nTextOffX   = 0;
+    long    nTextOffY   = 0;
+    USHORT  nStyle      = 0;
+
     // draw separators in flat style only
     if ( !bLayout &&
          (mnOutStyle & TOOLBOX_STYLE_FLAT) &&
@@ -3469,31 +3544,7 @@ void ToolBox::ImplDrawItem( USHORT nPos, BOOL bHighlight, BOOL bPaint, BOOL 
bLay
          nPos > 0
          )
     {
-        // no separator before or after windows or at breaks
-        ImplToolItem* pTempItem = &mpData->m_aItems[nPos-1];
-        if ( pTempItem && !pTempItem->mbShowWindow && nPos < mpData->m_aItems.size()-1 )
-        {
-            pTempItem = &mpData->m_aItems[nPos+1];
-            if ( !pTempItem->mbShowWindow && !pTempItem->mbBreak )
-            {
-                long nCenterPos, nSlim;
-                SetLineColor( rStyleSettings.GetSeparatorColor() );
-                if ( IsHorizontal() )
-                {
-                    nSlim = (pItem->maRect.Bottom() - pItem->maRect.Top ()) / 4;
-                    nCenterPos = pItem->maRect.Center().X();
-                    DrawLine( Point( nCenterPos, pItem->maRect.Top() + nSlim ),
-                              Point( nCenterPos, pItem->maRect.Bottom() - nSlim ) );
-                }
-                else
-                {
-                    nSlim = (pItem->maRect.Right() - pItem->maRect.Left ()) / 4;
-                    nCenterPos = pItem->maRect.Center().Y();
-                    DrawLine( Point( pItem->maRect.Left() + nSlim, nCenterPos ),
-                              Point( pItem->maRect.Right() - nSlim, nCenterPos ) );
-                }
-            }
-        }
+        ImplDrawSeparator( nPos, aButtonRect );
     }
 
     // do nothing if item is no button or will be displayed as window
@@ -3557,30 +3608,6 @@ void ToolBox::ImplDrawItem( USHORT nPos, BOOL bHighlight, BOOL bPaint, BOOL 
bLay
         return;
     }
 
-    // draw button
-    Size    aBtnSize    = pItem->maRect.GetSize();
-    if( ImplGetSVData()->maNWFData.mbToolboxDropDownSeparate )
-    {
-        // separate button not for dropdown only where the whole button is painted
-        if ( pItem->mnBits & TIB_DROPDOWN &&
-            ((pItem->mnBits & TIB_DROPDOWNONLY) != TIB_DROPDOWNONLY) )
-        {
-            Rectangle aArrowRect = pItem->GetDropDownRect( mbHorz );
-            if( aArrowRect.Top() == pItem->maRect.Top() ) // dropdown arrow on right side
-                aBtnSize.Width() -= aArrowRect.GetWidth();
-            else // dropdown arrow on bottom side
-                aBtnSize.Height() -= aArrowRect.GetHeight();
-        }
-    }
-    Rectangle aButtonRect( pItem->maRect.TopLeft(), aBtnSize );
-    long    nOffX       = SMALLBUTTON_OFF_NORMAL_X;
-    long    nOffY       = SMALLBUTTON_OFF_NORMAL_Y;
-    long    nImageOffX=0;
-    long    nImageOffY=0;
-    long    nTextOffX=0;
-    long    nTextOffY=0;
-    USHORT  nStyle      = 0;
-
     if ( pItem->meState == STATE_CHECK )
     {
         nStyle |= BUTTON_DRAW_CHECKED;
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index f94a9e3..0dbfefb 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -102,6 +102,7 @@ struct NWFWidgetData
     GtkWidget *  gTreeView;
     GtkWidget *  gHScale;
     GtkWidget *  gVScale;
+    GtkWidget *  gVSeparator;
 
     NWPixmapCacheList* gNWPixmapCacheList;
     NWPixmapCache* gCacheTabItems;
@@ -140,6 +141,7 @@ struct NWFWidgetData
         gTreeView( NULL ),
         gHScale( NULL ),
         gVScale( NULL ),
+        gVSeparator ( NULL ),
         gNWPixmapCacheList( NULL ),
         gCacheTabItems( NULL ),
         gCacheTabPages( NULL )
@@ -583,6 +585,7 @@ BOOL GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nP
                 ||  (nPart==PART_THUMB_HORZ)
                 ||  (nPart==PART_THUMB_VERT)
                 ||  (nPart==PART_BUTTON)
+                ||  (nPart==PART_SEPARATOR)
                 )
                                                                 )   ||
         ((nType == CTRL_MENUBAR) &&
@@ -2640,6 +2643,21 @@ BOOL GtkSalGraphics::NWPaintGTKToolbar(
                                pButtonWidget, "button", x, y, w, h );
             }
         }
+        else if(nPart == PART_SEPARATOR )
+        {
+            gtk_paint_vline( gWidgetData[m_nScreen].gVSeparator->style,
+                              gdkDrawable,
+                              GTK_STATE_NORMAL,
+                              &clipRect,
+                              gWidgetData[m_nScreen].gVSeparator,
+                              "vseparator",
+                              y + 4, y + h - 8 /* -2 and -4 is a dirty
+                                                * hack, to fit most gtk
+                                                * style, but it must be
+                                                * fixed, FIXME */,
+                              x
+                              );
+        }
     }
 
     return( TRUE );
@@ -3945,6 +3963,8 @@ static void NWEnsureGTKToolbar( int nScreen )
         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gToolbarWidget, nScreen );
         gWidgetData[nScreen].gToolbarButtonWidget = gtk_button_new();
         gWidgetData[nScreen].gToolbarToggleWidget = gtk_toggle_button_new();
+        gWidgetData[nScreen].gVSeparator = gtk_vseparator_new();
+        NWAddWidgetToCacheWindow( gWidgetData[nScreen].gVSeparator, nScreen );
 
         GtkReliefStyle aRelief = GTK_RELIEF_NORMAL;
         gtk_widget_ensure_style( gWidgetData[nScreen].gToolbarWidget );
-- 
1.7.1


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.