[GTK] Hardcoded text color in input fields
[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         Window,
63     };
64     static RenderThemeWidget& getOrCreate(Type);
65     static void clearCache();
66
67     RenderThemeWidget() = default;
68     virtual ~RenderThemeWidget();
69 };
70
71 class RenderThemeScrollbar final : public RenderThemeWidget {
72 public:
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
84 private:
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
92 class RenderThemeToggleButton final : public RenderThemeWidget {
93 public:
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
101 private:
102     std::unique_ptr<RenderThemeGadget> m_button;
103     std::unique_ptr<RenderThemeGadget> m_toggle;
104 };
105
106 class RenderThemeButton final : public RenderThemeWidget {
107 public:
108     enum class Default { No, Yes };
109     explicit RenderThemeButton(Default);
110     ~RenderThemeButton() = default;
111
112     RenderThemeGadget& button() const { return *m_button; }
113
114 private:
115     std::unique_ptr<RenderThemeGadget> m_button;
116 };
117
118 class RenderThemeComboBox final : public RenderThemeWidget {
119 public:
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
129 private:
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
136 class RenderThemeEntry : public RenderThemeWidget {
137 public:
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
145 protected:
146     std::unique_ptr<RenderThemeGadget> m_entry;
147     std::unique_ptr<RenderThemeGadget> m_selection;
148 };
149
150 class RenderThemeSearchEntry final : public RenderThemeEntry {
151 public:
152     RenderThemeSearchEntry();
153     ~RenderThemeSearchEntry() = default;
154
155     RenderThemeGadget& leftIcon() const { return *m_leftIcon; }
156     RenderThemeGadget& rightIcon() const { return *m_rightIcon; }
157
158 private:
159     std::unique_ptr<RenderThemeGadget> m_leftIcon;
160     std::unique_ptr<RenderThemeGadget> m_rightIcon;
161 };
162
163 class RenderThemeSpinButton final : public RenderThemeWidget {
164 public:
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
173 private:
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
180 class RenderThemeSlider final : public RenderThemeWidget {
181 public:
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
191 private:
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
199 class RenderThemeProgressBar final : public RenderThemeWidget {
200 public:
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
209 private:
210     std::unique_ptr<RenderThemeGadget> m_progressBar;
211     std::unique_ptr<RenderThemeGadget> m_trough;
212     std::unique_ptr<RenderThemeGadget> m_progress;
213 };
214
215 class RenderThemeListView final : public RenderThemeWidget {
216 public:
217     RenderThemeListView();
218     ~RenderThemeListView() = default;
219
220     RenderThemeGadget& treeview() const { return *m_treeview; }
221
222 private:
223     std::unique_ptr<RenderThemeGadget> m_treeview;
224 };
225
226 class RenderThemeIcon final : public RenderThemeWidget {
227 public:
228     RenderThemeIcon();
229     ~RenderThemeIcon() = default;
230
231     RenderThemeGadget& icon() const { return *m_icon; }
232
233 private:
234     std::unique_ptr<RenderThemeGadget> m_icon;
235 };
236
237 class RenderThemeWindow final : public RenderThemeWidget {
238 public:
239     RenderThemeWindow();
240     ~RenderThemeWindow() = default;
241
242     RenderThemeGadget& window() const { return *m_window; }
243
244 private:
245     std::unique_ptr<RenderThemeGadget> m_window;
246
247 };
248
249 } // namespace WebCore
250
251 #endif // GTK_CHECK_VERSION(3, 20, 0)