[WPE][GTK] Bump minimum versions of GLib, GTK, libsoup, ATK, GStreamer, and Cairo
[WebKit-https.git] / Source / WebCore / platform / gtk / RenderThemeGadget.h
1 /*
2  * Copyright (C) 2016 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 "Color.h"
29 #include "IntSize.h"
30 #include <gtk/gtk.h>
31 #include <wtf/OptionSet.h>
32 #include <wtf/Vector.h>
33 #include <wtf/glib/GRefPtr.h>
34 #include <wtf/text/CString.h>
35
36 namespace WebCore {
37 class FloatRect;
38
39 class RenderThemeGadget {
40     WTF_MAKE_FAST_ALLOCATED;
41     WTF_MAKE_NONCOPYABLE(RenderThemeGadget);
42 public:
43     enum class Type {
44         Generic,
45         TextField,
46         Check,
47         Radio,
48         Arrow,
49         Icon,
50         Scrollbar,
51         Button
52     };
53
54     struct Info {
55         Type type;
56         const char* name;
57         Vector<const char*> classList;
58     };
59
60     static std::unique_ptr<RenderThemeGadget> create(const Info&, RenderThemeGadget* parent = nullptr, const Vector<RenderThemeGadget::Info> siblings = Vector<RenderThemeGadget::Info>(), unsigned position = 0);
61     RenderThemeGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
62     virtual ~RenderThemeGadget();
63
64     virtual IntSize preferredSize() const;
65     virtual bool render(cairo_t*, const FloatRect&, FloatRect* = nullptr);
66     virtual IntSize minimumSize() const;
67
68     void renderFocus(cairo_t*, const FloatRect&);
69
70     GtkBorder contentsBox() const;
71     Color color() const;
72     Color backgroundColor() const;
73     double opacity() const;
74
75     GtkStyleContext* context() const { return m_context.get(); }
76
77     GtkStateFlags state() const;
78     void setState(GtkStateFlags);
79
80 protected:
81     GtkBorder marginBox() const;
82     GtkBorder borderBox() const;
83     GtkBorder paddingBox() const;
84
85     GRefPtr<GtkStyleContext> m_context;
86 };
87
88 class RenderThemeBoxGadget final : public RenderThemeGadget {
89 public:
90     RenderThemeBoxGadget(const RenderThemeGadget::Info&, GtkOrientation, const Vector<RenderThemeGadget::Info> children, RenderThemeGadget* parent = nullptr);
91
92     IntSize preferredSize() const override;
93
94     RenderThemeGadget* child(unsigned index) const { return m_children[index].get(); }
95
96 private:
97     Vector<std::unique_ptr<RenderThemeGadget>> m_children;
98     GtkOrientation m_orientation { GTK_ORIENTATION_HORIZONTAL };
99 };
100
101 class RenderThemeTextFieldGadget final : public RenderThemeGadget {
102 public:
103     RenderThemeTextFieldGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
104
105     IntSize minimumSize() const override;
106 };
107
108 class RenderThemeToggleGadget final : public RenderThemeGadget {
109 public:
110     RenderThemeToggleGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
111
112     bool render(cairo_t*, const FloatRect&, FloatRect* = nullptr) override;
113
114 private:
115     RenderThemeGadget::Type m_type;
116 };
117
118 class RenderThemeArrowGadget final : public RenderThemeGadget {
119 public:
120     RenderThemeArrowGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
121
122     bool render(cairo_t*, const FloatRect&, FloatRect* = nullptr) override;
123 };
124
125 class RenderThemeIconGadget final : public RenderThemeGadget {
126 public:
127     RenderThemeIconGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
128
129     bool render(cairo_t*, const FloatRect&, FloatRect* = nullptr) override;
130     IntSize minimumSize() const override;
131
132     void setIconName(const char* iconName) { m_iconName = iconName; }
133     void setIconSize(unsigned iconSize) { m_iconSize = iconSize; }
134
135     // Defined in GTK+ (gtk/gtkiconfactory.c).
136     enum IconSizeGtk {
137         Menu = 16,
138         SmallToolbar = 18,
139         Button = 20,
140         LargeToolbar = 24,
141         DragAndDrop = 32,
142         Dialog = 48
143     };
144
145 private:
146     GtkIconSize gtkIconSizeForPixelSize(unsigned) const;
147
148     CString m_iconName;
149     unsigned m_iconSize { 0 };
150 };
151
152 class RenderThemeScrollbarGadget final : public RenderThemeGadget {
153 public:
154     RenderThemeScrollbarGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
155
156     enum class Steppers {
157         Backward = 1 << 0,
158         Forward = 1 << 1,
159         SecondaryBackward = 1 << 2,
160         SecondaryForward = 1 << 3
161     };
162     OptionSet<Steppers> steppers() const { return m_steppers; };
163
164     void renderStepper(cairo_t*, const FloatRect&, RenderThemeGadget*, GtkOrientation, Steppers);
165
166 private:
167     OptionSet<Steppers> m_steppers;
168 };
169
170 class RenderThemeButtonGadget final : public RenderThemeGadget {
171 public:
172     RenderThemeButtonGadget(const Info&, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position);
173
174     IntSize minimumSize() const override;
175 };
176
177 } // namespace WebCore