| Index: Source/platform/scroll/ScrollView.cpp
|
| diff --git a/Source/platform/scroll/ScrollView.cpp b/Source/platform/scroll/ScrollView.cpp
|
| deleted file mode 100644
|
| index c7d3bdd2f26c7b06fa76c7eb27715579298b1786..0000000000000000000000000000000000000000
|
| --- a/Source/platform/scroll/ScrollView.cpp
|
| +++ /dev/null
|
| @@ -1,1183 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "platform/scroll/ScrollView.h"
|
| -
|
| -#include "platform/graphics/GraphicsContextStateSaver.h"
|
| -#include "platform/graphics/GraphicsLayer.h"
|
| -#include "platform/HostWindow.h"
|
| -#include "platform/scroll/ScrollbarTheme.h"
|
| -#include "wtf/StdLibExtras.h"
|
| -
|
| -namespace blink {
|
| -
|
| -ScrollView::ScrollView()
|
| - : m_horizontalScrollbarMode(ScrollbarAuto)
|
| - , m_verticalScrollbarMode(ScrollbarAuto)
|
| - , m_horizontalScrollbarLock(false)
|
| - , m_verticalScrollbarLock(false)
|
| - , m_scrollbarsAvoidingResizer(0)
|
| - , m_scrollbarsSuppressed(false)
|
| - , m_inUpdateScrollbars(false)
|
| - , m_drawPanScrollIcon(false)
|
| - , m_clipsRepaints(true)
|
| -{
|
| -}
|
| -
|
| -ScrollView::~ScrollView()
|
| -{
|
| -}
|
| -
|
| -void ScrollView::addChild(PassRefPtr<Widget> prpChild)
|
| -{
|
| - Widget* child = prpChild.get();
|
| - ASSERT(child != this && !child->parent());
|
| - child->setParent(this);
|
| - m_children.add(prpChild);
|
| -}
|
| -
|
| -void ScrollView::removeChild(Widget* child)
|
| -{
|
| - ASSERT(child->parent() == this);
|
| - child->setParent(0);
|
| - m_children.remove(child);
|
| -}
|
| -
|
| -void ScrollView::setHasHorizontalScrollbar(bool hasBar)
|
| -{
|
| - if (hasBar && !m_horizontalScrollbar) {
|
| - m_horizontalScrollbar = createScrollbar(HorizontalScrollbar);
|
| - addChild(m_horizontalScrollbar.get());
|
| - didAddScrollbar(m_horizontalScrollbar.get(), HorizontalScrollbar);
|
| - m_horizontalScrollbar->styleChanged();
|
| - } else if (!hasBar && m_horizontalScrollbar) {
|
| - willRemoveScrollbar(m_horizontalScrollbar.get(), HorizontalScrollbar);
|
| - // If the scrollbar has been marked as overlapping the window resizer,
|
| - // then its removal should reduce the count.
|
| - if (m_horizontalScrollbar->overlapsResizer())
|
| - adjustScrollbarsAvoidingResizerCount(-1);
|
| - removeChild(m_horizontalScrollbar.get());
|
| - m_horizontalScrollbar = nullptr;
|
| - }
|
| -}
|
| -
|
| -void ScrollView::setHasVerticalScrollbar(bool hasBar)
|
| -{
|
| - if (hasBar && !m_verticalScrollbar) {
|
| - m_verticalScrollbar = createScrollbar(VerticalScrollbar);
|
| - addChild(m_verticalScrollbar.get());
|
| - didAddScrollbar(m_verticalScrollbar.get(), VerticalScrollbar);
|
| - m_verticalScrollbar->styleChanged();
|
| - } else if (!hasBar && m_verticalScrollbar) {
|
| - willRemoveScrollbar(m_verticalScrollbar.get(), VerticalScrollbar);
|
| - // If the scrollbar has been marked as overlapping the window resizer,
|
| - // then its removal should reduce the count.
|
| - if (m_verticalScrollbar->overlapsResizer())
|
| - adjustScrollbarsAvoidingResizerCount(-1);
|
| - removeChild(m_verticalScrollbar.get());
|
| - m_verticalScrollbar = nullptr;
|
| - }
|
| -}
|
| -
|
| -PassRefPtr<Scrollbar> ScrollView::createScrollbar(ScrollbarOrientation orientation)
|
| -{
|
| - return Scrollbar::create(this, orientation, RegularScrollbar);
|
| -}
|
| -
|
| -void ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode,
|
| - bool horizontalLock, bool verticalLock)
|
| -{
|
| - bool needsUpdate = false;
|
| -
|
| - if (horizontalMode != horizontalScrollbarMode() && !m_horizontalScrollbarLock) {
|
| - m_horizontalScrollbarMode = horizontalMode;
|
| - needsUpdate = true;
|
| - }
|
| -
|
| - if (verticalMode != verticalScrollbarMode() && !m_verticalScrollbarLock) {
|
| - m_verticalScrollbarMode = verticalMode;
|
| - needsUpdate = true;
|
| - }
|
| -
|
| - if (horizontalLock)
|
| - setHorizontalScrollbarLock();
|
| -
|
| - if (verticalLock)
|
| - setVerticalScrollbarLock();
|
| -
|
| - if (!needsUpdate)
|
| - return;
|
| -
|
| - updateScrollbars(scrollOffsetDouble());
|
| -
|
| - if (!layerForScrolling())
|
| - return;
|
| - blink::WebLayer* layer = layerForScrolling()->platformLayer();
|
| - if (!layer)
|
| - return;
|
| - layer->setUserScrollable(userInputScrollable(HorizontalScrollbar), userInputScrollable(VerticalScrollbar));
|
| -}
|
| -
|
| -void ScrollView::scrollbarModes(ScrollbarMode& horizontalMode, ScrollbarMode& verticalMode) const
|
| -{
|
| - horizontalMode = m_horizontalScrollbarMode;
|
| - verticalMode = m_verticalScrollbarMode;
|
| -}
|
| -
|
| -void ScrollView::setCanHaveScrollbars(bool canScroll)
|
| -{
|
| - ScrollbarMode newHorizontalMode;
|
| - ScrollbarMode newVerticalMode;
|
| -
|
| - scrollbarModes(newHorizontalMode, newVerticalMode);
|
| -
|
| - if (canScroll && newVerticalMode == ScrollbarAlwaysOff)
|
| - newVerticalMode = ScrollbarAuto;
|
| - else if (!canScroll)
|
| - newVerticalMode = ScrollbarAlwaysOff;
|
| -
|
| - if (canScroll && newHorizontalMode == ScrollbarAlwaysOff)
|
| - newHorizontalMode = ScrollbarAuto;
|
| - else if (!canScroll)
|
| - newHorizontalMode = ScrollbarAlwaysOff;
|
| -
|
| - setScrollbarModes(newHorizontalMode, newVerticalMode);
|
| -}
|
| -
|
| -void ScrollView::setClipsRepaints(bool clipsRepaints)
|
| -{
|
| - m_clipsRepaints = clipsRepaints;
|
| -}
|
| -
|
| -IntSize ScrollView::unscaledVisibleContentSize(IncludeScrollbarsInRect scrollbarInclusion) const
|
| -{
|
| - return scrollbarInclusion == ExcludeScrollbars ? excludeScrollbars(frameRect().size()) : frameRect().size();
|
| -}
|
| -
|
| -IntSize ScrollView::excludeScrollbars(const IntSize& size) const
|
| -{
|
| - int verticalScrollbarWidth = 0;
|
| - int horizontalScrollbarHeight = 0;
|
| -
|
| - if (Scrollbar* verticalBar = verticalScrollbar())
|
| - verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? verticalBar->width() : 0;
|
| - if (Scrollbar* horizontalBar = horizontalScrollbar())
|
| - horizontalScrollbarHeight = !horizontalBar->isOverlayScrollbar() ? horizontalBar->height() : 0;
|
| -
|
| - return IntSize(std::max(0, size.width() - verticalScrollbarWidth),
|
| - std::max(0, size.height() - horizontalScrollbarHeight));
|
| -
|
| -}
|
| -
|
| -IntRect ScrollView::visibleContentRect(IncludeScrollbarsInRect scollbarInclusion) const
|
| -{
|
| - FloatSize visibleContentSize = unscaledVisibleContentSize(scollbarInclusion);
|
| - visibleContentSize.scale(1 / visibleContentScaleFactor());
|
| - return IntRect(flooredIntPoint(m_scrollPosition), expandedIntSize(visibleContentSize));
|
| -}
|
| -
|
| -IntSize ScrollView::contentsSize() const
|
| -{
|
| - return m_contentsSize;
|
| -}
|
| -
|
| -void ScrollView::setContentsSize(const IntSize& newSize)
|
| -{
|
| - if (contentsSize() == newSize)
|
| - return;
|
| - m_contentsSize = newSize;
|
| - updateScrollbars(scrollOffsetDouble());
|
| - updateOverhangAreas();
|
| -}
|
| -
|
| -IntPoint ScrollView::maximumScrollPosition() const
|
| -{
|
| - IntPoint maximumOffset(contentsWidth() - visibleWidth() - scrollOrigin().x(), contentsHeight() - visibleHeight() - scrollOrigin().y());
|
| - maximumOffset.clampNegativeToZero();
|
| - return maximumOffset;
|
| -}
|
| -
|
| -IntPoint ScrollView::minimumScrollPosition() const
|
| -{
|
| - return IntPoint(-scrollOrigin().x(), -scrollOrigin().y());
|
| -}
|
| -
|
| -IntPoint ScrollView::adjustScrollPositionWithinRange(const IntPoint& scrollPoint) const
|
| -{
|
| - if (!constrainsScrollingToContentEdge())
|
| - return scrollPoint;
|
| -
|
| - IntPoint newScrollPosition = scrollPoint.shrunkTo(maximumScrollPosition());
|
| - newScrollPosition = newScrollPosition.expandedTo(minimumScrollPosition());
|
| - return newScrollPosition;
|
| -}
|
| -
|
| -DoublePoint ScrollView::adjustScrollPositionWithinRange(const DoublePoint& scrollPoint) const
|
| -{
|
| - if (!constrainsScrollingToContentEdge())
|
| - return scrollPoint;
|
| - DoublePoint newScrollPosition = scrollPoint.shrunkTo(
|
| - maximumScrollPosition().x(), maximumScrollPosition().y());
|
| - newScrollPosition = newScrollPosition.expandedTo(
|
| - minimumScrollPosition().x(), minimumScrollPosition().y());
|
| - return newScrollPosition;
|
| -}
|
| -
|
| -void ScrollView::adjustScrollbarOpacity()
|
| -{
|
| - if (m_horizontalScrollbar && layerForHorizontalScrollbar()) {
|
| - bool isOpaqueScrollbar = !m_horizontalScrollbar->isOverlayScrollbar();
|
| - layerForHorizontalScrollbar()->setContentsOpaque(isOpaqueScrollbar);
|
| - }
|
| - if (m_verticalScrollbar && layerForVerticalScrollbar()) {
|
| - bool isOpaqueScrollbar = !m_verticalScrollbar->isOverlayScrollbar();
|
| - layerForVerticalScrollbar()->setContentsOpaque(isOpaqueScrollbar);
|
| - }
|
| -}
|
| -
|
| -int ScrollView::scrollSize(ScrollbarOrientation orientation) const
|
| -{
|
| - Scrollbar* scrollbar = ((orientation == HorizontalScrollbar) ? m_horizontalScrollbar : m_verticalScrollbar).get();
|
| -
|
| - // If no scrollbars are present, the content may still be scrollable.
|
| - if (!scrollbar) {
|
| - IntSize scrollSize = m_contentsSize - visibleContentRect().size();
|
| - scrollSize.clampNegativeToZero();
|
| - return orientation == HorizontalScrollbar ? scrollSize.width() : scrollSize.height();
|
| - }
|
| -
|
| - return scrollbar->totalSize() - scrollbar->visibleSize();
|
| -}
|
| -
|
| -void ScrollView::notifyPageThatContentAreaWillPaint() const
|
| -{
|
| -}
|
| -
|
| -void ScrollView::setScrollOffset(const IntPoint& offset)
|
| -{
|
| - scrollTo(DoublePoint(adjustScrollPositionWithinRange(offset)));
|
| -}
|
| -
|
| -void ScrollView::setScrollOffset(const DoublePoint& offset)
|
| -{
|
| - scrollTo(adjustScrollPositionWithinRange(offset));
|
| -}
|
| -
|
| -void ScrollView::scrollTo(const DoublePoint& newPosition)
|
| -{
|
| - DoubleSize scrollDelta = newPosition - m_scrollPosition;
|
| - if (scrollDelta.isZero())
|
| - return;
|
| - m_scrollPosition = newPosition;
|
| -
|
| - if (scrollbarsSuppressed())
|
| - return;
|
| -
|
| - // FIXME: Change scrollContents() to take DoubleSize. crbug.com/414283.
|
| - if (isFrameView())
|
| - m_pendingScrollDelta += scrollDelta;
|
| - else
|
| - scrollContents(flooredIntSize(scrollDelta));
|
| -}
|
| -
|
| -void ScrollView::setScrollPosition(const DoublePoint& scrollPoint, ScrollBehavior scrollBehavior)
|
| -{
|
| - DoublePoint newScrollPosition = adjustScrollPositionWithinRange(scrollPoint);
|
| -
|
| - if (newScrollPosition == scrollPositionDouble())
|
| - return;
|
| -
|
| - if (scrollBehavior == ScrollBehaviorInstant) {
|
| - DoubleSize newOffset(newScrollPosition.x(), newScrollPosition.y());
|
| - updateScrollbars(newOffset);
|
| - } else {
|
| - programmaticallyScrollSmoothlyToOffset(toFloatPoint(newScrollPosition));
|
| - }
|
| -}
|
| -
|
| -bool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity)
|
| -{
|
| - ScrollDirection physicalDirection =
|
| - toPhysicalDirection(direction, isVerticalDocument(), isFlippedDocument());
|
| -
|
| - return ScrollableArea::scroll(physicalDirection, granularity);
|
| -}
|
| -
|
| -IntSize ScrollView::overhangAmount() const
|
| -{
|
| - IntSize stretch;
|
| -
|
| - IntPoint currentScrollPosition = scrollPosition();
|
| - IntPoint minScrollPosition = minimumScrollPosition();
|
| - IntPoint maxScrollPosition = maximumScrollPosition();
|
| -
|
| - if (currentScrollPosition.x() < minScrollPosition.x())
|
| - stretch.setWidth(currentScrollPosition.x() - minScrollPosition.x());
|
| - if (currentScrollPosition.x() > maxScrollPosition.x())
|
| - stretch.setWidth(currentScrollPosition.x() - maxScrollPosition.x());
|
| -
|
| - if (currentScrollPosition.y() < minScrollPosition.y())
|
| - stretch.setHeight(currentScrollPosition.y() - minScrollPosition.y());
|
| - if (currentScrollPosition.y() > maxScrollPosition.y())
|
| - stretch.setHeight(currentScrollPosition.y() - maxScrollPosition.y());
|
| -
|
| - return stretch;
|
| -}
|
| -
|
| -void ScrollView::windowResizerRectChanged()
|
| -{
|
| - updateScrollbars(scrollOffsetDouble());
|
| -}
|
| -
|
| -static bool useOverlayScrollbars()
|
| -{
|
| - // FIXME: Need to detect the presence of CSS custom scrollbars, which are non-overlay regardless the ScrollbarTheme.
|
| - return ScrollbarTheme::theme()->usesOverlayScrollbars();
|
| -}
|
| -
|
| -void ScrollView::computeScrollbarExistence(bool& newHasHorizontalScrollbar, bool& newHasVerticalScrollbar, const IntSize& docSize, ComputeScrollbarExistenceOption option) const
|
| -{
|
| - bool hasHorizontalScrollbar = m_horizontalScrollbar;
|
| - bool hasVerticalScrollbar = m_verticalScrollbar;
|
| -
|
| - newHasHorizontalScrollbar = hasHorizontalScrollbar;
|
| - newHasVerticalScrollbar = hasVerticalScrollbar;
|
| -
|
| - ScrollbarMode hScroll = m_horizontalScrollbarMode;
|
| - ScrollbarMode vScroll = m_verticalScrollbarMode;
|
| -
|
| - if (hScroll != ScrollbarAuto)
|
| - newHasHorizontalScrollbar = (hScroll == ScrollbarAlwaysOn);
|
| - if (vScroll != ScrollbarAuto)
|
| - newHasVerticalScrollbar = (vScroll == ScrollbarAlwaysOn);
|
| -
|
| - if (m_scrollbarsSuppressed || (hScroll != ScrollbarAuto && vScroll != ScrollbarAuto))
|
| - return;
|
| -
|
| - if (hScroll == ScrollbarAuto)
|
| - newHasHorizontalScrollbar = docSize.width() > visibleWidth();
|
| - if (vScroll == ScrollbarAuto)
|
| - newHasVerticalScrollbar = docSize.height() > visibleHeight();
|
| -
|
| - if (useOverlayScrollbars())
|
| - return;
|
| -
|
| - IntSize fullVisibleSize = visibleContentRect(IncludeScrollbars).size();
|
| -
|
| - bool attemptToRemoveScrollbars = (option == FirstPass
|
| - && docSize.width() <= fullVisibleSize.width() && docSize.height() <= fullVisibleSize.height());
|
| - if (attemptToRemoveScrollbars) {
|
| - if (hScroll == ScrollbarAuto)
|
| - newHasHorizontalScrollbar = false;
|
| - if (vScroll == ScrollbarAuto)
|
| - newHasVerticalScrollbar = false;
|
| - }
|
| -
|
| - // If we ever turn one scrollbar off, always turn the other one off too.
|
| - // Never ever try to both gain/lose a scrollbar in the same pass.
|
| - if (!newHasHorizontalScrollbar && hasHorizontalScrollbar && vScroll != ScrollbarAlwaysOn)
|
| - newHasVerticalScrollbar = false;
|
| - if (!newHasVerticalScrollbar && hasVerticalScrollbar && hScroll != ScrollbarAlwaysOn)
|
| - newHasHorizontalScrollbar = false;
|
| -}
|
| -
|
| -void ScrollView::updateScrollbarGeometry()
|
| -{
|
| - if (m_horizontalScrollbar) {
|
| - int clientWidth = visibleWidth();
|
| - IntRect oldRect(m_horizontalScrollbar->frameRect());
|
| - IntRect hBarRect((shouldPlaceVerticalScrollbarOnLeft() && m_verticalScrollbar) ? m_verticalScrollbar->width() : 0,
|
| - height() - m_horizontalScrollbar->height(),
|
| - width() - (m_verticalScrollbar ? m_verticalScrollbar->width() : 0),
|
| - m_horizontalScrollbar->height());
|
| - m_horizontalScrollbar->setFrameRect(adjustScrollbarRectForResizer(hBarRect, m_horizontalScrollbar.get()));
|
| - if (!m_scrollbarsSuppressed && oldRect != m_horizontalScrollbar->frameRect())
|
| - m_horizontalScrollbar->invalidate();
|
| -
|
| - if (m_scrollbarsSuppressed)
|
| - m_horizontalScrollbar->setSuppressInvalidation(true);
|
| - m_horizontalScrollbar->setEnabled(contentsWidth() > clientWidth);
|
| - m_horizontalScrollbar->setProportion(clientWidth, contentsWidth());
|
| - m_horizontalScrollbar->offsetDidChange();
|
| - if (m_scrollbarsSuppressed)
|
| - m_horizontalScrollbar->setSuppressInvalidation(false);
|
| - }
|
| -
|
| - if (m_verticalScrollbar) {
|
| - int clientHeight = visibleHeight();
|
| - IntRect oldRect(m_verticalScrollbar->frameRect());
|
| - IntRect vBarRect(shouldPlaceVerticalScrollbarOnLeft() ? 0 : (width() - m_verticalScrollbar->width()),
|
| - 0,
|
| - m_verticalScrollbar->width(),
|
| - height() - (m_horizontalScrollbar ? m_horizontalScrollbar->height() : 0));
|
| - m_verticalScrollbar->setFrameRect(adjustScrollbarRectForResizer(vBarRect, m_verticalScrollbar.get()));
|
| - if (!m_scrollbarsSuppressed && oldRect != m_verticalScrollbar->frameRect())
|
| - m_verticalScrollbar->invalidate();
|
| -
|
| - if (m_scrollbarsSuppressed)
|
| - m_verticalScrollbar->setSuppressInvalidation(true);
|
| - m_verticalScrollbar->setEnabled(contentsHeight() > clientHeight);
|
| - m_verticalScrollbar->setProportion(clientHeight, contentsHeight());
|
| - m_verticalScrollbar->offsetDidChange();
|
| - if (m_scrollbarsSuppressed)
|
| - m_verticalScrollbar->setSuppressInvalidation(false);
|
| - }
|
| -}
|
| -
|
| -IntRect ScrollView::adjustScrollbarRectForResizer(const IntRect& rect, Scrollbar* scrollbar)
|
| -{
|
| - // Get our window resizer rect and see if we overlap. Adjust to avoid the overlap
|
| - // if necessary.
|
| - IntRect adjustedRect(rect);
|
| - bool overlapsResizer = false;
|
| - if (!rect.isEmpty() && !windowResizerRect().isEmpty()) {
|
| - IntRect resizerRect = convertFromContainingWindow(windowResizerRect());
|
| - if (rect.intersects(resizerRect)) {
|
| - if (scrollbar->orientation() == HorizontalScrollbar) {
|
| - int overlap = rect.maxX() - resizerRect.x();
|
| - if (overlap > 0 && resizerRect.maxX() >= rect.maxX()) {
|
| - adjustedRect.setWidth(rect.width() - overlap);
|
| - overlapsResizer = true;
|
| - }
|
| - } else {
|
| - int overlap = rect.maxY() - resizerRect.y();
|
| - if (overlap > 0 && resizerRect.maxY() >= rect.maxY()) {
|
| - adjustedRect.setHeight(rect.height() - overlap);
|
| - overlapsResizer = true;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - if (overlapsResizer != scrollbar->overlapsResizer()) {
|
| - scrollbar->setOverlapsResizer(overlapsResizer);
|
| - adjustScrollbarsAvoidingResizerCount(overlapsResizer ? 1 : -1);
|
| - }
|
| - return adjustedRect;
|
| -}
|
| -
|
| -bool ScrollView::adjustScrollbarExistence(ComputeScrollbarExistenceOption option)
|
| -{
|
| - ASSERT(m_inUpdateScrollbars);
|
| -
|
| - // If we came in here with the view already needing a layout, then go ahead and do that
|
| - // first. (This will be the common case, e.g., when the page changes due to window resizing for example).
|
| - // This layout will not re-enter updateScrollbars and does not count towards our max layout pass total.
|
| - if (!m_scrollbarsSuppressed)
|
| - scrollbarExistenceDidChange();
|
| -
|
| - bool hasHorizontalScrollbar = m_horizontalScrollbar;
|
| - bool hasVerticalScrollbar = m_verticalScrollbar;
|
| -
|
| - bool newHasHorizontalScrollbar = false;
|
| - bool newHasVerticalScrollbar = false;
|
| - computeScrollbarExistence(newHasHorizontalScrollbar, newHasVerticalScrollbar, contentsSize(), option);
|
| -
|
| - bool scrollbarExistenceChanged = hasHorizontalScrollbar != newHasHorizontalScrollbar || hasVerticalScrollbar != newHasVerticalScrollbar;
|
| - if (!scrollbarExistenceChanged)
|
| - return false;
|
| -
|
| - setHasHorizontalScrollbar(newHasHorizontalScrollbar);
|
| - setHasVerticalScrollbar(newHasVerticalScrollbar);
|
| -
|
| - if (m_scrollbarsSuppressed)
|
| - return true;
|
| -
|
| - if (!useOverlayScrollbars())
|
| - contentsResized();
|
| - scrollbarExistenceDidChange();
|
| - return true;
|
| -}
|
| -
|
| -void ScrollView::updateScrollbars(const DoubleSize& desiredOffset)
|
| -{
|
| - if (scrollbarsDisabled()) {
|
| - setScrollOffsetFromUpdateScrollbars(desiredOffset);
|
| - return;
|
| - }
|
| -
|
| - if (m_inUpdateScrollbars)
|
| - return;
|
| - InUpdateScrollbarsScope inUpdateScrollbarsScope(this);
|
| -
|
| - IntSize oldVisibleSize = visibleSize();
|
| -
|
| - bool scrollbarExistenceChanged = false;
|
| - int maxUpdateScrollbarsPass = useOverlayScrollbars() || m_scrollbarsSuppressed ? 1 : 3;
|
| - for (int updateScrollbarsPass = 0; updateScrollbarsPass < maxUpdateScrollbarsPass; updateScrollbarsPass++) {
|
| - if (!adjustScrollbarExistence(updateScrollbarsPass ? Incremental : FirstPass))
|
| - break;
|
| - scrollbarExistenceChanged = true;
|
| - }
|
| -
|
| - updateScrollbarGeometry();
|
| -
|
| - if (scrollbarExistenceChanged) {
|
| - // FIXME: Is frameRectsChanged really necessary here? Have any frame rects changed?
|
| - frameRectsChanged();
|
| - positionScrollbarLayers();
|
| - updateScrollCorner();
|
| - }
|
| -
|
| - // FIXME: We don't need to do this if we are composited.
|
| - IntSize newVisibleSize = visibleSize();
|
| - if (newVisibleSize.width() > oldVisibleSize.width()) {
|
| - if (shouldPlaceVerticalScrollbarOnLeft())
|
| - invalidateRect(IntRect(0, 0, newVisibleSize.width() - oldVisibleSize.width(), newVisibleSize.height()));
|
| - else
|
| - invalidateRect(IntRect(oldVisibleSize.width(), 0, newVisibleSize.width() - oldVisibleSize.width(), newVisibleSize.height()));
|
| - }
|
| - if (newVisibleSize.height() > oldVisibleSize.height())
|
| - invalidateRect(IntRect(0, oldVisibleSize.height(), newVisibleSize.width(), newVisibleSize.height() - oldVisibleSize.height()));
|
| -
|
| - setScrollOffsetFromUpdateScrollbars(desiredOffset);
|
| -}
|
| -
|
| -void ScrollView::setScrollOffsetFromUpdateScrollbars(const DoubleSize& offset)
|
| -{
|
| - DoublePoint adjustedScrollPosition = DoublePoint(offset);
|
| -
|
| - if (!isRubberBandInProgress())
|
| - adjustedScrollPosition = adjustScrollPositionWithinRange(adjustedScrollPosition);
|
| -
|
| - if (adjustedScrollPosition != scrollPositionDouble() || scrollOriginChanged()) {
|
| - ScrollableArea::scrollToOffsetWithoutAnimation(toFloatPoint(adjustedScrollPosition));
|
| - resetScrollOriginChanged();
|
| - }
|
| -}
|
| -
|
| -const int panIconSizeLength = 16;
|
| -
|
| -IntRect ScrollView::rectToCopyOnScroll() const
|
| -{
|
| - IntRect scrollViewRect = convertToContainingWindow(IntRect((shouldPlaceVerticalScrollbarOnLeft() && verticalScrollbar()) ? verticalScrollbar()->width() : 0, 0, visibleWidth(), visibleHeight()));
|
| - if (hasOverlayScrollbars()) {
|
| - int verticalScrollbarWidth = (verticalScrollbar() && !hasLayerForVerticalScrollbar()) ? verticalScrollbar()->width() : 0;
|
| - int horizontalScrollbarHeight = (horizontalScrollbar() && !hasLayerForHorizontalScrollbar()) ? horizontalScrollbar()->height() : 0;
|
| -
|
| - scrollViewRect.setWidth(scrollViewRect.width() - verticalScrollbarWidth);
|
| - scrollViewRect.setHeight(scrollViewRect.height() - horizontalScrollbarHeight);
|
| - }
|
| - return scrollViewRect;
|
| -}
|
| -
|
| -void ScrollView::scrollContentsIfNeeded()
|
| -{
|
| - if (m_pendingScrollDelta.isZero())
|
| - return;
|
| - DoubleSize scrollDelta = m_pendingScrollDelta;
|
| - m_pendingScrollDelta = DoubleSize();
|
| - // FIXME: Change scrollContents() to take DoubleSize. crbug.com/414283.
|
| - scrollContents(flooredIntSize(scrollDelta));
|
| -}
|
| -
|
| -void ScrollView::scrollContents(const IntSize& scrollDelta)
|
| -{
|
| - HostWindow* window = hostWindow();
|
| - if (!window)
|
| - return;
|
| -
|
| - IntRect clipRect = windowClipRect();
|
| - IntRect updateRect = clipRect;
|
| - updateRect.intersect(rectToCopyOnScroll());
|
| -
|
| - if (m_drawPanScrollIcon) {
|
| - // FIXME: the pan icon is broken when accelerated compositing is on, since it will draw under the compositing layers.
|
| - // https://bugs.webkit.org/show_bug.cgi?id=47837
|
| - int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + std::max(abs(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint what's necessary
|
| - IntPoint panIconDirtySquareLocation = IntPoint(m_panScrollIconPoint.x() - (panIconDirtySquareSizeLength / 2), m_panScrollIconPoint.y() - (panIconDirtySquareSizeLength / 2));
|
| - IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation, IntSize(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength));
|
| - panScrollIconDirtyRect.intersect(clipRect);
|
| - window->invalidateContentsAndRootView(panScrollIconDirtyRect);
|
| - }
|
| -
|
| - if (!scrollContentsFastPath(-scrollDelta))
|
| - scrollContentsSlowPath(updateRect);
|
| -
|
| - // Invalidate the overhang areas if they are visible.
|
| - updateOverhangAreas();
|
| -
|
| - // This call will move children with native widgets (plugins) and invalidate them as well.
|
| - frameRectsChanged();
|
| -}
|
| -
|
| -void ScrollView::scrollContentsSlowPath(const IntRect& updateRect)
|
| -{
|
| - hostWindow()->invalidateContentsForSlowScroll(updateRect);
|
| -}
|
| -
|
| -IntPoint ScrollView::rootViewToContents(const IntPoint& rootViewPoint) const
|
| -{
|
| - IntPoint viewPoint = convertFromContainingWindow(rootViewPoint);
|
| - return viewPoint + scrollOffset();
|
| -}
|
| -
|
| -IntPoint ScrollView::contentsToRootView(const IntPoint& contentsPoint) const
|
| -{
|
| - IntPoint viewPoint = contentsPoint - scrollOffset();
|
| - return convertToContainingWindow(viewPoint);
|
| -}
|
| -
|
| -IntRect ScrollView::rootViewToContents(const IntRect& rootViewRect) const
|
| -{
|
| - IntRect viewRect = convertFromContainingWindow(rootViewRect);
|
| - viewRect.move(scrollOffset());
|
| - return viewRect;
|
| -}
|
| -
|
| -IntRect ScrollView::contentsToRootView(const IntRect& contentsRect) const
|
| -{
|
| - IntRect viewRect = contentsRect;
|
| - viewRect.move(-scrollOffset());
|
| - return convertToContainingWindow(viewRect);
|
| -}
|
| -
|
| -IntPoint ScrollView::windowToContents(const IntPoint& windowPoint) const
|
| -{
|
| - IntPoint viewPoint = convertFromContainingWindow(windowPoint);
|
| - return viewPoint + scrollOffset();
|
| -}
|
| -
|
| -FloatPoint ScrollView::windowToContents(const FloatPoint& windowPoint) const
|
| -{
|
| - FloatPoint viewPoint = convertFromContainingWindow(windowPoint);
|
| - return viewPoint + scrollOffset();
|
| -}
|
| -
|
| -IntPoint ScrollView::contentsToWindow(const IntPoint& contentsPoint) const
|
| -{
|
| - IntPoint viewPoint = contentsPoint - scrollOffset();
|
| - return convertToContainingWindow(viewPoint);
|
| -}
|
| -
|
| -IntRect ScrollView::windowToContents(const IntRect& windowRect) const
|
| -{
|
| - IntRect viewRect = convertFromContainingWindow(windowRect);
|
| - viewRect.move(scrollOffset());
|
| - return viewRect;
|
| -}
|
| -
|
| -IntRect ScrollView::contentsToWindow(const IntRect& contentsRect) const
|
| -{
|
| - IntRect viewRect = contentsRect;
|
| - viewRect.move(-scrollOffset());
|
| - return convertToContainingWindow(viewRect);
|
| -}
|
| -
|
| -IntRect ScrollView::contentsToScreen(const IntRect& rect) const
|
| -{
|
| - HostWindow* window = hostWindow();
|
| - if (!window)
|
| - return IntRect();
|
| - return window->rootViewToScreen(contentsToRootView(rect));
|
| -}
|
| -
|
| -bool ScrollView::containsScrollbarsAvoidingResizer() const
|
| -{
|
| - return !m_scrollbarsAvoidingResizer;
|
| -}
|
| -
|
| -void ScrollView::adjustScrollbarsAvoidingResizerCount(int overlapDelta)
|
| -{
|
| - int oldCount = m_scrollbarsAvoidingResizer;
|
| - m_scrollbarsAvoidingResizer += overlapDelta;
|
| - if (parent())
|
| - toScrollView(parent())->adjustScrollbarsAvoidingResizerCount(overlapDelta);
|
| - else if (!scrollbarsSuppressed()) {
|
| - // If we went from n to 0 or from 0 to n and we're the outermost view,
|
| - // we need to invalidate the windowResizerRect(), since it will now need to paint
|
| - // differently.
|
| - if ((oldCount > 0 && m_scrollbarsAvoidingResizer == 0) ||
|
| - (oldCount == 0 && m_scrollbarsAvoidingResizer > 0))
|
| - invalidateRect(windowResizerRect());
|
| - }
|
| -}
|
| -
|
| -void ScrollView::setParent(Widget* parentView)
|
| -{
|
| - if (parentView == parent())
|
| - return;
|
| -
|
| - if (m_scrollbarsAvoidingResizer && parent())
|
| - toScrollView(parent())->adjustScrollbarsAvoidingResizerCount(-m_scrollbarsAvoidingResizer);
|
| -
|
| - Widget::setParent(parentView);
|
| -
|
| - if (m_scrollbarsAvoidingResizer && parent())
|
| - toScrollView(parent())->adjustScrollbarsAvoidingResizerCount(m_scrollbarsAvoidingResizer);
|
| -}
|
| -
|
| -void ScrollView::setScrollbarsSuppressed(bool suppressed, bool repaintOnUnsuppress)
|
| -{
|
| - if (suppressed == m_scrollbarsSuppressed)
|
| - return;
|
| -
|
| - m_scrollbarsSuppressed = suppressed;
|
| -
|
| - if (repaintOnUnsuppress && !suppressed) {
|
| - if (m_horizontalScrollbar)
|
| - m_horizontalScrollbar->invalidate();
|
| - if (m_verticalScrollbar)
|
| - m_verticalScrollbar->invalidate();
|
| -
|
| - // Invalidate the scroll corner too on unsuppress.
|
| - invalidateRect(scrollCornerRect());
|
| - }
|
| -}
|
| -
|
| -Scrollbar* ScrollView::scrollbarAtWindowPoint(const IntPoint& windowPoint)
|
| -{
|
| - IntPoint viewPoint = convertFromContainingWindow(windowPoint);
|
| - return scrollbarAtViewPoint(viewPoint);
|
| -}
|
| -
|
| -Scrollbar* ScrollView::scrollbarAtViewPoint(const IntPoint& viewPoint)
|
| -{
|
| - if (m_horizontalScrollbar && m_horizontalScrollbar->shouldParticipateInHitTesting() && m_horizontalScrollbar->frameRect().contains(viewPoint))
|
| - return m_horizontalScrollbar.get();
|
| - if (m_verticalScrollbar && m_verticalScrollbar->shouldParticipateInHitTesting() && m_verticalScrollbar->frameRect().contains(viewPoint))
|
| - return m_verticalScrollbar.get();
|
| - return 0;
|
| -}
|
| -
|
| -void ScrollView::setFrameRect(const IntRect& newRect)
|
| -{
|
| - IntRect oldRect = frameRect();
|
| -
|
| - if (newRect == oldRect)
|
| - return;
|
| -
|
| - Widget::setFrameRect(newRect);
|
| -
|
| - updateScrollbars(scrollOffsetDouble());
|
| -
|
| - frameRectsChanged();
|
| -}
|
| -
|
| -void ScrollView::frameRectsChanged()
|
| -{
|
| - HashSet<RefPtr<Widget> >::const_iterator end = m_children.end();
|
| - for (HashSet<RefPtr<Widget> >::const_iterator current = m_children.begin(); current != end; ++current)
|
| - (*current)->frameRectsChanged();
|
| -}
|
| -
|
| -static void positionScrollbarLayer(GraphicsLayer* graphicsLayer, Scrollbar* scrollbar)
|
| -{
|
| - if (!graphicsLayer || !scrollbar)
|
| - return;
|
| -
|
| - IntRect scrollbarRect = scrollbar->frameRect();
|
| - graphicsLayer->setPosition(scrollbarRect.location());
|
| -
|
| - if (scrollbarRect.size() == graphicsLayer->size())
|
| - return;
|
| -
|
| - graphicsLayer->setSize(scrollbarRect.size());
|
| -
|
| - if (graphicsLayer->hasContentsLayer()) {
|
| - graphicsLayer->setContentsRect(IntRect(0, 0, scrollbarRect.width(), scrollbarRect.height()));
|
| - return;
|
| - }
|
| -
|
| - graphicsLayer->setDrawsContent(true);
|
| - graphicsLayer->setNeedsDisplay();
|
| -}
|
| -
|
| -static void positionScrollCornerLayer(GraphicsLayer* graphicsLayer, const IntRect& cornerRect)
|
| -{
|
| - if (!graphicsLayer)
|
| - return;
|
| - graphicsLayer->setDrawsContent(!cornerRect.isEmpty());
|
| - graphicsLayer->setPosition(cornerRect.location());
|
| - if (cornerRect.size() != graphicsLayer->size())
|
| - graphicsLayer->setNeedsDisplay();
|
| - graphicsLayer->setSize(cornerRect.size());
|
| -}
|
| -
|
| -void ScrollView::positionScrollbarLayers()
|
| -{
|
| - positionScrollbarLayer(layerForHorizontalScrollbar(), horizontalScrollbar());
|
| - positionScrollbarLayer(layerForVerticalScrollbar(), verticalScrollbar());
|
| - positionScrollCornerLayer(layerForScrollCorner(), scrollCornerRect());
|
| -}
|
| -
|
| -bool ScrollView::userInputScrollable(ScrollbarOrientation orientation) const
|
| -{
|
| - ScrollbarMode mode = (orientation == HorizontalScrollbar) ?
|
| - m_horizontalScrollbarMode : m_verticalScrollbarMode;
|
| -
|
| - return mode == ScrollbarAuto || mode == ScrollbarAlwaysOn;
|
| -}
|
| -
|
| -bool ScrollView::shouldPlaceVerticalScrollbarOnLeft() const
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -void ScrollView::contentRectangleForPaintInvalidation(const IntRect& rect)
|
| -{
|
| - IntRect paintRect = rect;
|
| - if (clipsPaintInvalidations())
|
| - paintRect.intersect(visibleContentRect());
|
| - if (paintRect.isEmpty())
|
| - return;
|
| -
|
| - if (HostWindow* window = hostWindow())
|
| - window->invalidateContentsAndRootView(contentsToWindow(paintRect));
|
| -}
|
| -
|
| -IntRect ScrollView::scrollCornerRect() const
|
| -{
|
| - IntRect cornerRect;
|
| -
|
| - if (hasOverlayScrollbars())
|
| - return cornerRect;
|
| -
|
| - if (m_horizontalScrollbar && width() - m_horizontalScrollbar->width() > 0) {
|
| - cornerRect.unite(IntRect(shouldPlaceVerticalScrollbarOnLeft() ? 0 : m_horizontalScrollbar->width(),
|
| - height() - m_horizontalScrollbar->height(),
|
| - width() - m_horizontalScrollbar->width(),
|
| - m_horizontalScrollbar->height()));
|
| - }
|
| -
|
| - if (m_verticalScrollbar && height() - m_verticalScrollbar->height() > 0) {
|
| - cornerRect.unite(IntRect(shouldPlaceVerticalScrollbarOnLeft() ? 0 : (width() - m_verticalScrollbar->width()),
|
| - m_verticalScrollbar->height(),
|
| - m_verticalScrollbar->width(),
|
| - height() - m_verticalScrollbar->height()));
|
| - }
|
| -
|
| - return cornerRect;
|
| -}
|
| -
|
| -bool ScrollView::isScrollCornerVisible() const
|
| -{
|
| - return !scrollCornerRect().isEmpty();
|
| -}
|
| -
|
| -void ScrollView::scrollbarStyleChanged()
|
| -{
|
| - adjustScrollbarOpacity();
|
| - contentsResized();
|
| - updateScrollbars(scrollOffsetDouble());
|
| - positionScrollbarLayers();
|
| -}
|
| -
|
| -void ScrollView::updateScrollCorner()
|
| -{
|
| -}
|
| -
|
| -void ScrollView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
|
| -{
|
| - ScrollbarTheme::theme()->paintScrollCorner(context, cornerRect);
|
| -}
|
| -
|
| -void ScrollView::paintScrollbar(GraphicsContext* context, Scrollbar* bar, const IntRect& rect)
|
| -{
|
| - bar->paint(context, rect);
|
| -}
|
| -
|
| -void ScrollView::invalidateScrollCornerRect(const IntRect& rect)
|
| -{
|
| - invalidateRect(rect);
|
| -}
|
| -
|
| -void ScrollView::paintScrollbars(GraphicsContext* context, const IntRect& rect)
|
| -{
|
| - if (m_horizontalScrollbar && !layerForHorizontalScrollbar())
|
| - paintScrollbar(context, m_horizontalScrollbar.get(), rect);
|
| - if (m_verticalScrollbar && !layerForVerticalScrollbar())
|
| - paintScrollbar(context, m_verticalScrollbar.get(), rect);
|
| -
|
| - if (layerForScrollCorner())
|
| - return;
|
| - paintScrollCorner(context, scrollCornerRect());
|
| -}
|
| -
|
| -void ScrollView::paintPanScrollIcon(GraphicsContext* context)
|
| -{
|
| - DEFINE_STATIC_REF(Image, panScrollIcon, (Image::loadPlatformResource("panIcon")));
|
| - IntPoint iconGCPoint = m_panScrollIconPoint;
|
| - if (parent())
|
| - iconGCPoint = toScrollView(parent())->windowToContents(iconGCPoint);
|
| - context->drawImage(panScrollIcon, iconGCPoint);
|
| -}
|
| -
|
| -void ScrollView::paint(GraphicsContext* context, const IntRect& rect)
|
| -{
|
| - notifyPageThatContentAreaWillPaint();
|
| -
|
| - IntRect documentDirtyRect = rect;
|
| - IntRect visibleAreaWithoutScrollbars(location(), visibleContentRect().size());
|
| - documentDirtyRect.intersect(visibleAreaWithoutScrollbars);
|
| -
|
| - if (!documentDirtyRect.isEmpty()) {
|
| - GraphicsContextStateSaver stateSaver(*context);
|
| -
|
| - context->translate(x() - scrollX(), y() - scrollY());
|
| - context->clip(visibleContentRect());
|
| -
|
| - documentDirtyRect.moveBy(-location() + scrollPosition());
|
| - paintContents(context, documentDirtyRect);
|
| - }
|
| -
|
| - calculateAndPaintOverhangAreas(context, rect);
|
| -
|
| - // Now paint the scrollbars.
|
| - if (!m_scrollbarsSuppressed && (m_horizontalScrollbar || m_verticalScrollbar)) {
|
| - GraphicsContextStateSaver stateSaver(*context);
|
| - IntRect scrollViewDirtyRect = rect;
|
| - IntRect visibleAreaWithScrollbars(location(), visibleContentRect(IncludeScrollbars).size());
|
| - scrollViewDirtyRect.intersect(visibleAreaWithScrollbars);
|
| - context->translate(x(), y());
|
| - scrollViewDirtyRect.moveBy(-location());
|
| - context->clip(IntRect(IntPoint(), visibleAreaWithScrollbars.size()));
|
| -
|
| - paintScrollbars(context, scrollViewDirtyRect);
|
| - }
|
| -
|
| - // Paint the panScroll Icon
|
| - if (m_drawPanScrollIcon)
|
| - paintPanScrollIcon(context);
|
| -}
|
| -
|
| -void ScrollView::calculateOverhangAreasForPainting(IntRect& horizontalOverhangRect, IntRect& verticalOverhangRect)
|
| -{
|
| - int verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar())
|
| - ? verticalScrollbar()->width() : 0;
|
| - int horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar())
|
| - ? horizontalScrollbar()->height() : 0;
|
| -
|
| - int physicalScrollY = scrollPosition().y() + scrollOrigin().y();
|
| - if (physicalScrollY < 0) {
|
| - horizontalOverhangRect = frameRect();
|
| - horizontalOverhangRect.setHeight(-physicalScrollY);
|
| - horizontalOverhangRect.setWidth(horizontalOverhangRect.width() - verticalScrollbarWidth);
|
| - } else if (contentsHeight() && physicalScrollY > contentsHeight() - visibleHeight()) {
|
| - int height = physicalScrollY - (contentsHeight() - visibleHeight());
|
| - horizontalOverhangRect = frameRect();
|
| - horizontalOverhangRect.setY(frameRect().maxY() - height - horizontalScrollbarHeight);
|
| - horizontalOverhangRect.setHeight(height);
|
| - horizontalOverhangRect.setWidth(horizontalOverhangRect.width() - verticalScrollbarWidth);
|
| - }
|
| -
|
| - int physicalScrollX = scrollPosition().x() + scrollOrigin().x();
|
| - if (physicalScrollX < 0) {
|
| - verticalOverhangRect.setWidth(-physicalScrollX);
|
| - verticalOverhangRect.setHeight(frameRect().height() - horizontalOverhangRect.height() - horizontalScrollbarHeight);
|
| - verticalOverhangRect.setX(frameRect().x());
|
| - if (horizontalOverhangRect.y() == frameRect().y())
|
| - verticalOverhangRect.setY(frameRect().y() + horizontalOverhangRect.height());
|
| - else
|
| - verticalOverhangRect.setY(frameRect().y());
|
| - } else if (contentsWidth() && physicalScrollX > contentsWidth() - visibleWidth()) {
|
| - int width = physicalScrollX - (contentsWidth() - visibleWidth());
|
| - verticalOverhangRect.setWidth(width);
|
| - verticalOverhangRect.setHeight(frameRect().height() - horizontalOverhangRect.height() - horizontalScrollbarHeight);
|
| - verticalOverhangRect.setX(frameRect().maxX() - width - verticalScrollbarWidth);
|
| - if (horizontalOverhangRect.y() == frameRect().y())
|
| - verticalOverhangRect.setY(frameRect().y() + horizontalOverhangRect.height());
|
| - else
|
| - verticalOverhangRect.setY(frameRect().y());
|
| - }
|
| -}
|
| -
|
| -void ScrollView::updateOverhangAreas()
|
| -{
|
| - HostWindow* window = hostWindow();
|
| - if (!window)
|
| - return;
|
| -
|
| - IntRect horizontalOverhangRect;
|
| - IntRect verticalOverhangRect;
|
| - calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
|
| - if (!horizontalOverhangRect.isEmpty())
|
| - window->invalidateContentsAndRootView(horizontalOverhangRect);
|
| - if (!verticalOverhangRect.isEmpty())
|
| - window->invalidateContentsAndRootView(verticalOverhangRect);
|
| -}
|
| -
|
| -void ScrollView::paintOverhangAreas(GraphicsContext* context, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect& dirtyRect)
|
| -{
|
| - ScrollbarTheme::theme()->paintOverhangBackground(context, horizontalOverhangRect, verticalOverhangRect, dirtyRect);
|
| - ScrollbarTheme::theme()->paintOverhangShadows(context, scrollOffset(), horizontalOverhangRect, verticalOverhangRect, dirtyRect);
|
| -}
|
| -
|
| -void ScrollView::calculateAndPaintOverhangAreas(GraphicsContext* context, const IntRect& dirtyRect)
|
| -{
|
| - IntRect horizontalOverhangRect;
|
| - IntRect verticalOverhangRect;
|
| - calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
|
| -
|
| - if (dirtyRect.intersects(horizontalOverhangRect) || dirtyRect.intersects(verticalOverhangRect))
|
| - paintOverhangAreas(context, horizontalOverhangRect, verticalOverhangRect, dirtyRect);
|
| -}
|
| -
|
| -void ScrollView::calculateAndPaintOverhangBackground(GraphicsContext* context, const IntRect& dirtyRect)
|
| -{
|
| - IntRect horizontalOverhangRect;
|
| - IntRect verticalOverhangRect;
|
| - calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
|
| -
|
| - if (dirtyRect.intersects(horizontalOverhangRect) || dirtyRect.intersects(verticalOverhangRect))
|
| - ScrollbarTheme::theme()->paintOverhangBackground(context, horizontalOverhangRect, verticalOverhangRect, dirtyRect);
|
| -}
|
| -
|
| -bool ScrollView::isPointInScrollbarCorner(const IntPoint& windowPoint)
|
| -{
|
| - if (!scrollbarCornerPresent())
|
| - return false;
|
| -
|
| - IntPoint viewPoint = convertFromContainingWindow(windowPoint);
|
| -
|
| - if (m_horizontalScrollbar) {
|
| - int horizontalScrollbarYMin = m_horizontalScrollbar->frameRect().y();
|
| - int horizontalScrollbarYMax = m_horizontalScrollbar->frameRect().y() + m_horizontalScrollbar->frameRect().height();
|
| - int horizontalScrollbarXMin = m_horizontalScrollbar->frameRect().x() + m_horizontalScrollbar->frameRect().width();
|
| -
|
| - return viewPoint.y() > horizontalScrollbarYMin && viewPoint.y() < horizontalScrollbarYMax && viewPoint.x() > horizontalScrollbarXMin;
|
| - }
|
| -
|
| - int verticalScrollbarXMin = m_verticalScrollbar->frameRect().x();
|
| - int verticalScrollbarXMax = m_verticalScrollbar->frameRect().x() + m_verticalScrollbar->frameRect().width();
|
| - int verticalScrollbarYMin = m_verticalScrollbar->frameRect().y() + m_verticalScrollbar->frameRect().height();
|
| -
|
| - return viewPoint.x() > verticalScrollbarXMin && viewPoint.x() < verticalScrollbarXMax && viewPoint.y() > verticalScrollbarYMin;
|
| -}
|
| -
|
| -bool ScrollView::scrollbarCornerPresent() const
|
| -{
|
| - return (m_horizontalScrollbar && width() - m_horizontalScrollbar->width() > 0)
|
| - || (m_verticalScrollbar && height() - m_verticalScrollbar->height() > 0);
|
| -}
|
| -
|
| -IntRect ScrollView::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntRect& localRect) const
|
| -{
|
| - // Scrollbars won't be transformed within us
|
| - IntRect newRect = localRect;
|
| - newRect.moveBy(scrollbar->location());
|
| - return newRect;
|
| -}
|
| -
|
| -IntRect ScrollView::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntRect& parentRect) const
|
| -{
|
| - IntRect newRect = parentRect;
|
| - // Scrollbars won't be transformed within us
|
| - newRect.moveBy(-scrollbar->location());
|
| - return newRect;
|
| -}
|
| -
|
| -// FIXME: test these on windows
|
| -IntPoint ScrollView::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntPoint& localPoint) const
|
| -{
|
| - // Scrollbars won't be transformed within us
|
| - IntPoint newPoint = localPoint;
|
| - newPoint.moveBy(scrollbar->location());
|
| - return newPoint;
|
| -}
|
| -
|
| -IntPoint ScrollView::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
|
| -{
|
| - IntPoint newPoint = parentPoint;
|
| - // Scrollbars won't be transformed within us
|
| - newPoint.moveBy(-scrollbar->location());
|
| - return newPoint;
|
| -}
|
| -
|
| -void ScrollView::setParentVisible(bool visible)
|
| -{
|
| - if (isParentVisible() == visible)
|
| - return;
|
| -
|
| - Widget::setParentVisible(visible);
|
| -
|
| - if (!isSelfVisible())
|
| - return;
|
| -
|
| - HashSet<RefPtr<Widget> >::iterator end = m_children.end();
|
| - for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
|
| - (*it)->setParentVisible(visible);
|
| -}
|
| -
|
| -void ScrollView::show()
|
| -{
|
| - if (!isSelfVisible()) {
|
| - setSelfVisible(true);
|
| - if (isParentVisible()) {
|
| - HashSet<RefPtr<Widget> >::iterator end = m_children.end();
|
| - for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
|
| - (*it)->setParentVisible(true);
|
| - }
|
| - }
|
| -
|
| - Widget::show();
|
| -}
|
| -
|
| -void ScrollView::hide()
|
| -{
|
| - if (isSelfVisible()) {
|
| - if (isParentVisible()) {
|
| - HashSet<RefPtr<Widget> >::iterator end = m_children.end();
|
| - for (HashSet<RefPtr<Widget> >::iterator it = m_children.begin(); it != end; ++it)
|
| - (*it)->setParentVisible(false);
|
| - }
|
| - setSelfVisible(false);
|
| - }
|
| -
|
| - Widget::hide();
|
| -}
|
| -
|
| -void ScrollView::addPanScrollIcon(const IntPoint& iconPosition)
|
| -{
|
| - HostWindow* window = hostWindow();
|
| - if (!window)
|
| - return;
|
| - m_drawPanScrollIcon = true;
|
| - m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , iconPosition.y() - panIconSizeLength / 2) ;
|
| - window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)));
|
| -}
|
| -
|
| -void ScrollView::removePanScrollIcon()
|
| -{
|
| - HostWindow* window = hostWindow();
|
| - if (!window)
|
| - return;
|
| - m_drawPanScrollIcon = false;
|
| - window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)));
|
| -}
|
| -
|
| -void ScrollView::setScrollOrigin(const IntPoint& origin, bool updatePositionAtAll, bool updatePositionSynchronously)
|
| -{
|
| - if (scrollOrigin() == origin)
|
| - return;
|
| -
|
| - ScrollableArea::setScrollOrigin(origin);
|
| -
|
| - // Update if the scroll origin changes, since our position will be different if the content size did not change.
|
| - if (updatePositionAtAll && updatePositionSynchronously)
|
| - updateScrollbars(scrollOffsetDouble());
|
| -}
|
| -
|
| -} // namespace blink
|
|
|