OLD | NEW |
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 |
11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
12 * | 12 * |
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
25 | 25 |
26 #include "platform/scroll/Scrollbar.h" | 26 #include "platform/scroll/Scrollbar.h" |
27 | 27 |
28 #include <algorithm> | 28 #include <algorithm> |
29 #include "platform/HostWindow.h" | 29 #include "platform/HostWindow.h" |
30 #include "platform/PlatformMouseEvent.h" | |
31 #include "platform/geometry/FloatRect.h" | 30 #include "platform/geometry/FloatRect.h" |
32 #include "platform/graphics/paint/CullRect.h" | 31 #include "platform/graphics/paint/CullRect.h" |
33 #include "platform/scroll/ScrollAnimatorBase.h" | 32 #include "platform/scroll/ScrollAnimatorBase.h" |
34 #include "platform/scroll/ScrollableArea.h" | 33 #include "platform/scroll/ScrollableArea.h" |
35 #include "platform/scroll/ScrollbarTheme.h" | 34 #include "platform/scroll/ScrollbarTheme.h" |
36 #include "public/platform/WebGestureEvent.h" | 35 #include "public/platform/WebGestureEvent.h" |
| 36 #include "public/platform/WebMouseEvent.h" |
37 | 37 |
38 namespace blink { | 38 namespace blink { |
39 | 39 |
40 Scrollbar::Scrollbar(ScrollableArea* scrollableArea, | 40 Scrollbar::Scrollbar(ScrollableArea* scrollableArea, |
41 ScrollbarOrientation orientation, | 41 ScrollbarOrientation orientation, |
42 ScrollbarControlSize controlSize, | 42 ScrollbarControlSize controlSize, |
43 HostWindow* hostWindow, | 43 HostWindow* hostWindow, |
44 ScrollbarTheme* theme) | 44 ScrollbarTheme* theme) |
45 : m_scrollableArea(scrollableArea), | 45 : m_scrollableArea(scrollableArea), |
46 m_orientation(orientation), | 46 m_orientation(orientation), |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 m_pressedPos = 0; | 411 m_pressedPos = 0; |
412 setPressedPart(NoPart); | 412 setPressedPart(NoPart); |
413 return false; | 413 return false; |
414 } | 414 } |
415 default: | 415 default: |
416 // By default, we assume that gestures don't deselect the scrollbar. | 416 // By default, we assume that gestures don't deselect the scrollbar. |
417 return true; | 417 return true; |
418 } | 418 } |
419 } | 419 } |
420 | 420 |
421 void Scrollbar::mouseMoved(const PlatformMouseEvent& evt) { | 421 void Scrollbar::mouseMoved(const WebMouseEvent& evt) { |
| 422 IntPoint position = flooredIntPoint(evt.positionInRootFrame()); |
422 if (m_pressedPart == ThumbPart) { | 423 if (m_pressedPart == ThumbPart) { |
423 if (theme().shouldSnapBackToDragOrigin(*this, evt)) { | 424 if (theme().shouldSnapBackToDragOrigin(*this, evt)) { |
424 if (m_scrollableArea) { | 425 if (m_scrollableArea) { |
425 m_scrollableArea->setScrollOffsetSingleAxis( | 426 m_scrollableArea->setScrollOffsetSingleAxis( |
426 m_orientation, | 427 m_orientation, |
427 m_dragOrigin + m_scrollableArea->minimumScrollOffset(m_orientation), | 428 m_dragOrigin + m_scrollableArea->minimumScrollOffset(m_orientation), |
428 UserScroll); | 429 UserScroll); |
429 } | 430 } |
430 } else { | 431 } else { |
431 moveThumb(m_orientation == HorizontalScrollbar | 432 moveThumb(m_orientation == HorizontalScrollbar |
432 ? convertFromRootFrame(evt.position()).x() | 433 ? convertFromRootFrame(position).x() |
433 : convertFromRootFrame(evt.position()).y(), | 434 : convertFromRootFrame(position).y(), |
434 theme().shouldDragDocumentInsteadOfThumb(*this, evt)); | 435 theme().shouldDragDocumentInsteadOfThumb(*this, evt)); |
435 } | 436 } |
436 return; | 437 return; |
437 } | 438 } |
438 | 439 |
439 if (m_pressedPart != NoPart) | 440 if (m_pressedPart != NoPart) { |
440 m_pressedPos = orientation() == HorizontalScrollbar | 441 m_pressedPos = orientation() == HorizontalScrollbar |
441 ? convertFromRootFrame(evt.position()).x() | 442 ? convertFromRootFrame(position).x() |
442 : convertFromRootFrame(evt.position()).y(); | 443 : convertFromRootFrame(position).y(); |
| 444 } |
443 | 445 |
444 ScrollbarPart part = theme().hitTest(*this, evt.position()); | 446 ScrollbarPart part = theme().hitTest(*this, position); |
445 if (part != m_hoveredPart) { | 447 if (part != m_hoveredPart) { |
446 if (m_pressedPart != NoPart) { | 448 if (m_pressedPart != NoPart) { |
447 if (part == m_pressedPart) { | 449 if (part == m_pressedPart) { |
448 // The mouse is moving back over the pressed part. We | 450 // The mouse is moving back over the pressed part. We |
449 // need to start up the timer action again. | 451 // need to start up the timer action again. |
450 startTimerIfNeeded(theme().autoscrollTimerDelay()); | 452 startTimerIfNeeded(theme().autoscrollTimerDelay()); |
451 } else if (m_hoveredPart == m_pressedPart) { | 453 } else if (m_hoveredPart == m_pressedPart) { |
452 // The mouse is leaving the pressed part. Kill our timer | 454 // The mouse is leaving the pressed part. Kill our timer |
453 // if needed. | 455 // if needed. |
454 stopTimerIfNeeded(); | 456 stopTimerIfNeeded(); |
(...skipping 10 matching lines...) Expand all Loading... |
465 if (m_scrollableArea) | 467 if (m_scrollableArea) |
466 m_scrollableArea->mouseEnteredScrollbar(*this); | 468 m_scrollableArea->mouseEnteredScrollbar(*this); |
467 } | 469 } |
468 | 470 |
469 void Scrollbar::mouseExited() { | 471 void Scrollbar::mouseExited() { |
470 if (m_scrollableArea) | 472 if (m_scrollableArea) |
471 m_scrollableArea->mouseExitedScrollbar(*this); | 473 m_scrollableArea->mouseExitedScrollbar(*this); |
472 setHoveredPart(NoPart); | 474 setHoveredPart(NoPart); |
473 } | 475 } |
474 | 476 |
475 void Scrollbar::mouseUp(const PlatformMouseEvent& mouseEvent) { | 477 void Scrollbar::mouseUp(const WebMouseEvent& mouseEvent) { |
476 bool isCaptured = m_pressedPart == ThumbPart; | 478 bool isCaptured = m_pressedPart == ThumbPart; |
477 setPressedPart(NoPart); | 479 setPressedPart(NoPart); |
478 m_pressedPos = 0; | 480 m_pressedPos = 0; |
479 m_draggingDocument = false; | 481 m_draggingDocument = false; |
480 stopTimerIfNeeded(); | 482 stopTimerIfNeeded(); |
481 | 483 |
482 if (m_scrollableArea) { | 484 if (m_scrollableArea) { |
483 if (isCaptured) | 485 if (isCaptured) |
484 m_scrollableArea->mouseReleasedScrollbar(); | 486 m_scrollableArea->mouseReleasedScrollbar(); |
485 | 487 |
486 ScrollbarPart part = theme().hitTest(*this, mouseEvent.position()); | 488 ScrollbarPart part = theme().hitTest( |
| 489 *this, flooredIntPoint(mouseEvent.positionInRootFrame())); |
487 if (part == NoPart) { | 490 if (part == NoPart) { |
488 setHoveredPart(NoPart); | 491 setHoveredPart(NoPart); |
489 m_scrollableArea->mouseExitedScrollbar(*this); | 492 m_scrollableArea->mouseExitedScrollbar(*this); |
490 } | 493 } |
491 } | 494 } |
492 } | 495 } |
493 | 496 |
494 void Scrollbar::mouseDown(const PlatformMouseEvent& evt) { | 497 void Scrollbar::mouseDown(const WebMouseEvent& evt) { |
495 // Early exit for right click | 498 // Early exit for right click |
496 if (evt.pointerProperties().button == WebPointerProperties::Button::Right) | 499 if (evt.button == WebPointerProperties::Button::Right) |
497 return; | 500 return; |
498 | 501 |
499 setPressedPart(theme().hitTest(*this, evt.position())); | 502 IntPoint position = flooredIntPoint(evt.positionInRootFrame()); |
| 503 setPressedPart(theme().hitTest(*this, position)); |
500 int pressedPos = orientation() == HorizontalScrollbar | 504 int pressedPos = orientation() == HorizontalScrollbar |
501 ? convertFromRootFrame(evt.position()).x() | 505 ? convertFromRootFrame(position).x() |
502 : convertFromRootFrame(evt.position()).y(); | 506 : convertFromRootFrame(position).y(); |
503 | 507 |
504 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && | 508 if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && |
505 theme().shouldCenterOnThumb(*this, evt)) { | 509 theme().shouldCenterOnThumb(*this, evt)) { |
506 setHoveredPart(ThumbPart); | 510 setHoveredPart(ThumbPart); |
507 setPressedPart(ThumbPart); | 511 setPressedPart(ThumbPart); |
508 m_dragOrigin = m_currentPos; | 512 m_dragOrigin = m_currentPos; |
509 int thumbLen = theme().thumbLength(*this); | 513 int thumbLen = theme().thumbLength(*this); |
510 int desiredPos = pressedPos; | 514 int desiredPos = pressedPos; |
511 // Set the pressed position to the middle of the thumb so that when we do | 515 // Set the pressed position to the middle of the thumb so that when we do |
512 // the move, the delta will be from the current pixel position of the thumb | 516 // the move, the delta will be from the current pixel position of the thumb |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 invalidParts = AllParts; | 639 invalidParts = AllParts; |
636 if (invalidParts & ~ThumbPart) | 640 if (invalidParts & ~ThumbPart) |
637 m_trackNeedsRepaint = true; | 641 m_trackNeedsRepaint = true; |
638 if (invalidParts & ThumbPart) | 642 if (invalidParts & ThumbPart) |
639 m_thumbNeedsRepaint = true; | 643 m_thumbNeedsRepaint = true; |
640 if (m_scrollableArea) | 644 if (m_scrollableArea) |
641 m_scrollableArea->setScrollbarNeedsPaintInvalidation(orientation()); | 645 m_scrollableArea->setScrollbarNeedsPaintInvalidation(orientation()); |
642 } | 646 } |
643 | 647 |
644 } // namespace blink | 648 } // namespace blink |
OLD | NEW |