1ce2f9e9cc389c5470230d4e46545aa99e8a563d
[WebKit.git] / WebCore / rendering / RenderThemeChromiumMac.h
1 /*
2  * This file is part of the theme implementation for form controls in WebCore.
3  *
4  * Copyright (C) 2005 Apple Computer, Inc.
5  * Copyright (C) 2008, 2009 Google, Inc.
6  * Copyright (C) 2009 Kenneth Rohde Christiansen
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef RenderThemeChromiumMac_h
26 #define RenderThemeChromiumMac_h
27
28 #import "RenderTheme.h"
29 #import <AppKit/AppKit.h>
30 #import <wtf/HashMap.h>
31 #import <wtf/RetainPtr.h>
32
33 #ifdef __OBJC__
34 @class WebCoreRenderThemeNotificationObserver;
35 #else
36 class WebCoreRenderThemeNotificationObserver;
37 #endif
38
39 namespace WebCore {
40
41     class RenderStyle;
42
43     class RenderThemeChromiumMac : public RenderTheme {
44     public:
45         static PassRefPtr<RenderTheme> create();
46
47 #if ENABLE(VIDEO)
48         virtual String extraMediaControlsStyleSheet();
49 #endif
50
51         // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
52         // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
53         // controls that need to do this.
54         virtual int baselinePosition(const RenderObject*) const;
55
56         // A method asking if the control changes its tint when the window has focus or not.
57         virtual bool controlSupportsTints(const RenderObject*) const;
58
59         // A general method asking if any control tinting is supported at all.
60         virtual bool supportsControlTints() const { return true; }
61
62         virtual void adjustRepaintRect(const RenderObject*, IntRect&);
63
64         virtual bool isControlStyled(const RenderStyle*, const BorderData&,
65                                      const FillLayer&, const Color& backgroundColor) const;
66
67         virtual Color platformActiveSelectionBackgroundColor() const;
68         virtual Color platformInactiveSelectionBackgroundColor() const;
69         virtual Color platformActiveListBoxSelectionBackgroundColor() const;
70
71         virtual Color platformFocusRingColor() const;
72         
73         virtual void platformColorsDidChange();
74
75         // System fonts.
76         virtual void systemFont(int cssValueId, FontDescription&) const;
77
78         virtual int minimumMenuListSize(RenderStyle*) const;
79
80         virtual void adjustSliderThumbSize(RenderObject*) 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         
87         virtual ScrollbarControlSize scrollbarControlSizeForPart(ControlPart) { return SmallScrollbar; }
88     
89         virtual bool paintCapsLockIndicator(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
90
91         virtual Color systemColor(int cssValueId) const;
92
93     protected:
94         virtual bool supportsSelectionForegroundColors() const { return false; }
95
96         // Methods for each appearance value.
97         virtual bool paintCheckbox(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
98         virtual void setCheckboxSize(RenderStyle*) const;
99
100         virtual bool paintRadio(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
101         virtual void setRadioSize(RenderStyle*) const;
102
103         virtual void adjustButtonStyle(CSSStyleSelector*, RenderStyle*, WebCore::Element*) const;
104         virtual bool paintButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
105         virtual void setButtonSize(RenderStyle*) const;
106
107         virtual bool paintTextField(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
108         virtual void adjustTextFieldStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
109
110         virtual bool paintTextArea(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
111         virtual void adjustTextAreaStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
112
113         virtual bool paintMenuList(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
114         virtual void adjustMenuListStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
115
116         virtual bool paintMenuListButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
117         virtual void adjustMenuListButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
118
119         virtual bool paintSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
120         virtual void adjustSliderTrackStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
121
122         virtual bool paintSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
123         virtual void adjustSliderThumbStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
124
125         virtual bool paintSearchField(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
126         virtual void adjustSearchFieldStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
127
128         virtual void adjustSearchFieldCancelButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
129         virtual bool paintSearchFieldCancelButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
130
131         virtual void adjustSearchFieldDecorationStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
132         virtual bool paintSearchFieldDecoration(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
133
134         virtual void adjustSearchFieldResultsDecorationStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
135         virtual bool paintSearchFieldResultsDecoration(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
136
137         virtual void adjustSearchFieldResultsButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
138         virtual bool paintSearchFieldResultsButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
139
140         virtual bool paintMediaPlayButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
141         virtual bool paintMediaMuteButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
142         virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
143         virtual bool paintMediaSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
144         virtual bool paintMediaVolumeSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
145         virtual bool paintMediaVolumeSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
146         virtual bool paintMediaControlsBackground(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
147
148     private:
149         RenderThemeChromiumMac();
150         virtual ~RenderThemeChromiumMac();
151
152         IntRect inflateRect(const IntRect&, const IntSize&, const int* margins, float zoomLevel = 1.0f) const;
153
154         // Get the control size based off the font.  Used by some of the controls (like buttons).
155         NSControlSize controlSizeForFont(RenderStyle*) const;
156         NSControlSize controlSizeForSystemFont(RenderStyle*) const;
157         void setControlSize(NSCell*, const IntSize* sizes, const IntSize& minSize, float zoomLevel = 1.0f);
158         void setSizeFromFont(RenderStyle*, const IntSize* sizes) const;
159         IntSize sizeForFont(RenderStyle*, const IntSize* sizes) const;
160         IntSize sizeForSystemFont(RenderStyle*, const IntSize* sizes) const;
161         void setFontFromControlSize(CSSStyleSelector*, RenderStyle*, NSControlSize) const;
162
163         void updateActiveState(NSCell*, const RenderObject*);
164         void updateCheckedState(NSCell*, const RenderObject*);
165         void updateEnabledState(NSCell*, const RenderObject*);
166         void updateFocusedState(NSCell*, const RenderObject*);
167         void updatePressedState(NSCell*, const RenderObject*);
168
169         // Helpers for adjusting appearance and for painting
170         const IntSize* checkboxSizes() const;
171         const int* checkboxMargins() const;
172         void setCheckboxCellState(const RenderObject*, const IntRect&);
173
174         const IntSize* radioSizes() const;
175         const int* radioMargins() const;
176         void setRadioCellState(const RenderObject*, const IntRect&);
177
178         void setButtonPaddingFromControlSize(RenderStyle*, NSControlSize) const;
179         const IntSize* buttonSizes() const;
180         const int* buttonMargins() const;
181         void setButtonCellState(const RenderObject*, const IntRect&);
182
183         void setPopupButtonCellState(const RenderObject*, const IntRect&);
184         const IntSize* popupButtonSizes() const;
185         const int* popupButtonMargins() const;
186         const int* popupButtonPadding(NSControlSize) const;
187         void paintMenuListButtonGradients(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
188         const IntSize* menuListSizes() const;
189
190         const IntSize* searchFieldSizes() const;
191         const IntSize* cancelButtonSizes() const;
192         const IntSize* resultsButtonSizes() const;
193         void setSearchCellState(RenderObject*, const IntRect&);
194         void setSearchFieldSize(RenderStyle*) const;
195         
196         NSButtonCell* checkbox() const;
197         NSButtonCell* radio() const;
198         NSButtonCell* button() const;
199         NSPopUpButtonCell* popupButton() const;
200         NSSearchFieldCell* search() const;
201         NSMenu* searchMenuTemplate() const;
202         NSSliderCell* sliderThumbHorizontal() const;
203         NSSliderCell* sliderThumbVertical() const;
204
205     private:
206         mutable RetainPtr<NSButtonCell> m_checkbox;
207         mutable RetainPtr<NSButtonCell> m_radio;
208         mutable RetainPtr<NSButtonCell> m_button;
209         mutable RetainPtr<NSPopUpButtonCell> m_popupButton;
210         mutable RetainPtr<NSSearchFieldCell> m_search;
211         mutable RetainPtr<NSMenu> m_searchMenuTemplate;
212         mutable RetainPtr<NSSliderCell> m_sliderThumbHorizontal;
213         mutable RetainPtr<NSSliderCell> m_sliderThumbVertical;
214
215         bool m_isSliderThumbHorizontalPressed;
216         bool m_isSliderThumbVerticalPressed;
217
218         mutable HashMap<int, RGBA32> m_systemColorCache;
219
220         RetainPtr<WebCoreRenderThemeNotificationObserver> m_notificationObserver;
221         bool paintMediaButtonInternal(GraphicsContext*, const IntRect&, Image*);
222     };
223
224 } // namespace WebCore
225
226 #endif