diff options
Diffstat (limited to 'WebCore/platform/ScrollView.cpp')
-rw-r--r-- | WebCore/platform/ScrollView.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/WebCore/platform/ScrollView.cpp b/WebCore/platform/ScrollView.cpp index 4f83794..ddce20c 100644 --- a/WebCore/platform/ScrollView.cpp +++ b/WebCore/platform/ScrollView.cpp @@ -54,7 +54,6 @@ ScrollView::ScrollView() , m_useFixedLayout(false) , m_paintsEntireContents(false) , m_delegatesScrolling(false) - , m_scrollOriginX(0) { platformInit(); } @@ -309,14 +308,14 @@ int ScrollView::actualScrollY() const IntPoint ScrollView::maximumScrollPosition() const { - IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOriginX, contentsHeight() - visibleHeight()); + IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOrigin.x(), contentsHeight() - visibleHeight() - m_scrollOrigin.y()); maximumOffset.clampNegativeToZero(); return maximumOffset; } IntPoint ScrollView::minimumScrollPosition() const { - return IntPoint(-m_scrollOriginX, 0); + return IntPoint(-m_scrollOrigin.x(), -m_scrollOrigin.y()); } IntPoint ScrollView::adjustScrollPositionWithinRange(const IntPoint& scrollPoint) const @@ -346,9 +345,9 @@ void ScrollView::valueChanged(Scrollbar* scrollbar) IntSize newOffset = m_scrollOffset; if (scrollbar) { if (scrollbar->orientation() == HorizontalScrollbar) - newOffset.setWidth(scrollbar->value() - m_scrollOriginX); + 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; @@ -403,7 +402,7 @@ bool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity { if (platformWidget()) return platformScroll(direction, granularity); - + if (direction == ScrollUp || direction == ScrollDown) { if (m_verticalScrollbar) return m_verticalScrollbar->scroll(direction, granularity); @@ -414,6 +413,11 @@ bool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity return false; } +bool ScrollView::logicalScroll(ScrollLogicalDirection direction, ScrollGranularity granularity) +{ + return scroll(logicalToPhysical(direction, isVerticalDocument(), isFlippedDocument()), granularity); +} + void ScrollView::windowResizerRectChanged() { if (platformWidget()) @@ -482,11 +486,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; } @@ -533,7 +541,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() + m_scrollOriginX, Scrollbar::NotFromScrollAnimator); + m_horizontalScrollbar->setValue(scroll.width() + m_scrollOrigin.x(), Scrollbar::NotFromScrollAnimator); if (m_scrollbarsSuppressed) m_horizontalScrollbar->setSuppressInvalidation(false); } @@ -555,7 +563,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); } @@ -1061,19 +1069,21 @@ void ScrollView::removePanScrollIcon() hostWindow()->invalidateContentsAndWindow(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true /*immediate*/); } -void ScrollView::setScrollOriginX(int x) +void ScrollView::setScrollOrigin(const IntPoint& origin, bool updatePosition) { - if (platformWidget()) - platformSetScrollOriginX(x); + if (m_scrollOrigin == origin) + return; - m_scrollOriginX = x; -} + m_scrollOrigin = origin; -void ScrollView::updateScrollbars() -{ - if (!platformWidget()) + 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()); - // FIXME: need corresponding functionality from platformWidget. } #if !PLATFORM(WX) && !PLATFORM(GTK) && !PLATFORM(EFL) @@ -1106,7 +1116,7 @@ void ScrollView::platformSetScrollbarsSuppressed(bool) { } -void ScrollView::platformSetScrollOriginX(int) +void ScrollView::platformSetScrollOrigin(const IntPoint&, bool updatePosition) { } |