1/*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31// WebThemeControlDRTWin implements the generic rendering of controls
32// needed by WebThemeEngineDRTWin. See the comments in that class
33// header file for why this class is needed and used.
34//
35// This class implements a generic set of widgets using Skia. The widgets
36// are optimized for testability, not a pleasing appearance.
37//
38
39#ifndef WebThemeControlDRTWin_h
40#define WebThemeControlDRTWin_h
41
42#include "skia/ext/platform_canvas.h"
43#include "third_party/skia/include/core/SkColor.h"
44#include <wtf/Noncopyable.h>
45
46// Skia forward declarations
47struct SkIRect;
48
49class WebThemeControlDRTWin {
50    WTF_MAKE_NONCOPYABLE(WebThemeControlDRTWin);
51public:
52    // This list of states mostly mirrors the list in WebCore/platform/ThemeTypes.h
53    // but is maintained separately since that isn't public and also to minimize
54    // dependencies.
55    // Note that the WebKit ThemeTypes seem to imply that a control can be
56    // in multiple states simultaneously but WebThemeEngine only allows for
57    // a single state at a time.
58    //
59    // Some definitions for the various states:
60    //   Disabled - indicates that a control can't be modified or selected
61    //              (corresponds to HTML 'disabled' attribute)
62    //   ReadOnly - indicates that a control can't be modified but can be
63    //              selected
64    //   Normal   - the normal state of control on the page when it isn't
65    //              focused or otherwise active
66    //   Hot      - when the mouse is hovering over a part of the control,
67    //              all the other parts are considered "hot"
68    //   Hover    - when the mouse is directly over a control (the CSS
69    //               :hover pseudo-class)
70    //   Focused  - when the control has the keyboard focus
71    //   Pressed  - when the control is being triggered (by a mousedown or
72    //              a key event).
73    //   Indeterminate - when set to indeterminate (only for progress bar)
74    enum State {
75        UnknownState = 0,
76        DisabledState,
77        ReadOnlyState,
78        NormalState,
79        HotState,
80        HoverState,
81        FocusedState,
82        PressedState,
83        IndeterminateState
84    };
85
86    // This list of types mostly mirrors the list in
87    // WebCore/platform/ThemeTypes.h but is maintained
88    // separately since that isn't public and also to minimize dependencies.
89    //
90    // Note that what the user might think of as a single control can be
91    // made up of multiple parts. For example, a single scroll bar contains
92    // six clickable parts - two arrows, the "thumb" indicating the current
93    // position on the bar, the other two parts of the bar (before and after
94    // the thumb) and the "gripper" on the thumb itself.
95    //
96    enum Type {
97        UnknownType = 0,
98        TextFieldType,
99        PushButtonType,
100        UncheckedBoxType,
101        CheckedBoxType,
102        IndeterminateCheckboxType,
103        UncheckedRadioType,
104        CheckedRadioType,
105        HorizontalScrollTrackBackType,
106        HorizontalScrollTrackForwardType,
107        HorizontalScrollThumbType,
108        HorizontalScrollGripType,
109        VerticalScrollTrackBackType,
110        VerticalScrollTrackForwardType,
111        VerticalScrollThumbType,
112        VerticalScrollGripType,
113        LeftArrowType,
114        RightArrowType,
115        UpArrowType,
116        DownArrowType,
117        HorizontalSliderTrackType,
118        HorizontalSliderThumbType,
119        DropDownButtonType,
120        ProgressBarType
121    };
122
123    // Constructs a control of the given size, type and state to draw
124    // on to the given canvas.
125    WebThemeControlDRTWin(SkCanvas*, const SkIRect&, Type, State);
126    ~WebThemeControlDRTWin();
127
128    // Draws the control.
129    void draw();
130
131    // Use this for TextField controls instead, because the logic
132    // for drawing them is dependent on what WebKit tells us to do.
133    // If drawEdges is true, draw an edge around the control. If
134    // fillContentArea is true, fill the content area with the given color.
135    void drawTextField(bool drawEdges, bool fillContentArea, SkColor color);
136
137    // Use this for drawing ProgressBar controls instead, since we
138    // need to know the rect to fill inside the bar.
139    void drawProgressBar(const SkIRect& fillRect);
140
141private:
142    // Draws a box of size specified by irect, filled with the given color.
143    // The box will have a border drawn in the default edge color.
144    void box(const SkIRect& irect, SkColor color);
145
146
147    // Draws a triangle of size specified by the three pairs of coordinates,
148    // filled with the given color. The box will have an edge drawn in the
149    // default edge color.
150    void triangle(int x0, int y0, int x1, int y1, int x2, int y2, SkColor color);
151
152    // Draws a rectangle the size of the control with rounded corners, filled
153    // with the specified color (and with a border in the default edge color).
154    void roundRect(SkColor color);
155
156    // Draws an oval the size of the control, filled with the specified color
157    // and with a border in the default edge color.
158    void oval(SkColor color);
159
160    // Draws a circle centered in the control with the specified radius,
161    // filled with the specified color, and with a border draw in the
162    // default edge color.
163    void circle(SkScalar radius, SkColor color);
164
165    // Draws a box the size of the control, filled with the outerColor and
166    // with a border in the default edge color, and then draws another box
167    // indented on all four sides by the specified amounts, filled with the
168    // inner color and with a border in the default edge color.
169    void nestedBoxes(int indentLeft,
170                     int indentTop,
171                     int indentRight,
172                     int indentBottom,
173                     SkColor outerColor,
174                     SkColor innerColor);
175
176    // Draws a line between the two points in the given color.
177    void line(int x0, int y0, int x1, int y1, SkColor color);
178
179    // Draws a distinctive mark on the control for each state, so that the
180    // state of the control can be determined without needing to know which
181    // color is which.
182    void markState();
183
184    SkCanvas* m_canvas;
185    const SkIRect m_irect;
186    const Type m_type;
187    const State m_state;
188    const SkColor m_edgeColor;
189    const SkColor m_bgColor;
190    const SkColor m_fgColor;
191
192    // The following are convenience accessors for m_irect.
193    const int m_left;
194    const int m_right;
195    const int m_top;
196    const int m_bottom;
197    const int m_width;
198    const int m_height;
199};
200
201#endif // WebThemeControlDRTWin_h
202