[Libreoffice-commits] .: 2 commits - svtools/source vcl/inc vcl/unx

Michael Meeks michael at kemper.freedesktop.org
Tue Jul 10 09:37:19 PDT 2012


 svtools/source/control/headbar.cxx       |   81 +++++++++++++++++--------------
 svtools/source/control/tabbar.cxx        |   42 +++++++++++++---
 vcl/inc/unx/gtk/gtkgdi.hxx               |    5 +
 vcl/inc/vcl/salnativewidgets.hxx         |    6 ++
 vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx |   42 ++++++++++++++--
 5 files changed, 133 insertions(+), 43 deletions(-)

New commits:
commit 17ea32a1a36d81a0a12df12adbe15e8eaf1c7c62
Author: Ruslan Kabatsayev <b7.10110111 at gmail.com>
Date:   Mon Jul 9 03:31:54 2012 +0400

    Make bottom tabbar items follow native theme
    
    Change-Id: Ia1c4b4ece81655a91c6e489ee51291684e06c157

diff --git a/svtools/source/control/tabbar.cxx b/svtools/source/control/tabbar.cxx
index a922241..0c43549 100644
--- a/svtools/source/control/tabbar.cxx
+++ b/svtools/source/control/tabbar.cxx
@@ -1098,14 +1098,20 @@ public:
 
     void drawOutputAreaBorder()
     {
+        Size aOutputSize = mrParent.GetOutputSizePixel();
+        Rectangle aOutRect = mrParent.GetPageArea();
+
+        Rectangle borderRect(Point(aOutRect.Left(),-10),Size(aOutputSize.Width(),12));
+        if( mrParent.IsNativeControlSupported(CTRL_FRAME,PART_ENTIRE_CONTROL) &&
+                mrParent.DrawNativeControl(CTRL_FRAME,PART_ENTIRE_CONTROL,borderRect,
+                    CTRL_STATE_ENABLED,ImplControlValue(FRAME_DRAW_IN),rtl::OUString()) )
+            return;
+
         WinBits nWinStyle = mrParent.GetStyle();
 
         // Bei Border oben und unten einen Strich extra malen
         if ( (nWinStyle & WB_BORDER) || (nWinStyle & WB_TOPBORDER) )
         {
-            Size aOutputSize = mrParent.GetOutputSizePixel();
-            Rectangle aOutRect = mrParent.GetPageArea();
-
             // Bei 3D-Tabs wird auch der Border in 3D gemalt
             if ( nWinStyle & WB_3DTAB )
             {
@@ -1198,6 +1204,27 @@ public:
 
     void drawTab()
     {
+        ControlState nState(CTRL_STATE_ENABLED);
+        if( mbSelected )
+            nState|=CTRL_STATE_SELECTED;
+        TabitemValue tiValue;
+        tiValue.mnPosition|=TABITEM_IS_AT_BOTTOM;
+        Rectangle tabRect(maRect);
+        tabRect.Left()+=5;
+        tabRect.Right()-=4;
+        tabRect.Bottom()+=1;
+        if( !mbSelected )
+        {
+            tabRect.Bottom()-=2;
+            tabRect.Top()+=2;
+        }
+        if( mrParent.IsNativeControlSupported(CTRL_TAB_ITEM,PART_ENTIRE_CONTROL) &&
+               mrParent.DrawNativeControl(CTRL_TAB_ITEM,PART_ENTIRE_CONTROL,tabRect,
+                   nState,tiValue,rtl::OUString()) )
+        {
+            return;
+        }
+
         mrParent.SetLineColor(mpStyleSettings->GetDarkShadowColor());
 
         // Je nach Status die richtige FillInBrush setzen
@@ -1422,9 +1449,12 @@ void TabBar::Paint( const Rectangle& )
 
             if ( bCurrent )
             {
-                SetLineColor();
-                SetFillColor(aSelectColor);
-                aDrawer.drawOverTopBorder(mnWinStyle & WB_3DTAB);
+                if(!IsNativeControlSupported(CTRL_TAB_ITEM,PART_ENTIRE_CONTROL))
+                {
+                    SetLineColor();
+                    SetFillColor(aSelectColor);
+                    aDrawer.drawOverTopBorder(mnWinStyle & WB_3DTAB);
+                }
                 return;
             }
 
diff --git a/vcl/inc/vcl/salnativewidgets.hxx b/vcl/inc/vcl/salnativewidgets.hxx
index 40d4fbd..2ae9473 100644
--- a/vcl/inc/vcl/salnativewidgets.hxx
+++ b/vcl/inc/vcl/salnativewidgets.hxx
@@ -366,16 +366,20 @@ class VCL_DLLPUBLIC SliderValue : public ImplControlValue
 #define TABITEM_RIGHTALIGNED   0x002   // the tabitem is aligned with the right border of the TabControl
 #define TABITEM_FIRST_IN_GROUP 0x004   // the tabitem is the first in group of tabitems
 #define TABITEM_LAST_IN_GROUP  0x008   // the tabitem is the last in group of tabitems
+/* This constant is independent from the ones above */
+#define TABITEM_IS_AT_BOTTOM   0x001   // the tabitem at the bottom of the TabControl
 
 class VCL_DLLPUBLIC TabitemValue : public ImplControlValue
 {
     public:
         unsigned int    mnAlignment;
+        unsigned int    mnPosition;
 
         inline TabitemValue()
         : ImplControlValue( CTRL_TAB_ITEM, BUTTONVALUE_DONTKNOW, 0 )
         {
             mnAlignment = 0;
+            mnPosition = 0;
         };
         virtual ~TabitemValue();
         virtual TabitemValue* clone() const;
@@ -386,6 +390,7 @@ class VCL_DLLPUBLIC TabitemValue : public ImplControlValue
         sal_Bool isNotAligned() const   { return (mnAlignment & (TABITEM_LEFTALIGNED | TABITEM_RIGHTALIGNED)) == 0; }
         sal_Bool isFirst() const        { return (mnAlignment & TABITEM_FIRST_IN_GROUP) != 0; }
         sal_Bool isLast() const         { return (mnAlignment & TABITEM_LAST_IN_GROUP) != 0; }
+        sal_Bool isAtBottom() const     { return (mnPosition & TABITEM_IS_AT_BOTTOM) != 0; }
 };
 
 /* SpinbuttonValue:
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index c9b1c30..6b18e7a 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -2680,7 +2680,11 @@ sal_Bool GtkSalGraphics::NWPaintGTKTabItem( ControlType nType, ControlPart,
 
         case CTRL_TAB_ITEM:
         {
+            const TabitemValue* tiValue = static_cast<const TabitemValue *>(&aValue);
             stateType = ( nState & CTRL_STATE_SELECTED ) ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE;
+            GtkPositionType gapSide(GTK_POS_BOTTOM);
+            if(tiValue->isAtBottom())
+                gapSide=GTK_POS_TOP;
 
             // First draw the background
             gtk_paint_flat_box(gWidgetData[m_nXScreen].gNotebookWidget->style, pixmap,
@@ -2696,7 +2700,7 @@ sal_Bool GtkSalGraphics::NWPaintGTKTabItem( ControlType nType, ControlPart,
 
             gtk_paint_extension( gWidgetData[m_nXScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[m_nXScreen].gNotebookWidget,
                 (char *)"tab", (tabRect.Left() - pixmapRect.Left()), (tabRect.Top() - pixmapRect.Top()),
-                tabRect.GetWidth(), tabRect.GetHeight(), GTK_POS_BOTTOM );
+                tabRect.GetWidth(), tabRect.GetHeight(), gapSide);
 
             g_object_steal_data(G_OBJECT(pixmap),tabPrelitDataName);
 
commit 1c222c5a767311d6628bdef3cfc7d7bc1e72e6ea
Author: Ruslan Kabatsayev <b7.10110111 at gmail.com>
Date:   Sat Jul 7 22:02:35 2012 +0400

    Implement support for HeaderBar arrow native rendering, add GTK support
    
    Change-Id: Ib65e61259fdbf371c3330dd555ee020f3a20d1fb

diff --git a/svtools/source/control/headbar.cxx b/svtools/source/control/headbar.cxx
index 3f004e3..7ff53f8 100644
--- a/svtools/source/control/headbar.cxx
+++ b/svtools/source/control/headbar.cxx
@@ -604,45 +604,58 @@ void HeaderBar::ImplDrawItem( OutputDevice* pDev,
             bDraw = sal_False;
 
         if ( bDraw )
-        {
-            long nArrowY;
-            if ( aTxtSize.Height() )
-                nArrowY = nTxtPosY+(aTxtSize.Height()/2);
-            else if ( aImageSize.Width() && aImageSize.Height() )
-                nArrowY = nImagePosY+(aImageSize.Height()/2);
-            else
-            {
-                if ( nBits & HIB_TOP )
-                    nArrowY = aRect.Top()+1;
-                else if ( nBits & HIB_BOTTOM )
-                    nArrowY = aRect.Bottom()-HEAD_ARROWSIZE2-1;
-                else
-                    nArrowY = aRect.Top()+((aRect.GetHeight()-HEAD_ARROWSIZE2)/2);
-            }
-            nArrowY -= HEAD_ARROWSIZE1-1;
-            if ( nBits & HIB_DOWNARROW )
+            if( pWin && pWin->IsNativeControlSupported(CTRL_LISTHEADER, PART_ARROW) )
             {
-                pDev->SetLineColor( rStyleSettings.GetLightColor() );
-                pDev->DrawLine( Point( nArrowX, nArrowY ),
-                                Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
-                pDev->DrawLine( Point( nArrowX, nArrowY ),
-                                Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ) );
-                pDev->SetLineColor( rStyleSettings.GetShadowColor() );
-                pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ),
-                                Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
+                aCtrlRegion=Rectangle(Point(nArrowX,aRect.Top()),Size(nArrowWidth,aRect.GetHeight()));
+                // control value passes 1 if arrow points down, 0 otherwise
+                aControlValue.setNumericVal((nBits&HIB_DOWNARROW)?1:0);
+                nState|=CTRL_STATE_ENABLED;
+                if(bHigh)
+                    nState|=CTRL_STATE_PRESSED;
+                pWin->DrawNativeControl( CTRL_LISTHEADER, PART_ARROW,
+                                         aCtrlRegion, nState, aControlValue,
+                                         rtl::OUString() );
             }
             else
             {
-                pDev->SetLineColor( rStyleSettings.GetLightColor() );
-                pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
-                                Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
-                pDev->SetLineColor( rStyleSettings.GetShadowColor() );
-                pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
-                                Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ) );
-                pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ),
-                                Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
+                long nArrowY;
+                if ( aTxtSize.Height() )
+                    nArrowY = nTxtPosY+(aTxtSize.Height()/2);
+                else if ( aImageSize.Width() && aImageSize.Height() )
+                    nArrowY = nImagePosY+(aImageSize.Height()/2);
+                else
+                {
+                    if ( nBits & HIB_TOP )
+                        nArrowY = aRect.Top()+1;
+                    else if ( nBits & HIB_BOTTOM )
+                        nArrowY = aRect.Bottom()-HEAD_ARROWSIZE2-1;
+                    else
+                        nArrowY = aRect.Top()+((aRect.GetHeight()-HEAD_ARROWSIZE2)/2);
+                }
+                nArrowY -= HEAD_ARROWSIZE1-1;
+                if ( nBits & HIB_DOWNARROW )
+                {
+                    pDev->SetLineColor( rStyleSettings.GetLightColor() );
+                    pDev->DrawLine( Point( nArrowX, nArrowY ),
+                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
+                    pDev->DrawLine( Point( nArrowX, nArrowY ),
+                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ) );
+                    pDev->SetLineColor( rStyleSettings.GetShadowColor() );
+                    pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ),
+                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
+                }
+                else
+                {
+                    pDev->SetLineColor( rStyleSettings.GetLightColor() );
+                    pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
+                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
+                    pDev->SetLineColor( rStyleSettings.GetShadowColor() );
+                    pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
+                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ) );
+                    pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ),
+                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
+                }
             }
-        }
     }
 
     // Gegebenenfalls auch UserDraw aufrufen
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index ab03d18..9dc93b1 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -165,6 +165,11 @@ protected:
     GdkPixmap* NWGetPixmapFromScreen( Rectangle srcRect );
     sal_Bool NWRenderPixmapToScreen( GdkPixmap* pPixmap, Rectangle dstRect );
 
+    sal_Bool NWPaintGTKArrow( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart,
+                           const Rectangle& rControlRectangle,
+                           const clipList& rClipList,
+                           ControlState nState, const ImplControlValue& aValue,
+                           const OUString& rCaption );
     sal_Bool NWPaintGTKListHeader( GdkDrawable* gdkDrawable, ControlType nType, ControlPart nPart,
                            const Rectangle& rControlRectangle,
                            const clipList& rClipList,
diff --git a/vcl/inc/vcl/salnativewidgets.hxx b/vcl/inc/vcl/salnativewidgets.hxx
index 02857a1..40d4fbd 100644
--- a/vcl/inc/vcl/salnativewidgets.hxx
+++ b/vcl/inc/vcl/salnativewidgets.hxx
@@ -172,6 +172,7 @@ typedef sal_uInt32      ControlPart;
 #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_ARROW                  220
 #define PART_MENU_ITEM              250
 #define PART_MENU_ITEM_CHECK_MARK   251
 #define PART_MENU_ITEM_RADIO_MARK   252
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index 3106751..c9b1c30 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -641,7 +641,7 @@ sal_Bool GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPar
             break;
 
         case CTRL_LISTHEADER:
-            if(nPart == PART_BUTTON)
+            if(nPart == PART_BUTTON || nPart == PART_ARROW)
                 return true;
             break;
     }
@@ -940,7 +940,10 @@ sal_Bool GtkSalGraphics::drawNativeControl(    ControlType nType,
     }
     else if(nType==CTRL_LISTHEADER)
     {
-        returnVal = NWPaintGTKListHeader( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
+        if(nPart == PART_BUTTON)
+            returnVal = NWPaintGTKListHeader( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
+        else if(nPart == PART_ARROW)
+            returnVal = NWPaintGTKArrow( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
     }
 
     if( pixmap )
@@ -1203,6 +1206,35 @@ sal_Bool GtkSalGraphics::getNativeControlRegion(  ControlType nType,
 /************************************************************************
  * Individual control drawing functions
  ************************************************************************/
+sal_Bool GtkSalGraphics::NWPaintGTKArrow(
+            GdkDrawable* gdkDrawable,
+            ControlType, ControlPart,
+            const Rectangle& rControlRectangle,
+            const clipList& rClipList,
+            ControlState nState, const ImplControlValue& aValue,
+            const OUString& )
+{
+    GtkArrowType arrowType(aValue.getNumericVal()&1?GTK_ARROW_DOWN:GTK_ARROW_UP);
+    GtkStateType stateType(nState&CTRL_STATE_PRESSED?GTK_STATE_ACTIVE:GTK_STATE_NORMAL);
+
+    GdkRectangle clipRect;
+    for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
+    {
+        clipRect.x = it->Left();
+        clipRect.y = it->Top();
+        clipRect.width = it->GetWidth();
+        clipRect.height = it->GetHeight();
+
+        gtk_paint_arrow(m_pWindow->style,gdkDrawable,stateType,GTK_SHADOW_NONE,&clipRect,
+                m_pWindow,"arrow",arrowType,true,
+                rControlRectangle.Left(),
+                rControlRectangle.Top(),
+                rControlRectangle.GetWidth(),
+                rControlRectangle.GetHeight());
+    }
+    return true;
+}
+
 sal_Bool GtkSalGraphics::NWPaintGTKListHeader(
             GdkDrawable* gdkDrawable,
             ControlType, ControlPart,


More information about the Libreoffice-commits mailing list