18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com> 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScrollView.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformWheelEvent.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Scrollbar.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/scrolbar.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/scrolwin.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/event.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass ScrollView::ScrollViewPrivate : public wxEvtHandler { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ScrollViewPrivate(ScrollView* scrollView) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : wxEvtHandler() 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_scrollView(scrollView) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , vScrollbarMode(ScrollbarAuto) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , hScrollbarMode(ScrollbarAuto) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , viewStart(0, 0) 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void bindEvents(wxWindow* win) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // TODO: is there an easier way to Connect to a range of events? these are contiguous. 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_LINEUP, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_PAGEUP, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxScrollWinEventHandler(ScrollViewPrivate::OnScrollWinEvents), NULL, this); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void OnScrollWinEvents(wxScrollWinEvent& e) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxEventType scrollType(e.GetEventType()); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool horiz = e.GetOrientation() == wxHORIZONTAL; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint pos(viewStart); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (scrollType == wxEVT_SCROLLWIN_THUMBTRACK || scrollType == wxEVT_SCROLLWIN_THUMBRELEASE) { 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (horiz) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pos.x = e.GetPosition(); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pos.y = e.GetPosition(); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (scrollType == wxEVT_SCROLLWIN_LINEDOWN) { 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (horiz) 878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.x += Scrollbar::pixelsPerLineStep(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.y += Scrollbar::pixelsPerLineStep(); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (scrollType == wxEVT_SCROLLWIN_LINEUP) { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (horiz) 938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.x -= Scrollbar::pixelsPerLineStep(); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.y -= Scrollbar::pixelsPerLineStep(); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (scrollType == wxEVT_SCROLLWIN_PAGEUP) { 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (horiz) 998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.x -= max<int>(m_scrollView->visibleWidth() * Scrollbar::minFractionToStepWhenPaging(), m_scrollView->visibleWidth() - Scrollbar::maxOverlapBetweenPages()); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.y -= max<int>(m_scrollView->visibleHeight() * Scrollbar::minFractionToStepWhenPaging(), m_scrollView->visibleHeight() - Scrollbar::maxOverlapBetweenPages()); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (scrollType == wxEVT_SCROLLWIN_PAGEDOWN) { 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (horiz) 1058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.x += max<int>(m_scrollView->visibleWidth() * Scrollbar::minFractionToStepWhenPaging(), m_scrollView->visibleWidth() - Scrollbar::maxOverlapBetweenPages()); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1078a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block pos.y += max<int>(m_scrollView->visibleHeight() * Scrollbar::minFractionToStepWhenPaging(), m_scrollView->visibleHeight() - Scrollbar::maxOverlapBetweenPages()); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return e.Skip(); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_scrollView->setScrollPosition(IntPoint(pos.x, pos.y)); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ScrollView* m_scrollView; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ScrollbarMode vScrollbarMode; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ScrollbarMode hScrollbarMode; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint viewStart; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformInit() 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_data = new ScrollViewPrivate(this); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformDestroy() 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_data; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::setPlatformWidget(wxWindow* win) 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Widget::setPlatformWidget(win); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_data->bindEvents(win); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformRepaintContentRectangle(const IntRect& updateRect, bool now) 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to convert coordinates to scrolled position 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxRect contentsRect = updateRect; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project contentsRect.Offset(-scrollX(), -scrollY()); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* win = platformWidget(); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (win) { 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->RefreshRect(contentsRect, true); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (now) 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Update(); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::platformVisibleContentRect(bool includeScrollbars) const 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* win = platformWidget(); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!win) 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width, height; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (includeScrollbars) 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->GetSize(&width, &height); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->GetClientSize(&width, &height); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(m_data->viewStart.x, m_data->viewStart.y, width, height); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntSize ScrollView::platformContentsSize() const 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = 0; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = 0; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (platformWidget()) { 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project platformWidget()->GetVirtualSize(&width, &height); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(width >= 0 && height >= 0); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntSize(width, height); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetScrollPosition(const IntPoint& scrollPoint) 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* win = platformWidget(); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint scrollOffset = m_data->viewStart; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint orig(scrollOffset); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint newScrollOffset(scrollPoint); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxRect vRect(win->GetVirtualSize()); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxRect cRect(win->GetClientSize()); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // clamp to scroll area 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newScrollOffset.x < 0) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newScrollOffset.x = 0; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (newScrollOffset.x + cRect.width > vRect.width) 1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian newScrollOffset.x = max(0, vRect.width - cRect.width); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newScrollOffset.y < 0) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newScrollOffset.y = 0; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (newScrollOffset.y + cRect.height > vRect.height) 1995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian newScrollOffset.y = max(0, vRect.height - cRect.height); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newScrollOffset == scrollOffset) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_data->viewStart = newScrollOffset; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxPoint delta(orig - newScrollOffset); 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canBlitOnScroll()) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->ScrollWindow(delta.x, delta.y); 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->Refresh(); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project adjustScrollbars(); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::platformScroll(ScrollDirection, ScrollGranularity) 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetContentsSize() 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* win = platformWidget(); 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!win) 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetVirtualSize(m_contentsSize.width(), m_contentsSize.height()); 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project adjustScrollbars(); 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::adjustScrollbars(int x, int y, bool refresh) 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* win = platformWidget(); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!win) 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxRect crect(win->GetClientRect()), vrect(win->GetVirtualSize()); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (x == -1) x = m_data->viewStart.x; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (y == -1) y = m_data->viewStart.y; 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project long style = win->GetWindowStyle(); 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // by setting the wxALWAYS_SHOW_SB wxWindow flag before 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // each SetScrollbar call, we can control the scrollbars 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // visibility individually. 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // horizontal scrollbar 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_data->hScrollbarMode) { 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ScrollbarAlwaysOff: 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style & ~wxALWAYS_SHOW_SB); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxHORIZONTAL, 0, 0, 0, refresh); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ScrollbarAuto: 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style & ~wxALWAYS_SHOW_SB); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxHORIZONTAL, x, crect.width, vrect.width, refresh); 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: // ScrollbarAlwaysOn 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style | wxALWAYS_SHOW_SB); 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxHORIZONTAL, x, crect.width, vrect.width, refresh); 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // vertical scrollbar 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_data->vScrollbarMode) { 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ScrollbarAlwaysOff: 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style & ~wxALWAYS_SHOW_SB); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxVERTICAL, 0, 0, 0, refresh); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ScrollbarAlwaysOn: 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style | wxALWAYS_SHOW_SB); 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxVERTICAL, y, crect.height, vrect.height, refresh); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: // case ScrollbarAuto: 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetWindowStyleFlag(style & ~wxALWAYS_SHOW_SB); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project win->SetScrollbar(wxVERTICAL, y, crect.height, vrect.height, refresh); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformSetScrollbarModes() 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool needsAdjust = false; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_data->hScrollbarMode != horizontalScrollbarMode() ) { 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_data->hScrollbarMode = horizontalScrollbarMode(); 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project needsAdjust = true; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_data->vScrollbarMode != verticalScrollbarMode() ) { 2955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_data->vScrollbarMode = verticalScrollbarMode(); 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project needsAdjust = true; 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (needsAdjust) 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project adjustScrollbars(); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformScrollbarModes(ScrollbarMode& horizontal, ScrollbarMode& vertical) const 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project horizontal = m_data->hScrollbarMode; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vertical = m_data->vScrollbarMode; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScrollView::platformSetCanBlitOnScroll(bool canBlitOnScroll) 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_canBlitOnScroll = canBlitOnScroll; 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ScrollView::platformCanBlitOnScroll() const 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_canBlitOnScroll; 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// used for subframes support 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformAddChild(Widget* widget) 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NB: In all cases I'm aware of, 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // by the time this is called the ScrollView is already a child 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of its parent Widget by wx port APIs, so I don't think 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to do anything here. 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScrollView::platformRemoveChild(Widget* widget) 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (platformWidget()) { 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project platformWidget()->RemoveChild(widget->platformWidget()); 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is this the right place to do deletion? I see 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // detachFromParent2/3/4, initiated by FrameLoader::detachFromParent, 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but I'm not sure if it's better to handle there or not. 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project widget->platformWidget()->Destroy(); 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ScrollView::platformContentsToScreen(const IntRect& rect) const 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (platformWidget()) { 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxRect wxrect = rect; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project platformWidget()->ClientToScreen(&wxrect.x, &wxrect.y); 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return wxrect; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ScrollView::platformScreenToContents(const IntPoint& point) const 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (platformWidget()) { 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return platformWidget()->ScreenToClient(point); 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntPoint(); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ScrollView::platformIsOffscreen() const 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !platformWidget() || !platformWidget()->IsShownOnScreen(); 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 363