79295c108fc437838a396aead05be34126bc39b6
[WebKit-https.git] / Source / WebCore / platform / gtk / ScrollbarThemeGtk2.cpp
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "ScrollbarThemeGtk.h"
28
29 #ifdef GTK_API_VERSION_2
30
31 #include "PlatformMouseEvent.h"
32 #include "RenderThemeGtk.h"
33 #include "ScrollView.h"
34 #include "Scrollbar.h"
35 #include "WidgetRenderingContext.h"
36 #include "gtkdrawing.h"
37 #include <gtk/gtk.h>
38
39 namespace WebCore {
40
41 static void gtkStyleSetCallback(GtkWidget* widget, GtkStyle* previous, ScrollbarThemeGtk* scrollbarTheme)
42 {
43     scrollbarTheme->updateThemeProperties();
44 }
45
46 ScrollbarThemeGtk::ScrollbarThemeGtk()
47 {
48     updateThemeProperties();
49     g_signal_connect(static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get())->gtkScrollbar(),
50          "style-set", G_CALLBACK(gtkStyleSetCallback), this);
51 }
52
53 void ScrollbarThemeGtk::updateThemeProperties()
54 {
55     MozGtkScrollbarMetrics metrics;
56     moz_gtk_get_scrollbar_metrics(&metrics);
57
58     m_thumbFatness = metrics.slider_width;
59     m_troughBorderWidth = metrics.trough_border;
60     m_stepperSize = metrics.stepper_size;
61     m_stepperSpacing = metrics.stepper_spacing;
62     m_minThumbLength = metrics.min_slider_size;
63     m_troughUnderSteppers = metrics.trough_under_steppers;
64     m_hasForwardButtonStartPart = metrics.has_secondary_forward_stepper;
65     m_hasBackButtonEndPart = metrics.has_secondary_backward_stepper;
66
67     updateScrollbarsFrameThickness();
68 }
69
70 void ScrollbarThemeGtk::paintTrackBackground(GraphicsContext* context, Scrollbar* scrollbar, const IntRect& rect)
71 {
72     GtkWidgetState state;
73     state.focused = FALSE;
74     state.isDefault = FALSE;
75     state.canDefault = FALSE;
76     state.disabled = FALSE;
77     state.active = FALSE;
78     state.inHover = FALSE;
79
80     // Paint the track background. If the trough-under-steppers property is true, this
81     // should be the full size of the scrollbar, but if is false, it should only be the
82     // track rect.
83     IntRect fullScrollbarRect = rect;
84     if (m_troughUnderSteppers)
85         fullScrollbarRect = IntRect(scrollbar->x(), scrollbar->y(), scrollbar->width(), scrollbar->height());
86
87     GtkThemeWidgetType type = scrollbar->orientation() == VerticalScrollbar ? MOZ_GTK_SCROLLBAR_TRACK_VERTICAL : MOZ_GTK_SCROLLBAR_TRACK_HORIZONTAL;
88     WidgetRenderingContext widgetContext(context, fullScrollbarRect);
89     widgetContext.paintMozillaWidget(type, &state, 0);
90 }
91
92 void ScrollbarThemeGtk::paintScrollbarBackground(GraphicsContext* context, Scrollbar* scrollbar)
93 {
94     // This is unused by the moz_gtk_scrollecd_window_paint.
95     GtkWidgetState state;
96     IntRect fullScrollbarRect = IntRect(scrollbar->x(), scrollbar->y(), scrollbar->width(), scrollbar->height());
97     WidgetRenderingContext widgetContext(context, fullScrollbarRect);
98     widgetContext.paintMozillaWidget(MOZ_GTK_SCROLLED_WINDOW, &state, 0);
99 }
100
101 void ScrollbarThemeGtk::paintThumb(GraphicsContext* context, Scrollbar* scrollbar, const IntRect& rect)
102 {
103     GtkWidgetState state;
104     state.focused = FALSE;
105     state.isDefault = FALSE;
106     state.canDefault = FALSE;
107     state.disabled = FALSE;
108     state.active = scrollbar->pressedPart() == ThumbPart;
109     state.inHover = scrollbar->hoveredPart() == ThumbPart;
110     state.maxpos = scrollbar->maximum();
111     state.curpos = scrollbar->currentPos();
112
113     GtkThemeWidgetType type = scrollbar->orientation() == VerticalScrollbar ? MOZ_GTK_SCROLLBAR_THUMB_VERTICAL : MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL;
114     WidgetRenderingContext widgetContext(context, rect);
115     widgetContext.paintMozillaWidget(type, &state, 0);
116 }
117
118 void ScrollbarThemeGtk::paintButton(GraphicsContext* context, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart part)
119 {
120     int flags = 0;
121     if (scrollbar->orientation() == VerticalScrollbar)
122         flags |= MOZ_GTK_STEPPER_VERTICAL;
123
124     if (part == ForwardButtonEndPart)
125         flags |= (MOZ_GTK_STEPPER_DOWN | MOZ_GTK_STEPPER_BOTTOM);
126     if (part == ForwardButtonStartPart)
127         flags |= MOZ_GTK_STEPPER_DOWN;
128
129     GtkWidgetState state;
130     state.focused = TRUE;
131     state.isDefault = TRUE;
132     state.canDefault = TRUE;
133     state.depressed = FALSE;
134
135     if ((BackButtonStartPart == part && scrollbar->currentPos())
136         || (BackButtonEndPart == part && scrollbar->currentPos())
137         || (ForwardButtonEndPart == part && scrollbar->currentPos() != scrollbar->maximum())
138         || (ForwardButtonStartPart == part && scrollbar->currentPos() != scrollbar->maximum())) {
139         state.disabled = FALSE;
140         state.active = part == scrollbar->pressedPart();
141         state.inHover = part == scrollbar->hoveredPart();
142     } else {
143         state.disabled = TRUE;
144         state.active = FALSE;
145         state.inHover = FALSE;
146     }
147
148     WidgetRenderingContext widgetContext(context, rect);
149     widgetContext.paintMozillaWidget(MOZ_GTK_SCROLLBAR_BUTTON, &state, flags);
150 }
151
152 } // namespace WebCore
153
154 #endif // GTK_API_VERSION_2