5daab0d7840cd19865fee2a3fa5df114420d3c3f
[WebKit-https.git] / Source / WebCore / platform / gtk / RenderThemeWidget.h
1 /*
2  * Copyright (C) 2017 Igalia S.L.
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 #pragma once
27
28 #include <gtk/gtk.h>
29
30 #if GTK_CHECK_VERSION(3, 20, 0)
31
32 #include "RenderThemeGadget.h"
33
34 namespace WebCore {
35
36 class RenderThemeWidget {
37     WTF_MAKE_FAST_ALLOCATED;
38     WTF_MAKE_NONCOPYABLE(RenderThemeWidget);
39 public:
40     enum class Type {
41         VerticalScrollbarRight = 1,
42         VerticalScrollbarLeft,
43         HorizontalScrollbar,
44         VerticalScrollIndicatorRight,
45         VerticalScrollIndicatorLeft,
46         HorizontalScrollIndicator,
47         CheckButton,
48         RadioButton,
49         Button,
50         ButtonDefault,
51         ComboBox,
52         Entry,
53         SelectedEntry,
54         SearchEntry,
55         SpinButton,
56         VerticalSlider,
57         HorizontalSlider,
58         ProgressBar,
59         IndeterminateProgressBar,
60         ListView,
61         Icon,
62     };
63     static RenderThemeWidget& getOrCreate(Type);
64     static void clearCache();
65
66     RenderThemeWidget() = default;
67     virtual ~RenderThemeWidget();
68 };
69
70 class RenderThemeScrollbar final : public RenderThemeWidget {
71 public:
72     enum class Mode { Full, Indicator };
73     enum class VerticalPosition { Right, Left };
74     RenderThemeScrollbar(GtkOrientation, Mode, VerticalPosition = VerticalPosition::Right);
75     ~RenderThemeScrollbar() = default;
76
77     RenderThemeGadget& scrollbar() const { return *m_scrollbar; }
78     RenderThemeGadget& contents() const { return *m_contents; }
79     RenderThemeGadget& slider() const { return *m_slider; }
80     RenderThemeGadget& trough() const { return *m_contents->child(m_troughPosition); }
81     RenderThemeGadget* stepper(RenderThemeScrollbarGadget::Steppers);
82
83 private:
84     std::unique_ptr<RenderThemeGadget> m_scrollbar;
85     std::unique_ptr<RenderThemeBoxGadget> m_contents;
86     std::unique_ptr<RenderThemeGadget> m_slider;
87     unsigned m_troughPosition;
88     unsigned m_steppersPosition[4];
89 };
90
91 class RenderThemeToggleButton final : public RenderThemeWidget {
92 public:
93     enum class Type { Check, Radio };
94     explicit RenderThemeToggleButton(Type);
95     ~RenderThemeToggleButton() = default;
96
97     RenderThemeGadget& button() const { return *m_button; }
98     RenderThemeGadget& toggle() const { return *m_toggle; }
99
100 private:
101     std::unique_ptr<RenderThemeGadget> m_button;
102     std::unique_ptr<RenderThemeGadget> m_toggle;
103 };
104
105 class RenderThemeButton final : public RenderThemeWidget {
106 public:
107     enum class Default { No, Yes };
108     explicit RenderThemeButton(Default);
109     ~RenderThemeButton() = default;
110
111     RenderThemeGadget& button() const { return *m_button; }
112
113 private:
114     std::unique_ptr<RenderThemeGadget> m_button;
115 };
116
117 class RenderThemeComboBox final : public RenderThemeWidget {
118 public:
119     RenderThemeComboBox();
120     ~RenderThemeComboBox() = default;
121
122     RenderThemeGadget& comboBox() const { return *m_comboBox; }
123     RenderThemeGadget& box() const { return *m_box; }
124     RenderThemeGadget& button() const { return *m_box->child(0); }
125     RenderThemeGadget& buttonBox() const { return *m_buttonBox; }
126     RenderThemeGadget& arrow() const { return *m_arrow; }
127
128 private:
129     std::unique_ptr<RenderThemeGadget> m_comboBox;
130     std::unique_ptr<RenderThemeBoxGadget> m_box;
131     std::unique_ptr<RenderThemeGadget> m_buttonBox;
132     std::unique_ptr<RenderThemeGadget> m_arrow;
133 };
134
135 class RenderThemeEntry : public RenderThemeWidget {
136 public:
137     enum class Selected { No, Yes };
138     explicit RenderThemeEntry(Selected = Selected::No);
139     ~RenderThemeEntry() = default;
140
141     RenderThemeGadget& entry() const { return *m_entry; }
142     RenderThemeGadget* selection() const { return m_selection.get(); }
143
144 protected:
145     std::unique_ptr<RenderThemeGadget> m_entry;
146     std::unique_ptr<RenderThemeGadget> m_selection;
147 };
148
149 class RenderThemeSearchEntry final : public RenderThemeEntry {
150 public:
151     RenderThemeSearchEntry();
152     ~RenderThemeSearchEntry() = default;
153
154     RenderThemeGadget& leftIcon() const { return *m_leftIcon; }
155     RenderThemeGadget& rightIcon() const { return *m_rightIcon; }
156
157 private:
158     std::unique_ptr<RenderThemeGadget> m_leftIcon;
159     std::unique_ptr<RenderThemeGadget> m_rightIcon;
160 };
161
162 class RenderThemeSpinButton final : public RenderThemeWidget {
163 public:
164     RenderThemeSpinButton();
165     ~RenderThemeSpinButton() = default;
166
167     RenderThemeGadget& spinButton() const { return *m_spinButton; }
168     RenderThemeGadget& entry() const { return *m_entry; }
169     RenderThemeGadget& up() const { return *m_up; }
170     RenderThemeGadget& down() const { return *m_down; }
171
172 private:
173     std::unique_ptr<RenderThemeGadget> m_spinButton;
174     std::unique_ptr<RenderThemeGadget> m_entry;
175     std::unique_ptr<RenderThemeGadget> m_up;
176     std::unique_ptr<RenderThemeGadget> m_down;
177 };
178
179 class RenderThemeSlider final : public RenderThemeWidget {
180 public:
181     explicit RenderThemeSlider(GtkOrientation);
182     ~RenderThemeSlider() = default;
183
184     RenderThemeGadget& scale() const { return *m_scale; }
185     RenderThemeGadget& contents() const { return *m_contents; }
186     RenderThemeGadget& trough() const { return *m_trough; }
187     RenderThemeGadget& slider() const { return *m_slider; }
188     RenderThemeGadget& highlight() const { return *m_highlight; }
189
190 private:
191     std::unique_ptr<RenderThemeGadget> m_scale;
192     std::unique_ptr<RenderThemeGadget> m_contents;
193     std::unique_ptr<RenderThemeGadget> m_trough;
194     std::unique_ptr<RenderThemeGadget> m_slider;
195     std::unique_ptr<RenderThemeGadget> m_highlight;
196 };
197
198 class RenderThemeProgressBar final : public RenderThemeWidget {
199 public:
200     enum class Mode { Determinate, Indeterminate };
201     explicit RenderThemeProgressBar(Mode);
202     ~RenderThemeProgressBar() = default;
203
204     RenderThemeGadget& progressBar() const { return *m_progressBar; }
205     RenderThemeGadget& trough() const { return *m_trough; }
206     RenderThemeGadget& progress() const { return *m_progress; }
207
208 private:
209     std::unique_ptr<RenderThemeGadget> m_progressBar;
210     std::unique_ptr<RenderThemeGadget> m_trough;
211     std::unique_ptr<RenderThemeGadget> m_progress;
212 };
213
214 class RenderThemeListView final : public RenderThemeWidget {
215 public:
216     RenderThemeListView();
217     ~RenderThemeListView() = default;
218
219     RenderThemeGadget& treeview() const { return *m_treeview; }
220
221 private:
222     std::unique_ptr<RenderThemeGadget> m_treeview;
223 };
224
225 class RenderThemeIcon final : public RenderThemeWidget {
226 public:
227     RenderThemeIcon();
228     ~RenderThemeIcon() = default;
229
230     RenderThemeGadget& icon() const { return *m_icon; }
231
232 private:
233     std::unique_ptr<RenderThemeGadget> m_icon;
234 };
235
236 } // namespace WebCore
237
238 #endif // GTK_CHECK_VERSION(3, 20, 0)