Element should be const in StyleResolver
[WebKit-https.git] / Source / WebCore / rendering / RenderThemeEfl.h
1 /*
2  * This file is part of the WebKit project.
3  *
4  * Copyright (C) 2006 Apple Inc.
5  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
6  * Copyright (C) 2007 Holger Hans Peter Freyther
7  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
8  * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia
9  * Copyright (C) 2009-2010 ProFUSION embedded systems
10  * Copyright (C) 2009-2010 Samsung Electronics
11  * All rights reserved.
12  *
13  * This library is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Library General Public
15  * License as published by the Free Software Foundation; either
16  * version 2 of the License, or (at your option) any later version.
17  *
18  * This library is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Library General Public License for more details.
22  *
23  * You should have received a copy of the GNU Library General Public License
24  * along with this library; see the file COPYING.LIB.  If not, write to
25  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26  * Boston, MA 02110-1301, USA.
27  *
28  */
29
30 #ifndef RenderThemeEfl_h
31 #define RenderThemeEfl_h
32
33 #include "RenderTheme.h"
34
35 #include <Eina.h>
36 #include <cairo.h>
37 #include <wtf/efl/UniquePtrEfl.h>
38
39 namespace WebCore {
40
41 enum FormType { // KEEP IN SYNC WITH edjeGroupFromFormType()
42     Button,
43     RadioButton,
44     TextField,
45     CheckBox,
46     ComboBox,
47     ProgressBar,
48     ScrollbarHorizontalThumb,
49     ScrollbarHorizontalTrackBackground,
50     ScrollbarVerticalThumb,
51     ScrollbarVerticalTrackBackground,
52     SearchField,
53     SearchFieldResultsButton,
54     SearchFieldResultsDecoration,
55     SearchFieldCancelButton,
56     SliderVertical,
57     SliderHorizontal,
58     SliderThumbVertical,
59     SliderThumbHorizontal,
60     Spinner,
61     FormTypeLast
62 };
63
64 class RenderThemeEfl final : public RenderTheme {
65 private:
66     explicit RenderThemeEfl(Page*);
67     virtual ~RenderThemeEfl();
68
69 public:
70     static PassRefPtr<RenderTheme> create(Page*);
71
72     // A method asking if the theme's controls actually care about redrawing when hovered.
73     bool supportsHover(const RenderStyle&) const override { return true; }
74
75     // A method Returning whether the control is styled by css or not e.g specifying background-color.
76     bool isControlStyled(const RenderStyle&, const BorderData&, const FillLayer&, const Color& backgroundColor) const override;
77
78     // A method asking if the theme is able to draw the focus ring.
79     bool supportsFocusRing(const RenderStyle&) const override;
80
81     // A method asking if the control changes its tint when the window has focus or not.
82     bool controlSupportsTints(const RenderObject&) const override;
83
84     // A general method asking if any control tinting is supported at all.
85     bool supportsControlTints() const override { return true; }
86
87     // A general method asking if foreground colors of selection are supported.
88     bool supportsSelectionForegroundColors() const override;
89
90     // A method to obtain the baseline position for a "leaf" control. This will only be used if a baseline
91     // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
92     // controls that need to do this.
93     int baselinePosition(const RenderBox&) const override;
94
95     Color platformActiveSelectionBackgroundColor() const override;
96     Color platformInactiveSelectionBackgroundColor() const override;
97     Color platformActiveSelectionForegroundColor() const override;
98     Color platformInactiveSelectionForegroundColor() const override;
99     Color platformFocusRingColor() const override;
100
101     // Set platform colors; remember to call platformColorDidChange after.
102     void setColorFromThemeClass(const char* colorClass);
103
104     void setButtonTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
105     void setComboTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
106     void setEntryTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
107     void setSearchTextColor(int foreR, int foreG, int foreB, int foreA, int backR, int backG, int backB, int backA);
108
109     void adjustSizeConstraints(RenderStyle&, FormType) const;
110
111     void adjustCheckboxStyle(StyleResolver&, RenderStyle&, const Element*) const override;
112     bool paintCheckbox(const RenderObject&, const PaintInfo&, const IntRect&) override;
113
114     void adjustRadioStyle(StyleResolver&, RenderStyle&, const Element*) const override;
115     bool paintRadio(const RenderObject&, const PaintInfo&, const IntRect&) override;
116
117     void adjustButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
118     bool paintButton(const RenderObject&, const PaintInfo&, const IntRect&) override;
119
120     void adjustTextFieldStyle(StyleResolver&, RenderStyle&, const Element*) const override;
121     bool paintTextField(const RenderObject&, const PaintInfo&, const FloatRect&) override;
122
123     void adjustTextAreaStyle(StyleResolver&, RenderStyle&, const Element*) const override;
124     bool paintTextArea(const RenderObject&, const PaintInfo&, const FloatRect&) override;
125
126     void adjustMenuListStyle(StyleResolver&, RenderStyle&, const Element*) const override;
127     bool paintMenuList(const RenderObject&, const PaintInfo&, const FloatRect&) override;
128
129     void adjustMenuListButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
130     bool paintMenuListButtonDecorations(const RenderBox&, const PaintInfo&, const FloatRect&) override;
131
132     void adjustSearchFieldResultsDecorationPartStyle(StyleResolver&, RenderStyle&, const Element*) const override;
133     bool paintSearchFieldResultsDecorationPart(const RenderBox&, const PaintInfo&, const IntRect&) override;
134
135     void adjustSearchFieldStyle(StyleResolver&, RenderStyle&, const Element*) const override;
136     bool paintSearchField(const RenderObject&, const PaintInfo&, const IntRect&) override;
137
138     void adjustSearchFieldResultsButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
139     bool paintSearchFieldResultsButton(const RenderBox&, const PaintInfo&, const IntRect&) override;
140
141     void adjustSearchFieldCancelButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
142     bool paintSearchFieldCancelButton(const RenderBox&, const PaintInfo&, const IntRect&) override;
143
144     void adjustSliderTrackStyle(StyleResolver&, RenderStyle&, const Element*) const override;
145     bool paintSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) override;
146
147     void adjustSliderThumbStyle(StyleResolver&, RenderStyle&, const Element*) const override;
148
149     void adjustSliderThumbSize(RenderStyle&, const Element*) const override;
150
151 #if ENABLE(DATALIST_ELEMENT)
152     IntSize sliderTickSize() const override;
153     int sliderTickOffsetFromTrackCenter() const override;
154     LayoutUnit sliderTickSnappingThreshold() const override;
155 #endif
156
157     bool supportsDataListUI(const AtomicString&) const override;
158
159     bool paintSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) override;
160
161     void adjustInnerSpinButtonStyle(StyleResolver&, RenderStyle&, const Element*) const override;
162     bool paintInnerSpinButton(const RenderObject&, const PaintInfo&, const IntRect&) override;
163
164     static void setDefaultFontSize(int fontsize);
165
166     void adjustProgressBarStyle(StyleResolver&, RenderStyle&, const Element*) const override;
167     bool paintProgressBar(const RenderObject&, const PaintInfo&, const IntRect&) override;
168     double animationRepeatIntervalForProgressBar(RenderProgress&) const override;
169     double animationDurationForProgressBar(RenderProgress&) const override;
170
171 #if ENABLE(VIDEO)
172     String mediaControlsStyleSheet() override;
173     String mediaControlsScript() override;
174 #endif
175 #if ENABLE(VIDEO_TRACK)
176     bool supportsClosedCaptioning() const override { return true; }
177 #endif
178
179     void setThemePath(const String&);
180     String themePath() const;
181
182     bool paintThemePart(const GraphicsContext&, FormType, const IntRect&);
183
184 protected:
185     static float defaultFontSize;
186
187 private:
188     bool loadTheme();
189     ALWAYS_INLINE bool loadThemeIfNeeded() const
190     {
191         return m_edje || (!m_themePath.isEmpty() && const_cast<RenderThemeEfl*>(this)->loadTheme());
192     }
193
194     // System fonts.
195     void updateCachedSystemFontDescription(CSSValueID, FontCascadeDescription&) const override;
196
197     ALWAYS_INLINE Ecore_Evas* canvas() const { return m_canvas.get(); }
198     ALWAYS_INLINE Evas_Object* edje() const { return m_edje.get(); }
199
200     void applyPartDescriptionsFrom(const String& themePath);
201
202     void applyEdjeStateFromForm(Evas_Object*, const ControlStates*, bool);
203     void applyEdjeRTLState(Evas_Object*, const RenderObject&, FormType, const IntRect&);
204     bool paintThemePart(const RenderObject&, FormType, const PaintInfo&, const IntRect&);
205
206     Page* m_page;
207     Color m_activeSelectionBackgroundColor;
208     Color m_activeSelectionForegroundColor;
209     Color m_inactiveSelectionBackgroundColor;
210     Color m_inactiveSelectionForegroundColor;
211     Color m_focusRingColor;
212     Color m_sliderThumbColor;
213
214     String m_themePath;
215     // Order so that the canvas gets destroyed at last.
216     EflUniquePtr<Ecore_Evas> m_canvas;
217     EflUniquePtr<Evas_Object> m_edje;
218
219     bool m_supportsSelectionForegroundColor;
220
221     struct ThemePartDesc {
222         FormType type;
223         LengthSize min;
224         LengthSize max;
225         LengthBox padding;
226     };
227     void applyPartDescriptionFallback(struct ThemePartDesc*);
228     void applyPartDescription(Evas_Object*, struct ThemePartDesc*);
229
230     struct ThemePartCacheEntry {
231         static std::unique_ptr<RenderThemeEfl::ThemePartCacheEntry> create(const String& themePath, FormType, const IntSize&);
232         void reuse(const String& themePath, FormType, const IntSize&);
233
234         ALWAYS_INLINE Ecore_Evas* canvas() { return m_canvas.get(); }
235         ALWAYS_INLINE Evas_Object* edje() { return m_edje.get(); }
236         ALWAYS_INLINE cairo_surface_t* surface() { return m_surface.get(); }
237
238         FormType type;
239         IntSize size;
240
241     private:
242         // Order so that the canvas gets destroyed at last.
243         EflUniquePtr<Ecore_Evas> m_canvas;
244         EflUniquePtr<Evas_Object> m_edje;
245         RefPtr<cairo_surface_t> m_surface;
246     };
247
248     struct ThemePartDesc m_partDescs[FormTypeLast];
249
250     // List of ThemePartCacheEntry* sorted so that the most recently
251     // used entries come first. We use a list for efficient moving
252     // of items within the container.
253     Vector<std::unique_ptr<ThemePartCacheEntry>> m_partCache;
254
255     ThemePartCacheEntry* getThemePartFromCache(FormType, const IntSize&);
256     void clearThemePartCache();
257 };
258 }
259
260 #endif // RenderThemeEfl_h