browsercore/core/webcursornavigation.cpp
branchGCC_SURGE
changeset 8 2e16851ffecd
parent 2 bf4420e9fa4d
parent 6 1c3b8676e58c
--- a/browsercore/core/webcursornavigation.cpp	Fri Jun 11 16:23:26 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,313 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-
-#include "qwidget.h"
-#include "qcursor.h"
-#include "qwebpage.h"
-#include "qwebview.h"
-#include "qwebframe.h"
-#include "qwebelement.h"
-#include "webcursornavigation.h"
-#include "webcontentview.h"
-
-namespace WRT {
-
-const int KPageViewScrollRange = 60;
-const int KNormalScrollRange = 40;
-const int KFlipAdjust = 10;
-const int KMiddleStep = 5;
-const int KFullStep = 14;
-const int KMinimumParagraphHeight = 30;
-const int KHitTestDistance = 100;
-
-/*!
-    \class WebCursorNavigation
-    \since cwrt 1.0
-    \brief cwrt navigation.
-
-    \sa WebNavigation, WebTouchNavigation, WebDirectionalNavigation, WebHtmlTabIndexedNavigation
-*/
-WebCursorNavigation::WebCursorNavigation(QWebPage* webPage,QObject* view)
-  : m_webPage(webPage)
-  , m_view(view)
-  , m_cursorPosition(0,0)
-  , m_flipcounter(1)
-  , m_direction(0)
-  , m_lastdirection(0)
-{
-    install();
-}
-
-/*!
-*/
-WebCursorNavigation::~WebCursorNavigation()
-{
-    uninstall();
-}
-
-void WebCursorNavigation::install()
-{
-    m_view->installEventFilter(this);
-    connect(&m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollTimeout()));
-    connect(&m_keypressTimer, SIGNAL(timeout()), this, SLOT(keypressTimeout()));
-    connect(m_webPage, SIGNAL(linkHovered(const QString&, const QString&, const QString &)),
-            this, SLOT(showLinkHover(const QString&, const QString&)));
-}
-
-void WebCursorNavigation::uninstall()
-{
-    disconnect(&m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollTimeout()));
-    disconnect(&m_keypressTimer, SIGNAL(timeout()), this, SLOT(keypressTimeout()));
-    disconnect(m_webPage, SIGNAL(linkHovered(const QString&, const QString&, const QString &)),
-                this, SLOT(showLinkHover(const QString&, const QString&)));
-    m_view->removeEventFilter(this);
-}
-
-bool WebCursorNavigation::eventFilter(QObject *object, QEvent *event)
-{
-    if (object == m_view) {
-        switch (event->type()) {
-            case QEvent::KeyPress: {
-                QKeyEvent* ev = static_cast<QKeyEvent*>(event);
-                keyPressEvent(ev);
-                return ev->isAccepted();
-            }
-            case QEvent::KeyRelease: {
-                QKeyEvent* ev = static_cast<QKeyEvent*>(event);
-                keyReleaseEvent(ev);
-                return ev->isAccepted();
-            }
-            default:
-                break;
-        }
-    }
-    return false;
-}
-
-/*!
-    Timeout for long keypress.
-    \sa scrollTimeout()
-*/
-void WebCursorNavigation::keypressTimeout()
-{
-    if (!m_scrollTimer.isActive())
-      scrollTimeout(); 
-}
-
-/*!
-    Timeout for scroller. Scrolls the page on a timer every 50 miliseconds
-    \sa keypressTimeout()
-*/
-void WebCursorNavigation::scrollTimeout()
-{
-    if (!scroll(m_direction))
-        moveCursor(m_direction);
-
-    if (!m_scrollTimer.isActive())
-        m_scrollTimer.start(50);
-}
-
-/*!
-    If the key is directional, starts the keyPress timer. The cursor navigation is processed on keyReleaseEvent.
-    If the key is <Select> or <Return>, eat the event; we'll do that action once on keyRelease.
-    Otherwise, send the keyPress event onwards to QWebPage.
-*/
-void WebCursorNavigation::keyPressEvent(QKeyEvent* ev)
-{
-    //stop fast scrolling timers
-    m_keypressTimer.stop();
-    m_scrollTimer.stop();
-
-    if (ev->key() == Qt::Key_Up || 
-        ev->key() == Qt::Key_Down || 
-        ev->key() == Qt::Key_Left || 
-        ev->key() == Qt::Key_Right ) {
-
-        if (!m_keypressTimer.isActive())
-            m_keypressTimer.start(300);
-
-        m_direction = ev->key();
-    }
-
-    if (ev->key() == Qt::Key_Return
-        || ev->key() == Qt::Key_Enter
-        || ev->key() == Qt::Key_Select) {
-            Qt::KeyboardModifier modifier = Qt::NoModifier;
-            QWebFrame* webFrame = m_webPage->frameAt(m_cursorPosition);
-            webFrame = (webFrame) ? webFrame : m_webPage->currentFrame();
-            QWebHitTestResult htr = webFrame->hitTestContent(m_cursorPosition);
-            if (htr.element().tagName().toLower().compare("select")==0  && htr.element().hasAttribute("multiple"))
-                modifier = Qt::ControlModifier;
-
-            QMouseEvent evpress(QEvent::MouseButtonPress, m_cursorPosition, Qt::LeftButton, Qt::NoButton, modifier);
-            m_webPage->event(&evpress);
-    }
-
-}
-
-/*!
-    If the key is directional the cursor navigation is processed.
-    If the key is a <Select> or <Return>, send a left button mouse press and release to QWebPage.
-    Otherwise just send the keyRelease event onwards to QWebPage.
-*/
-void WebCursorNavigation::keyReleaseEvent(QKeyEvent* ev)
-{
-    //stop fast scrolling timers
-    m_keypressTimer.stop();
-    m_scrollTimer.stop();
-
-    if (ev->key() == Qt::Key_Up
-        || ev->key() == Qt::Key_Down
-        || ev->key() == Qt::Key_Left
-        || ev->key() == Qt::Key_Right ) {
-
-        if (!scroll(ev->key())) {
-            moveCursor(ev->key());
-            QMouseEvent evmm(QEvent::MouseMove, m_cursorPosition, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
-            m_webPage->event(&evmm);
-        }
-    }
-
-    if (ev->key() == Qt::Key_Return
-        || ev->key() == Qt::Key_Enter
-        || ev->key() == Qt::Key_Select) {
-            Qt::KeyboardModifier modifier = Qt::NoModifier;
-            QWebFrame* webFrame = m_webPage->frameAt(m_cursorPosition);
-            webFrame = (webFrame) ? webFrame : m_webPage->currentFrame();
-            QWebHitTestResult htr = webFrame->hitTestContent(m_cursorPosition);
-            if (htr.element().tagName().toLower().compare("select")==0  && htr.element().hasAttribute("multiple"))
-                modifier = Qt::ControlModifier;
-
-            QMouseEvent evrel(QEvent::MouseButtonRelease, m_cursorPosition, Qt::LeftButton, Qt::NoButton, modifier);
-            m_webPage->event(&evrel);
-    }
-}
-
-/*!
-    Returns true if the cursor is over a editable area
-*/
-bool WebCursorNavigation::isContentEditable()
-{
-    QWebFrame* webFrame = m_webPage->frameAt(m_cursorPosition);
-    webFrame = (webFrame) ? webFrame : m_webPage->currentFrame();
-    QWebHitTestResult htr = webFrame->hitTestContent(m_cursorPosition);
-    return htr.isContentEditable();
-}
-
-/*!
-    Moves the cursor a fixed interval in the given direction
-*/
-void WebCursorNavigation::moveCursor(int direction)
-{
-    QRect rect(0, 0,
-               m_webPage->viewportSize().width(),
-               m_webPage->viewportSize().height());
-
-    switch (direction) {
-        case Qt::Key_Left: {
-            m_flipcounter = (m_lastdirection == Qt::Key_Right) ? ++m_flipcounter : 1;
-            int dx = m_cursorPosition.x() - (KFullStep / m_flipcounter);
-            m_cursorPosition.setX((dx > 0) ? dx : 0);
-        }
-        break;
-        case Qt::Key_Right: {
-            m_flipcounter = (m_lastdirection == Qt::Key_Left) ? ++m_flipcounter : 1;
-            int dx = m_cursorPosition.x() + (KFullStep / m_flipcounter);
-            m_cursorPosition.setX((dx < rect.width() - KFullStep) ? dx : rect.width() - KFullStep);
-        }
-        break;
-        case Qt::Key_Up: {
-            m_flipcounter = (m_lastdirection == Qt::Key_Down) ? ++m_flipcounter : 1;
-            int dy = m_cursorPosition.y() - (KFullStep / m_flipcounter);
-            m_cursorPosition.setY((dy > 0) ? dy : 0);
-        }
-        break;
-        case Qt::Key_Down : {
-            m_flipcounter = (m_lastdirection == Qt::Key_Up) ? ++m_flipcounter : 1;
-            int dy = m_cursorPosition.y() + (KFullStep / m_flipcounter);
-            m_cursorPosition.setY((dy < rect.height() - KFullStep) ? dy : rect.height() - KFullStep);
-        }
-        break;
-    }
-    m_lastdirection = direction;
-    QCursor::setPos(static_cast<WebContentWidget*>(m_view)->mapToGlobal(m_cursorPosition).toPoint());
-}
-
-/*!
-    Scrolls QWebFrame a fixed interval in a given direction.
-*/
-bool WebCursorNavigation::scroll(int direction)
-{
-    QWebFrame* webFrame = m_webPage->frameAt(m_cursorPosition);
-    webFrame = (webFrame) ? webFrame : m_webPage->currentFrame();
-
-    QPoint scrollPosition = webFrame->scrollPosition();
-    QRect rect(QPoint(0,0),m_webPage->viewportSize());
-    int xmargin = 2 * rect.width() / 5;
-    int ymargin = 2 * rect.height() / 5;
-
-    switch (direction) {
-        case Qt::Key_Left :
-            if (m_cursorPosition.x() < rect.x() + xmargin)
-                webFrame->scroll(-KNormalScrollRange, 0);
-        break;
-        case Qt::Key_Right:
-            if (m_cursorPosition.x() > (rect.right() - xmargin))
-                webFrame->scroll(KNormalScrollRange, 0);
-        break;
-        case Qt::Key_Up:
-            if (m_cursorPosition.y() < rect.y() + ymargin)
-                webFrame->scroll(0, -KNormalScrollRange);
-        break;
-        case Qt::Key_Down:
-            if (m_cursorPosition.y() > (rect.bottom() - ymargin))
-                webFrame->scroll(0, KNormalScrollRange);
-        break;
-    }
-
-    if (scrollPosition.y() == 0 || webFrame->scrollPosition().y() == 0) {
-        emit pageScrollPositionZero();
-    }
-    return scrollPosition != webFrame->scrollPosition();
-}
-
-
-/*!
-    Returns the distance to scroll to the nearest edge of a text paragraph.
-*/
-int WebCursorNavigation::getNearestEdge(int scrollRange, int direction)
-{
-    QSize size = m_webPage->viewportSize();
-    //Identify the number of hit tests needed
-    int hitTestCount = size.height() / KHitTestDistance;
-    int x = direction == Qt::Key_Right ? scrollRange : 0;
-    QPoint pos(x,KHitTestDistance);
-    for(int i=0;i<hitTestCount;i++)  {
-        QWebHitTestResult htr = m_webPage->mainFrame()->hitTestContent(pos);
-        QRect rect = htr.boundingRect();
-        QPoint scrollPosition = m_webPage->mainFrame()->scrollPosition();
-        int d = direction == Qt::Key_Right ? rect.x() - scrollPosition.x() : pos.x() - rect.x();
-        if(d > 0 && scrollRange > d && rect.height() > KMinimumParagraphHeight)
-           scrollRange = d;
-        pos = QPoint(pos.x(), pos.y() + (i + 1) * KHitTestDistance);
-    }
-
-    return scrollRange;
-}
-}
-