diff options
author | Shimeng (Simon) Wang <swang@google.com> | 2010-12-07 17:22:45 -0800 |
---|---|---|
committer | Shimeng (Simon) Wang <swang@google.com> | 2010-12-22 14:15:40 -0800 |
commit | 4576aa36e9a9671459299c7963ac95aa94beaea9 (patch) | |
tree | 3863574e050f168c0126ecb47c83319fab0972d8 /WebCore/platform/ScrollView.cpp | |
parent | 55323ac613cc31553107b68603cb627264d22bb0 (diff) | |
download | external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.zip external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.tar.gz external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.tar.bz2 |
Merge WebKit at r73109: Initial merge by git.
Change-Id: I61f1a66d9642e3d8405d3ac6ccab2a53421c75d8
Diffstat (limited to 'WebCore/platform/ScrollView.cpp')
-rw-r--r-- | WebCore/platform/ScrollView.cpp | 68 |
1 files changed, 55 insertions, 13 deletions
diff --git a/WebCore/platform/ScrollView.cpp b/WebCore/platform/ScrollView.cpp index 4a9d479..d6184e9 100644 --- a/WebCore/platform/ScrollView.cpp +++ b/WebCore/platform/ScrollView.cpp @@ -53,6 +53,7 @@ ScrollView::ScrollView() , m_drawPanScrollIcon(false) , m_useFixedLayout(false) , m_paintsEntireContents(false) + , m_delegatesScrolling(false) { platformInit(); } @@ -201,6 +202,11 @@ void ScrollView::setPaintsEntireContents(bool paintsEntireContents) m_paintsEntireContents = paintsEntireContents; } +void ScrollView::setDelegatesScrolling(bool delegatesScrolling) +{ + m_delegatesScrolling = delegatesScrolling; +} + #if !PLATFORM(GTK) IntRect ScrollView::visibleContentRect(bool includeScrollbars) const { @@ -302,9 +308,21 @@ int ScrollView::actualScrollY() const IntPoint ScrollView::maximumScrollPosition() const { - IntSize maximumOffset = contentsSize() - visibleContentRect().size(); + IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOrigin.x(), contentsHeight() - visibleHeight() - m_scrollOrigin.y()); maximumOffset.clampNegativeToZero(); - return IntPoint(maximumOffset.width(), maximumOffset.height()); + return maximumOffset; +} + +IntPoint ScrollView::minimumScrollPosition() const +{ + return IntPoint(-m_scrollOrigin.x(), -m_scrollOrigin.y()); +} + +IntPoint ScrollView::adjustScrollPositionWithinRange(const IntPoint& scrollPoint) const +{ + IntPoint newScrollPosition = scrollPoint.shrunkTo(maximumScrollPosition()); + newScrollPosition = newScrollPosition.expandedTo(minimumScrollPosition()); + return newScrollPosition; } int ScrollView::scrollSize(ScrollbarOrientation orientation) const @@ -327,9 +345,9 @@ void ScrollView::valueChanged(Scrollbar* scrollbar) IntSize newOffset = m_scrollOffset; if (scrollbar) { if (scrollbar->orientation() == HorizontalScrollbar) - newOffset.setWidth(scrollbar->value()); + newOffset.setWidth(scrollbar->value() - m_scrollOrigin.x()); else if (scrollbar->orientation() == VerticalScrollbar) - newOffset.setHeight(scrollbar->value()); + newOffset.setHeight(scrollbar->value() - m_scrollOrigin.y()); } IntSize scrollDelta = newOffset - m_scrollOffset; @@ -372,8 +390,7 @@ void ScrollView::setScrollPosition(const IntPoint& scrollPoint) } #endif - IntPoint newScrollPosition = scrollPoint.shrunkTo(maximumScrollPosition()); - newScrollPosition.clampNegativeToZero(); + IntPoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint); if (newScrollPosition == scrollPosition()) return; @@ -464,11 +481,15 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) newHasHorizontalScrollbar = false; if (hasHorizontalScrollbar != newHasHorizontalScrollbar) { + if (m_scrollOrigin.y() && !newHasHorizontalScrollbar) + m_scrollOrigin.setY(m_scrollOrigin.y() - m_horizontalScrollbar->height()); setHasHorizontalScrollbar(newHasHorizontalScrollbar); sendContentResizedNotification = true; } if (hasVerticalScrollbar != newHasVerticalScrollbar) { + if (m_scrollOrigin.x() && !newHasVerticalScrollbar) + m_scrollOrigin.setX(m_scrollOrigin.x() - m_verticalScrollbar->width()); setHasVerticalScrollbar(newHasVerticalScrollbar); sendContentResizedNotification = true; } @@ -494,10 +515,10 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) return; m_inUpdateScrollbars = true; - IntSize maxScrollPosition(contentsWidth() - visibleWidth(), contentsHeight() - visibleHeight()); - IntSize scroll = desiredOffset.shrunkTo(maxScrollPosition); - scroll.clampNegativeToZero(); - + + IntPoint scrollPoint = adjustScrollPositionWithinRange(IntPoint(desiredOffset.width(), desiredOffset.height())); + IntSize scroll(scrollPoint.x(), scrollPoint.y()); + if (m_horizontalScrollbar) { int clientWidth = visibleWidth(); m_horizontalScrollbar->setEnabled(contentsWidth() > clientWidth); @@ -515,7 +536,7 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) m_horizontalScrollbar->setSuppressInvalidation(true); m_horizontalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep); m_horizontalScrollbar->setProportion(clientWidth, contentsWidth()); - m_horizontalScrollbar->setValue(scroll.width(), Scrollbar::NotFromScrollAnimator); + m_horizontalScrollbar->setValue(scroll.width() + m_scrollOrigin.x(), Scrollbar::NotFromScrollAnimator); if (m_scrollbarsSuppressed) m_horizontalScrollbar->setSuppressInvalidation(false); } @@ -537,7 +558,7 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) m_verticalScrollbar->setSuppressInvalidation(true); m_verticalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep); m_verticalScrollbar->setProportion(clientHeight, contentsHeight()); - m_verticalScrollbar->setValue(scroll.height(), Scrollbar::NotFromScrollAnimator); + m_verticalScrollbar->setValue(scroll.height() + m_scrollOrigin.y(), Scrollbar::NotFromScrollAnimator); if (m_scrollbarsSuppressed) m_verticalScrollbar->setSuppressInvalidation(false); } @@ -1042,7 +1063,24 @@ void ScrollView::removePanScrollIcon() hostWindow()->invalidateContentsAndWindow(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true /*immediate*/); } -#if !PLATFORM(WX) && !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) +void ScrollView::setScrollOrigin(const IntPoint& origin, bool updatePosition) +{ + if (m_scrollOrigin == origin) + return; + + m_scrollOrigin = origin; + + if (platformWidget()) { + platformSetScrollOrigin(origin, updatePosition); + return; + } + + // Update if the scroll origin changes, since our position will be different if the content size did not change. + if (updatePosition) + updateScrollbars(scrollOffset()); +} + +#if !PLATFORM(WX) && !PLATFORM(GTK) && !PLATFORM(EFL) void ScrollView::platformInit() { @@ -1072,6 +1110,10 @@ void ScrollView::platformSetScrollbarsSuppressed(bool) { } +void ScrollView::platformSetScrollOrigin(const IntPoint&, bool updatePosition) +{ +} + #endif #if !PLATFORM(MAC) && !PLATFORM(WX) |