EditorClientQt.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString str = QString("range from %1 of %2 to %3 of %4")
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        .arg(range->startOffset(code)).arg(dumpPath(range->startContainer(code)))
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        .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 Projectbool EditorClientQt::isEditable()
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_page->isContentEditable();
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand> cmd)
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
2505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (m_inUndoRedo || (frame && !frame->editor()->lastEditCommand() /* HACK!! Don't recreate undos */))
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->push(new EditCommandQt(cmd));
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // QT_NO_UNDOSTACK
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>)
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::clearUndoRedoOperations()
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->clear();
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::canUndo() const
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef QT_NO_UNDOSTACK
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->canUndo();
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::canRedo() const
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef QT_NO_UNDOSTACK
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_page->undoStack()->canRedo();
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::undo()
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = true;
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->undo();
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = false;
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::redo()
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_UNDOSTACK
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = true;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_page->undoStack()->redo();
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inUndoRedo = false;
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::shouldInsertNode(Node* node, Range* range, EditorInsertAction action)
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dumpEditingCallbacks) {
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const char *insertactionstring[] = {
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionTyped",
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionPasted",
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            "WebViewInsertActionDropped",
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf("EDITING DELEGATE: shouldInsertNode:%s replacingDOMRange:%s givenAction:%s\n", dumpPath(node).toUtf8().constData(),
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project               dumpRange(range).toUtf8().constData(), insertactionstring[action]);
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return acceptsEditing;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::pageDestroyed()
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::smartInsertDeleteEnabled()
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_page->d->smartInsertDeleteEnabled;
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EditorClientQt::toggleSmartInsertDelete()
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool current = m_page->d->smartInsertDeleteEnabled;
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_page->d->smartInsertDeleteEnabled = !current;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool EditorClientQt::isSelectTrailingWhitespaceEnabled()
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_page->d->selectTrailingWhitespaceEnabled;
337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::toggleContinuousSpellChecking()
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::toggleGrammarChecking()
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
349cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned CtrlKey = 1 << 0;
350cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned AltKey = 1 << 1;
351cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const unsigned ShiftKey = 1 << 2;
352cad810f21b803229eb11403f9209855525a25d57Steve Block
353cad810f21b803229eb11403f9209855525a25d57Steve Blockstruct KeyDownEntry {
354cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned virtualKey;
355cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned modifiers;
356cad810f21b803229eb11403f9209855525a25d57Steve Block    const char* editorCommand;
357cad810f21b803229eb11403f9209855525a25d57Steve Block};
358cad810f21b803229eb11403f9209855525a25d57Steve Block
359cad810f21b803229eb11403f9209855525a25d57Steve Block// Handle here key down events that are needed for spatial navigation and caret browsing, or
360cad810f21b803229eb11403f9209855525a25d57Steve Block// are not handled by QWebPage.
361cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic const KeyDownEntry keyDownEntries[] = {
362cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that do not have an associated QAction:
363cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_DELETE, 0,                  "DeleteForward"                     },
364cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_BACK,   ShiftKey,           "DeleteBackward"                    },
365cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_BACK,   0,                  "DeleteBackward"                    },
366cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that need special handling for caret browsing:
367cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_PRIOR,  0,                  "MovePageUp"                        },
368cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_PRIOR,  ShiftKey,           "MovePageUpAndModifySelection"      },
369cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_NEXT,   0,                  "MovePageDown"                      },
370cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_NEXT,   ShiftKey,           "MovePageDownAndModifySelection"    },
371cad810f21b803229eb11403f9209855525a25d57Steve Block    // Ones that need special handling for spatial navigation:
372cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_LEFT,   0,                  "MoveLeft"                          },
373cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_RIGHT,  0,                  "MoveRight"                         },
374cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_UP,     0,                  "MoveUp"                            },
375cad810f21b803229eb11403f9209855525a25d57Steve Block    { VK_DOWN,   0,                  "MoveDown"                          },
376cad810f21b803229eb11403f9209855525a25d57Steve Block};
377cad810f21b803229eb11403f9209855525a25d57Steve Block
378cad810f21b803229eb11403f9209855525a25d57Steve Blockconst char* editorCommandForKeyDownEvent(const KeyboardEvent* event)
379cad810f21b803229eb11403f9209855525a25d57Steve Block{
380cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->type() != eventNames().keydownEvent)
381cad810f21b803229eb11403f9209855525a25d57Steve Block        return "";
382cad810f21b803229eb11403f9209855525a25d57Steve Block
383cad810f21b803229eb11403f9209855525a25d57Steve Block    static HashMap<int, const char*> keyDownCommandsMap;
384cad810f21b803229eb11403f9209855525a25d57Steve Block    if (keyDownCommandsMap.isEmpty()) {
385cad810f21b803229eb11403f9209855525a25d57Steve Block
386cad810f21b803229eb11403f9209855525a25d57Steve Block        unsigned numEntries = sizeof(keyDownEntries) / sizeof((keyDownEntries)[0]);
387cad810f21b803229eb11403f9209855525a25d57Steve Block        for (unsigned i = 0; i < numEntries; i++)
388cad810f21b803229eb11403f9209855525a25d57Steve Block            keyDownCommandsMap.set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].editorCommand);
389cad810f21b803229eb11403f9209855525a25d57Steve Block    }
390cad810f21b803229eb11403f9209855525a25d57Steve Block
391cad810f21b803229eb11403f9209855525a25d57Steve Block    unsigned modifiers = 0;
392cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->shiftKey())
393cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= ShiftKey;
394cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->altKey())
395cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= AltKey;
396cad810f21b803229eb11403f9209855525a25d57Steve Block    if (event->ctrlKey())
397cad810f21b803229eb11403f9209855525a25d57Steve Block        modifiers |= CtrlKey;
398cad810f21b803229eb11403f9209855525a25d57Steve Block
399cad810f21b803229eb11403f9209855525a25d57Steve Block    int mapKey = modifiers << 16 | event->keyCode();
400cad810f21b803229eb11403f9209855525a25d57Steve Block    return mapKey ? keyDownCommandsMap.get(mapKey) : 0;
401cad810f21b803229eb11403f9209855525a25d57Steve Block}
402cad810f21b803229eb11403f9209855525a25d57Steve Block
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::handleKeyboardEvent(KeyboardEvent* event)
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!frame)
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const PlatformKeyboardEvent* kevent = event->keyEvent();
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!kevent || kevent->type() == PlatformKeyboardEvent::KeyUp)
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* start = frame->selection()->start().node();
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!start)
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: refactor all of this to use Actions or something like them
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (start->isContentEditable()) {
41928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        bool doSpatialNavigation = false;
42028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (isSpatialNavigationEnabled(frame)) {
42128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (!kevent->modifiers()) {
42228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                switch (kevent->windowsVirtualKeyCode()) {
42328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_LEFT:
42428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_RIGHT:
42528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_UP:
42628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                case VK_DOWN:
42728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    doSpatialNavigation = true;
42828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                }
42928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            }
43028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef QT_NO_SHORTCUT
433635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        QWebPage::WebAction action = QWebPagePrivate::editorActionForKeyEvent(kevent->qtEvent());
43428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (action != QWebPage::NoWebAction && !doSpatialNavigation) {
435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            const char* cmd = QWebPagePrivate::editorCommandForWebActions(action);
436635860845790a19bf50bbc51ba8fb66a96dde068The 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,
437635860845790a19bf50bbc51ba8fb66a96dde068The 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
438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // (e.g. Tab that inserts a Tab character, or Enter).
439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (cmd && frame->editor()->command(cmd).isTextInsertion()
440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                && kevent->type() == PlatformKeyboardEvent::RawKeyDown)
441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return;
442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_page->triggerAction(action);
444cad810f21b803229eb11403f9209855525a25d57Steve Block            event->setDefaultHandled();
445cad810f21b803229eb11403f9209855525a25d57Steve Block            return;
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else
447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // QT_NO_SHORTCUT
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
449cad810f21b803229eb11403f9209855525a25d57Steve Block            String commandName = editorCommandForKeyDownEvent(event);
450cad810f21b803229eb11403f9209855525a25d57Steve Block            if (!commandName.isEmpty()) {
451cad810f21b803229eb11403f9209855525a25d57Steve Block                if (frame->editor()->command(commandName).execute()) // Event handled.
452cad810f21b803229eb11403f9209855525a25d57Steve Block                    event->setDefaultHandled();
45328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                return;
454cad810f21b803229eb11403f9209855525a25d57Steve Block            }
455cad810f21b803229eb11403f9209855525a25d57Steve Block
456cad810f21b803229eb11403f9209855525a25d57Steve Block            if (kevent->windowsVirtualKeyCode() == VK_TAB) {
457cad810f21b803229eb11403f9209855525a25d57Steve Block                // Do not handle TAB text insertion here.
45828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                return;
459cad810f21b803229eb11403f9209855525a25d57Steve Block            }
460cad810f21b803229eb11403f9209855525a25d57Steve Block
461cad810f21b803229eb11403f9209855525a25d57Steve Block            // Text insertion.
462cad810f21b803229eb11403f9209855525a25d57Steve Block            bool shouldInsertText = false;
463cad810f21b803229eb11403f9209855525a25d57Steve Block            if (kevent->type() != PlatformKeyboardEvent::KeyDown && !kevent->text().isEmpty()) {
464cad810f21b803229eb11403f9209855525a25d57Steve Block
465cad810f21b803229eb11403f9209855525a25d57Steve Block                if (kevent->ctrlKey()) {
466cad810f21b803229eb11403f9209855525a25d57Steve Block                    if (kevent->altKey())
467cad810f21b803229eb11403f9209855525a25d57Steve Block                        shouldInsertText = true;
468cad810f21b803229eb11403f9209855525a25d57Steve Block                } else {
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef Q_WS_MAC
4705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                // We need to exclude checking for Alt because it is just a different Shift
471cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!kevent->altKey())
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
473cad810f21b803229eb11403f9209855525a25d57Steve Block                    shouldInsertText = true;
474cad810f21b803229eb11403f9209855525a25d57Steve Block
4755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                }
476cad810f21b803229eb11403f9209855525a25d57Steve Block            }
477cad810f21b803229eb11403f9209855525a25d57Steve Block
478cad810f21b803229eb11403f9209855525a25d57Steve Block            if (shouldInsertText) {
479cad810f21b803229eb11403f9209855525a25d57Steve Block                frame->editor()->insertText(kevent->text(), event);
480cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
4815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                return;
482cad810f21b803229eb11403f9209855525a25d57Steve Block            }
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
484cad810f21b803229eb11403f9209855525a25d57Steve Block
485cad810f21b803229eb11403f9209855525a25d57Steve Block        // Event not handled.
486cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
487cad810f21b803229eb11403f9209855525a25d57Steve Block    }
488cad810f21b803229eb11403f9209855525a25d57Steve Block
489cad810f21b803229eb11403f9209855525a25d57Steve Block    // Non editable content.
490cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_page->handle()->page->settings()->caretBrowsingEnabled()) {
491cad810f21b803229eb11403f9209855525a25d57Steve Block        switch (kevent->windowsVirtualKeyCode()) {
492cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_LEFT:
493cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_RIGHT:
494cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_UP:
495cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_DOWN:
496cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_HOME:
497cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_END:
498cad810f21b803229eb11403f9209855525a25d57Steve Block            {
49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_SHORTCUT
500cad810f21b803229eb11403f9209855525a25d57Steve Block                QWebPage::WebAction action = QWebPagePrivate::editorActionForKeyEvent(kevent->qtEvent());
501cad810f21b803229eb11403f9209855525a25d57Steve Block                ASSERT(action != QWebPage::NoWebAction);
502cad810f21b803229eb11403f9209855525a25d57Steve Block                m_page->triggerAction(action);
503cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
505cad810f21b803229eb11403f9209855525a25d57Steve Block                return;
506cad810f21b803229eb11403f9209855525a25d57Steve Block            }
507cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_PRIOR: // PageUp
508cad810f21b803229eb11403f9209855525a25d57Steve Block        case VK_NEXT:  // PageDown
509cad810f21b803229eb11403f9209855525a25d57Steve Block            {
510cad810f21b803229eb11403f9209855525a25d57Steve Block                String commandName = editorCommandForKeyDownEvent(event);
511cad810f21b803229eb11403f9209855525a25d57Steve Block                ASSERT(!commandName.isEmpty());
512cad810f21b803229eb11403f9209855525a25d57Steve Block                frame->editor()->command(commandName).execute();
513cad810f21b803229eb11403f9209855525a25d57Steve Block                event->setDefaultHandled();
514cad810f21b803229eb11403f9209855525a25d57Steve Block                return;
515f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
516f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
517cad810f21b803229eb11403f9209855525a25d57Steve Block    }
518cad810f21b803229eb11403f9209855525a25d57Steve Block
519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef QT_NO_SHORTCUT
520cad810f21b803229eb11403f9209855525a25d57Steve Block    if (kevent->qtEvent() == QKeySequence::Copy) {
521cad810f21b803229eb11403f9209855525a25d57Steve Block        m_page->triggerAction(QWebPage::Copy);
522cad810f21b803229eb11403f9209855525a25d57Steve Block        event->setDefaultHandled();
523cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
525cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // QT_NO_SHORTCUT
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::handleInputMethodKeydown(KeyboardEvent*)
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEditorClientQt::EditorClientQt(QWebPage* page)
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_page(page), m_editing(false), m_inUndoRedo(false)
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textFieldDidBeginEditing(Element*)
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = true;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textFieldDidEndEditing(Element*)
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editing = false;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textDidChangeInTextField(Element*)
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::doTextFieldCommandFromEvent(Element*, KeyboardEvent*)
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textWillBeDeletedInTextField(Element*)
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::textDidChangeInTextArea(Element*)
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::ignoreWordInSpellDocument(const String&)
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::learnWord(const String&)
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::checkSpellingOfString(const UChar*, int, int*, int*)
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString EditorClientQt::getAutoCorrectSuggestionForMisspelledWord(const String&)
5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    notImplemented();
5820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return String();
5830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::checkGrammarOfString(const UChar*, int, Vector<GrammarDetail>&, int*, int*)
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::updateSpellingUIWithGrammarString(const String&, const GrammarDetail&)
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::updateSpellingUIWithMisspelledWord(const String&)
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::showSpellingUI(bool)
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::spellingUIIsShowing()
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
611f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid EditorClientQt::getGuessesForWord(const String& word, const String& context, Vector<String>& guesses)
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientQt::isEditing() const
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_editing;
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
621967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid EditorClientQt::willSetInputMethodState()
622967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
623967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
624967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientQt::setInputMethodState(bool active)
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
627f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QWebPageClient* webPageClient = m_page->d->client.get();
628cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (webPageClient) {
629dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        Qt::InputMethodHints hints;
630dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
631545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        HTMLInputElement* inputElement = 0;
632545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
633545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (frame && frame->document() && frame->document()->focusedNode())
634545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag))
635545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                inputElement = static_cast<HTMLInputElement*>(frame->document()->focusedNode());
636545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
637545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (inputElement) {
6380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // Set input method hints for "number", "tel", "email", "url" and "password" input elements.
639dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isTelephoneField())
640dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhDialableCharactersOnly;
641dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isNumberField())
642dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhDigitsOnly;
643dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isEmailField())
644dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhEmailCharactersOnly;
64568513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (inputElement->isURLField())
646dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhUrlCharactersOnly;
6470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // Setting the Qt::WA_InputMethodEnabled attribute true and Qt::ImhHiddenText flag
6480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // for password fields. The Qt platform is responsible for determining which widget
6490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            // will receive input method events for password fields.
650dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (inputElement->isPasswordField()) {
6510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                active = true;
652dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                hints |= Qt::ImhHiddenText;
653dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            }
654cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
655545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
656545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // disables auto-uppercase and predictive text for mobile devices
658dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        hints |= Qt::ImhNoAutoUppercase;
659dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        hints |= Qt::ImhNoPredictiveText;
660545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif // Q_WS_MAEMO_5 || Q_WS_MAEMO_6 || Q_OS_SYMBIAN
661bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        webPageClient->setInputMethodHints(hints);
662cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        webPageClient->setInputMethodEnabled(active);
663cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
664231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    emit m_page->microFocusChanged();
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// vim: ts=4 sw=4 et
670