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