2009-03-02 Adam Langley <agl@google.com>
[WebKit-https.git] / WebCore / platform / chromium / ScrollbarThemeChromiumLinux.cpp
1 /*
2  * Copyright (c) 2008, 2009, 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 #include "config.h"
32 #include "ScrollbarThemeChromium.h"
33
34 #include "NotImplemented.h"
35 #include "PlatformContextSkia.h"
36 #include "PlatformMouseEvent.h"
37 #include "Scrollbar.h"
38 #include "TransformationMatrix.h"
39
40 namespace WebCore {
41
42 int ScrollbarThemeChromium::scrollbarThickness(ScrollbarControlSize controlSize)
43 {
44     return 15;
45 }
46
47 bool ScrollbarThemeChromium::invalidateOnMouseEnterExit()
48 {
49     notImplemented();
50     return false;
51 }
52
53 void ScrollbarThemeChromium::paintTrackPiece(GraphicsContext* gc, Scrollbar* scrollbar,
54                                              const IntRect& rect, ScrollbarPart partType)
55 {
56     const int right = rect.x() + rect.width();
57     const int bottom = rect.y() + rect.height();
58     SkCanvas* const canvas = gc->platformContext()->canvas();
59
60     SkPaint paint;
61     paint.setARGB(0xff, 0xe3, 0xdd, 0xd8);
62     SkRect skrect;
63     skrect.set(rect.x(), rect.y(), right, bottom);
64     canvas->drawRect(skrect, paint);
65
66     paint.setARGB(0xff, 0xc5, 0xba, 0xb0);
67     canvas->drawLine(rect.x(), rect.y(), rect.x(), bottom, paint);
68     canvas->drawLine(right, rect.y(), right, bottom, paint);
69     canvas->drawLine(rect.x(), rect.y(), right, rect.y(), paint);
70     canvas->drawLine(rect.x(), bottom, right, bottom, paint);
71 }
72
73 void ScrollbarThemeChromium::paintButton(GraphicsContext* gc, Scrollbar* scrollbar,
74                                          const IntRect& rect, ScrollbarPart part)
75 {
76     // We don't use buttons
77 }
78
79 void ScrollbarThemeChromium::paintThumb(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect)
80 {
81     const bool hovered = scrollbar->hoveredPart() == ThumbPart;
82     const int right = rect.x() + rect.width();
83     const int bottom = rect.y() + rect.height();
84     const int midx = rect.x() + rect.width() / 2;
85     const int midy = rect.y() + rect.height() / 2;
86     const bool vertical = scrollbar->orientation() == VerticalScrollbar;
87     SkCanvas* const canvas = gc->platformContext()->canvas();
88
89     SkPaint paint;
90     if (hovered)
91         paint.setARGB(0xff, 0xff, 0xff, 0xff);
92     else
93         paint.setARGB(0xff, 0xf4, 0xf2, 0xef);
94
95     SkRect skrect;
96     if (vertical) {
97       skrect.set(rect.x(), rect.y(), midx + 1, bottom);
98     } else {
99       skrect.set(rect.x(), rect.y(), right, midy + 1);
100     }
101     canvas->drawRect(skrect, paint);
102
103     if (hovered) {
104       paint.setARGB(0xff, 0xf4, 0xf2, 0xef);
105     } else {
106       paint.setARGB(0xff, 0xea, 0xe5, 0xe0);
107     }
108     if (vertical) {
109       skrect.set(midx + 1, rect.y(), right, bottom);
110     } else {
111       skrect.set(rect.x(), midy + 1, right, bottom);
112     }
113     canvas->drawRect(skrect, paint);
114
115     paint.setARGB(0xff, 0x9d, 0x96, 0x8e);
116     canvas->drawLine(rect.x(), rect.y(), rect.x(), bottom, paint);
117     canvas->drawLine(right, rect.y(), right, bottom, paint);
118     canvas->drawLine(rect.x(), rect.y(), right, rect.y(), paint);
119     canvas->drawLine(rect.x(), bottom, right, bottom, paint);
120
121     if (rect.height() > 10 && rect.width() > 10) {
122       paint.setARGB(0xff, 0x9d, 0x96, 0x8e);
123       canvas->drawLine(midx - 1, midy, midx + 3, midy, paint);
124       canvas->drawLine(midx - 1, midy - 3, midx + 3, midy - 3, paint);
125       canvas->drawLine(midx - 1, midy + 3, midx + 3, midy + 3, paint);
126     }
127 }
128
129 } // namespace WebCore