OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 } | 85 } |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
89 @end | 89 @end |
90 | 90 |
91 namespace blink { | 91 namespace blink { |
92 | 92 |
93 typedef HashMap<ScrollbarThemeClient*, RetainPtr<WebCoreScrollbarObserver> > Scr
ollbarPainterMap; | 93 typedef HashMap<ScrollbarThemeClient*, RetainPtr<WebCoreScrollbarObserver> > Scr
ollbarPainterMap; |
94 | 94 |
95 static ScrollbarPainterMap* scrollbarPainterMap() | 95 static ScrollbarPainterMap& scrollbarPainterMap() |
96 { | 96 { |
97 static ScrollbarPainterMap* map = new ScrollbarPainterMap; | 97 static ScrollbarPainterMap* map = new ScrollbarPainterMap; |
98 return map; | 98 return *map; |
99 } | 99 } |
100 | 100 |
101 static bool supportsExpandedScrollbars() | 101 static bool supportsExpandedScrollbars() |
102 { | 102 { |
103 // FIXME: This is temporary until all platforms that support ScrollbarPainte
r support this part of the API. | 103 // FIXME: This is temporary until all platforms that support ScrollbarPainte
r support this part of the API. |
104 static bool globalSupportsExpandedScrollbars = [NSClassFromString(@"NSScroll
erImp") instancesRespondToSelector:@selector(setExpanded:)]; | 104 static bool globalSupportsExpandedScrollbars = [NSClassFromString(@"NSScroll
erImp") instancesRespondToSelector:@selector(setExpanded:)]; |
105 return globalSupportsExpandedScrollbars; | 105 return globalSupportsExpandedScrollbars; |
106 } | 106 } |
107 | 107 |
108 void ScrollbarThemeMacOverlayAPI::registerScrollbar(ScrollbarThemeClient* scroll
bar) | 108 void ScrollbarThemeMacOverlayAPI::registerScrollbar(ScrollbarThemeClient& scroll
bar) |
109 { | 109 { |
110 ScrollbarThemeMacCommon::registerScrollbar(scrollbar); | 110 ScrollbarThemeMacCommon::registerScrollbar(scrollbar); |
111 | 111 |
112 bool isHorizontal = scrollbar->orientation() == HorizontalScrollbar; | 112 bool isHorizontal = scrollbar.orientation() == HorizontalScrollbar; |
113 ScrollbarPainter scrollbarPainter = [NSClassFromString(@"NSScrollerImp") scr
ollerImpWithStyle:recommendedScrollerStyle() controlSize:(NSControlSize)scrollba
r->controlSize() horizontal:isHorizontal replacingScrollerImp:nil]; | 113 ScrollbarPainter scrollbarPainter = [NSClassFromString(@"NSScrollerImp") scr
ollerImpWithStyle:recommendedScrollerStyle() controlSize:(NSControlSize)scrollba
r.controlSize() horizontal:isHorizontal replacingScrollerImp:nil]; |
114 RetainPtr<WebCoreScrollbarObserver> observer = [[WebCoreScrollbarObserver al
loc] initWithScrollbar:scrollbar painter:scrollbarPainter]; | 114 RetainPtr<WebCoreScrollbarObserver> observer = [[WebCoreScrollbarObserver al
loc] initWithScrollbar:&scrollbar painter:scrollbarPainter]; |
115 | 115 |
116 scrollbarPainterMap()->add(scrollbar, observer); | 116 scrollbarPainterMap().add(&scrollbar, observer); |
117 updateEnabledState(scrollbar); | 117 updateEnabledState(scrollbar); |
118 updateScrollbarOverlayStyle(scrollbar); | 118 updateScrollbarOverlayStyle(scrollbar); |
119 } | 119 } |
120 | 120 |
121 void ScrollbarThemeMacOverlayAPI::unregisterScrollbar(ScrollbarThemeClient* scro
llbar) | 121 void ScrollbarThemeMacOverlayAPI::unregisterScrollbar(ScrollbarThemeClient& scro
llbar) |
122 { | 122 { |
123 scrollbarPainterMap()->remove(scrollbar); | 123 scrollbarPainterMap().remove(&scrollbar); |
124 | 124 |
125 ScrollbarThemeMacCommon::unregisterScrollbar(scrollbar); | 125 ScrollbarThemeMacCommon::unregisterScrollbar(scrollbar); |
126 } | 126 } |
127 | 127 |
128 void ScrollbarThemeMacOverlayAPI::setNewPainterForScrollbar(ScrollbarThemeClient
* scrollbar, ScrollbarPainter newPainter) | 128 void ScrollbarThemeMacOverlayAPI::setNewPainterForScrollbar(ScrollbarThemeClient
& scrollbar, ScrollbarPainter newPainter) |
129 { | 129 { |
130 RetainPtr<WebCoreScrollbarObserver> observer = [[WebCoreScrollbarObserver al
loc] initWithScrollbar:scrollbar painter:newPainter]; | 130 RetainPtr<WebCoreScrollbarObserver> observer = [[WebCoreScrollbarObserver al
loc] initWithScrollbar:&scrollbar painter:newPainter]; |
131 scrollbarPainterMap()->set(scrollbar, observer); | 131 scrollbarPainterMap().set(&scrollbar, observer); |
132 updateEnabledState(scrollbar); | 132 updateEnabledState(scrollbar); |
133 updateScrollbarOverlayStyle(scrollbar); | 133 updateScrollbarOverlayStyle(scrollbar); |
134 } | 134 } |
135 | 135 |
136 ScrollbarPainter ScrollbarThemeMacOverlayAPI::painterForScrollbar(const Scrollba
rThemeClient* scrollbar) const | 136 ScrollbarPainter ScrollbarThemeMacOverlayAPI::painterForScrollbar(const Scrollba
rThemeClient& scrollbar) const |
137 { | 137 { |
138 return [scrollbarPainterMap()->get(const_cast<ScrollbarThemeClient*>(scrollb
ar)).get() painter]; | 138 return [scrollbarPainterMap().get(const_cast<ScrollbarThemeClient*>(&scrollb
ar)).get() painter]; |
139 } | 139 } |
140 | 140 |
141 void ScrollbarThemeMacOverlayAPI::paintTrackBackground(GraphicsContext* context,
const ScrollbarThemeClient* scrollbar, const IntRect& rect) { | 141 void ScrollbarThemeMacOverlayAPI::paintTrackBackground(GraphicsContext& context,
const ScrollbarThemeClient& scrollbar, const IntRect& rect) { |
142 if (DrawingRecorder::useCachedDrawingIfPossible(*context, *scrollbar, Displa
yItem::ScrollbarTrackBackground)) | 142 if (DrawingRecorder::useCachedDrawingIfPossible(context, scrollbar, DisplayI
tem::ScrollbarTrackBackground)) |
143 return; | 143 return; |
144 | 144 |
145 DrawingRecorder recorder(*context, *scrollbar, DisplayItem::ScrollbarTrackBa
ckground, rect); | 145 DrawingRecorder recorder(context, scrollbar, DisplayItem::ScrollbarTrackBack
ground, rect); |
146 | 146 |
147 ASSERT(isOverlayAPIAvailable()); | 147 ASSERT(isOverlayAPIAvailable()); |
148 | 148 |
149 GraphicsContextStateSaver stateSaver(*context); | 149 GraphicsContextStateSaver stateSaver(context); |
150 context->translate(rect.x(), rect.y()); | 150 context.translate(rect.x(), rect.y()); |
151 LocalCurrentGraphicsContext localContext(context, IntRect(IntPoint(), rect.s
ize())); | 151 LocalCurrentGraphicsContext localContext(&context, IntRect(IntPoint(), rect.
size())); |
152 | 152 |
153 CGRect frameRect = scrollbar->frameRect(); | 153 CGRect frameRect = scrollbar.frameRect(); |
154 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); | 154 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); |
155 [scrollbarPainter setEnabled:scrollbar->enabled()]; | 155 [scrollbarPainter setEnabled:scrollbar.enabled()]; |
156 [scrollbarPainter setBoundsSize: NSSizeFromCGSize(frameRect.size)]; | 156 [scrollbarPainter setBoundsSize: NSSizeFromCGSize(frameRect.size)]; |
157 NSRect trackRect = NSMakeRect(0, 0, frameRect.size.width, frameRect.size.hei
ght); | 157 NSRect trackRect = NSMakeRect(0, 0, frameRect.size.width, frameRect.size.hei
ght); |
158 [scrollbarPainter drawKnobSlotInRect:trackRect highlight:NO]; | 158 [scrollbarPainter drawKnobSlotInRect:trackRect highlight:NO]; |
159 } | 159 } |
160 | 160 |
161 void ScrollbarThemeMacOverlayAPI::paintThumb(GraphicsContext* context, const Scr
ollbarThemeClient* scrollbar, const IntRect& rect) { | 161 void ScrollbarThemeMacOverlayAPI::paintThumb(GraphicsContext& context, const Scr
ollbarThemeClient& scrollbar, const IntRect& rect) { |
162 if (DrawingRecorder::useCachedDrawingIfPossible(*context, *scrollbar, Displa
yItem::ScrollbarThumb)) | 162 if (DrawingRecorder::useCachedDrawingIfPossible(context, scrollbar, DisplayI
tem::ScrollbarThumb)) |
163 return; | 163 return; |
164 | 164 |
165 // Expand dirty rect to allow for scroll thumb anti-aliasing in minimum thum
b size case. | 165 // Expand dirty rect to allow for scroll thumb anti-aliasing in minimum thum
b size case. |
166 IntRect dirtyRect = IntRect(rect); | 166 IntRect dirtyRect = IntRect(rect); |
167 dirtyRect.inflate(1); | 167 dirtyRect.inflate(1); |
168 DrawingRecorder recorder(*context, *scrollbar, DisplayItem::ScrollbarThumb,
dirtyRect); | 168 DrawingRecorder recorder(context, scrollbar, DisplayItem::ScrollbarThumb, di
rtyRect); |
169 | 169 |
170 ASSERT(isOverlayAPIAvailable()); | 170 ASSERT(isOverlayAPIAvailable()); |
171 | 171 |
172 GraphicsContextStateSaver stateSaver(*context); | 172 GraphicsContextStateSaver stateSaver(context); |
173 context->translate(rect.x(), rect.y()); | 173 context.translate(rect.x(), rect.y()); |
174 LocalCurrentGraphicsContext localContext(context, IntRect(IntPoint(), rect.s
ize())); | 174 LocalCurrentGraphicsContext localContext(&context, IntRect(IntPoint(), rect.
size())); |
175 | 175 |
176 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); | 176 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); |
177 [scrollbarPainter setEnabled:scrollbar->enabled()]; | 177 [scrollbarPainter setEnabled:scrollbar.enabled()]; |
178 [scrollbarPainter setBoundsSize:NSSizeFromCGSize(rect.size())]; | 178 [scrollbarPainter setBoundsSize:NSSizeFromCGSize(rect.size())]; |
179 [scrollbarPainter setDoubleValue:0]; | 179 [scrollbarPainter setDoubleValue:0]; |
180 [scrollbarPainter setKnobProportion:1]; | 180 [scrollbarPainter setKnobProportion:1]; |
181 | 181 |
182 CGFloat oldKnobAlpha = [scrollbarPainter knobAlpha]; | 182 CGFloat oldKnobAlpha = [scrollbarPainter knobAlpha]; |
183 [scrollbarPainter setKnobAlpha:1]; | 183 [scrollbarPainter setKnobAlpha:1]; |
184 | 184 |
185 if (scrollbar->enabled()) | 185 if (scrollbar.enabled()) |
186 [scrollbarPainter drawKnob]; | 186 [scrollbarPainter drawKnob]; |
187 | 187 |
188 // If this state is not set, then moving the cursor over the scrollbar area
will only cause the | 188 // If this state is not set, then moving the cursor over the scrollbar area
will only cause the |
189 // scrollbar to engorge when moved over the top of the scrollbar area. | 189 // scrollbar to engorge when moved over the top of the scrollbar area. |
190 [scrollbarPainter setBoundsSize: NSSizeFromCGSize(scrollbar->frameRect().siz
e())]; | 190 [scrollbarPainter setBoundsSize: NSSizeFromCGSize(scrollbar.frameRect().size
())]; |
191 [scrollbarPainter setKnobAlpha:oldKnobAlpha]; | 191 [scrollbarPainter setKnobAlpha:oldKnobAlpha]; |
192 } | 192 } |
193 | 193 |
194 int ScrollbarThemeMacOverlayAPI::scrollbarThickness(ScrollbarControlSize control
Size) | 194 int ScrollbarThemeMacOverlayAPI::scrollbarThickness(ScrollbarControlSize control
Size) |
195 { | 195 { |
196 NSControlSize nsControlSize = static_cast<NSControlSize>(controlSize); | 196 NSControlSize nsControlSize = static_cast<NSControlSize>(controlSize); |
197 ScrollbarPainter scrollbarPainter = [NSClassFromString(@"NSScrollerImp") scr
ollerImpWithStyle:recommendedScrollerStyle() controlSize:nsControlSize horizonta
l:NO replacingScrollerImp:nil]; | 197 ScrollbarPainter scrollbarPainter = [NSClassFromString(@"NSScrollerImp") scr
ollerImpWithStyle:recommendedScrollerStyle() controlSize:nsControlSize horizonta
l:NO replacingScrollerImp:nil]; |
198 BOOL wasExpanded = NO; | 198 BOOL wasExpanded = NO; |
199 if (supportsExpandedScrollbars()) { | 199 if (supportsExpandedScrollbars()) { |
200 wasExpanded = [scrollbarPainter isExpanded]; | 200 wasExpanded = [scrollbarPainter isExpanded]; |
201 [scrollbarPainter setExpanded:YES]; | 201 [scrollbarPainter setExpanded:YES]; |
202 } | 202 } |
203 int thickness = [scrollbarPainter trackBoxWidth]; | 203 int thickness = [scrollbarPainter trackBoxWidth]; |
204 if (supportsExpandedScrollbars()) | 204 if (supportsExpandedScrollbars()) |
205 [scrollbarPainter setExpanded:wasExpanded]; | 205 [scrollbarPainter setExpanded:wasExpanded]; |
206 return thickness; | 206 return thickness; |
207 } | 207 } |
208 | 208 |
209 bool ScrollbarThemeMacOverlayAPI::usesOverlayScrollbars() const | 209 bool ScrollbarThemeMacOverlayAPI::usesOverlayScrollbars() const |
210 { | 210 { |
211 return recommendedScrollerStyle() == NSScrollerStyleOverlay; | 211 return recommendedScrollerStyle() == NSScrollerStyleOverlay; |
212 } | 212 } |
213 | 213 |
214 void ScrollbarThemeMacOverlayAPI::updateScrollbarOverlayStyle(const ScrollbarThe
meClient* scrollbar) | 214 void ScrollbarThemeMacOverlayAPI::updateScrollbarOverlayStyle(const ScrollbarThe
meClient& scrollbar) |
215 { | 215 { |
216 ScrollbarPainter painter = painterForScrollbar(scrollbar); | 216 ScrollbarPainter painter = painterForScrollbar(scrollbar); |
217 switch (scrollbar->scrollbarOverlayStyle()) { | 217 switch (scrollbar.scrollbarOverlayStyle()) { |
218 case ScrollbarOverlayStyleDefault: | 218 case ScrollbarOverlayStyleDefault: |
219 [painter setKnobStyle:NSScrollerKnobStyleDefault]; | 219 [painter setKnobStyle:NSScrollerKnobStyleDefault]; |
220 break; | 220 break; |
221 case ScrollbarOverlayStyleDark: | 221 case ScrollbarOverlayStyleDark: |
222 [painter setKnobStyle:NSScrollerKnobStyleDark]; | 222 [painter setKnobStyle:NSScrollerKnobStyleDark]; |
223 break; | 223 break; |
224 case ScrollbarOverlayStyleLight: | 224 case ScrollbarOverlayStyleLight: |
225 [painter setKnobStyle:NSScrollerKnobStyleLight]; | 225 [painter setKnobStyle:NSScrollerKnobStyleLight]; |
226 break; | 226 break; |
227 } | 227 } |
228 } | 228 } |
229 | 229 |
230 ScrollbarButtonsPlacement ScrollbarThemeMacOverlayAPI::buttonsPlacement() const | 230 ScrollbarButtonsPlacement ScrollbarThemeMacOverlayAPI::buttonsPlacement() const |
231 { | 231 { |
232 return ScrollbarButtonsPlacementNone; | 232 return ScrollbarButtonsPlacementNone; |
233 } | 233 } |
234 | 234 |
235 bool ScrollbarThemeMacOverlayAPI::hasThumb(const ScrollbarThemeClient* scrollbar
) | 235 bool ScrollbarThemeMacOverlayAPI::hasThumb(const ScrollbarThemeClient& scrollbar
) |
236 { | 236 { |
237 ScrollbarPainter painter = painterForScrollbar(scrollbar); | 237 ScrollbarPainter painter = painterForScrollbar(scrollbar); |
238 int minLengthForThumb = [painter knobMinLength] + [painter trackOverlapEndIn
set] + [painter knobOverlapEndInset] | 238 int minLengthForThumb = [painter knobMinLength] + [painter trackOverlapEndIn
set] + [painter knobOverlapEndInset] |
239 + 2 * ([painter trackEndInset] + [painter knobEndInset]); | 239 + 2 * ([painter trackEndInset] + [painter knobEndInset]); |
240 return scrollbar->enabled() && (scrollbar->orientation() == HorizontalScroll
bar ? | 240 return scrollbar.enabled() && (scrollbar.orientation() == HorizontalScrollba
r ? |
241 scrollbar->width() : | 241 scrollbar.width() : |
242 scrollbar->height()) >= minLengthForThumb; | 242 scrollbar.height()) >= minLengthForThumb; |
243 } | 243 } |
244 | 244 |
245 IntRect ScrollbarThemeMacOverlayAPI::backButtonRect(const ScrollbarThemeClient*
scrollbar, ScrollbarPart part, bool painting) | 245 IntRect ScrollbarThemeMacOverlayAPI::backButtonRect(const ScrollbarThemeClient&
scrollbar, ScrollbarPart part, bool painting) |
246 { | 246 { |
247 ASSERT(buttonsPlacement() == ScrollbarButtonsPlacementNone); | 247 ASSERT(buttonsPlacement() == ScrollbarButtonsPlacementNone); |
248 return IntRect(); | 248 return IntRect(); |
249 } | 249 } |
250 | 250 |
251 IntRect ScrollbarThemeMacOverlayAPI::forwardButtonRect(const ScrollbarThemeClien
t* scrollbar, ScrollbarPart part, bool painting) | 251 IntRect ScrollbarThemeMacOverlayAPI::forwardButtonRect(const ScrollbarThemeClien
t& scrollbar, ScrollbarPart part, bool painting) |
252 { | 252 { |
253 ASSERT(buttonsPlacement() == ScrollbarButtonsPlacementNone); | 253 ASSERT(buttonsPlacement() == ScrollbarButtonsPlacementNone); |
254 return IntRect(); | 254 return IntRect(); |
255 } | 255 } |
256 | 256 |
257 IntRect ScrollbarThemeMacOverlayAPI::trackRect(const ScrollbarThemeClient* scrol
lbar, bool painting) | 257 IntRect ScrollbarThemeMacOverlayAPI::trackRect(const ScrollbarThemeClient& scrol
lbar, bool painting) |
258 { | 258 { |
259 ASSERT(!hasButtons(scrollbar)); | 259 ASSERT(!hasButtons(scrollbar)); |
260 return scrollbar->frameRect(); | 260 return scrollbar.frameRect(); |
261 } | 261 } |
262 | 262 |
263 int ScrollbarThemeMacOverlayAPI::minimumThumbLength(const ScrollbarThemeClient*
scrollbar) | 263 int ScrollbarThemeMacOverlayAPI::minimumThumbLength(const ScrollbarThemeClient&
scrollbar) |
264 { | 264 { |
265 return [painterForScrollbar(scrollbar) knobMinLength]; | 265 return [painterForScrollbar(scrollbar) knobMinLength]; |
266 } | 266 } |
267 | 267 |
268 void ScrollbarThemeMacOverlayAPI::updateEnabledState(const ScrollbarThemeClient*
scrollbar) | 268 void ScrollbarThemeMacOverlayAPI::updateEnabledState(const ScrollbarThemeClient&
scrollbar) |
269 { | 269 { |
270 [painterForScrollbar(scrollbar) setEnabled:scrollbar->enabled()]; | 270 [painterForScrollbar(scrollbar) setEnabled:scrollbar.enabled()]; |
271 } | 271 } |
272 | 272 |
273 float ScrollbarThemeMacOverlayAPI::thumbOpacity(const ScrollbarThemeClient* scro
llbar) const { | 273 float ScrollbarThemeMacOverlayAPI::thumbOpacity(const ScrollbarThemeClient& scro
llbar) const { |
274 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); | 274 ScrollbarPainter scrollbarPainter = painterForScrollbar(scrollbar); |
275 return [scrollbarPainter knobAlpha]; | 275 return [scrollbarPainter knobAlpha]; |
276 } | 276 } |
277 | 277 |
278 } // namespace blink | 278 } // namespace blink |
279 | 279 |
OLD | NEW |