18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Zack Rusin <zack@kde.org>
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClientQt.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSStyleDeclaration.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditCommandQt.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLElement.h"
41cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "HTMLInputElement.h"
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLNames.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h"
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "NotImplemented.h"
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Page.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformKeyboardEvent.h"
47cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "QWebPageClient.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Range.h"
4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Settings.h"
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WindowsKeyboardCodes.h"
515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "qwebpage.h"
525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "qwebpage_p.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <QUndoStack>
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h>
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/OwnPtr.h>
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define methodDebug() qDebug("EditorClientQt: %s", __FUNCTION__);
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic QString dumpPath(WebCore::Node *node)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QString str = node->nodeName();
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Node *parent = node->parentNode();
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (parent) {
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        str.append(QLatin1String(" > "));
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        str.append(parent->nodeName());
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parent = parent->parentNode();
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return str;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic QString dumpRange(WebCore::Range *range)
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!range)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return QLatin1String("(null)");
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::ExceptionCode code;
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    QString str = QString::fromLatin1("range from %1 of %2 to %3 of %4")
802bde8e466a4451c7319e3a072d118917957d6554Steve Block            .arg(range->startOffset(code)).arg(dumpPath(range->startContainer(code)))
812bde8e466a4451c7319e3a072d118917957d6554Steve Block            .arg(range->endOffset(code)).arg(dumpPath(range->endContainer(code)));
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return str;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool EditorClientQt::dumpEditingCallbacks = false;
906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool EditorClientQt::acceptsEditing = true;
916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace HTMLNames;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldDeleteRange(Range* range)
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldDeleteDOMRange:%s\n", dumpRange(range).toUtf8().constData());
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldShowDeleteInterface(HTMLElement* element)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (QWebPagePrivate::drtRun)
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return element->getAttribute(classAttr) == "needsDeletionUI";
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::isContinuousSpellCheckingEnabled()
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::isGrammarCheckingEnabled()
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint EditorClientQt::spellCheckerDocumentTag()
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldBeginEditing(WebCore::Range* range)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldBeginEditingInDOMRange:%s\n", dumpRange(range).toUtf8().constData());
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldEndEditing(WebCore::Range* range)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldEndEditingInDOMRange:%s\n", dumpRange(range).toUtf8().constData());
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldInsertText(const String& string, Range* range, EditorInsertAction action)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks) {
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const char *insertactionstring[] = {
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionTyped",
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionPasted",
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionDropped",
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldInsertText:%s replacingDOMRange:%s givenAction:%s\n",
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               QString(string).toUtf8().constData(), dumpRange(range).toUtf8().constData(), insertactionstring[action]);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return acceptsEditing;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldChangeSelectedRange(Range* currentRange, Range* proposedRange, EAffinity selectionAffinity, bool stillSelecting)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks) {
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const char *affinitystring[] = {
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "NSSelectionAffinityUpstream",
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "NSSelectionAffinityDownstream"
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const char *boolstring[] = {
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "FALSE",
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "TRUE"
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldChangeSelectedDOMRange:%s toDOMRange:%s affinity:%s stillSelecting:%s\n",
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               dumpRange(currentRange).toUtf8().constData(),
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               dumpRange(proposedRange).toUtf8().constData(),
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               affinitystring[selectionAffinity], boolstring[stillSelecting]);
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return acceptsEditing;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldApplyStyle(WebCore::CSSStyleDeclaration* style,
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                      WebCore::Range* range)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldApplyStyle:%s toElementsInDOMRange:%s\n",
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               QString(style->cssText()).toUtf8().constData(), dumpRange(range).toUtf8().constData());
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return acceptsEditing;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*)
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::didBeginEditing()
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification\n");
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = true;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::respondToChangedContents()
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n");
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->d->updateEditorActions();
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    emit m_page->contentsChanged();
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::respondToChangedSelection()
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n");
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//     const Selection &selection = m_page->d->page->selection();
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//     char buffer[1024];
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//     selection.formatForDebugger(buffer, sizeof(buffer));
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//     printf("%s\n", buffer);
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->d->updateEditorActions();
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    emit m_page->selectionChanged();
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!frame->editor()->ignoreCompositionSelectionChange())
217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        emit m_page->microFocusChanged();
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::didEndEditing()
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks)
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: webViewDidEndEditing:WebViewDidEndEditingNotification\n");
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = false;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::didWriteSelectionToPasteboard()
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::didSetSelectionTypesForPasteboard()
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::selectWordBeforeMenuEvent()
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand> cmd)
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
2455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (m_inUndoRedo || (frame && !frame->editor()->lastEditCommand() /* HACK!! Don't recreate undos */))
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->push(new EditCommandQt(cmd));
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // QT_NO_UNDOSTACK
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::clearUndoRedoOperations()
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->clear();
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool EditorClientQt::canCopyCut(bool defaultValue) const
26381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
26781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool EditorClientQt::canPaste(bool defaultValue) const
26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
27081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::canUndo() const
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef QT_NO_UNDOSTACK
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->canUndo();
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::canRedo() const
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef QT_NO_UNDOSTACK
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->canRedo();
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::undo()
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = true;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->undo();
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = false;
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::redo()
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = true;
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->redo();
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = false;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldInsertNode(Node* node, Range* range, EditorInsertAction action)
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks) {
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const char *insertactionstring[] = {
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionTyped",
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionPasted",
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionDropped",
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldInsertNode:%s replacingDOMRange:%s givenAction:%s\n", dumpPath(node).toUtf8().constData(),
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               dumpRange(range).toUtf8().constData(), insertactionstring[action]);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return acceptsEditing;
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::pageDestroyed()
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::smartInsertDeleteEnabled()
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_page->d->smartInsertDeleteEnabled;
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EditorClientQt::toggleSmartInsertDelete()
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool current = m_page->d->smartInsertDeleteEnabled;
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_page->d->smartInsertDeleteEnabled = !current;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool EditorClientQt::isSelectTrailingWhitespaceEnabled()
340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_page->d->selectTrailingWhitespaceEnabled;
342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::toggleContinuousSpellChecking()
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::toggleGrammarChecking()
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
354cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned CtrlKey = 1 << 0;
355cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned AltKey = 1 << 1;
356cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned ShiftKey = 1 << 2;
357cad810f21b803229eb11403f9209855525a25d57Steve Block
358cad810f21b803229eb11403f9209855525a25d57Steve Blockstruct KeyDownEntry {
359cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned virtualKey;
360cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned modifiers;
361cad810f21b803229eb11403f9209855525a25d57Steve Block    const char* editorCommand;
362cad810f21b803229eb11403f9209855525a25d57Steve Block};
363cad810f21b803229eb11403f9209855525a25d57Steve Block
364cad810f21b803229eb11403f9209855525a25d57Steve Block// Handle here key down events that are needed for spatial navigation and caret browsing, or
365cad810f21b803229eb11403f9209855525a25d57Steve Block// are not handled by QWebPage.
366cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const KeyDownEntry keyDownEntries[] = {
367cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that do not have an associated QAction:
368cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_DELETE, 0,                  "DeleteForward"                     },
369cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_BACK,   ShiftKey,           "DeleteBackward"                    },
370cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_BACK,   0,                  "DeleteBackward"                    },
371cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that need special handling for caret browsing:
372cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_PRIOR,  0,                  "MovePageUp"                        },
373cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_PRIOR,  ShiftKey,           "MovePageUpAndModifySelection"      },
374cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_NEXT,   0,                  "MovePageDown"                      },
375cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_NEXT,   ShiftKey,           "MovePageDownAndModifySelection"    },
376cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that need special handling for spatial navigation:
377cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_LEFT,   0,                  "MoveLeft"                          },
378cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_RIGHT,  0,                  "MoveRight"                         },
379cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_UP,     0,                  "MoveUp"                            },
380cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_DOWN,   0,                  "MoveDown"                          },
381cad810f21b803229eb11403f9209855525a25d57Steve Block};
382cad810f21b803229eb11403f9209855525a25d57Steve Block
383cad810f21b803229eb11403f9209855525a25d57Steve Blockconst char* editorCommandForKeyDownEvent(const KeyboardEvent* event)
384cad810f21b803229eb11403f9209855525a25d57Steve Block{
385cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->type() != eventNames().keydownEvent)
386cad810f21b803229eb11403f9209855525a25d57Steve Block        return "";
387cad810f21b803229eb11403f9209855525a25d57Steve Block
388cad810f21b803229eb11403f9209855525a25d57Steve Block    static HashMap<int, const char*> keyDownCommandsMap;
389cad810f21b803229eb11403f9209855525a25d57Steve Block    if (keyDownCommandsMap.isEmpty()) {
390cad810f21b803229eb11403f9209855525a25d57Steve Block
391cad810f21b803229eb11403f9209855525a25d57Steve Block        unsigned numEntries = sizeof(keyDownEntries) / sizeof((keyDownEntries)[0]);
392cad810f21b803229eb11403f9209855525a25d57Steve Block        for (unsigned i = 0; i < numEntries; i++)
393cad810f21b803229eb11403f9209855525a25d57Steve Block            keyDownCommandsMap.set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].editorCommand);
394cad810f21b803229eb11403f9209855525a25d57Steve Block    }
395cad810f21b803229eb11403f9209855525a25d57Steve Block
396cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned modifiers = 0;
397cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->shiftKey())
398cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= ShiftKey;
399cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->altKey())
400cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= AltKey;
401cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->ctrlKey())
402cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= CtrlKey;
403cad810f21b803229eb11403f9209855525a25d57Steve Block
404cad810f21b803229eb11403f9209855525a25d57Steve Block    int mapKey = modifiers << 16 | event->keyCode();
405cad810f21b803229eb11403f9209855525a25d57Steve Block    return mapKey ? keyDownCommandsMap.get(mapKey) : 0;
406cad810f21b803229eb11403f9209855525a25d57Steve Block}
407cad810f21b803229eb11403f9209855525a25d57Steve Block
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::handleKeyboardEvent(KeyboardEvent* event)
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
411f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!frame)
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const PlatformKeyboardEvent* kevent = event->keyEvent();
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!kevent || kevent->type() == PlatformKeyboardEvent::KeyUp)
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* start = frame->selection()->start().containerNode();
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!start)
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: refactor all of this to use Actions or something like them
4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (start->isContentEditable()) {
42428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        bool doSpatialNavigation = false;
42528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (isSpatialNavigationEnabled(frame)) {
42628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (!kevent->modifiers()) {
42728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                switch (kevent->windowsVirtualKeyCode()) {
42828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_LEFT:
42928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_RIGHT:
43028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_UP:
43128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_DOWN:
43228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    doSpatialNavigation = true;
43328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                }
43428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            }
43528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef QT_NO_SHORTCUT
438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        QWebPage::WebAction action = QWebPagePrivate::editorActionForKeyEvent(kevent->qtEvent());
43928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (action != QWebPage::NoWebAction && !doSpatialNavigation) {
440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            const char* cmd = QWebPagePrivate::editorCommandForWebActions(action);
441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // WebKit doesn't have enough information about mode to decide how commands that just insert text if executed via Editor should be treated,
442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // so we leave it upon WebCore to either handle them immediately (e.g. Tab that changes focus) or let a keypress event be generated
443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // (e.g. Tab that inserts a Tab character, or Enter).
444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (cmd && frame->editor()->command(cmd).isTextInsertion()
445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                && kevent->type() == PlatformKeyboardEvent::RawKeyDown)
446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return;
447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_page->triggerAction(action);
449cad810f21b803229eb11403f9209855525a25d57Steve Block            event->setDefaultHandled();
450cad810f21b803229eb11403f9209855525a25d57Steve Block            return;
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else
452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // QT_NO_SHORTCUT
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
454cad810f21b803229eb11403f9209855525a25d57Steve Block            String commandName = editorCommandForKeyDownEvent(event);
455cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!commandName.isEmpty()) {
456cad810f21b803229eb11403f9209855525a25d57Steve Block                if (frame->editor()->command(commandName).execute()) // Event handled.
457cad810f21b803229eb11403f9209855525a25d57Steve Block                    event->setDefaultHandled();
45828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                return;
459cad810f21b803229eb11403f9209855525a25d57Steve Block            }
460cad810f21b803229eb11403f9209855525a25d57Steve Block
461cad810f21b803229eb11403f9209855525a25d57Steve Block            if (kevent->windowsVirtualKeyCode() == VK_TAB) {
462cad810f21b803229eb11403f9209855525a25d57Steve Block                // Do not handle TAB text insertion here.
46328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                return;
464cad810f21b803229eb11403f9209855525a25d57Steve Block            }
465cad810f21b803229eb11403f9209855525a25d57Steve Block
466cad810f21b803229eb11403f9209855525a25d57Steve Block            // Text insertion.
467cad810f21b803229eb11403f9209855525a25d57Steve Block            bool shouldInsertText = false;
468cad810f21b803229eb11403f9209855525a25d57Steve Block            if (kevent->type() != PlatformKeyboardEvent::KeyDown && !kevent->text().isEmpty()) {
469cad810f21b803229eb11403f9209855525a25d57Steve Block
470cad810f21b803229eb11403f9209855525a25d57Steve Block                if (kevent->ctrlKey()) {
471cad810f21b803229eb11403f9209855525a25d57Steve Block                    if (kevent->altKey())
472cad810f21b803229eb11403f9209855525a25d57Steve Block                        shouldInsertText = true;
473cad810f21b803229eb11403f9209855525a25d57Steve Block                } else {
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef Q_WS_MAC
4755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                // We need to exclude checking for Alt because it is just a different Shift
476cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!kevent->altKey())
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
478cad810f21b803229eb11403f9209855525a25d57Steve Block                    shouldInsertText = true;
479cad810f21b803229eb11403f9209855525a25d57Steve Block
4805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                }
481cad810f21b803229eb11403f9209855525a25d57Steve Block            }
482cad810f21b803229eb11403f9209855525a25d57Steve Block
483cad810f21b803229eb11403f9209855525a25d57Steve Block            if (shouldInsertText) {
484cad810f21b803229eb11403f9209855525a25d57Steve Block                frame->editor()->insertText(kevent->text(), event);
485cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
4865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                return;
487cad810f21b803229eb11403f9209855525a25d57Steve Block            }
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
489cad810f21b803229eb11403f9209855525a25d57Steve Block
490cad810f21b803229eb11403f9209855525a25d57Steve Block        // Event not handled.
491cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
492cad810f21b803229eb11403f9209855525a25d57Steve Block    }
493cad810f21b803229eb11403f9209855525a25d57Steve Block
494cad810f21b803229eb11403f9209855525a25d57Steve Block    // Non editable content.
495cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_page->handle()->page->settings()->caretBrowsingEnabled()) {
496cad810f21b803229eb11403f9209855525a25d57Steve Block        switch (kevent->windowsVirtualKeyCode()) {
497cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_LEFT:
498cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_RIGHT:
499cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_UP:
500cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_DOWN:
501cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_HOME:
502cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_END:
503cad810f21b803229eb11403f9209855525a25d57Steve Block            {
50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_SHORTCUT
505cad810f21b803229eb11403f9209855525a25d57Steve Block                QWebPage::WebAction action = QWebPagePrivate::editorActionForKeyEvent(kevent->qtEvent());
506cad810f21b803229eb11403f9209855525a25d57Steve Block                ASSERT(action != QWebPage::NoWebAction);
507cad810f21b803229eb11403f9209855525a25d57Steve Block                m_page->triggerAction(action);
508cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
50965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
510cad810f21b803229eb11403f9209855525a25d57Steve Block                return;
511cad810f21b803229eb11403f9209855525a25d57Steve Block            }
512cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_PRIOR: // PageUp
513cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_NEXT:  // PageDown
514cad810f21b803229eb11403f9209855525a25d57Steve Block            {
515cad810f21b803229eb11403f9209855525a25d57Steve Block                String commandName = editorCommandForKeyDownEvent(event);
516cad810f21b803229eb11403f9209855525a25d57Steve Block                ASSERT(!commandName.isEmpty());
517cad810f21b803229eb11403f9209855525a25d57Steve Block                frame->editor()->command(commandName).execute();
518cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
519cad810f21b803229eb11403f9209855525a25d57Steve Block                return;
520f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
521f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
522cad810f21b803229eb11403f9209855525a25d57Steve Block    }
523cad810f21b803229eb11403f9209855525a25d57Steve Block
524635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef QT_NO_SHORTCUT
525cad810f21b803229eb11403f9209855525a25d57Steve Block    if (kevent->qtEvent() == QKeySequence::Copy) {
526cad810f21b803229eb11403f9209855525a25d57Steve Block        m_page->triggerAction(QWebPage::Copy);
527cad810f21b803229eb11403f9209855525a25d57Steve Block        event->setDefaultHandled();
528cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
530cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // QT_NO_SHORTCUT
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5332bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid EditorClientQt::handleInputMethodKeydown(KeyboardEvent* event)
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5352bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef QT_NO_SHORTCUT
5362bde8e466a4451c7319e3a072d118917957d6554Steve Block    const PlatformKeyboardEvent* kevent = event->keyEvent();
5372bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (kevent->type() == PlatformKeyboardEvent::RawKeyDown) {
5382bde8e466a4451c7319e3a072d118917957d6554Steve Block        QWebPage::WebAction action = QWebPagePrivate::editorActionForKeyEvent(kevent->qtEvent());
5392bde8e466a4451c7319e3a072d118917957d6554Steve Block        switch (action) {
5402bde8e466a4451c7319e3a072d118917957d6554Steve Block        case QWebPage::InsertParagraphSeparator:
5412bde8e466a4451c7319e3a072d118917957d6554Steve Block        case QWebPage::InsertLineSeparator:
5422bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_page->triggerAction(action);
5432bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
5442bde8e466a4451c7319e3a072d118917957d6554Steve Block        default:
5452bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
5462bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5472bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5482bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEditorClientQt::EditorClientQt(QWebPage* page)
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_page(page), m_editing(false), m_inUndoRedo(false)
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textFieldDidBeginEditing(Element*)
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = true;
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textFieldDidEndEditing(Element*)
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = false;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textDidChangeInTextField(Element*)
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::doTextFieldCommandFromEvent(Element*, KeyboardEvent*)
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textWillBeDeletedInTextField(Element*)
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textDidChangeInTextArea(Element*)
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::ignoreWordInSpellDocument(const String&)
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::learnWord(const String&)
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::checkSpellingOfString(const UChar*, int, int*, int*)
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString EditorClientQt::getAutoCorrectSuggestionForMisspelledWord(const String&)
5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    notImplemented();
6010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return String();
6020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::checkGrammarOfString(const UChar*, int, Vector<GrammarDetail>&, int*, int*)
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::updateSpellingUIWithGrammarString(const String&, const GrammarDetail&)
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::updateSpellingUIWithMisspelledWord(const String&)
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::showSpellingUI(bool)
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::spellingUIIsShowing()
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
630f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid EditorClientQt::getGuessesForWord(const String& word, const String& context, Vector<String>& guesses)
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::isEditing() const
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_editing;
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
640967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid EditorClientQt::willSetInputMethodState()
641967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
642967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
643967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::setInputMethodState(bool active)
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QWebPageClient* webPageClient = m_page->d->client.get();
647cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (webPageClient) {
648dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        Qt::InputMethodHints hints;
649dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
650545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        HTMLInputElement* inputElement = 0;
651545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
652545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (frame && frame->document() && frame->document()->focusedNode())
653545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag))
654545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                inputElement = static_cast<HTMLInputElement*>(frame->document()->focusedNode());
655545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
656545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (inputElement) {
6570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // Set input method hints for "number", "tel", "email", "url" and "password" input elements.
658dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isTelephoneField())
659dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhDialableCharactersOnly;
660dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isNumberField())
661dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhDigitsOnly;
662dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isEmailField())
663dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhEmailCharactersOnly;
66468513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (inputElement->isURLField())
665dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhUrlCharactersOnly;
6660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // Setting the Qt::WA_InputMethodEnabled attribute true and Qt::ImhHiddenText flag
6670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // for password fields. The Qt platform is responsible for determining which widget
6680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // will receive input method events for password fields.
669dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isPasswordField()) {
6700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                active = true;
671dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhHiddenText;
672dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            }
673cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
674545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
675545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // disables auto-uppercase and predictive text for mobile devices
677dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        hints |= Qt::ImhNoAutoUppercase;
678dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        hints |= Qt::ImhNoPredictiveText;
679545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif // Q_WS_MAEMO_5 || Q_WS_MAEMO_6 || Q_OS_SYMBIAN
680bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        webPageClient->setInputMethodHints(hints);
681cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        webPageClient->setInputMethodEnabled(active);
682cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    emit m_page->microFocusChanged();
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// vim: ts=4 sw=4 et
689