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