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 <[email protected]> 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 <[email protected]> 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, _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
