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
34namespace WebCore {
35
36class RenderThemeWidget {
37 WTF_MAKE_FAST_ALLOCATED;
38 WTF_MAKE_NONCOPYABLE(RenderThemeWidget);
39public:
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 Window,
63 };
64 static RenderThemeWidget& getOrCreate(Type);
65 static void clearCache();
66
67 RenderThemeWidget() = default;
68 virtual ~RenderThemeWidget();
69};
70
71class RenderThemeScrollbar final : public RenderThemeWidget {
72public:
73 enum class Mode { Full, Indicator };
74 enum class VerticalPosition { Right, Left };
75 RenderThemeScrollbar(GtkOrientation, Mode, VerticalPosition = VerticalPosition::Right);
76 ~RenderThemeScrollbar() = default;
77
78 RenderThemeGadget& scrollbar() const { return *m_scrollbar; }
79 RenderThemeGadget& contents() const { return *m_contents; }
80 RenderThemeGadget& slider() const { return *m_slider; }
81 RenderThemeGadget& trough() const { return *m_contents->child(m_troughPosition); }
82 RenderThemeGadget* stepper(RenderThemeScrollbarGadget::Steppers);
83
84private:
85 std::unique_ptr<RenderThemeGadget> m_scrollbar;
86 std::unique_ptr<RenderThemeBoxGadget> m_contents;
87 std::unique_ptr<RenderThemeGadget> m_slider;
88 unsigned m_troughPosition;
89 unsigned m_steppersPosition[4];
90};
91
92class RenderThemeToggleButton final : public RenderThemeWidget {
93public:
94 enum class Type { Check, Radio };
95 explicit RenderThemeToggleButton(Type);
96 ~RenderThemeToggleButton() = default;
97
98 RenderThemeGadget& button() const { return *m_button; }
99 RenderThemeGadget& toggle() const { return *m_toggle; }
100
101private:
102 std::unique_ptr<RenderThemeGadget> m_button;
103 std::unique_ptr<RenderThemeGadget> m_toggle;
104};
105
106class RenderThemeButton final : public RenderThemeWidget {
107public:
108 enum class Default { No, Yes };
109 explicit RenderThemeButton(Default);
110 ~RenderThemeButton() = default;
111
112 RenderThemeGadget& button() const { return *m_button; }
113
114private:
115 std::unique_ptr<RenderThemeGadget> m_button;
116};
117
118class RenderThemeComboBox final : public RenderThemeWidget {
119public:
120 RenderThemeComboBox();
121 ~RenderThemeComboBox() = default;
122
123 RenderThemeGadget& comboBox() const { return *m_comboBox; }
124 RenderThemeGadget& box() const { return *m_box; }
125 RenderThemeGadget& button() const { return *m_box->child(0); }
126 RenderThemeGadget& buttonBox() const { return *m_buttonBox; }
127 RenderThemeGadget& arrow() const { return *m_arrow; }
128
129private:
130 std::unique_ptr<RenderThemeGadget> m_comboBox;
131 std::unique_ptr<RenderThemeBoxGadget> m_box;
132 std::unique_ptr<RenderThemeGadget> m_buttonBox;
133 std::unique_ptr<RenderThemeGadget> m_arrow;
134};
135
136class RenderThemeEntry : public RenderThemeWidget {
137public:
138 enum class Selected { No, Yes };
139 explicit RenderThemeEntry(Selected = Selected::No);
140 ~RenderThemeEntry() = default;
141
142 RenderThemeGadget& entry() const { return *m_entry; }
143 RenderThemeGadget* selection() const { return m_selection.get(); }
144
145protected:
146 std::unique_ptr<RenderThemeGadget> m_entry;
147 std::unique_ptr<RenderThemeGadget> m_selection;
148};
149
150class RenderThemeSearchEntry final : public RenderThemeEntry {
151public:
152 RenderThemeSearchEntry();
153 ~RenderThemeSearchEntry() = default;
154
155 RenderThemeGadget& leftIcon() const { return *m_leftIcon; }
156 RenderThemeGadget& rightIcon() const { return *m_rightIcon; }
157
158private:
159 std::unique_ptr<RenderThemeGadget> m_leftIcon;
160 std::unique_ptr<RenderThemeGadget> m_rightIcon;
161};
162
163class RenderThemeSpinButton final : public RenderThemeWidget {
164public:
165 RenderThemeSpinButton();
166 ~RenderThemeSpinButton() = default;
167
168 RenderThemeGadget& spinButton() const { return *m_spinButton; }
169 RenderThemeGadget& entry() const { return *m_entry; }
170 RenderThemeGadget& up() const { return *m_up; }
171 RenderThemeGadget& down() const { return *m_down; }
172
173private:
174 std::unique_ptr<RenderThemeGadget> m_spinButton;
175 std::unique_ptr<RenderThemeGadget> m_entry;
176 std::unique_ptr<RenderThemeGadget> m_up;
177 std::unique_ptr<RenderThemeGadget> m_down;
178};
179
180class RenderThemeSlider final : public RenderThemeWidget {
181public:
182 explicit RenderThemeSlider(GtkOrientation);
183 ~RenderThemeSlider() = default;
184
185 RenderThemeGadget& scale() const { return *m_scale; }
186 RenderThemeGadget& contents() const { return *m_contents; }
187 RenderThemeGadget& trough() const { return *m_trough; }
188 RenderThemeGadget& slider() const { return *m_slider; }
189 RenderThemeGadget& highlight() const { return *m_highlight; }
190
191private:
192 std::unique_ptr<RenderThemeGadget> m_scale;
193 std::unique_ptr<RenderThemeGadget> m_contents;
194 std::unique_ptr<RenderThemeGadget> m_trough;
195 std::unique_ptr<RenderThemeGadget> m_slider;
196 std::unique_ptr<RenderThemeGadget> m_highlight;
197};
198
199class RenderThemeProgressBar final : public RenderThemeWidget {
200public:
201 enum class Mode { Determinate, Indeterminate };
202 explicit RenderThemeProgressBar(Mode);
203 ~RenderThemeProgressBar() = default;
204
205 RenderThemeGadget& progressBar() const { return *m_progressBar; }
206 RenderThemeGadget& trough() const { return *m_trough; }
207 RenderThemeGadget& progress() const { return *m_progress; }
208
209private:
210 std::unique_ptr<RenderThemeGadget> m_progressBar;
211 std::unique_ptr<RenderThemeGadget> m_trough;
212 std::unique_ptr<RenderThemeGadget> m_progress;
213};
214
215class RenderThemeListView final : public RenderThemeWidget {
216public:
217 RenderThemeListView();
218 ~RenderThemeListView() = default;
219
220 RenderThemeGadget& treeview() const { return *m_treeview; }
221
222private:
223 std::unique_ptr<RenderThemeGadget> m_treeview;
224};
225
226class RenderThemeIcon final : public RenderThemeWidget {
227public:
228 RenderThemeIcon();
229 ~RenderThemeIcon() = default;
230
231 RenderThemeGadget& icon() const { return *m_icon; }
232
233private:
234 std::unique_ptr<RenderThemeGadget> m_icon;
235};
236
237class RenderThemeWindow final : public RenderThemeWidget {
238public:
239 RenderThemeWindow();
240 ~RenderThemeWindow() = default;
241
242 RenderThemeGadget& window() const { return *m_window; }
243
244private:
245 std::unique_ptr<RenderThemeGadget> m_window;
246
247};
248
249} // namespace WebCore
250
251#endif // GTK_CHECK_VERSION(3, 20, 0)
252