15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
27f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ScrollbarGroup.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h"
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginScrollbarImpl.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollbarGroup::ScrollbarGroup(FrameView* frameView, const IntRect& frameRect)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frameView(frameView)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frameRect(frameRect)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_horizontalScrollbar(0)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_verticalScrollbar(0)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScrollbarGroup::~ScrollbarGroup()
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_horizontalScrollbar);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_verticalScrollbar);
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::scrollbarCreated(WebPluginScrollbarImpl* scrollbar)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hadScrollbars = m_horizontalScrollbar || m_verticalScrollbar;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollbar->scrollbar()->orientation() == HorizontalScrollbar) {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_horizontalScrollbar);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar = scrollbar;
5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didAddScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_verticalScrollbar);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar = scrollbar;
6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didAddScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hadScrollbars) {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->addScrollableArea(this);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->setNeedsLayout();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::scrollbarDestroyed(WebPluginScrollbarImpl* scrollbar)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollbar == m_horizontalScrollbar) {
7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        willRemoveScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar = 0;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(scrollbar == m_verticalScrollbar);
7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        willRemoveScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar = 0;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_horizontalScrollbar && !m_verticalScrollbar) {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->removeScrollableArea(this);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frameView->setNeedsLayout();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setLastMousePosition(const IntPoint& point)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastMousePosition = point;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ScrollbarGroup::scrollSize(WebCore::ScrollbarOrientation orientation) const
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginScrollbarImpl* webScrollbar = orientation == HorizontalScrollbar ? m_horizontalScrollbar : m_verticalScrollbar;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!webScrollbar)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* scrollbar = webScrollbar->scrollbar();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return scrollbar->totalSize() - scrollbar->visibleSize();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setScrollOffset(const IntPoint& offset)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && m_horizontalScrollbar->scrollOffset() != offset.x())
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->setScrollOffset(offset.x());
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar && m_verticalScrollbar->scrollOffset() != offset.y())
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->setScrollOffset(offset.y());
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->invalidateScrollbarRect(rect);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->invalidateScrollbarRect(rect);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::invalidateScrollCornerRect(const IntRect&)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::isActive() const
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::setFrameRect(const IntRect& frameRect)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frameRect = frameRect;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ScrollbarGroup::scrollableAreaBoundingBox() const
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_frameRect;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::isScrollCornerVisible() const
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ScrollbarGroup::getTickmarks(Vector<IntRect>& tickmarks) const
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->getTickmarks(tickmarks);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
1551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Scrollbar* ScrollbarGroup::horizontalScrollbar() const
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_horizontalScrollbar ? m_horizontalScrollbar->scrollbar() : 0;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Scrollbar* ScrollbarGroup::verticalScrollbar() const
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_verticalScrollbar ? m_verticalScrollbar->scrollbar() : 0;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::scrollPosition() const
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int x = m_horizontalScrollbar ? m_horizontalScrollbar->scrollOffset() : 0;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int y = m_verticalScrollbar ? m_verticalScrollbar->scrollOffset() : 0;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint(x, y);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::minimumScrollPosition() const
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint();
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ScrollbarGroup::maximumScrollPosition() const
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntPoint(contentsSize().width() - visibleWidth(), contentsSize().height() - visibleHeight());
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ScrollbarGroup::visibleHeight() const
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->scrollbar()->height();
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->scrollbar()->height();
1921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ScrollbarGroup::visibleWidth() const
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_horizontalScrollbar->scrollbar()->width();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_verticalScrollbar->scrollbar()->width();
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    BLINK_ASSERT_NOT_REACHED();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize ScrollbarGroup::contentsSize() const
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setWidth(m_horizontalScrollbar->scrollbar()->totalSize());
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalScrollbar) {
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setWidth(m_verticalScrollbar->scrollbar()->x());
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_verticalScrollbar->scrollbar()->isOverlayScrollbar())
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size.expand(WebPluginScrollbar::defaultThickness(), 0);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setHeight(m_verticalScrollbar->scrollbar()->totalSize());
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_horizontalScrollbar) {
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size.setHeight(m_horizontalScrollbar->scrollbar()->y());
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_horizontalScrollbar->scrollbar()->isOverlayScrollbar())
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size.expand(0, WebPluginScrollbar::defaultThickness());
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return size;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize ScrollbarGroup::overhangAmount() const
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntSize();
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint ScrollbarGroup::lastKnownMousePosition() const
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_lastMousePosition;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::shouldSuspendScrollAnimations() const
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid ScrollbarGroup::scrollbarStyleChanged()
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_horizontalScrollbar)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_horizontalScrollbar->scrollbarStyleChanged();
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_verticalScrollbar)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_verticalScrollbar->scrollbarStyleChanged();
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ScrollbarGroup::scrollbarsCanBeActive() const
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
254f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool ScrollbarGroup::userInputScrollable(ScrollbarOrientation orientation) const
255f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
256f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return orientation == HorizontalScrollbar ? horizontalScrollbar() : verticalScrollbar();
257f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
258f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool ScrollbarGroup::shouldPlaceVerticalScrollbarOnLeft() const
2608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
2618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return false;
2628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
2638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
264f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)int ScrollbarGroup::pageStep(ScrollbarOrientation orientation) const
265f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
266f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    int length;
267f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (orientation == VerticalScrollbar) {
268f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!m_verticalScrollbar)
269f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return 0;
270f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
271f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length = m_verticalScrollbar->scrollbar()->height();
272f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    } else {
273f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!m_horizontalScrollbar)
274f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return 0;
275f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
276f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length = m_horizontalScrollbar->scrollbar()->width();
277f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
278f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
279f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    int pageStep = std::max(
280f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        static_cast<int>(static_cast<float>(length) * ScrollableArea::minFractionToStepWhenPaging()),
281f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        length - ScrollableArea::maxOverlapBetweenPages());
282f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
283f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return std::max(pageStep, 1);
284f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
285f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
28651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
287