[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