Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1061)

Side by Side Diff: third_party/WebKit/Source/platform/scroll/Scrollbar.cpp

Issue 1511003003: Use refs for non-null GraphicsContext, Scrollbar, etc. in scrollbar related code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ScrollbarRemove
Patch Set: yet another mac fix Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2006, 2008 Apple 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 PassRefPtrWillBeRawPtr<Scrollbar> Scrollbar::create(ScrollableArea* scrollableAr ea, ScrollbarOrientation orientation, ScrollbarControlSize size) 44 PassRefPtrWillBeRawPtr<Scrollbar> Scrollbar::create(ScrollableArea* scrollableAr ea, ScrollbarOrientation orientation, ScrollbarControlSize size)
45 { 45 {
46 return adoptRefWillBeNoop(new Scrollbar(scrollableArea, orientation, size)); 46 return adoptRefWillBeNoop(new Scrollbar(scrollableArea, orientation, size));
47 } 47 }
48 48
49 Scrollbar::Scrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orient ation, ScrollbarControlSize controlSize, ScrollbarTheme* theme) 49 Scrollbar::Scrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orient ation, ScrollbarControlSize controlSize, ScrollbarTheme* theme)
50 : m_scrollableArea(scrollableArea) 50 : m_scrollableArea(scrollableArea)
51 , m_orientation(orientation) 51 , m_orientation(orientation)
52 , m_controlSize(controlSize) 52 , m_controlSize(controlSize)
53 , m_theme(theme) 53 , m_theme(theme ? *theme : ScrollbarTheme::theme())
54 , m_visibleSize(0) 54 , m_visibleSize(0)
55 , m_totalSize(0) 55 , m_totalSize(0)
56 , m_currentPos(0) 56 , m_currentPos(0)
57 , m_dragOrigin(0) 57 , m_dragOrigin(0)
58 , m_hoveredPart(NoPart) 58 , m_hoveredPart(NoPart)
59 , m_pressedPart(NoPart) 59 , m_pressedPart(NoPart)
60 , m_pressedPos(0) 60 , m_pressedPos(0)
61 , m_scrollPos(0) 61 , m_scrollPos(0)
62 , m_draggingDocument(false) 62 , m_draggingDocument(false)
63 , m_documentDragPos(0) 63 , m_documentDragPos(0)
64 , m_enabled(true) 64 , m_enabled(true)
65 , m_scrollTimer(this, &Scrollbar::autoscrollTimerFired) 65 , m_scrollTimer(this, &Scrollbar::autoscrollTimerFired)
66 , m_overlapsResizer(false) 66 , m_overlapsResizer(false)
67 , m_isAlphaLocked(false) 67 , m_isAlphaLocked(false)
68 , m_elasticOverscroll(0) 68 , m_elasticOverscroll(0)
69 , m_trackNeedsRepaint(true) 69 , m_trackNeedsRepaint(true)
70 , m_thumbNeedsRepaint(true) 70 , m_thumbNeedsRepaint(true)
71 { 71 {
72 if (!m_theme) 72 m_theme.registerScrollbar(*this);
73 m_theme = ScrollbarTheme::theme();
74
75 m_theme->registerScrollbar(this);
76 73
77 // FIXME: This is ugly and would not be necessary if we fix cross-platform c ode to actually query for 74 // FIXME: This is ugly and would not be necessary if we fix cross-platform c ode to actually query for
78 // scrollbar thickness and use it when sizing scrollbars (rather than leavin g one dimension of the scrollbar 75 // scrollbar thickness and use it when sizing scrollbars (rather than leavin g one dimension of the scrollbar
79 // alone when sizing). 76 // alone when sizing).
80 int thickness = m_theme->scrollbarThickness(controlSize); 77 int thickness = m_theme.scrollbarThickness(controlSize);
81 Widget::setFrameRect(IntRect(0, 0, thickness, thickness)); 78 Widget::setFrameRect(IntRect(0, 0, thickness, thickness));
82 79
83 m_currentPos = scrollableAreaCurrentPos(); 80 m_currentPos = scrollableAreaCurrentPos();
84 } 81 }
85 82
86 Scrollbar::~Scrollbar() 83 Scrollbar::~Scrollbar()
87 { 84 {
88 m_theme->unregisterScrollbar(this); 85 m_theme.unregisterScrollbar(*this);
89 } 86 }
90 87
91 DEFINE_TRACE(Scrollbar) 88 DEFINE_TRACE(Scrollbar)
92 { 89 {
93 visitor->trace(m_scrollableArea); 90 visitor->trace(m_scrollableArea);
94 Widget::trace(visitor); 91 Widget::trace(visitor);
95 } 92 }
96 93
97 void Scrollbar::setFrameRect(const IntRect& frameRect) 94 void Scrollbar::setFrameRect(const IntRect& frameRect)
98 { 95 {
(...skipping 28 matching lines...) Expand all
127 } 124 }
128 125
129 void Scrollbar::offsetDidChange() 126 void Scrollbar::offsetDidChange()
130 { 127 {
131 ASSERT(m_scrollableArea); 128 ASSERT(m_scrollableArea);
132 129
133 float position = scrollableAreaCurrentPos(); 130 float position = scrollableAreaCurrentPos();
134 if (position == m_currentPos) 131 if (position == m_currentPos)
135 return; 132 return;
136 133
137 int oldThumbPosition = theme()->thumbPosition(this); 134 int oldThumbPosition = theme().thumbPosition(*this);
138 m_currentPos = position; 135 m_currentPos = position;
139 updateThumbPosition(); 136 updateThumbPosition();
140 if (m_pressedPart == ThumbPart) 137 if (m_pressedPart == ThumbPart)
141 setPressedPos(m_pressedPos + theme()->thumbPosition(this) - oldThumbPosi tion); 138 setPressedPos(m_pressedPos + theme().thumbPosition(*this) - oldThumbPosi tion);
142 } 139 }
143 140
144 void Scrollbar::disconnectFromScrollableArea() 141 void Scrollbar::disconnectFromScrollableArea()
145 { 142 {
146 m_scrollableArea = nullptr; 143 m_scrollableArea = nullptr;
147 } 144 }
148 145
149 void Scrollbar::setProportion(int visibleSize, int totalSize) 146 void Scrollbar::setProportion(int visibleSize, int totalSize)
150 { 147 {
151 if (visibleSize == m_visibleSize && totalSize == m_totalSize) 148 if (visibleSize == m_visibleSize && totalSize == m_totalSize)
(...skipping 13 matching lines...) Expand all
165 void Scrollbar::updateThumbPosition() 162 void Scrollbar::updateThumbPosition()
166 { 163 {
167 updateThumb(); 164 updateThumb();
168 } 165 }
169 166
170 void Scrollbar::updateThumbProportion() 167 void Scrollbar::updateThumbProportion()
171 { 168 {
172 updateThumb(); 169 updateThumb();
173 } 170 }
174 171
175 void Scrollbar::paint(GraphicsContext* context, const CullRect& cullRect) const 172 void Scrollbar::paint(GraphicsContext& context, const CullRect& cullRect) const
176 { 173 {
177 if (!cullRect.intersectsCullRect(frameRect())) 174 if (!cullRect.intersectsCullRect(frameRect()))
178 return; 175 return;
179 176
180 if (!theme()->paint(this, context, cullRect)) 177 if (!theme().paint(*this, context, cullRect))
181 Widget::paint(context, cullRect); 178 Widget::paint(context, cullRect);
182 } 179 }
183 180
184 void Scrollbar::autoscrollTimerFired(Timer<Scrollbar>*) 181 void Scrollbar::autoscrollTimerFired(Timer<Scrollbar>*)
185 { 182 {
186 autoscrollPressedPart(theme()->autoscrollTimerDelay()); 183 autoscrollPressedPart(theme().autoscrollTimerDelay());
187 } 184 }
188 185
189 static bool thumbUnderMouse(Scrollbar* scrollbar) 186 static bool thumbUnderMouse(Scrollbar& scrollbar)
190 { 187 {
191 int thumbPos = scrollbar->theme()->trackPosition(scrollbar) + scrollbar->the me()->thumbPosition(scrollbar); 188 int thumbPos = scrollbar.theme().trackPosition(scrollbar) + scrollbar.theme( ).thumbPosition(scrollbar);
192 int thumbLength = scrollbar->theme()->thumbLength(scrollbar); 189 int thumbLength = scrollbar.theme().thumbLength(scrollbar);
193 return scrollbar->pressedPos() >= thumbPos && scrollbar->pressedPos() < thum bPos + thumbLength; 190 return scrollbar.pressedPos() >= thumbPos && scrollbar.pressedPos() < thumbP os + thumbLength;
194 } 191 }
195 192
196 void Scrollbar::autoscrollPressedPart(double delay) 193 void Scrollbar::autoscrollPressedPart(double delay)
197 { 194 {
198 // Don't do anything for the thumb or if nothing was pressed. 195 // Don't do anything for the thumb or if nothing was pressed.
199 if (m_pressedPart == ThumbPart || m_pressedPart == NoPart) 196 if (m_pressedPart == ThumbPart || m_pressedPart == NoPart)
200 return; 197 return;
201 198
202 // Handle the track. 199 // Handle the track.
203 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(this)) { 200 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(*this)) {
204 setNeedsPaintInvalidation(); 201 setNeedsPaintInvalidation();
205 setHoveredPart(ThumbPart); 202 setHoveredPart(ThumbPart);
206 return; 203 return;
207 } 204 }
208 205
209 // Handle the arrows and track. 206 // Handle the arrows and track.
210 if (m_scrollableArea && m_scrollableArea->userScroll(pressedPartScrollDirect ionPhysical(), pressedPartScrollGranularity()).didScroll) 207 if (m_scrollableArea && m_scrollableArea->userScroll(pressedPartScrollDirect ionPhysical(), pressedPartScrollGranularity()).didScroll)
211 startTimerIfNeeded(delay); 208 startTimerIfNeeded(delay);
212 } 209 }
213 210
214 void Scrollbar::startTimerIfNeeded(double delay) 211 void Scrollbar::startTimerIfNeeded(double delay)
215 { 212 {
216 // Don't do anything for the thumb. 213 // Don't do anything for the thumb.
217 if (m_pressedPart == ThumbPart) 214 if (m_pressedPart == ThumbPart)
218 return; 215 return;
219 216
220 // Handle the track. We halt track scrolling once the thumb is level 217 // Handle the track. We halt track scrolling once the thumb is level
221 // with us. 218 // with us.
222 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(this)) { 219 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(*this)) {
223 setNeedsPaintInvalidation(); 220 setNeedsPaintInvalidation();
224 setHoveredPart(ThumbPart); 221 setHoveredPart(ThumbPart);
225 return; 222 return;
226 } 223 }
227 224
228 // We can't scroll if we've hit the beginning or end. 225 // We can't scroll if we've hit the beginning or end.
229 ScrollDirectionPhysical dir = pressedPartScrollDirectionPhysical(); 226 ScrollDirectionPhysical dir = pressedPartScrollDirectionPhysical();
230 if (dir == ScrollUp || dir == ScrollLeft) { 227 if (dir == ScrollUp || dir == ScrollLeft) {
231 if (m_currentPos == 0) 228 if (m_currentPos == 0)
232 return; 229 return;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 { 265 {
269 if (!m_scrollableArea) 266 if (!m_scrollableArea)
270 return; 267 return;
271 268
272 int delta = pos - m_pressedPos; 269 int delta = pos - m_pressedPos;
273 270
274 if (draggingDocument) { 271 if (draggingDocument) {
275 if (m_draggingDocument) 272 if (m_draggingDocument)
276 delta = pos - m_documentDragPos; 273 delta = pos - m_documentDragPos;
277 m_draggingDocument = true; 274 m_draggingDocument = true;
278 FloatPoint currentPosition = m_scrollableArea->scrollAnimator()->current Position(); 275 FloatPoint currentPosition = m_scrollableArea->scrollAnimator().currentP osition();
279 float destinationPosition = (m_orientation == HorizontalScrollbar ? curr entPosition.x() : currentPosition.y()) + delta; 276 float destinationPosition = (m_orientation == HorizontalScrollbar ? curr entPosition.x() : currentPosition.y()) + delta;
280 destinationPosition = m_scrollableArea->clampScrollPosition(m_orientatio n, destinationPosition); 277 destinationPosition = m_scrollableArea->clampScrollPosition(m_orientatio n, destinationPosition);
281 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, destination Position, UserScroll); 278 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, destination Position, UserScroll);
282 m_documentDragPos = pos; 279 m_documentDragPos = pos;
283 return; 280 return;
284 } 281 }
285 282
286 if (m_draggingDocument) { 283 if (m_draggingDocument) {
287 delta += m_pressedPos - m_documentDragPos; 284 delta += m_pressedPos - m_documentDragPos;
288 m_draggingDocument = false; 285 m_draggingDocument = false;
289 } 286 }
290 287
291 // Drag the thumb. 288 // Drag the thumb.
292 int thumbPos = theme()->thumbPosition(this); 289 int thumbPos = theme().thumbPosition(*this);
293 int thumbLen = theme()->thumbLength(this); 290 int thumbLen = theme().thumbLength(*this);
294 int trackLen = theme()->trackLength(this); 291 int trackLen = theme().trackLength(*this);
295 ASSERT(thumbLen <= trackLen); 292 ASSERT(thumbLen <= trackLen);
296 if (thumbLen == trackLen) 293 if (thumbLen == trackLen)
297 return; 294 return;
298 295
299 if (delta > 0) 296 if (delta > 0)
300 delta = std::min(trackLen - thumbLen - thumbPos, delta); 297 delta = std::min(trackLen - thumbLen - thumbPos, delta);
301 else if (delta < 0) 298 else if (delta < 0)
302 delta = std::max(-thumbPos, delta); 299 delta = std::max(-thumbPos, delta);
303 300
304 float minPos = m_scrollableArea->minimumScrollPosition(m_orientation); 301 float minPos = m_scrollableArea->minimumScrollPosition(m_orientation);
305 float maxPos = m_scrollableArea->maximumScrollPosition(m_orientation); 302 float maxPos = m_scrollableArea->maximumScrollPosition(m_orientation);
306 if (delta) { 303 if (delta) {
307 float newPosition = static_cast<float>(thumbPos + delta) * (maxPos - min Pos) / (trackLen - thumbLen) + minPos; 304 float newPosition = static_cast<float>(thumbPos + delta) * (maxPos - min Pos) / (trackLen - thumbLen) + minPos;
308 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, newPosition , UserScroll); 305 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, newPosition , UserScroll);
309 } 306 }
310 } 307 }
311 308
312 void Scrollbar::setHoveredPart(ScrollbarPart part) 309 void Scrollbar::setHoveredPart(ScrollbarPart part)
313 { 310 {
314 if (part == m_hoveredPart) 311 if (part == m_hoveredPart)
315 return; 312 return;
316 313
317 if (((m_hoveredPart == NoPart || part == NoPart) && theme()->invalidateOnMou seEnterExit()) 314 if (((m_hoveredPart == NoPart || part == NoPart) && theme().invalidateOnMous eEnterExit())
318 // When there's a pressed part, we don't draw a hovered state, so there' s no reason to invalidate. 315 // When there's a pressed part, we don't draw a hovered state, so there' s no reason to invalidate.
319 || m_pressedPart == NoPart) 316 || m_pressedPart == NoPart)
320 setNeedsPaintInvalidation(); 317 setNeedsPaintInvalidation();
321 318
322 m_hoveredPart = part; 319 m_hoveredPart = part;
323 } 320 }
324 321
325 void Scrollbar::setPressedPart(ScrollbarPart part) 322 void Scrollbar::setPressedPart(ScrollbarPart part)
326 { 323 {
327 if (m_pressedPart != NoPart 324 if (m_pressedPart != NoPart
328 // When we no longer have a pressed part, we can start drawing a hovered state on the hovered part. 325 // When we no longer have a pressed part, we can start drawing a hovered state on the hovered part.
329 || m_hoveredPart != NoPart) 326 || m_hoveredPart != NoPart)
330 setNeedsPaintInvalidation(); 327 setNeedsPaintInvalidation();
331 m_pressedPart = part; 328 m_pressedPart = part;
332 } 329 }
333 330
334 bool Scrollbar::gestureEvent(const PlatformGestureEvent& evt) 331 bool Scrollbar::gestureEvent(const PlatformGestureEvent& evt)
335 { 332 {
336 switch (evt.type()) { 333 switch (evt.type()) {
337 case PlatformEvent::GestureTapDown: 334 case PlatformEvent::GestureTapDown:
338 setPressedPart(theme()->hitTest(this, evt.position())); 335 setPressedPart(theme().hitTest(*this, evt.position()));
339 m_pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFra me(evt.position()).x() : convertFromRootFrame(evt.position()).y(); 336 m_pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFra me(evt.position()).x() : convertFromRootFrame(evt.position()).y();
340 return true; 337 return true;
341 case PlatformEvent::GestureTapDownCancel: 338 case PlatformEvent::GestureTapDownCancel:
342 case PlatformEvent::GestureScrollBegin: 339 case PlatformEvent::GestureScrollBegin:
343 if (m_pressedPart != ThumbPart) 340 if (m_pressedPart != ThumbPart)
344 return false; 341 return false;
345 m_scrollPos = m_pressedPos; 342 m_scrollPos = m_pressedPos;
346 return true; 343 return true;
347 case PlatformEvent::GestureScrollUpdate: 344 case PlatformEvent::GestureScrollUpdate:
348 if (m_pressedPart != ThumbPart) 345 if (m_pressedPart != ThumbPart)
(...skipping 20 matching lines...) Expand all
369 } 366 }
370 default: 367 default:
371 // By default, we assume that gestures don't deselect the scrollbar. 368 // By default, we assume that gestures don't deselect the scrollbar.
372 return true; 369 return true;
373 } 370 }
374 } 371 }
375 372
376 void Scrollbar::mouseMoved(const PlatformMouseEvent& evt) 373 void Scrollbar::mouseMoved(const PlatformMouseEvent& evt)
377 { 374 {
378 if (m_pressedPart == ThumbPart) { 375 if (m_pressedPart == ThumbPart) {
379 if (theme()->shouldSnapBackToDragOrigin(this, evt)) { 376 if (theme().shouldSnapBackToDragOrigin(*this, evt)) {
380 if (m_scrollableArea) { 377 if (m_scrollableArea) {
381 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, m_d ragOrigin + m_scrollableArea->minimumScrollPosition(m_orientation), UserScroll); 378 m_scrollableArea->setScrollPositionSingleAxis(m_orientation, m_d ragOrigin + m_scrollableArea->minimumScrollPosition(m_orientation), UserScroll);
382 } 379 }
383 } else { 380 } else {
384 moveThumb(m_orientation == HorizontalScrollbar 381 moveThumb(m_orientation == HorizontalScrollbar
385 ? convertFromRootFrame(evt.position()).x() 382 ? convertFromRootFrame(evt.position()).x()
386 : convertFromRootFrame(evt.position()).y(), theme()->shouldDragD ocumentInsteadOfThumb(this, evt)); 383 : convertFromRootFrame(evt.position()).y(), theme().shouldDragDo cumentInsteadOfThumb(*this, evt));
387 } 384 }
388 return; 385 return;
389 } 386 }
390 387
391 if (m_pressedPart != NoPart) 388 if (m_pressedPart != NoPart)
392 m_pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFra me(evt.position()).x() : convertFromRootFrame(evt.position()).y(); 389 m_pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFra me(evt.position()).x() : convertFromRootFrame(evt.position()).y();
393 390
394 ScrollbarPart part = theme()->hitTest(this, evt.position()); 391 ScrollbarPart part = theme().hitTest(*this, evt.position());
395 if (part != m_hoveredPart) { 392 if (part != m_hoveredPart) {
396 if (m_pressedPart != NoPart) { 393 if (m_pressedPart != NoPart) {
397 if (part == m_pressedPart) { 394 if (part == m_pressedPart) {
398 // The mouse is moving back over the pressed part. We 395 // The mouse is moving back over the pressed part. We
399 // need to start up the timer action again. 396 // need to start up the timer action again.
400 startTimerIfNeeded(theme()->autoscrollTimerDelay()); 397 startTimerIfNeeded(theme().autoscrollTimerDelay());
401 setNeedsPaintInvalidation(); 398 setNeedsPaintInvalidation();
402 } else if (m_hoveredPart == m_pressedPart) { 399 } else if (m_hoveredPart == m_pressedPart) {
403 // The mouse is leaving the pressed part. Kill our timer 400 // The mouse is leaving the pressed part. Kill our timer
404 // if needed. 401 // if needed.
405 stopTimerIfNeeded(); 402 stopTimerIfNeeded();
406 setNeedsPaintInvalidation(); 403 setNeedsPaintInvalidation();
407 } 404 }
408 } 405 }
409 406
410 setHoveredPart(part); 407 setHoveredPart(part);
411 } 408 }
412 409
413 return; 410 return;
414 } 411 }
415 412
416 void Scrollbar::mouseEntered() 413 void Scrollbar::mouseEntered()
417 { 414 {
418 if (m_scrollableArea) 415 if (m_scrollableArea)
419 m_scrollableArea->mouseEnteredScrollbar(this); 416 m_scrollableArea->mouseEnteredScrollbar(*this);
420 } 417 }
421 418
422 void Scrollbar::mouseExited() 419 void Scrollbar::mouseExited()
423 { 420 {
424 if (m_scrollableArea) 421 if (m_scrollableArea)
425 m_scrollableArea->mouseExitedScrollbar(this); 422 m_scrollableArea->mouseExitedScrollbar(*this);
426 setHoveredPart(NoPart); 423 setHoveredPart(NoPart);
427 } 424 }
428 425
429 void Scrollbar::mouseUp(const PlatformMouseEvent& mouseEvent) 426 void Scrollbar::mouseUp(const PlatformMouseEvent& mouseEvent)
430 { 427 {
431 setPressedPart(NoPart); 428 setPressedPart(NoPart);
432 m_pressedPos = 0; 429 m_pressedPos = 0;
433 m_draggingDocument = false; 430 m_draggingDocument = false;
434 stopTimerIfNeeded(); 431 stopTimerIfNeeded();
435 432
436 if (m_scrollableArea) { 433 if (m_scrollableArea) {
437 // m_hoveredPart won't be updated until the next mouseMoved or mouseDown , so we have to hit test 434 // m_hoveredPart won't be updated until the next mouseMoved or mouseDown , so we have to hit test
438 // to really know if the mouse has exited the scrollbar on a mouseUp. 435 // to really know if the mouse has exited the scrollbar on a mouseUp.
439 ScrollbarPart part = theme()->hitTest(this, mouseEvent.position()); 436 ScrollbarPart part = theme().hitTest(*this, mouseEvent.position());
440 if (part == NoPart) 437 if (part == NoPart)
441 m_scrollableArea->mouseExitedScrollbar(this); 438 m_scrollableArea->mouseExitedScrollbar(*this);
442 } 439 }
443 } 440 }
444 441
445 void Scrollbar::mouseDown(const PlatformMouseEvent& evt) 442 void Scrollbar::mouseDown(const PlatformMouseEvent& evt)
446 { 443 {
447 // Early exit for right click 444 // Early exit for right click
448 if (evt.button() == RightButton) 445 if (evt.button() == RightButton)
449 return; 446 return;
450 447
451 setPressedPart(theme()->hitTest(this, evt.position())); 448 setPressedPart(theme().hitTest(*this, evt.position()));
452 int pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFrame (evt.position()).x() : convertFromRootFrame(evt.position()).y(); 449 int pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFrame (evt.position()).x() : convertFromRootFrame(evt.position()).y();
453 450
454 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && theme()->shouldCenterOnThumb(this, evt)) { 451 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && theme().shouldCenterOnThumb(*this, evt)) {
455 setHoveredPart(ThumbPart); 452 setHoveredPart(ThumbPart);
456 setPressedPart(ThumbPart); 453 setPressedPart(ThumbPart);
457 m_dragOrigin = m_currentPos; 454 m_dragOrigin = m_currentPos;
458 int thumbLen = theme()->thumbLength(this); 455 int thumbLen = theme().thumbLength(*this);
459 int desiredPos = pressedPos; 456 int desiredPos = pressedPos;
460 // Set the pressed position to the middle of the thumb so that when we d o the move, the delta 457 // Set the pressed position to the middle of the thumb so that when we d o the move, the delta
461 // will be from the current pixel position of the thumb to the new desir ed position for the thumb. 458 // will be from the current pixel position of the thumb to the new desir ed position for the thumb.
462 m_pressedPos = theme()->trackPosition(this) + theme()->thumbPosition(thi s) + thumbLen / 2; 459 m_pressedPos = theme().trackPosition(*this) + theme().thumbPosition(*thi s) + thumbLen / 2;
463 moveThumb(desiredPos); 460 moveThumb(desiredPos);
464 return; 461 return;
465 } else if (m_pressedPart == ThumbPart) 462 }
463 if (m_pressedPart == ThumbPart)
466 m_dragOrigin = m_currentPos; 464 m_dragOrigin = m_currentPos;
467 465
468 m_pressedPos = pressedPos; 466 m_pressedPos = pressedPos;
469 467
470 autoscrollPressedPart(theme()->initialAutoscrollTimerDelay()); 468 autoscrollPressedPart(theme().initialAutoscrollTimerDelay());
471 } 469 }
472 470
473 void Scrollbar::visibilityChanged() 471 void Scrollbar::visibilityChanged()
474 { 472 {
475 if (m_scrollableArea) 473 if (m_scrollableArea)
476 m_scrollableArea->scrollbarVisibilityChanged(); 474 m_scrollableArea->scrollbarVisibilityChanged();
477 } 475 }
478 476
479 void Scrollbar::setEnabled(bool e) 477 void Scrollbar::setEnabled(bool e)
480 { 478 {
481 if (m_enabled == e) 479 if (m_enabled == e)
482 return; 480 return;
483 m_enabled = e; 481 m_enabled = e;
484 theme()->updateEnabledState(this); 482 theme().updateEnabledState(*this);
485 setNeedsPaintInvalidation(); 483 setNeedsPaintInvalidation();
486 } 484 }
487 485
488 bool Scrollbar::isOverlayScrollbar() const 486 bool Scrollbar::isOverlayScrollbar() const
489 { 487 {
490 return m_theme->usesOverlayScrollbars(); 488 return m_theme.usesOverlayScrollbars();
491 } 489 }
492 490
493 bool Scrollbar::shouldParticipateInHitTesting() 491 bool Scrollbar::shouldParticipateInHitTesting()
494 { 492 {
495 // Non-overlay scrollbars should always participate in hit testing. 493 // Non-overlay scrollbars should always participate in hit testing.
496 if (!isOverlayScrollbar()) 494 if (!isOverlayScrollbar())
497 return true; 495 return true;
498 return m_scrollableArea->scrollAnimator()->shouldScrollbarParticipateInHitTe sting(this); 496 return m_scrollableArea->scrollAnimator().shouldScrollbarParticipateInHitTes ting(*this);
499 } 497 }
500 498
501 // Don't use this method. It will be removed later. 499 // Don't use this method. It will be removed later.
502 // TODO(ellyjones): remove this method after Snow Leopard support drops. 500 // TODO(ellyjones): remove this method after Snow Leopard support drops.
503 void Scrollbar::windowActiveChangedForSnowLeopardOnly() 501 void Scrollbar::windowActiveChangedForSnowLeopardOnly()
504 { 502 {
505 #if OS(MACOSX) 503 #if OS(MACOSX)
506 // On Snow Leopard, scrollbars need to be invalidated when the window 504 // On Snow Leopard, scrollbars need to be invalidated when the window
507 // activity changes so that they take on the "inactive" scrollbar 505 // activity changes so that they take on the "inactive" scrollbar
508 // appearance. Later OS X releases do not have such an appearance. 506 // appearance. Later OS X releases do not have such an appearance.
509 if (m_theme && m_theme->invalidateOnWindowActiveChange()) { 507 if (m_theme.invalidateOnWindowActiveChange()) {
510 ASSERT(IsOSSnowLeopard()); 508 ASSERT(IsOSSnowLeopard());
511 invalidate(); 509 invalidate();
512 } 510 }
513 #endif 511 #endif
514 } 512 }
515 513
516 bool Scrollbar::isWindowActive() const 514 bool Scrollbar::isWindowActive() const
517 { 515 {
518 return m_scrollableArea && m_scrollableArea->isActive(); 516 return m_scrollableArea && m_scrollableArea->isActive();
519 } 517 }
520 518
521 IntRect Scrollbar::convertToContainingWidget(const IntRect& localRect) const 519 IntRect Scrollbar::convertToContainingWidget(const IntRect& localRect) const
522 { 520 {
523 if (m_scrollableArea) 521 if (m_scrollableArea)
524 return m_scrollableArea->convertFromScrollbarToContainingWidget(this, lo calRect); 522 return m_scrollableArea->convertFromScrollbarToContainingWidget(*this, l ocalRect);
525 523
526 return Widget::convertToContainingWidget(localRect); 524 return Widget::convertToContainingWidget(localRect);
527 } 525 }
528 526
529 IntRect Scrollbar::convertFromContainingWidget(const IntRect& parentRect) const 527 IntRect Scrollbar::convertFromContainingWidget(const IntRect& parentRect) const
530 { 528 {
531 if (m_scrollableArea) 529 if (m_scrollableArea)
532 return m_scrollableArea->convertFromContainingWidgetToScrollbar(this, pa rentRect); 530 return m_scrollableArea->convertFromContainingWidgetToScrollbar(*this, p arentRect);
533 531
534 return Widget::convertFromContainingWidget(parentRect); 532 return Widget::convertFromContainingWidget(parentRect);
535 } 533 }
536 534
537 IntPoint Scrollbar::convertToContainingWidget(const IntPoint& localPoint) const 535 IntPoint Scrollbar::convertToContainingWidget(const IntPoint& localPoint) const
538 { 536 {
539 if (m_scrollableArea) 537 if (m_scrollableArea)
540 return m_scrollableArea->convertFromScrollbarToContainingWidget(this, lo calPoint); 538 return m_scrollableArea->convertFromScrollbarToContainingWidget(*this, l ocalPoint);
541 539
542 return Widget::convertToContainingWidget(localPoint); 540 return Widget::convertToContainingWidget(localPoint);
543 } 541 }
544 542
545 IntPoint Scrollbar::convertFromContainingWidget(const IntPoint& parentPoint) con st 543 IntPoint Scrollbar::convertFromContainingWidget(const IntPoint& parentPoint) con st
546 { 544 {
547 if (m_scrollableArea) 545 if (m_scrollableArea)
548 return m_scrollableArea->convertFromContainingWidgetToScrollbar(this, pa rentPoint); 546 return m_scrollableArea->convertFromContainingWidgetToScrollbar(*this, p arentPoint);
549 547
550 return Widget::convertFromContainingWidget(parentPoint); 548 return Widget::convertFromContainingWidget(parentPoint);
551 } 549 }
552 550
553 float Scrollbar::scrollableAreaCurrentPos() const 551 float Scrollbar::scrollableAreaCurrentPos() const
554 { 552 {
555 if (!m_scrollableArea) 553 if (!m_scrollableArea)
556 return 0; 554 return 0;
557 555
558 if (m_orientation == HorizontalScrollbar) 556 if (m_orientation == HorizontalScrollbar)
559 return m_scrollableArea->scrollPosition().x() - m_scrollableArea->minimu mScrollPosition().x(); 557 return m_scrollableArea->scrollPosition().x() - m_scrollableArea->minimu mScrollPosition().x();
560 558
561 return m_scrollableArea->scrollPosition().y() - m_scrollableArea->minimumScr ollPosition().y(); 559 return m_scrollableArea->scrollPosition().y() - m_scrollableArea->minimumScr ollPosition().y();
562 } 560 }
563 561
564 void Scrollbar::setNeedsPaintInvalidation() 562 void Scrollbar::setNeedsPaintInvalidation()
565 { 563 {
566 if (m_theme->shouldRepaintAllPartsOnInvalidation()) { 564 if (m_theme.shouldRepaintAllPartsOnInvalidation()) {
567 m_trackNeedsRepaint = true; 565 m_trackNeedsRepaint = true;
568 m_thumbNeedsRepaint = true; 566 m_thumbNeedsRepaint = true;
569 } 567 }
570 if (m_scrollableArea) 568 if (m_scrollableArea)
571 m_scrollableArea->setScrollbarNeedsPaintInvalidation(this); 569 m_scrollableArea->setScrollbarNeedsPaintInvalidation(orientation());
572 } 570 }
573 571
574 } // namespace blink 572 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/scroll/Scrollbar.h ('k') | third_party/WebKit/Source/platform/scroll/ScrollbarTheme.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698