1/*
2 * Copyright (C) 2007, 2008, 2013 Apple Inc.
3 * Copyright (C) 2009 Kenneth Rohde Christiansen
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB.  If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 *
20 */
21
22#ifndef RenderThemeSafari_h
23#define RenderThemeSafari_h
24
25#if USE(SAFARI_THEME)
26
27#include "RenderTheme.h"
28
29// If you have an empty placeholder SafariThemeConstants.h, then include SafariTheme.h
30// This is a workaround until a version of WebKitSupportLibrary is released with an updated SafariThemeConstants.h
31#include <SafariTheme/SafariThemeConstants.h>
32#ifndef SafariThemeConstants_h
33#include <SafariTheme/SafariTheme.h>
34#endif
35
36#if PLATFORM(WIN)
37typedef void* HANDLE;
38typedef struct HINSTANCE__* HINSTANCE;
39typedef HINSTANCE HMODULE;
40#endif
41
42namespace WebCore {
43
44using namespace SafariTheme;
45
46class RenderStyle;
47
48class RenderThemeSafari : public RenderTheme {
49public:
50    static PassRefPtr<RenderTheme> create();
51
52    // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
53    // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
54    // controls that need to do this.
55    virtual int baselinePosition(const RenderObject*) const;
56
57    // A method asking if the control changes its tint when the window has focus or not.
58    virtual bool controlSupportsTints(const RenderObject*) const;
59
60    // A general method asking if any control tinting is supported at all.
61    virtual bool supportsControlTints() const { return true; }
62
63    virtual void adjustRepaintRect(const RenderObject*, IntRect&);
64
65    virtual bool isControlStyled(const RenderStyle*, const BorderData&,
66                                 const FillLayer&, const Color& backgroundColor) const;
67
68    virtual Color platformActiveSelectionBackgroundColor() const;
69    virtual Color platformInactiveSelectionBackgroundColor() const;
70    virtual Color activeListBoxSelectionBackgroundColor() const;
71
72    virtual Color platformFocusRingColor() const;
73
74    // System fonts.
75    virtual void systemFont(int propId, FontDescription&) const;
76
77    virtual int minimumMenuListSize(RenderStyle*) const;
78
79    virtual void adjustSliderThumbSize(RenderStyle*, Element*) const;
80    virtual void adjustSliderThumbStyle(StyleResolver*, RenderStyle*, Element*) const;
81
82    virtual int popupInternalPaddingLeft(RenderStyle*) const;
83    virtual int popupInternalPaddingRight(RenderStyle*) const;
84    virtual int popupInternalPaddingTop(RenderStyle*) const;
85    virtual int popupInternalPaddingBottom(RenderStyle*) const;
86
87protected:
88    // Methods for each appearance value.
89    virtual bool paintCheckbox(RenderObject*, const PaintInfo&, const IntRect&);
90    virtual void setCheckboxSize(RenderStyle*) const;
91
92    virtual bool paintRadio(RenderObject*, const PaintInfo&, const IntRect&);
93    virtual void setRadioSize(RenderStyle*) const;
94
95    virtual void adjustButtonStyle(StyleResolver*, RenderStyle*, WebCore::Element*) const;
96    virtual bool paintButton(RenderObject*, const PaintInfo&, const IntRect&);
97    virtual void setButtonSize(RenderStyle*) const;
98
99    virtual bool paintTextField(RenderObject*, const PaintInfo&, const IntRect&);
100    virtual void adjustTextFieldStyle(StyleResolver*, RenderStyle*, Element*) const;
101
102    virtual bool paintTextArea(RenderObject*, const PaintInfo&, const IntRect&);
103    virtual void adjustTextAreaStyle(StyleResolver*, RenderStyle*, Element*) const;
104
105    virtual bool paintMenuList(RenderObject*, const PaintInfo&, const IntRect&);
106    virtual void adjustMenuListStyle(StyleResolver*, RenderStyle*, Element*) const;
107
108    virtual bool paintMenuListButton(RenderObject*, const PaintInfo&, const IntRect&);
109    virtual void adjustMenuListButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
110
111    virtual bool paintSliderTrack(RenderObject*, const PaintInfo&, const IntRect&);
112    virtual bool paintSliderThumb(RenderObject*, const PaintInfo&, const IntRect&);
113
114    virtual bool paintSearchField(RenderObject*, const PaintInfo&, const IntRect&);
115    virtual void adjustSearchFieldStyle(StyleResolver*, RenderStyle*, Element*) const;
116
117    virtual void adjustSearchFieldCancelButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
118    virtual bool paintSearchFieldCancelButton(RenderObject*, const PaintInfo&, const IntRect&);
119
120    virtual void adjustSearchFieldDecorationStyle(StyleResolver*, RenderStyle*, Element*) const;
121    virtual bool paintSearchFieldDecoration(RenderObject*, const PaintInfo&, const IntRect&);
122
123    virtual void adjustSearchFieldResultsDecorationStyle(StyleResolver*, RenderStyle*, Element*) const;
124    virtual bool paintSearchFieldResultsDecoration(RenderObject*, const PaintInfo&, const IntRect&);
125
126    virtual void adjustSearchFieldResultsButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
127    virtual bool paintSearchFieldResultsButton(RenderObject*, const PaintInfo&, const IntRect&);
128
129    virtual bool paintCapsLockIndicator(RenderObject*, const PaintInfo&, const IntRect&);
130
131#if ENABLE(VIDEO)
132    virtual bool paintMediaFullscreenButton(RenderObject*, const PaintInfo&, const IntRect&);
133    virtual bool paintMediaPlayButton(RenderObject*, const PaintInfo&, const IntRect&);
134    virtual bool paintMediaMuteButton(RenderObject*, const PaintInfo&, const IntRect&);
135    virtual bool paintMediaSeekBackButton(RenderObject*, const PaintInfo&, const IntRect&);
136    virtual bool paintMediaSeekForwardButton(RenderObject*, const PaintInfo&, const IntRect&);
137    virtual bool paintMediaSliderTrack(RenderObject*, const PaintInfo&, const IntRect&);
138    virtual bool paintMediaSliderThumb(RenderObject*, const PaintInfo&, const IntRect&);
139#endif
140
141#if ENABLE(METER_ELEMENT)
142    virtual IntSize meterSizeForBounds(const RenderMeter*, const IntRect&) const OVERRIDE;
143    virtual bool supportsMeter(ControlPart) const OVERRIDE;
144    virtual void adjustMeterStyle(StyleResolver*, RenderStyle*, Element*) const OVERRIDE;
145    virtual bool paintMeter(RenderObject*, const PaintInfo&, const IntRect&) OVERRIDE;
146#endif
147
148    virtual bool shouldShowPlaceholderWhenFocused() const { return true; }
149
150private:
151    RenderThemeSafari();
152    virtual ~RenderThemeSafari();
153
154    IntRect inflateRect(const IntRect&, const IntSize&, const int* margins) const;
155
156    // Get the control size based off the font.  Used by some of the controls (like buttons).
157
158    NSControlSize controlSizeForFont(RenderStyle*) const;
159    NSControlSize controlSizeForSystemFont(RenderStyle*) const;
160    //void setControlSize(NSCell*, const IntSize* sizes, const IntSize& minSize);
161    void setSizeFromFont(RenderStyle*, const IntSize* sizes) const;
162    IntSize sizeForFont(RenderStyle*, const IntSize* sizes) const;
163    IntSize sizeForSystemFont(RenderStyle*, const IntSize* sizes) const;
164    void setFontFromControlSize(StyleResolver*, RenderStyle*, NSControlSize) const;
165
166    // Helpers for adjusting appearance and for painting
167    const IntSize* checkboxSizes() const;
168    const int* checkboxMargins(NSControlSize) const;
169
170    const IntSize* radioSizes() const;
171    const int* radioMargins(NSControlSize) const;
172
173    void setButtonPaddingFromControlSize(RenderStyle*, NSControlSize) const;
174    const IntSize* buttonSizes() const;
175    const int* buttonMargins(NSControlSize) const;
176
177    const IntSize* popupButtonSizes() const;
178    const int* popupButtonMargins(NSControlSize) const;
179    const int* popupButtonPadding(NSControlSize) const;
180    void paintMenuListButtonGradients(RenderObject*, const PaintInfo&, const IntRect&);
181    const IntSize* menuListSizes() const;
182
183    const IntSize* searchFieldSizes() const;
184    const IntSize* cancelButtonSizes() const;
185    const IntSize* resultsButtonSizes() const;
186    void setSearchFieldSize(RenderStyle*) const;
187
188    ThemeControlState determineState(RenderObject*) const;
189};
190
191} // namespace WebCore
192
193#endif // #if USE(SAFARI_THEME)
194
195#endif // RenderThemeSafari_h
196