This source file includes following definitions.
- m_verticalScrollbar
- scrollbarCreated
- scrollbarDestroyed
- setLastMousePosition
- scrollSize
- setScrollOffset
- invalidateScrollbarRect
- invalidateScrollCornerRect
- isActive
- setFrameRect
- scrollableAreaBoundingBox
- isScrollCornerVisible
- getTickmarks
- convertFromContainingViewToScrollbar
- horizontalScrollbar
- verticalScrollbar
- scrollPosition
- minimumScrollPosition
- maximumScrollPosition
- visibleHeight
- visibleWidth
- contentsSize
- overhangAmount
- lastKnownMousePosition
- shouldSuspendScrollAnimations
- scrollbarStyleChanged
- scrollbarsCanBeActive
- userInputScrollable
- shouldPlaceVerticalScrollbarOnLeft
- pageStep
#include "config.h"
#include "ScrollbarGroup.h"
#include "WebPluginScrollbarImpl.h"
#include "core/frame/FrameView.h"
#include "platform/scroll/Scrollbar.h"
#include "platform/scroll/ScrollbarTheme.h"
#include "public/platform/WebRect.h"
using namespace WebCore;
namespace blink {
ScrollbarGroup::ScrollbarGroup(FrameView* frameView, const IntRect& frameRect)
: m_frameView(frameView)
, m_frameRect(frameRect)
, m_horizontalScrollbar(0)
, m_verticalScrollbar(0)
{
}
ScrollbarGroup::~ScrollbarGroup()
{
ASSERT(!m_horizontalScrollbar);
ASSERT(!m_verticalScrollbar);
}
void ScrollbarGroup::scrollbarCreated(WebPluginScrollbarImpl* scrollbar)
{
bool hadScrollbars = m_horizontalScrollbar || m_verticalScrollbar;
if (scrollbar->scrollbar()->orientation() == HorizontalScrollbar) {
ASSERT(!m_horizontalScrollbar);
m_horizontalScrollbar = scrollbar;
didAddScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
} else {
ASSERT(!m_verticalScrollbar);
m_verticalScrollbar = scrollbar;
didAddScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
}
if (!hadScrollbars) {
m_frameView->addScrollableArea(this);
m_frameView->setNeedsLayout();
}
}
void ScrollbarGroup::scrollbarDestroyed(WebPluginScrollbarImpl* scrollbar)
{
if (scrollbar == m_horizontalScrollbar) {
willRemoveScrollbar(scrollbar->scrollbar(), HorizontalScrollbar);
m_horizontalScrollbar = 0;
} else {
ASSERT(scrollbar == m_verticalScrollbar);
willRemoveScrollbar(scrollbar->scrollbar(), VerticalScrollbar);
m_verticalScrollbar = 0;
}
if (!m_horizontalScrollbar && !m_verticalScrollbar) {
m_frameView->removeScrollableArea(this);
m_frameView->setNeedsLayout();
}
}
void ScrollbarGroup::setLastMousePosition(const IntPoint& point)
{
m_lastMousePosition = point;
}
int ScrollbarGroup::scrollSize(WebCore::ScrollbarOrientation orientation) const
{
WebPluginScrollbarImpl* webScrollbar = orientation == HorizontalScrollbar ? m_horizontalScrollbar : m_verticalScrollbar;
if (!webScrollbar)
return 0;
Scrollbar* scrollbar = webScrollbar->scrollbar();
return scrollbar->totalSize() - scrollbar->visibleSize();
}
void ScrollbarGroup::setScrollOffset(const IntPoint& offset)
{
if (m_horizontalScrollbar && m_horizontalScrollbar->scrollOffset() != offset.x())
m_horizontalScrollbar->setScrollOffset(offset.x());
else if (m_verticalScrollbar && m_verticalScrollbar->scrollOffset() != offset.y())
m_verticalScrollbar->setScrollOffset(offset.y());
}
void ScrollbarGroup::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
{
if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
m_horizontalScrollbar->invalidateScrollbarRect(rect);
else if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
m_verticalScrollbar->invalidateScrollbarRect(rect);
}
void ScrollbarGroup::invalidateScrollCornerRect(const IntRect&)
{
}
bool ScrollbarGroup::isActive() const
{
return true;
}
void ScrollbarGroup::setFrameRect(const IntRect& frameRect)
{
m_frameRect = frameRect;
}
IntRect ScrollbarGroup::scrollableAreaBoundingBox() const
{
return m_frameRect;
}
bool ScrollbarGroup::isScrollCornerVisible() const
{
return false;
}
void ScrollbarGroup::getTickmarks(Vector<IntRect>& tickmarks) const
{
if (m_verticalScrollbar)
m_verticalScrollbar->getTickmarks(tickmarks);
}
IntPoint ScrollbarGroup::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
{
if (m_horizontalScrollbar && scrollbar == m_horizontalScrollbar->scrollbar())
return m_horizontalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
if (m_verticalScrollbar && scrollbar == m_verticalScrollbar->scrollbar())
return m_verticalScrollbar->convertFromContainingViewToScrollbar(parentPoint);
BLINK_ASSERT_NOT_REACHED();
return IntPoint();
}
Scrollbar* ScrollbarGroup::horizontalScrollbar() const
{
return m_horizontalScrollbar ? m_horizontalScrollbar->scrollbar() : 0;
}
Scrollbar* ScrollbarGroup::verticalScrollbar() const
{
return m_verticalScrollbar ? m_verticalScrollbar->scrollbar() : 0;
}
IntPoint ScrollbarGroup::scrollPosition() const
{
int x = m_horizontalScrollbar ? m_horizontalScrollbar->scrollOffset() : 0;
int y = m_verticalScrollbar ? m_verticalScrollbar->scrollOffset() : 0;
return IntPoint(x, y);
}
IntPoint ScrollbarGroup::minimumScrollPosition() const
{
return IntPoint();
}
IntPoint ScrollbarGroup::maximumScrollPosition() const
{
return IntPoint(contentsSize().width() - visibleWidth(), contentsSize().height() - visibleHeight());
}
int ScrollbarGroup::visibleHeight() const
{
if (m_verticalScrollbar)
return m_verticalScrollbar->scrollbar()->height();
if (m_horizontalScrollbar)
return m_horizontalScrollbar->scrollbar()->height();
BLINK_ASSERT_NOT_REACHED();
return 0;
}
int ScrollbarGroup::visibleWidth() const
{
if (m_horizontalScrollbar)
return m_horizontalScrollbar->scrollbar()->width();
if (m_verticalScrollbar)
return m_verticalScrollbar->scrollbar()->width();
BLINK_ASSERT_NOT_REACHED();
return 0;
}
IntSize ScrollbarGroup::contentsSize() const
{
IntSize size;
if (m_horizontalScrollbar)
size.setWidth(m_horizontalScrollbar->scrollbar()->totalSize());
else if (m_verticalScrollbar) {
size.setWidth(m_verticalScrollbar->scrollbar()->x());
if (m_verticalScrollbar->scrollbar()->isOverlayScrollbar())
size.expand(WebPluginScrollbar::defaultThickness(), 0);
}
if (m_verticalScrollbar)
size.setHeight(m_verticalScrollbar->scrollbar()->totalSize());
else if (m_horizontalScrollbar) {
size.setHeight(m_horizontalScrollbar->scrollbar()->y());
if (m_horizontalScrollbar->scrollbar()->isOverlayScrollbar())
size.expand(0, WebPluginScrollbar::defaultThickness());
}
return size;
}
IntSize ScrollbarGroup::overhangAmount() const
{
return IntSize();
}
IntPoint ScrollbarGroup::lastKnownMousePosition() const
{
return m_lastMousePosition;
}
bool ScrollbarGroup::shouldSuspendScrollAnimations() const
{
return false;
}
void ScrollbarGroup::scrollbarStyleChanged(int, bool forceUpdate)
{
if (!forceUpdate)
return;
if (m_horizontalScrollbar)
m_horizontalScrollbar->scrollbarStyleChanged();
if (m_verticalScrollbar)
m_verticalScrollbar->scrollbarStyleChanged();
}
bool ScrollbarGroup::scrollbarsCanBeActive() const
{
return true;
}
bool ScrollbarGroup::userInputScrollable(ScrollbarOrientation orientation) const
{
return orientation == HorizontalScrollbar ? horizontalScrollbar() : verticalScrollbar();
}
bool ScrollbarGroup::shouldPlaceVerticalScrollbarOnLeft() const
{
return false;
}
int ScrollbarGroup::pageStep(ScrollbarOrientation orientation) const
{
int length;
if (orientation == VerticalScrollbar) {
if (!m_verticalScrollbar)
return 0;
length = m_verticalScrollbar->scrollbar()->height();
} else {
if (!m_horizontalScrollbar)
return 0;
length = m_horizontalScrollbar->scrollbar()->width();
}
int pageStep = std::max(
static_cast<int>(static_cast<float>(length) * ScrollableArea::minFractionToStepWhenPaging()),
length - ScrollableArea::maxOverlapBetweenPages());
return std::max(pageStep, 1);
}
}