0d36b8c931e057bf196a17938d15274fa13761f2
[WebKit-https.git] / Source / WebCore / platform / qt / RenderThemeQtMobile.h
1 /*
2  * This file is part of the theme implementation for form controls in WebCore.
3  *
4  * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22 #ifndef RenderThemeQtMobile_h
23 #define RenderThemeQtMobile_h
24
25 #include "RenderThemeQt.h"
26
27 #include <QBrush>
28 #include <QHash>
29 #include <QPixmapCache>
30
31 QT_BEGIN_NAMESPACE
32 class QColor;
33 class QSize;
34 QT_END_NAMESPACE
35
36 typedef QPixmapCache::Key CacheKey;
37
38 namespace WebCore {
39
40 class RenderThemeQtMobile : public RenderThemeQt {
41 private:
42     RenderThemeQtMobile(Page*);
43     virtual ~RenderThemeQtMobile();
44
45 public:
46     static PassRefPtr<RenderTheme> create(Page*);
47
48     virtual void adjustSliderThumbSize(RenderStyle*) const;
49
50     virtual bool isControlStyled(const RenderStyle*, const BorderData&, const FillLayer&, const Color& backgroundColor) const;
51
52     virtual int popupInternalPaddingBottom(RenderStyle*) const;
53
54     virtual bool delegatesMenuListRendering() const { return true; }
55
56 protected:
57
58     virtual void adjustButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
59     virtual bool paintButton(RenderObject*, const PaintInfo&, const IntRect&);
60
61     virtual bool paintTextField(RenderObject*, const PaintInfo&, const IntRect&);
62     virtual void adjustTextFieldStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
63
64     virtual bool paintMenuList(RenderObject*, const PaintInfo&, const IntRect&);
65     virtual void adjustMenuListStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
66
67     virtual bool paintMenuListButton(RenderObject*, const PaintInfo&, const IntRect&);
68
69 #if ENABLE(PROGRESS_TAG)
70     // Returns the duration of the animation for the progress bar.
71     virtual double animationDurationForProgressBar(RenderProgress*) const;
72     virtual bool paintProgressBar(RenderObject*, const PaintInfo&, const IntRect&);
73 #endif
74
75     virtual bool paintSliderTrack(RenderObject*, const PaintInfo&, const IntRect&);
76     virtual bool paintSliderThumb(RenderObject*, const PaintInfo&, const IntRect&);
77
78     virtual void computeSizeBasedOnStyle(RenderStyle*) const;
79     virtual QSharedPointer<StylePainter> getStylePainter(const PaintInfo&);
80
81 private:
82     bool checkMultiple(RenderObject*) const;
83     void setButtonPadding(RenderStyle*) const;
84     void setPopupPadding(RenderStyle*) const;
85
86     void setPaletteFromPageClientIfExists(QPalette&) const;
87 };
88
89 struct KeyIdentifier {
90
91     KeyIdentifier()
92         : type(Undefined)
93         , width(0)
94         , height(0)
95         , trait1(0)
96         , trait2(0)
97         , trait3(0)
98     {
99     }
100
101     enum ControlType {
102         Undefined,
103         CheckBox,
104         Radio,
105         ComboButton,
106         LineEdit,
107         PushButton,
108         Progress,
109         SliderThumb
110     };
111
112     ControlType type : 3;
113     uint width : 11;
114     uint height : 9;
115     uint trait1 : 1;
116     uint trait2 : 1;
117     uint trait3 : 7;
118
119     inline bool operator==(const KeyIdentifier& other) const
120     {
121         return (type == other.type && width == other.width
122                 && height == other.height && trait1 == other.trait1
123                 && trait2 == other.trait2 && trait3 == other.trait3);
124     }
125 };
126
127 class StylePainterMobile : public StylePainter {
128
129 public:
130     explicit StylePainterMobile(RenderThemeQtMobile*, const PaintInfo&);
131     ~StylePainterMobile();
132
133     void drawLineEdit(const QRect&, bool focused, bool enabled = true);
134     void drawCheckBox(const QRect&, bool checked, bool enabled = true);
135     void drawRadioButton(const QRect&, bool checked, bool enabled = true);
136     void drawPushButton(const QRect&, bool sunken, bool enabled = true);
137     void drawComboBox(const QRect&, bool multiple, bool enabled = true);
138     void drawProgress(const QRect&, double progress, bool leftToRight = true, bool animated = false, bool vertical = false) const;
139     void drawSliderThumb(const QRect&, bool pressed) const;
140
141 private:
142     void drawCheckableBackground(QPainter*, const QRect&, bool checked, bool enabled) const;
143     void drawChecker(QPainter*, const QRect&, const QColor&) const;
144     QPixmap findCheckBox(const QSize&, bool checked, bool enabled) const;
145
146     void drawRadio(QPainter*, const QSize&, bool checked, bool enabled) const;
147     QPixmap findRadio(const QSize&, bool checked, bool enabled) const;
148
149     QSizeF getButtonImageSize(int , bool multiple) const;
150     void drawSimpleComboButton(QPainter*, const QSizeF&, const QColor&) const;
151     void drawMultipleComboButton(QPainter*, const QSizeF&, const QColor&) const;
152     QPixmap findComboButton(const QSize&, bool multiple, bool enabled) const;
153
154     QPixmap findLineEdit(const QSize&, bool focused) const;
155     QPixmap findPushButton(const QSize&, bool sunken, bool enabled) const;
156
157     QSize sizeForPainterScale(const QRect&) const;
158
159     static bool findCachedControl(const KeyIdentifier&, QPixmap*);
160     static void insertIntoCache(const KeyIdentifier&, const QPixmap&);
161
162     bool m_previousSmoothPixmapTransform;
163
164     Q_DISABLE_COPY(StylePainterMobile)
165 };
166
167 }
168
169 #endif // RenderThemeQtMobile_h