| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010, Google Inc. All rights reserved. | 2 * Copyright (c) 2010, Google Inc. All rights reserved. |
| 3 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved. | 3 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "core/platform/ScrollableArea.h" | 33 #include "core/platform/ScrollableArea.h" |
| 34 | 34 |
| 35 #include "core/platform/ScrollAnimator.h" | 35 #include "core/platform/ScrollAnimator.h" |
| 36 #include "core/platform/ScrollbarTheme.h" | 36 #include "core/platform/ScrollbarTheme.h" |
| 37 #include "core/platform/graphics/FloatPoint.h" | 37 #include "core/platform/graphics/FloatPoint.h" |
| 38 #include "core/platform/graphics/GraphicsLayer.h" | 38 #include "core/platform/graphics/GraphicsLayer.h" |
| 39 #include "wtf/PassOwnPtr.h" | 39 #include "wtf/PassOwnPtr.h" |
| 40 | 40 |
| 41 #include "core/platform/chromium/TraceEvent.h" | 41 #include "core/platform/chromium/TraceEvent.h" |
| 42 | 42 |
| 43 static const int kPixelsPerLineStep = 40; |
| 44 static const float kMinFractionToStepWhenPaging = 0.875f; |
| 45 |
| 43 namespace WebCore { | 46 namespace WebCore { |
| 44 | 47 |
| 45 struct SameSizeAsScrollableArea { | 48 struct SameSizeAsScrollableArea { |
| 46 virtual ~SameSizeAsScrollableArea(); | 49 virtual ~SameSizeAsScrollableArea(); |
| 47 void* pointer; | 50 void* pointer; |
| 48 unsigned bitfields : 16; | 51 unsigned bitfields : 16; |
| 49 IntPoint origin; | 52 IntPoint origin; |
| 50 }; | 53 }; |
| 51 | 54 |
| 52 COMPILE_ASSERT(sizeof(ScrollableArea) == sizeof(SameSizeAsScrollableArea), Scrol
lableArea_should_stay_small); | 55 COMPILE_ASSERT(sizeof(ScrollableArea) == sizeof(SameSizeAsScrollableArea), Scrol
lableArea_should_stay_small); |
| 53 | 56 |
| 57 int ScrollableArea::pixelsPerLineStep() |
| 58 { |
| 59 return kPixelsPerLineStep; |
| 60 } |
| 61 |
| 62 float ScrollableArea::minFractionToStepWhenPaging() |
| 63 { |
| 64 return kMinFractionToStepWhenPaging; |
| 65 } |
| 66 |
| 67 int ScrollableArea::maxOverlapBetweenPages() |
| 68 { |
| 69 static int maxOverlapBetweenPages = ScrollbarTheme::theme()->maxOverlapBetwe
enPages(); |
| 70 return maxOverlapBetweenPages; |
| 71 } |
| 72 |
| 54 ScrollableArea::ScrollableArea() | 73 ScrollableArea::ScrollableArea() |
| 55 : m_constrainsScrollingToContentEdge(true) | 74 : m_constrainsScrollingToContentEdge(true) |
| 56 , m_inLiveResize(false) | 75 , m_inLiveResize(false) |
| 57 , m_verticalScrollElasticity(ScrollElasticityNone) | 76 , m_verticalScrollElasticity(ScrollElasticityNone) |
| 58 , m_horizontalScrollElasticity(ScrollElasticityNone) | 77 , m_horizontalScrollElasticity(ScrollElasticityNone) |
| 59 , m_scrollbarOverlayStyle(ScrollbarOverlayStyleDefault) | 78 , m_scrollbarOverlayStyle(ScrollbarOverlayStyleDefault) |
| 60 , m_scrollOriginChanged(false) | 79 , m_scrollOriginChanged(false) |
| 61 { | 80 { |
| 62 } | 81 } |
| 63 | 82 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 77 { | 96 { |
| 78 if (m_scrollOrigin != origin) { | 97 if (m_scrollOrigin != origin) { |
| 79 m_scrollOrigin = origin; | 98 m_scrollOrigin = origin; |
| 80 m_scrollOriginChanged = true; | 99 m_scrollOriginChanged = true; |
| 81 } | 100 } |
| 82 } | 101 } |
| 83 | 102 |
| 84 bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
rity, float multiplier) | 103 bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granula
rity, float multiplier) |
| 85 { | 104 { |
| 86 ScrollbarOrientation orientation; | 105 ScrollbarOrientation orientation; |
| 87 Scrollbar* scrollbar; | 106 |
| 88 if (direction == ScrollUp || direction == ScrollDown) { | 107 if (direction == ScrollUp || direction == ScrollDown) |
| 89 orientation = VerticalScrollbar; | 108 orientation = VerticalScrollbar; |
| 90 scrollbar = verticalScrollbar(); | 109 else |
| 91 } else { | |
| 92 orientation = HorizontalScrollbar; | 110 orientation = HorizontalScrollbar; |
| 93 scrollbar = horizontalScrollbar(); | |
| 94 } | |
| 95 | 111 |
| 96 if (!scrollbar) | 112 if (!userInputScrollable(orientation)) |
| 97 return false; | 113 return false; |
| 98 | 114 |
| 99 float step = 0; | 115 float step = 0; |
| 100 switch (granularity) { | 116 switch (granularity) { |
| 101 case ScrollByLine: | 117 case ScrollByLine: |
| 102 step = scrollbar->lineStep(); | 118 step = lineStep(orientation); |
| 103 break; | 119 break; |
| 104 case ScrollByPage: | 120 case ScrollByPage: |
| 105 step = scrollbar->pageStep(); | 121 step = pageStep(orientation); |
| 106 break; | 122 break; |
| 107 case ScrollByDocument: | 123 case ScrollByDocument: |
| 108 step = scrollbar->totalSize(); | 124 step = documentStep(orientation); |
| 109 break; | 125 break; |
| 110 case ScrollByPixel: | 126 case ScrollByPixel: |
| 111 case ScrollByPrecisePixel: | 127 case ScrollByPrecisePixel: |
| 112 step = scrollbar->pixelStep(); | 128 step = pixelStep(orientation); |
| 113 break; | 129 break; |
| 114 } | 130 } |
| 115 | 131 |
| 116 if (direction == ScrollUp || direction == ScrollLeft) | 132 if (direction == ScrollUp || direction == ScrollLeft) |
| 117 multiplier = -multiplier; | 133 multiplier = -multiplier; |
| 118 | 134 |
| 119 return scrollAnimator()->scroll(orientation, granularity, step, multiplier); | 135 return scrollAnimator()->scroll(orientation, granularity, step, multiplier); |
| 120 } | 136 } |
| 121 | 137 |
| 122 void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset) | 138 void ScrollableArea::scrollToOffsetWithoutAnimation(const FloatPoint& offset) |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 { | 372 { |
| 357 return layerForScrollCorner(); | 373 return layerForScrollCorner(); |
| 358 } | 374 } |
| 359 | 375 |
| 360 void ScrollableArea::serviceScrollAnimations() | 376 void ScrollableArea::serviceScrollAnimations() |
| 361 { | 377 { |
| 362 if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) | 378 if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) |
| 363 scrollAnimator->serviceScrollAnimations(); | 379 scrollAnimator->serviceScrollAnimations(); |
| 364 } | 380 } |
| 365 | 381 |
| 366 IntPoint ScrollableArea::scrollPosition() const | |
| 367 { | |
| 368 int x = horizontalScrollbar() ? horizontalScrollbar()->value() : 0; | |
| 369 int y = verticalScrollbar() ? verticalScrollbar()->value() : 0; | |
| 370 return IntPoint(x, y); | |
| 371 } | |
| 372 | |
| 373 IntPoint ScrollableArea::minimumScrollPosition() const | |
| 374 { | |
| 375 return IntPoint(); | |
| 376 } | |
| 377 | |
| 378 IntPoint ScrollableArea::maximumScrollPosition() const | |
| 379 { | |
| 380 return IntPoint(contentsSize().width() - visibleWidth(), contentsSize().heig
ht() - visibleHeight()); | |
| 381 } | |
| 382 | |
| 383 IntRect ScrollableArea::visibleContentRect(VisibleContentRectIncludesScrollbars
scrollbarInclusion) const | 382 IntRect ScrollableArea::visibleContentRect(VisibleContentRectIncludesScrollbars
scrollbarInclusion) const |
| 384 { | 383 { |
| 385 int verticalScrollbarWidth = 0; | 384 int verticalScrollbarWidth = 0; |
| 386 int horizontalScrollbarHeight = 0; | 385 int horizontalScrollbarHeight = 0; |
| 387 | 386 |
| 388 if (scrollbarInclusion == IncludeScrollbars) { | 387 if (scrollbarInclusion == IncludeScrollbars) { |
| 389 if (Scrollbar* verticalBar = verticalScrollbar()) | 388 if (Scrollbar* verticalBar = verticalScrollbar()) |
| 390 verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? vertic
alBar->width() : 0; | 389 verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? vertic
alBar->width() : 0; |
| 391 if (Scrollbar* horizontalBar = horizontalScrollbar()) | 390 if (Scrollbar* horizontalBar = horizontalScrollbar()) |
| 392 horizontalScrollbarHeight = !horizontalBar->isOverlayScrollbar() ? h
orizontalBar->height() : 0; | 391 horizontalScrollbarHeight = !horizontalBar->isOverlayScrollbar() ? h
orizontalBar->height() : 0; |
| 393 } | 392 } |
| 394 | 393 |
| 395 return IntRect(scrollPosition().x(), | 394 return IntRect(scrollPosition().x(), |
| 396 scrollPosition().y(), | 395 scrollPosition().y(), |
| 397 std::max(0, visibleWidth() + verticalScrollbarWidth), | 396 std::max(0, visibleWidth() + verticalScrollbarWidth), |
| 398 std::max(0, visibleHeight() + horizontalScrollbarHeight)); | 397 std::max(0, visibleHeight() + horizontalScrollbarHeight)); |
| 399 } | 398 } |
| 400 | 399 |
| 401 IntPoint ScrollableArea::clampScrollPosition(const IntPoint& scrollPosition) con
st | 400 IntPoint ScrollableArea::clampScrollPosition(const IntPoint& scrollPosition) con
st |
| 402 { | 401 { |
| 403 return scrollPosition.shrunkTo(maximumScrollPosition()).expandedTo(minimumSc
rollPosition()); | 402 return scrollPosition.shrunkTo(maximumScrollPosition()).expandedTo(minimumSc
rollPosition()); |
| 404 } | 403 } |
| 405 | 404 |
| 405 int ScrollableArea::lineStep(ScrollbarOrientation) const |
| 406 { |
| 407 return pixelsPerLineStep(); |
| 408 } |
| 409 |
| 410 int ScrollableArea::documentStep(ScrollbarOrientation orientation) const |
| 411 { |
| 412 return scrollSize(orientation); |
| 413 } |
| 414 |
| 415 float ScrollableArea::pixelStep(ScrollbarOrientation) const |
| 416 { |
| 417 return 1; |
| 418 } |
| 419 |
| 406 } // namespace WebCore | 420 } // namespace WebCore |
| OLD | NEW |