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