diff options
author | Lucas Baudin <xapantu@gmail.com> | 2011-01-29 21:20:45 +0100 |
---|---|---|
committer | Cédric Bosdonnat <cedricbosdo@openoffice.org> | 2011-01-31 11:24:43 +0100 |
commit | 0377b99b3f50a67e7845a3d728313e5a2ef36e73 (patch) | |
tree | ae3d17f4374f107ede9faed70507cd1e24c81f1d | |
parent | d326d10ba876b064cb092a3cf4909fc3c915242a (diff) |
GTK: Use gtk vseparator instead of native one for the toolbar
-rw-r--r-- | vcl/inc/vcl/salnativewidgets.hxx | 15 | ||||
-rw-r--r-- | vcl/inc/vcl/toolbox.hxx | 1 | ||||
-rw-r--r-- | vcl/source/window/toolbox.cxx | 125 | ||||
-rw-r--r-- | vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx | 20 |
4 files changed, 105 insertions, 56 deletions
diff --git a/vcl/inc/vcl/salnativewidgets.hxx b/vcl/inc/vcl/salnativewidgets.hxx index 89b6be637005..bea43a41c24f 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_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_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_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 b7ba4ec2693c..66a13e975b1f 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 16b1f5d7a4a9..ea24b661efa0 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 a0dfbd31c3fd..045bfa077806 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 ); |