browsercore/core/webnavigation.cpp
changeset 0 1450b09d0cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browsercore/core/webnavigation.cpp	Tue May 04 12:39:35 2010 +0300
@@ -0,0 +1,171 @@
+/*
+* 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 "webnavigation.h"
+#include "qwebpage.h"
+#include "qwebframe.h"
+#include "webtouchnavigation.h"
+#include "webcursornavigation.h"
+#include "webhtmltabbednavigation.h"
+#include "webdirectionalnavigation.h"
+
+namespace WRT {
+
+/*!
+    \class WebNavigation
+    \since cwrt 1.0
+    \brief cwrt navigation.
+
+    \sa WebTouchNavigation, WebCursorNavigation, WebDirectionalNavigation, WebHtmlTabIndexedNavigation
+*/
+WebNavigation::WebNavigation(QWebPage* webPage,QObject* view) : m_webPage(webPage)
+, m_view(view)
+, m_webTouchNavigation(0)
+, m_webCursorNavigation(0)
+, m_webDirectionalNavigation(0)
+, m_webHtmlTabIndexNavigation(0)
+{
+    m_webPage->settings()->setUserStyleSheetUrl(QUrl("data:text/css;charset=utf-8;base64," \
+                        + QByteArray("textarea:hover, textarea:focus {                " \
+                        "    outline: auto;                              " \
+                        "    outline-style: solid;                       " \
+                        "    outline-color: rgb(140,140,255);            " \
+                        "    outline-width: 2px;                         " \
+                        "}                                               " \
+                        "select:hover,                                   " \
+                        "select[multiple]:hover,                         " \
+                        "select:focus,                                   " \
+                        "select[multiple]:focus {                        " \
+                        "    outline: auto;                              " \
+                        "    outline-style: solid;                       " \
+                        "    outline-color: rgb(140,140,255);            " \
+                        "    outline-width: 2px;                         " \
+                        "}                                               " \
+                        "input:hover, input:focus {                      " \
+                        "    outline: auto;                              " \
+                        "    outline-style: solid;                       " \
+                        "    outline-color: rgb(140,140,255);            " \
+                        "    outline-width: 2px;                         " \
+                        "}                                               " \
+                        "object:hover, object:focus {                    " \
+                        "    outline: auto;                              " \
+                        "    outline-style: solid;                       " \
+                        "    outline-color: rgb(140,140,255);            " \
+                        "    outline-width: 2px;                         " \
+                        "}                                               " \
+                        "input:disabled, select:disabled, textarea:disabled { " \
+                        "    outline: none;                              " \
+                        "}                                               " \
+                    		"a:-webkit-any-link {                            " \
+                        "    padding: 1px 2px;                           " \
+                        "}                                               " \
+                        "a:-webkit-any-link:visited {                    " \
+                        "    color: red;                                 " \
+                        "}                                               " \
+                        "a:-webkit-any-link:active {                     " \
+                        "    background-color: lightgray;                " \
+                        "    -webkit-border-radius: 3px;                 " \
+                        "    text-decoration: none;                      " \
+                        "}                                               " \
+                        "a:-webkit-any-link:focus {                      " \
+                        "    background-color: lightgray;                " \
+                        "    -webkit-border-radius: 3px;                 " \
+                        "    text-decoration: none;                      " \
+                        "} ").toBase64()));
+
+    
+    setNavigationMode();
+    connect(m_webPage->mainFrame(), SIGNAL(initialLayoutCompleted()), this, SLOT(setNavigationMode()));
+    connect(this, SIGNAL(longPressEvent()), m_webPage,SIGNAL(longPressEvent()));
+    connect(this,SIGNAL(focusElementChanged(wrtBrowserDefs::BrowserElementType &)),
+            m_webPage,SLOT(setElementType(wrtBrowserDefs::BrowserElementType &)));
+    connect(this, SIGNAL(pageScrollPositionZero()), m_webPage, SIGNAL(pageScrollPositionZero()));
+
+}
+
+/*!
+*/
+WebNavigation::~WebNavigation() 
+{
+    delete m_webTouchNavigation;
+    delete m_webCursorNavigation;
+    delete m_webDirectionalNavigation;
+    delete m_webHtmlTabIndexNavigation;
+}
+
+void WebNavigation::setPage(QWebPage * page) {
+
+     m_webPage = page;
+     if (m_webTouchNavigation)
+         m_webTouchNavigation->setPage(page);
+     if (m_webCursorNavigation)
+         m_webCursorNavigation->setPage(page);
+     if (m_webDirectionalNavigation)
+         m_webDirectionalNavigation->setPage(page);
+     if (m_webHtmlTabIndexNavigation)
+         m_webHtmlTabIndexNavigation->setPage(page);
+}
+
+/*!
+    Sets the navigation mode
+*/
+void WebNavigation::setNavigationMode()
+{
+    if (!m_webPage)
+        return;
+
+    if (!m_view)
+        return;
+
+    if (m_webTouchNavigation)
+        m_webTouchNavigation->uninstall();
+    if (m_webCursorNavigation)
+        m_webCursorNavigation->uninstall();
+    if (m_webDirectionalNavigation)
+        m_webDirectionalNavigation->uninstall();
+    if (m_webHtmlTabIndexNavigation)
+        m_webHtmlTabIndexNavigation->uninstall();
+
+    QWebFrame* webFrame = m_webPage->currentFrame();
+    if (webFrame) {
+        QMultiMap<QString, QString> map = webFrame->metaData();
+        if (map.value("touchnavigation") != "off" && map.value("navigation") != "none") {
+            if (!m_webTouchNavigation) {
+                m_webTouchNavigation = new WebTouchNavigation(m_webPage,m_view);
+                connect( (const QObject*)(m_webTouchNavigation),SIGNAL(longPressEvent()),this,SIGNAL(longPressEvent()));
+                connect((const QObject*)(m_webTouchNavigation), SIGNAL(focusElementChanged(wrtBrowserDefs::BrowserElementType &)),
+                                        this, SIGNAL(focusElementChanged(wrtBrowserDefs::BrowserElementType &)));
+                connect( (const QObject*)(m_webTouchNavigation),SIGNAL(pageScrollPositionZero()),this,SIGNAL(pageScrollPositionZero()));
+                
+            }
+            else 
+                m_webTouchNavigation->install();
+        }
+
+       // Enable key navigation, browser does not depend on meta data for navigation
+        if (!m_webDirectionalNavigation) {
+            m_webDirectionalNavigation = new WebDirectionalNavigation(m_webPage,m_view);
+            connect( (const QObject*)(m_webDirectionalNavigation),SIGNAL(pageScrollPositionZero()),this,SIGNAL(pageScrollPositionZero()));
+        }
+        else {
+            m_webDirectionalNavigation->install();
+        }
+    }
+}
+
+}