OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved. | 2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "platform/graphics/GraphicsContext.h" | 36 #include "platform/graphics/GraphicsContext.h" |
37 #include "platform/graphics/paint/DrawingRecorder.h" | 37 #include "platform/graphics/paint/DrawingRecorder.h" |
38 #include "platform/scroll/ScrollbarThemeClient.h" | 38 #include "platform/scroll/ScrollbarThemeClient.h" |
39 #include "platform/scroll/ScrollbarThemeOverlay.h" | 39 #include "platform/scroll/ScrollbarThemeOverlay.h" |
40 #include "public/platform/Platform.h" | 40 #include "public/platform/Platform.h" |
41 #include "public/platform/WebRect.h" | 41 #include "public/platform/WebRect.h" |
42 #include "public/platform/WebThemeEngine.h" | 42 #include "public/platform/WebThemeEngine.h" |
43 | 43 |
44 namespace blink { | 44 namespace blink { |
45 | 45 |
46 namespace { | |
47 | |
48 static bool useMockTheme() | 46 static bool useMockTheme() |
49 { | 47 { |
50 return LayoutTestSupport::isRunningLayoutTest(); | 48 return LayoutTestSupport::isRunningLayoutTest(); |
51 } | 49 } |
52 | 50 |
53 // Contains a flag indicating whether WebThemeEngine should paint a UI widget | |
54 // for a scrollbar part, and if so, what part and state apply. | |
55 // | |
56 // If the PartPaintingParams are not affected by a change in the scrollbar | |
57 // state, then the corresponding scrollbar part does not need to be repainted. | |
58 struct PartPaintingParams { | |
59 PartPaintingParams() | |
60 : shouldPaint(false) | |
61 , part(WebThemeEngine::PartScrollbarDownArrow) | |
62 , state(WebThemeEngine::StateNormal) {} | |
63 PartPaintingParams(WebThemeEngine::Part part, WebThemeEngine::State state) | |
64 : shouldPaint(true) | |
65 , part(part) | |
66 , state(state) {} | |
67 | |
68 bool shouldPaint; | |
69 WebThemeEngine::Part part; | |
70 WebThemeEngine::State state; | |
71 }; | |
72 | |
73 bool operator==(const PartPaintingParams& a, const PartPaintingParams& b) | |
74 { | |
75 return (!a.shouldPaint && !b.shouldPaint) || std::tie(a.shouldPaint, a.part,
a.state) == std::tie(b.shouldPaint, b.part, b.state); | |
76 } | |
77 | |
78 bool operator!=(const PartPaintingParams& a, const PartPaintingParams& b) | |
79 { | |
80 return !(a == b); | |
81 } | |
82 | |
83 PartPaintingParams buttonPartPaintingParams(const ScrollbarThemeClient& scrollba
r, float position, ScrollbarPart part) | |
84 { | |
85 WebThemeEngine::Part paintPart; | |
86 WebThemeEngine::State state = WebThemeEngine::StateNormal; | |
87 bool checkMin = false; | |
88 bool checkMax = false; | |
89 | |
90 if (scrollbar.orientation() == HorizontalScrollbar) { | |
91 if (part == BackButtonStartPart) { | |
92 paintPart = WebThemeEngine::PartScrollbarLeftArrow; | |
93 checkMin = true; | |
94 } else if (useMockTheme() && part != ForwardButtonEndPart) { | |
95 return PartPaintingParams(); | |
96 } else { | |
97 paintPart = WebThemeEngine::PartScrollbarRightArrow; | |
98 checkMax = true; | |
99 } | |
100 } else { | |
101 if (part == BackButtonStartPart) { | |
102 paintPart = WebThemeEngine::PartScrollbarUpArrow; | |
103 checkMin = true; | |
104 } else if (useMockTheme() && part != ForwardButtonEndPart) { | |
105 return PartPaintingParams(); | |
106 } else { | |
107 paintPart = WebThemeEngine::PartScrollbarDownArrow; | |
108 checkMax = true; | |
109 } | |
110 } | |
111 | |
112 if (useMockTheme() && !scrollbar.enabled()) { | |
113 state = WebThemeEngine::StateDisabled; | |
114 } else if (!useMockTheme() && ((checkMin && (position <= 0)) | |
115 || (checkMax && position >= scrollbar.maximum()))) { | |
116 state = WebThemeEngine::StateDisabled; | |
117 } else { | |
118 if (part == scrollbar.pressedPart()) | |
119 state = WebThemeEngine::StatePressed; | |
120 else if (part == scrollbar.hoveredPart()) | |
121 state = WebThemeEngine::StateHover; | |
122 } | |
123 | |
124 return PartPaintingParams(paintPart, state); | |
125 } | |
126 | |
127 } // namespace | |
128 | |
129 ScrollbarTheme& ScrollbarTheme::nativeTheme() | 51 ScrollbarTheme& ScrollbarTheme::nativeTheme() |
130 { | 52 { |
131 if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) { | 53 if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) { |
132 DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, (10, 0, ScrollbarTheme
Overlay::AllowHitTest)); | 54 DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, (10, 0, ScrollbarTheme
Overlay::AllowHitTest)); |
133 return theme; | 55 return theme; |
134 } | 56 } |
135 | 57 |
136 DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); | 58 DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); |
137 return theme; | 59 return theme; |
138 } | 60 } |
139 | 61 |
140 int ScrollbarThemeAura::scrollbarThickness(ScrollbarControlSize controlSize) | 62 int ScrollbarThemeAura::scrollbarThickness(ScrollbarControlSize controlSize) |
141 { | 63 { |
142 // Horiz and Vert scrollbars are the same thickness. | 64 // Horiz and Vert scrollbars are the same thickness. |
143 // In unit tests we don't have the mock theme engine (because of layering vi
olations), so we hard code the size (see bug 327470). | 65 // In unit tests we don't have the mock theme engine (because of layering vi
olations), so we hard code the size (see bug 327470). |
144 if (useMockTheme()) | 66 if (useMockTheme()) |
145 return 15; | 67 return 15; |
146 IntSize scrollbarSize = Platform::current()->themeEngine()->getSize(WebTheme
Engine::PartScrollbarVerticalTrack); | 68 IntSize scrollbarSize = Platform::current()->themeEngine()->getSize(WebTheme
Engine::PartScrollbarVerticalTrack); |
147 return scrollbarSize.width(); | 69 return scrollbarSize.width(); |
148 } | 70 } |
149 | 71 |
150 bool ScrollbarThemeAura::shouldRepaintAllPartsOnInvalidation() const | |
151 { | |
152 // This theme can separately handle thumb invalidation. | |
153 return false; | |
154 } | |
155 | |
156 ScrollbarPart ScrollbarThemeAura::invalidateOnThumbPositionChange(const Scrollba
rThemeClient& scrollbar, float oldPosition, float newPosition) const | |
157 { | |
158 ScrollbarPart invalidParts = NoPart; | |
159 ASSERT(buttonsPlacement() == WebScrollbarButtonsPlacementSingle); | |
160 static const ScrollbarPart kButtonParts[] = {BackButtonStartPart, ForwardBut
tonEndPart}; | |
161 for (ScrollbarPart part : kButtonParts) { | |
162 if (buttonPartPaintingParams(scrollbar, oldPosition, part) != buttonPart
PaintingParams(scrollbar, newPosition, part)) | |
163 invalidParts = static_cast<ScrollbarPart>(invalidParts | part); | |
164 } | |
165 return invalidParts; | |
166 } | |
167 | |
168 void ScrollbarThemeAura::paintTrackPiece(GraphicsContext& gc, const ScrollbarThe
meClient& scrollbar, const IntRect& rect, ScrollbarPart partType) | 72 void ScrollbarThemeAura::paintTrackPiece(GraphicsContext& gc, const ScrollbarThe
meClient& scrollbar, const IntRect& rect, ScrollbarPart partType) |
169 { | 73 { |
170 DisplayItem::Type displayItemType = trackPiecePartToDisplayItemType(partType
); | 74 DisplayItem::Type displayItemType = trackPiecePartToDisplayItemType(partType
); |
171 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
pe)) | 75 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
pe)) |
172 return; | 76 return; |
173 | 77 |
174 DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 78 DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); |
175 | 79 |
176 WebThemeEngine::State state = scrollbar.hoveredPart() == partType ? WebTheme
Engine::StateHover : WebThemeEngine::StateNormal; | 80 WebThemeEngine::State state = scrollbar.hoveredPart() == partType ? WebTheme
Engine::StateHover : WebThemeEngine::StateNormal; |
177 | 81 |
178 if (useMockTheme() && !scrollbar.enabled()) | 82 if (useMockTheme() && !scrollbar.enabled()) |
179 state = WebThemeEngine::StateDisabled; | 83 state = WebThemeEngine::StateDisabled; |
180 | 84 |
181 IntRect alignRect = trackRect(scrollbar, false); | 85 IntRect alignRect = trackRect(scrollbar, false); |
182 WebThemeEngine::ExtraParams extraParams; | 86 WebThemeEngine::ExtraParams extraParams; |
183 extraParams.scrollbarTrack.isBack = (partType == BackTrackPart); | 87 extraParams.scrollbarTrack.isBack = (partType == BackTrackPart); |
184 extraParams.scrollbarTrack.trackX = alignRect.x(); | 88 extraParams.scrollbarTrack.trackX = alignRect.x(); |
185 extraParams.scrollbarTrack.trackY = alignRect.y(); | 89 extraParams.scrollbarTrack.trackY = alignRect.y(); |
186 extraParams.scrollbarTrack.trackWidth = alignRect.width(); | 90 extraParams.scrollbarTrack.trackWidth = alignRect.width(); |
187 extraParams.scrollbarTrack.trackHeight = alignRect.height(); | 91 extraParams.scrollbarTrack.trackHeight = alignRect.height(); |
188 Platform::current()->themeEngine()->paint(gc.canvas(), scrollbar.orientation
() == HorizontalScrollbar ? WebThemeEngine::PartScrollbarHorizontalTrack : WebTh
emeEngine::PartScrollbarVerticalTrack, state, WebRect(rect), &extraParams); | 92 Platform::current()->themeEngine()->paint(gc.canvas(), scrollbar.orientation
() == HorizontalScrollbar ? WebThemeEngine::PartScrollbarHorizontalTrack : WebTh
emeEngine::PartScrollbarVerticalTrack, state, WebRect(rect), &extraParams); |
189 } | 93 } |
190 | 94 |
191 void ScrollbarThemeAura::paintButton(GraphicsContext& gc, const ScrollbarThemeCl
ient& scrollbar, const IntRect& rect, ScrollbarPart part) | 95 void ScrollbarThemeAura::paintButton(GraphicsContext& gc, const ScrollbarThemeCl
ient& scrollbar, const IntRect& rect, ScrollbarPart part) |
192 { | 96 { |
| 97 WebThemeEngine::Part paintPart; |
| 98 WebThemeEngine::State state = WebThemeEngine::StateNormal; |
| 99 bool checkMin = false; |
| 100 bool checkMax = false; |
| 101 |
| 102 if (scrollbar.orientation() == HorizontalScrollbar) { |
| 103 if (part == BackButtonStartPart) { |
| 104 paintPart = WebThemeEngine::PartScrollbarLeftArrow; |
| 105 checkMin = true; |
| 106 } else if (useMockTheme() && part != ForwardButtonEndPart) { |
| 107 return; |
| 108 } else { |
| 109 paintPart = WebThemeEngine::PartScrollbarRightArrow; |
| 110 checkMax = true; |
| 111 } |
| 112 } else { |
| 113 if (part == BackButtonStartPart) { |
| 114 paintPart = WebThemeEngine::PartScrollbarUpArrow; |
| 115 checkMin = true; |
| 116 } else if (useMockTheme() && part != ForwardButtonEndPart) { |
| 117 return; |
| 118 } else { |
| 119 paintPart = WebThemeEngine::PartScrollbarDownArrow; |
| 120 checkMax = true; |
| 121 } |
| 122 } |
| 123 |
193 DisplayItem::Type displayItemType = buttonPartToDisplayItemType(part); | 124 DisplayItem::Type displayItemType = buttonPartToDisplayItemType(part); |
194 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
pe)) | 125 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
pe)) |
195 return; | 126 return; |
196 PartPaintingParams params = buttonPartPaintingParams(scrollbar, scrollbar.cu
rrentPos(), part); | 127 |
197 if (!params.shouldPaint) | |
198 return; | |
199 DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 128 DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); |
200 Platform::current()->themeEngine()->paint(gc.canvas(), params.part, params.s
tate, WebRect(rect), 0); | 129 |
| 130 if (useMockTheme() && !scrollbar.enabled()) { |
| 131 state = WebThemeEngine::StateDisabled; |
| 132 } else if (!useMockTheme() && ((checkMin && (scrollbar.currentPos() <= 0)) |
| 133 || (checkMax && scrollbar.currentPos() >= scrollbar.maximum()))) { |
| 134 state = WebThemeEngine::StateDisabled; |
| 135 } else { |
| 136 if (part == scrollbar.pressedPart()) |
| 137 state = WebThemeEngine::StatePressed; |
| 138 else if (part == scrollbar.hoveredPart()) |
| 139 state = WebThemeEngine::StateHover; |
| 140 } |
| 141 Platform::current()->themeEngine()->paint(gc.canvas(), paintPart, state, Web
Rect(rect), 0); |
201 } | 142 } |
202 | 143 |
203 void ScrollbarThemeAura::paintThumb(GraphicsContext& gc, const ScrollbarThemeCli
ent& scrollbar, const IntRect& rect) | 144 void ScrollbarThemeAura::paintThumb(GraphicsContext& gc, const ScrollbarThemeCli
ent& scrollbar, const IntRect& rect) |
204 { | 145 { |
205 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, DisplayItem::
ScrollbarThumb)) | 146 if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, DisplayItem::
ScrollbarThumb)) |
206 return; | 147 return; |
207 | 148 |
208 DrawingRecorder recorder(gc, scrollbar, DisplayItem::ScrollbarThumb, rect); | 149 DrawingRecorder recorder(gc, scrollbar, DisplayItem::ScrollbarThumb, rect); |
209 | 150 |
210 WebThemeEngine::State state; | 151 WebThemeEngine::State state; |
(...skipping 24 matching lines...) Expand all Loading... |
235 if (scrollbar.orientation() == VerticalScrollbar) { | 176 if (scrollbar.orientation() == VerticalScrollbar) { |
236 IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngin
e::PartScrollbarVerticalThumb); | 177 IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngin
e::PartScrollbarVerticalThumb); |
237 return size.height(); | 178 return size.height(); |
238 } | 179 } |
239 | 180 |
240 IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::P
artScrollbarHorizontalThumb); | 181 IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::P
artScrollbarHorizontalThumb); |
241 return size.width(); | 182 return size.width(); |
242 } | 183 } |
243 | 184 |
244 } // namespace blink | 185 } // namespace blink |
OLD | NEW |