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