diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-09-08 15:10:27 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-09-08 15:10:27 +0000 |
commit | 196bae14a4d5a59e30b8164c8137bcd11800f25d (patch) | |
tree | 3d7fe19c16fa5edc4c9c5bf810747be87674c75e /vcl/unx | |
parent | ec5a27d5d9e310fdfc6e014c122aed9fc78081f4 (diff) |
INTEGRATION: CWS vcl26 (1.2.86); FILE MERGED
2004/08/27 13:00:13 dv 1.2.86.3: #i33381# Better scrollbar positioning
2004/08/26 14:22:17 dv 1.2.86.2: #i33447# Always use GTK_SHADOW_IN for all kinds of edit fields
2004/08/25 13:05:44 dv 1.2.86.1: #i33381# Use theme settings for calculating scrollbar rectangles, enhanced painting of scrollbar
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx | 421 |
1 files changed, 334 insertions, 87 deletions
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx index b385c504f55d..b20ac1a8f610 100644 --- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx @@ -2,9 +2,9 @@ * * $RCSfile: salnativewidgets-gtk.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: rt $ $Date: 2004-09-08 15:12:32 $ + * last change: $Author: hr $ $Date: 2004-09-08 16:10:27 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -147,6 +147,7 @@ static void NWConvertVCLStateToGTKState( ControlState nVCLState, GtkStateType* n static void NWAddWidgetToCacheWindow( GtkWidget* widget ); static void NWSetWidgetState( GtkWidget* widget, ControlState nState, GtkStateType nGtkState ); +static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow ); /* * Individual helper functions @@ -185,6 +186,9 @@ static Rectangle NWGetListBoxIndicatorRect( ControlType nType, ControlPart nPart const ImplControlValue& aValue, SalControlHandle& rControlHandle, OUString aCaption ); //--- +static Rectangle NWGetScrollButtonRect( ControlPart nPart, Rectangle aAreaRect ); +//--- + /********************************************************* * PixmapCache *********************************************************/ @@ -373,7 +377,8 @@ BOOL GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nP ((nType==CTRL_SCROLLBAR) && ( (nPart==PART_DRAW_BACKGROUND_HORZ) || (nPart==PART_DRAW_BACKGROUND_VERT) - || (nPart==PART_ENTIRE_CONTROL) ) ) || + || (nPart==PART_ENTIRE_CONTROL) + || (nPart==HAS_THREE_BUTTONS) ) ) || ((nType==CTRL_EDITBOX) && ( (nPart==PART_ENTIRE_CONTROL) || (nPart==HAS_BACKGROUND_TEXTURE) ) ) || @@ -418,6 +423,85 @@ BOOL GtkSalGraphics::hitTestNativeControl( ControlType nType, SalControlHandle& rControlHandle, BOOL& rIsInside ) { + if ( ( nType == CTRL_SCROLLBAR ) && + ( ( nPart == PART_BUTTON_UP ) || + ( nPart == PART_BUTTON_DOWN ) || + ( nPart == PART_BUTTON_LEFT ) || + ( nPart == PART_BUTTON_RIGHT ) ) ) + { + NWEnsureGTKScrollbars(); + + // Grab some button style attributes + gboolean has_forward; + gboolean has_forward2; + gboolean has_backward; + gboolean has_backward2; + + gtk_widget_style_get( gScrollHorizWidget, "has-forward-stepper", &has_forward, + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, NULL ); + Rectangle aForward; + Rectangle aBackward; + + rIsInside = FALSE; + + ControlPart nCounterPart; + if ( nPart == PART_BUTTON_UP ) + nCounterPart = PART_BUTTON_DOWN; + else if ( nPart == PART_BUTTON_DOWN ) + nCounterPart = PART_BUTTON_UP; + else if ( nPart == PART_BUTTON_LEFT ) + nCounterPart = PART_BUTTON_RIGHT; + else if ( nPart == PART_BUTTON_RIGHT ) + nCounterPart = PART_BUTTON_LEFT; + + aBackward = NWGetScrollButtonRect( nPart, rControlRegion.GetBoundRect() ); + aForward = NWGetScrollButtonRect( nCounterPart, rControlRegion.GetBoundRect() ); + + if ( has_backward && has_forward2 ) + { + if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) ) + aBackward.setHeight( aBackward.getHeight() / 2 ); + else + aBackward.setWidth( aBackward.getWidth() / 2 ); + + if ( nPart == PART_BUTTON_DOWN ) + aBackward.Move( 0, aBackward.getHeight() / 2 ); + else if ( nPart == PART_BUTTON_RIGHT ) + aBackward.Move( aBackward.getWidth() / 2, 0 ); + } + + if ( has_backward2 && has_forward ) + { + if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) ) + aForward.setHeight( aForward.getHeight() / 2 ); + else + aForward.setWidth( aForward.getWidth() / 2 ); + + if ( nPart == PART_BUTTON_DOWN ) + aForward.Move( 0, aForward.getHeight() / 2 ); + else if ( nPart == PART_BUTTON_RIGHT ) + aForward.Move( aForward.getWidth() / 2, 0 ); + } + + if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_LEFT ) ) + { + if ( has_backward ) + rIsInside |= aBackward.IsInside( aPos ); + if ( has_backward2 ) + rIsInside |= aForward.IsInside( aPos ); + } + else + { + if ( has_forward ) + rIsInside |= aBackward.IsInside( aPos ); + if ( has_forward2 ) + rIsInside |= aForward.IsInside( aPos ); + } + return ( TRUE ); + } + if( IsNativeControlSupported(nType, nPart) ) { rIsInside = rControlRegion.IsInside( aPos ); @@ -610,6 +694,14 @@ BOOL GtkSalGraphics::getNativeControlRegion( ControlType nType, returnVal = TRUE; } + if ( (nType==CTRL_SCROLLBAR) && ((nPart==PART_BUTTON_LEFT) || (nPart==PART_BUTTON_RIGHT) || + (nPart==PART_BUTTON_UP) || (nPart==PART_BUTTON_DOWN) ) ) + { + rNativeBoundingRegion = NWGetScrollButtonRect( nPart, rControlRegion.GetBoundRect() ); + rNativeContentRegion = rNativeBoundingRegion; + + returnVal = TRUE; + } pWidgetMutex->release(); } @@ -998,6 +1090,15 @@ BOOL GtkSalGraphics::NWPaintGTKCheck( ControlType nType, ControlPart nPart, } //------------------------------------- +static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow ) +{ + // Size the arrow appropriately + rArrow.setWidth ( rButton.getWidth() / 2 ); + rArrow.setHeight( rButton.getHeight() / 2 ); + + rArrow.setX( rButton.getX() + ( rButton.getWidth() - rArrow.getWidth() ) / 2 ); + rArrow.setY( rButton.getY() + ( rButton.getHeight() - rArrow.getHeight() ) / 2 ); +} BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, const Region& rControlRegion, ControlState nState, @@ -1015,12 +1116,12 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, GtkAdjustment* scrollbarValues = NULL; GtkOrientation scrollbarOrientation; Rectangle thumbRect = pScrollbarVal->maThumbRect; - Rectangle button1BoundRect = pScrollbarVal->maButton1Rect; - Rectangle button2BoundRect = pScrollbarVal->maButton2Rect; - GtkArrowType button1Type; - GtkArrowType button2Type; - gint nButton1Extra = 0; - gint nButton2Extra = 0; + Rectangle button11BoundRect = pScrollbarVal->maButton1Rect; // backward + Rectangle button22BoundRect = pScrollbarVal->maButton2Rect; // forward + Rectangle button12BoundRect = pScrollbarVal->maButton1Rect; // secondary forward + Rectangle button21BoundRect = pScrollbarVal->maButton2Rect; // secondary backward + GtkArrowType button1Type; // backward + GtkArrowType button2Type; // forward gchar * scrollbarTagH = (gchar *) "hscrollbar"; gchar * scrollbarTagV = (gchar *) "vscrollbar"; gchar * scrollbarTag = NULL; @@ -1049,6 +1150,7 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, pixmapRect.setWidth( pixmapRect.getWidth() + 1 ); pixmapRect.setHeight( pixmapRect.getHeight() + 1 ); scrollbarRect = pixmapRect; + if ( (scrollbarRect.getWidth() <= 1) || (scrollbarRect.getHeight() <= 1) ) return( TRUE ); @@ -1058,10 +1160,24 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, "trough_border", &trough_border, "stepper_spacing", &stepper_spacing, "min_slider_length", &min_slider_length, NULL ); + gboolean has_forward; + gboolean has_forward2; + gboolean has_backward; + gboolean has_backward2; + + gtk_widget_style_get( gScrollHorizWidget, "has-forward-stepper", &has_forward, + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, NULL ); + gint magic = trough_border ? 1 : 0; + gint nFirst = 0; + + if ( has_backward ) nFirst += 1; + if ( has_forward2 ) nFirst += 1; if ( nPart == PART_DRAW_BACKGROUND_HORZ ) { - unsigned int sliderHeight = slider_width + (trough_border * 2); + unsigned int sliderHeight = slider_width + (trough_border * 2); vShim = (pixmapRect.getHeight() - sliderHeight) / 2; if ( sliderHeight < scrollbarRect.getHeight() ); @@ -1076,18 +1192,32 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, button1Type = GTK_ARROW_LEFT; button2Type = GTK_ARROW_RIGHT; - button1BoundRect.setX( (button1BoundRect.getWidth()-stepper_size) / 2 ); - button1BoundRect.setY( ((button1BoundRect.getHeight()-vShim)-slider_width) / 2 ); - button1BoundRect.setHeight( slider_width ); - button1BoundRect.setWidth( stepper_size ); - nButton1Extra = (pScrollbarVal->maButton1Rect.getX() + pScrollbarVal->maButton1Rect.getWidth()) - - (button1BoundRect.getX() + button1BoundRect.getWidth()); + if ( has_backward ) + { + button12BoundRect.Move( stepper_size - trough_border, + (scrollbarRect.getHeight() - slider_width) / 2 ); + } + + button11BoundRect.Move( trough_border, (scrollbarRect.getHeight() - slider_width) / 2 ); + button11BoundRect.setHeight( slider_width ); + button11BoundRect.setWidth( stepper_size ); + button12BoundRect.setHeight( slider_width ); + button12BoundRect.setWidth( stepper_size ); - button2BoundRect.setX( scrollbarRect.getWidth() - button2BoundRect.getWidth() + ((button2BoundRect.getWidth()-stepper_size) / 2) ); - button2BoundRect.setY( ((button2BoundRect.getHeight()-vShim)-slider_width) / 2 ); - button2BoundRect.setHeight( slider_width ); - button2BoundRect.setWidth( stepper_size ); - nButton2Extra = button2BoundRect.getX() - pScrollbarVal->maButton2Rect.getX(); + if ( has_backward2 ) + { + button22BoundRect.Move( stepper_size+(trough_border+1)/2, (scrollbarRect.getHeight() - slider_width) / 2 ); + button21BoundRect.Move( (trough_border+1)/2, (scrollbarRect.getHeight() - slider_width) / 2 ); + } + else + { + button22BoundRect.Move( (trough_border+1)/2, (scrollbarRect.getHeight() - slider_width) / 2 ); + } + + button21BoundRect.setHeight( slider_width ); + button21BoundRect.setWidth( stepper_size ); + button22BoundRect.setHeight( slider_width ); + button22BoundRect.setWidth( stepper_size ); thumbRect.setHeight( slider_width ); // Make sure the thumb is at least the default width (so we don't get tiny thumbs), @@ -1099,18 +1229,13 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, thumbRect.setWidth( min_slider_length ); #endif + thumbRect.setWidth( thumbRect.getWidth() + magic ); // Center vertically in the track thumbRect.Move( 0, (scrollbarRect.getHeight() - slider_width) / 2 ); - - // Themes may have a different idea of what the scrollbar stepper button - // size should be, so we have to adjust the Thumbs rectangle to account - // for the difference between OOo's idea and the theme's - thumbRect.Move( -nButton1Extra, 0 ); - thumbRect.setWidth( thumbRect.getWidth() + nButton1Extra + nButton2Extra ); } else { - unsigned int sliderWidth = slider_width + (trough_border * 2); + unsigned int sliderWidth = slider_width + (trough_border * 2); hShim = (pixmapRect.getWidth() - sliderWidth) / 2; if ( sliderWidth < scrollbarRect.getWidth() ); @@ -1125,18 +1250,31 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, button1Type = GTK_ARROW_UP; button2Type = GTK_ARROW_DOWN; - button1BoundRect.setX( ((button1BoundRect.getWidth()-hShim)-slider_width) / 2 ); - button1BoundRect.setY( (button1BoundRect.getHeight()-stepper_size) / 2 ); - button1BoundRect.setHeight( stepper_size ); - button1BoundRect.setWidth( slider_width ); - nButton1Extra = (pScrollbarVal->maButton1Rect.getY() + pScrollbarVal->maButton1Rect.getHeight()) - - (button1BoundRect.getY() + button1BoundRect.getHeight()); + if ( has_backward ) + { + button12BoundRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, + stepper_size + trough_border ); + } + button11BoundRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, trough_border ); + button11BoundRect.setHeight( stepper_size ); + button11BoundRect.setWidth( slider_width ); + button12BoundRect.setHeight( stepper_size ); + button12BoundRect.setWidth( slider_width ); + + if ( has_backward2 ) + { + button22BoundRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, stepper_size+(trough_border+1)/2 ); + button21BoundRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, (trough_border+1)/2 ); + } + else + { + button22BoundRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, (trough_border+1)/2 ); + } - button2BoundRect.setX( ((button2BoundRect.getWidth()-hShim)-slider_width) / 2 ); - button2BoundRect.setY( scrollbarRect.getHeight() - button2BoundRect.getHeight() + ((button2BoundRect.getHeight()-stepper_size) / 2) ); - button2BoundRect.setHeight( stepper_size ); - button2BoundRect.setWidth( slider_width ); - nButton2Extra = button2BoundRect.getY() - pScrollbarVal->maButton2Rect.getY(); + button21BoundRect.setHeight( stepper_size ); + button21BoundRect.setWidth( slider_width ); + button22BoundRect.setHeight( stepper_size ); + button22BoundRect.setWidth( slider_width ); thumbRect.setWidth( slider_width ); #if 0 @@ -1148,16 +1286,13 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, thumbRect.setHeight( min_slider_length ); #endif + thumbRect.setHeight( thumbRect.getHeight() + magic ); // Center horizontally in the track thumbRect.Move( (scrollbarRect.getWidth() - slider_width) / 2, 0 ); - - // Themes may have a different idea of what the scrollbar stepper button - // size should be, so we have to adjust the Thumbs rectangle to account - // for the difference between OOo's idea and the theme's - thumbRect.Move( 0, -nButton1Extra ); - thumbRect.setHeight( thumbRect.getHeight() + nButton1Extra + nButton2Extra ); } + BOOL has_slider = ! ( thumbRect.IsEmpty() ); + scrollbarValues = gtk_range_get_adjustment( GTK_RANGE(scrollbarWidget) ); if ( scrollbarValues == NULL ) scrollbarValues = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) ); @@ -1177,17 +1312,6 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, } gtk_adjustment_changed( scrollbarValues ); - // Size the arrow appropriately - arrow1Rect.setWidth ( button1BoundRect.getWidth() / 2 ); - arrow1Rect.setHeight( button1BoundRect.getHeight() / 2 ); - arrow2Rect.setWidth ( button2BoundRect.getWidth() / 2 ); - arrow2Rect.setHeight( button2BoundRect.getHeight() / 2 ); - - arrow1Rect.setX( button1BoundRect.getX() + (button1BoundRect.getWidth() - arrow1Rect.getWidth() ) / 2 ); - arrow1Rect.setY( button1BoundRect.getY() + (button1BoundRect.getHeight() - arrow1Rect.getHeight()) / 2 ); - arrow2Rect.setX( button2BoundRect.getX() + (button2BoundRect.getWidth() - arrow2Rect.getWidth() ) / 2 ); - arrow2Rect.setY( button2BoundRect.getY() + (button2BoundRect.getHeight() - arrow2Rect.getHeight()) / 2 ); - if( !bUseWindow ) { pixmap = NWGetPixmapFromScreen( pixmapRect ); @@ -1234,38 +1358,77 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, } // ----------------- THUMB - NWConvertVCLStateToGTKState( pScrollbarVal->mnThumbState, &stateType, &shadowType ); - if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED ) stateType = GTK_STATE_PRELIGHT; - gtk_paint_slider( style, gdkDrawable, stateType, GTK_SHADOW_OUT, - gdkRect, GTK_WIDGET(scrollbarWidget), "slider", - x+hShim+thumbRect.getX(), y+vShim+thumbRect.getY(), - thumbRect.getWidth(), thumbRect.getHeight(), scrollbarOrientation ); - - // ----------------- BUTTON 1 - NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; - gtk_paint_box( style, gdkDrawable, stateType, shadowType, - gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", - x+hShim+button1BoundRect.getX(), y+vShim+button1BoundRect.getY(), - button1BoundRect.getWidth(), button1BoundRect.getHeight() ); - // ----------------- ARROW 1 - gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, - gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, TRUE, - x+hShim+arrow1Rect.getX(), y+vShim+arrow1Rect.getY(), - arrow1Rect.getWidth(), arrow1Rect.getHeight() ); - + if ( has_slider ) + { + NWConvertVCLStateToGTKState( pScrollbarVal->mnThumbState, &stateType, &shadowType ); + if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED ) stateType = GTK_STATE_PRELIGHT; + gtk_paint_slider( style, gdkDrawable, stateType, GTK_SHADOW_OUT, + gdkRect, GTK_WIDGET(scrollbarWidget), "slider", + x+hShim+thumbRect.getX(), y+vShim+thumbRect.getY(), + thumbRect.getWidth(), thumbRect.getHeight(), scrollbarOrientation ); + } + // ----------------- BUTTON 1 // + if ( has_backward ) + { + NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType ); + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + gtk_paint_box( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", + x+hShim+button11BoundRect.getX(), y+vShim+button11BoundRect.getY(), + button11BoundRect.getWidth(), button11BoundRect.getHeight() ); + // ----------------- ARROW 1 + NWCalcArrowRect( button11BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, TRUE, + x+hShim+arrowRect.getX(), y+vShim+arrowRect.getY(), + arrowRect.getWidth(), arrowRect.getHeight() ); + } + if ( has_forward2 ) + { + NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType ); + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + gtk_paint_box( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), "stepper", + x+hShim+button12BoundRect.getX(), y+vShim+button12BoundRect.getY(), + button12BoundRect.getWidth(), button12BoundRect.getHeight() ); + // ----------------- ARROW 1 + NWCalcArrowRect( button12BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, TRUE, + x+hShim+arrowRect.getX(), y+vShim+arrowRect.getY(), + arrowRect.getWidth(), arrowRect.getHeight() ); + } // ----------------- BUTTON 2 - NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType ); - if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; - gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, - GTK_WIDGET(scrollbarWidget), "stepper", - x+hShim+button2BoundRect.getX(), y+vShim+button2BoundRect.getY(), - button2BoundRect.getWidth(), button2BoundRect.getHeight() ); - // ----------------- ARROW 2 - gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, - gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, TRUE, - x+hShim+arrow2Rect.getX(), y+vShim+arrow2Rect.getY(), - arrow2Rect.getWidth(), arrow2Rect.getHeight() ); + if ( has_backward2 ) + { + NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType ); + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, + GTK_WIDGET(scrollbarWidget), "stepper", + x+hShim+button21BoundRect.getX(), y+vShim+button21BoundRect.getY(), + button21BoundRect.getWidth(), button21BoundRect.getHeight() ); + // ----------------- ARROW 2 + NWCalcArrowRect( button21BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, TRUE, + x+hShim+arrowRect.getX(), y+vShim+arrowRect.getY(), + arrowRect.getWidth(), arrowRect.getHeight() ); + } + if ( has_forward ) + { + NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType ); + if ( stateType == GTK_STATE_INSENSITIVE ) stateType = GTK_STATE_NORMAL; + gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect, + GTK_WIDGET(scrollbarWidget), "stepper", + x+hShim+button22BoundRect.getX(), y+vShim+button22BoundRect.getY(), + button22BoundRect.getWidth(), button22BoundRect.getHeight() ); + // ----------------- ARROW 2 + NWCalcArrowRect( button22BoundRect, arrowRect ); + gtk_paint_arrow( style, gdkDrawable, stateType, shadowType, + gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, TRUE, + x+hShim+arrowRect.getX(), y+vShim+arrowRect.getY(), + arrowRect.getWidth(), arrowRect.getHeight() ); + } if( !bUseWindow ) { @@ -1279,6 +1442,88 @@ BOOL GtkSalGraphics::NWPaintGTKScrollbar( ControlType nType, ControlPart nPart, return( TRUE ); } +//--- + +static Rectangle NWGetScrollButtonRect( ControlPart nPart, Rectangle aAreaRect ) +{ + gint slider_width; + gint stepper_size; + gint stepper_spacing; + gint trough_border; + + NWEnsureGTKScrollbars(); + + // Grab some button style attributes + gtk_widget_style_get( gScrollHorizWidget, "slider-width", &slider_width, + "stepper-size", &stepper_size, + "trough-border", &trough_border, + "stepper-spacing", &stepper_spacing, NULL ); + + gboolean has_forward; + gboolean has_forward2; + gboolean has_backward; + gboolean has_backward2; + + gtk_widget_style_get( gScrollHorizWidget, "has-forward-stepper", &has_forward, + "has-secondary-forward-stepper", &has_forward2, + "has-backward-stepper", &has_backward, + "has-secondary-backward-stepper", &has_backward2, NULL ); + gint buttonWidth; + gint buttonHeight; + Rectangle buttonRect; + + gint nFirst = 0; + gint nSecond = 0; + + if ( has_forward ) nSecond += 1; + if ( has_forward2 ) nFirst += 1; + if ( has_backward ) nFirst += 1; + if ( has_backward2 ) nSecond += 1; + + if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) ) + { + buttonWidth = slider_width + 2 * trough_border; + buttonHeight = stepper_size + trough_border + stepper_spacing; + } + else + { + buttonWidth = stepper_size + trough_border + stepper_spacing; + buttonHeight = slider_width + 2 * trough_border; + } + + if ( nPart == PART_BUTTON_UP ) + { + buttonHeight *= nFirst; + buttonHeight -= 1; + buttonRect.setX( aAreaRect.getX() ); + buttonRect.setY( aAreaRect.getY() ); + } + else if ( nPart == PART_BUTTON_LEFT ) + { + buttonWidth *= nFirst; + buttonWidth -= 1; + buttonRect.setX( aAreaRect.getX() ); + buttonRect.setY( aAreaRect.getY() ); + } + else if ( nPart == PART_BUTTON_DOWN ) + { + buttonHeight *= nSecond; + buttonRect.setX( aAreaRect.getX() ); + buttonRect.setY( aAreaRect.getY() + aAreaRect.getHeight() - buttonHeight ); + } + else if ( nPart == PART_BUTTON_RIGHT ) + { + buttonWidth *= nSecond; + buttonRect.setX( aAreaRect.getX() + aAreaRect.getWidth() - buttonWidth ); + buttonRect.setY( aAreaRect.getY() ); + } + + buttonRect.setWidth( buttonWidth ); + buttonRect.setHeight( buttonHeight ); + + return( buttonRect ); +} + //------------------------------------- BOOL GtkSalGraphics::NWPaintGTKEditBox( ControlType nType, ControlPart nPart, @@ -1375,6 +1620,8 @@ static void NWPaintOneEditBox( GdkWindow * gdkDrawable, NWEnsureGTKCombo(); NWConvertVCLStateToGTKState( nState, &stateType, &shadowType ); + shadowType = GTK_SHADOW_IN; + switch ( nType ) { case CTRL_COMBOBOX: |