18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Computer, Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
45f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2007, 2009 Holger Hans Peter Freyther
58a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Copyright (C) 2008, 2010 Collabora Ltd.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScrollView.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(NATIVE_GTK_MAIN_FRAME_SCROLLBAR)
352bde8e466a4451c7319e3a072d118917957d6554Steve Block
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ChromeClient.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Frame.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "FrameView.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
41f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "GtkVersioning.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HostWindow.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "MainFrameScrollbarGtk.h"
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Page.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformMouseEvent.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformWheelEvent.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScrollbarTheme.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <gtk/gtk.h>
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformInit()
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformDestroy()
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_horizontalAdjustment = 0;
625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_verticalAdjustment = 0;
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
655f1ab04193ad0130ca8204aadaceae083aca9881Feng QianPassRefPtr<Scrollbar> ScrollView::createScrollbar(ScrollbarOrientation orientation)
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // If this is an interior frame scrollbar, we want to create a totally fake
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // scrollbar with no GtkAdjustment backing it.
69e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (parent())
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return Scrollbar::createNativeScrollbar(this, orientation, RegularScrollbar);
71e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
72e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // If this is the main frame, we want to create a Scrollbar that does no  painting
73e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // and defers to our GtkAdjustment for all of its state. Note that the GtkAdjustment
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // may be null here.
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (orientation == HorizontalScrollbar)
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return MainFrameScrollbarGtk::create(this, orientation, m_horizontalAdjustment.get());
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // VerticalScrollbar
795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return MainFrameScrollbarGtk::create(this, orientation, m_verticalAdjustment.get());
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid ScrollView::setHorizontalAdjustment(GtkAdjustment* hadj, bool resetValues)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ASSERT(!parent() || !hadj);
855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (parent())
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return;
875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_horizontalAdjustment = hadj;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
90e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!m_horizontalAdjustment) {
915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        MainFrameScrollbarGtk* hScrollbar = reinterpret_cast<MainFrameScrollbarGtk*>(horizontalScrollbar());
928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (hScrollbar)
938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            hScrollbar->detachAdjustment();
948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
95e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
98e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // We may be lacking scrollbars when returning to a cached
99e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // page, this kicks the page to recreate the scrollbars.
100e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    setHasHorizontalScrollbar(true);
101e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    MainFrameScrollbarGtk* hScrollbar = reinterpret_cast<MainFrameScrollbarGtk*>(horizontalScrollbar());
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    hScrollbar->attachAdjustment(m_horizontalAdjustment.get());
104e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
105e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // We used to reset everything to 0 here, but when page cache
106e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // is enabled we reuse FrameViews that are cached. Since their
107e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // size is not going to change when being restored, (which is
108e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // what would cause the upper limit in the adjusments to be
109e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // set in the normal case), we make sure they are up-to-date
110e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // here. This is needed for the parent scrolling widget to be
111e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // able to report correct values.
112e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int horizontalPageStep = max(max<int>(frameRect().width() * Scrollbar::minFractionToStepWhenPaging(), frameRect().width() - Scrollbar::maxOverlapBetweenPages()), 1);
1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    gtk_adjustment_configure(m_horizontalAdjustment.get(),
114e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : scrollOffset().width(), 0,
115e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : contentsSize().width(),
116e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : Scrollbar::pixelsPerLineStep(),
117e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : horizontalPageStep,
118e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : frameRect().width());
119e14391e94c850b8bd03680c23b38978db68687a8John Reck}
120e14391e94c850b8bd03680c23b38978db68687a8John Reck
121e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid ScrollView::setVerticalAdjustment(GtkAdjustment* vadj, bool resetValues)
122e14391e94c850b8bd03680c23b38978db68687a8John Reck{
123e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(!parent() || !vadj);
124e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (parent())
125e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
126e14391e94c850b8bd03680c23b38978db68687a8John Reck
127e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_verticalAdjustment = vadj;
128e14391e94c850b8bd03680c23b38978db68687a8John Reck
129e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_verticalAdjustment) {
130e14391e94c850b8bd03680c23b38978db68687a8John Reck        MainFrameScrollbarGtk* vScrollbar = reinterpret_cast<MainFrameScrollbarGtk*>(verticalScrollbar());
131e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (vScrollbar)
132e14391e94c850b8bd03680c23b38978db68687a8John Reck            vScrollbar->detachAdjustment();
133e14391e94c850b8bd03680c23b38978db68687a8John Reck
134e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
135e14391e94c850b8bd03680c23b38978db68687a8John Reck    }
136e14391e94c850b8bd03680c23b38978db68687a8John Reck
137e14391e94c850b8bd03680c23b38978db68687a8John Reck    // We may be lacking scrollbars when returning to a cached
138e14391e94c850b8bd03680c23b38978db68687a8John Reck    // page, this kicks the page to recreate the scrollbars.
139e14391e94c850b8bd03680c23b38978db68687a8John Reck    setHasVerticalScrollbar(true);
140e14391e94c850b8bd03680c23b38978db68687a8John Reck
141e14391e94c850b8bd03680c23b38978db68687a8John Reck    MainFrameScrollbarGtk* vScrollbar = reinterpret_cast<MainFrameScrollbarGtk*>(verticalScrollbar());
142e14391e94c850b8bd03680c23b38978db68687a8John Reck    vScrollbar->attachAdjustment(m_verticalAdjustment.get());
143e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
144e14391e94c850b8bd03680c23b38978db68687a8John Reck    // We used to reset everything to 0 here, but when page cache
145e14391e94c850b8bd03680c23b38978db68687a8John Reck    // is enabled we reuse FrameViews that are cached. Since their
146e14391e94c850b8bd03680c23b38978db68687a8John Reck    // size is not going to change when being restored, (which is
147e14391e94c850b8bd03680c23b38978db68687a8John Reck    // what would cause the upper limit in the adjusments to be
148e14391e94c850b8bd03680c23b38978db68687a8John Reck    // set in the normal case), we make sure they are up-to-date
149e14391e94c850b8bd03680c23b38978db68687a8John Reck    // here. This is needed for the parent scrolling widget to be
150e14391e94c850b8bd03680c23b38978db68687a8John Reck    // able to report correct values.
151e14391e94c850b8bd03680c23b38978db68687a8John Reck    int verticalPageStep = max(max<int>(frameRect().width() * Scrollbar::minFractionToStepWhenPaging(), frameRect().width() - Scrollbar::maxOverlapBetweenPages()), 1);
1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    gtk_adjustment_configure(m_verticalAdjustment.get(),
153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : scrollOffset().height(), 0,
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : contentsSize().height(),
155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : Scrollbar::pixelsPerLineStep(),
156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : verticalPageStep,
157e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                             resetValues ? 0 : frameRect().height());
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
160e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid ScrollView::setGtkAdjustments(GtkAdjustment* hadj, GtkAdjustment* vadj, bool resetValues)
161e14391e94c850b8bd03680c23b38978db68687a8John Reck{
162e14391e94c850b8bd03680c23b38978db68687a8John Reck    setHorizontalAdjustment(hadj, resetValues);
163e14391e94c850b8bd03680c23b38978db68687a8John Reck    setVerticalAdjustment(vadj, resetValues);
164e14391e94c850b8bd03680c23b38978db68687a8John Reck}
165e14391e94c850b8bd03680c23b38978db68687a8John Reck
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect ScrollView::visibleContentRect(bool includeScrollbars) const
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // If we are an interior frame scrollbar or are in some sort of transition
1695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // state, just calculate our size based on what the GTK+ theme says the
1705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // scrollbar width should be.
1715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (parent() || !hostWindow() || !hostWindow()->platformPageClient()) {
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return IntRect(IntPoint(m_scrollOffset.width(), m_scrollOffset.height()),
17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                       IntSize(max(0, m_boundsSize.width() - (verticalScrollbar() && !includeScrollbars ? verticalScrollbar()->width() : 0)),
17481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                               max(0, m_boundsSize.height() - (horizontalScrollbar() && !includeScrollbars ? horizontalScrollbar()->height() : 0))));
1755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // We don't have a parent, so we are the main frame and thus have
1785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // a parent widget which we can use to measure the visible region.
179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GtkWidget* measuredWidget = hostWindow()->platformPageClient();
1805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    GtkWidget* parentWidget = gtk_widget_get_parent(measuredWidget);
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // We may not be in a widget that displays scrollbars, but we may
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // have other kinds of decoration that make us smaller.
1845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (parentWidget && includeScrollbars)
1855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        measuredWidget = parentWidget;
1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
187ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    GtkAllocation allocation;
188ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    gtk_widget_get_allocation(measuredWidget, &allocation);
1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return IntRect(IntPoint(m_scrollOffset.width(), m_scrollOffset.height()),
190ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                   IntSize(allocation.width, allocation.height));
1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode, bool horizontalLock, bool verticalLock)
194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // FIXME: Restructure the ScrollView abstraction so that we do not have to
1965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // copy this verbatim from ScrollView.cpp. Until then, we should make sure this
1975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // is kept in sync.
1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool needsUpdate = false;
1995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (horizontalMode != horizontalScrollbarMode() && !m_horizontalScrollbarLock) {
2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_horizontalScrollbarMode = horizontalMode;
2025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        needsUpdate = true;
2035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (verticalMode != verticalScrollbarMode() && !m_verticalScrollbarLock) {
2065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_verticalScrollbarMode = verticalMode;
2075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        needsUpdate = true;
2085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (horizontalLock)
2115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        setHorizontalScrollbarLock();
2125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (verticalLock)
2145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        setVerticalScrollbarLock();
2155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (needsUpdate)
217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        updateScrollbars(scrollOffset());
218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // We don't need to report policy changes on ScrollView's unless this
2205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // one has an adjustment attached and it is a main frame.
2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!m_horizontalAdjustment || parent() || !isFrameView())
222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // For frames that do have adjustments attached, we want to report
225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // policy changes, so that they may be applied to the widget to
2265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // which the WebView's container (e.g. GtkScrolledWindow).
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (hostWindow())
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        hostWindow()->scrollbarsModeDidChange();
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block
2332bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif // USE(NATIVE_GTK_MAIN_FRAME_SCROLLBAR)
234