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