1cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/* 2cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 4cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 5cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Redistribution and use in source and binary forms, with or without 6cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * modification, are permitted provided that the following conditions 7cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * are met: 8cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 9cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 1. Redistributions of source code must retain the above copyright 10cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * notice, this list of conditions and the following disclaimer. 11cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 2. Redistributions in binary form must reproduce the above copyright 12cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * notice, this list of conditions and the following disclaimer in the 13cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * documentation and/or other materials provided with the distribution. 14cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * its contributors may be used to endorse or promote products derived 16cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * from this software without specific prior written permission. 17cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * 18cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block */ 29cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "config.h" 30cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "TextInputControllerQt.h" 312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DumpRenderTreeSupportQt.h" 32cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 33cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <QApplication> 3421939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <QInputMethodEvent> 35cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <QKeyEvent> 36cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 37cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockTextInputController::TextInputController(QWebPage* parent) 38cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block : QObject(parent) 39cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 40cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 41cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 42cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid TextInputController::doCommand(const QString& command) 43cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 44cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block Qt::KeyboardModifiers modifiers = Qt::NoModifier; 45cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int keycode = 0; 46cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (command == "moveBackwardAndModifySelection:") { 47cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 48cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 49cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveDown:") { 50cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Down; 51cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveDownAndModifySelection:") { 52cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 53cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Down; 54cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveForward:") { 55cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 56cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveForwardAndModifySelection:") { 57cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 58cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 59cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveLeft:") { 60cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 61cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveLeftAndModifySelection:") { 62cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 63cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 64cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveRight:") { 65cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 66cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveRightAndModifySelection:") { 67cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 68cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 69cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveToBeginningOfDocument:") { 70cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 71cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Home; 72cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveToBeginningOfLine:") { 73cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Home; 74cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// } else if (command =="moveToBeginningOfParagraph:") { 75cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveToEndOfDocument:") { 76cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_End; 78cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveToEndOfLine:") { 79cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_End; 80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// } else if (command =="moveToEndOfParagraph:") { 81cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveUp:") { 82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Up; 83cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveUpAndModifySelection:") { 84cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 85cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Up; 86cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordBackward:") { 87cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 88cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Up; 89cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordBackwardAndModifySelection:") { 90cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 91cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 93cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordForward:") { 94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 96cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordForwardAndModifySelection:") { 97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 98cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 100cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordLeft:") { 101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 102cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 103cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordRight:") { 104cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 105cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 106cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordRightAndModifySelection:") { 107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 108cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Right; 110cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="moveWordLeftAndModifySelection:") { 111cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ShiftModifier; 112cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Left; 114cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="pageDown:") { 115cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_PageDown; 116cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command =="pageUp:") { 117cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_PageUp; 118cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command == "deleteWordBackward:") { 119cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block modifiers |= Qt::ControlModifier; 120cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Backspace; 121cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command == "deleteBackward:") { 122cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Backspace; 123cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } else if (command == "deleteForward:") { 124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block keycode = Qt::Key_Delete; 125cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 126cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 127cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block QKeyEvent event(QEvent::KeyPress, keycode, modifiers); 128cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block QApplication::sendEvent(parent(), &event); 129cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block QKeyEvent event2(QEvent::KeyRelease, keycode, modifiers); 130cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block QApplication::sendEvent(parent(), &event2); 131cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 13221939df44de1705786c545cd1bf519d47250322dBen Murdoch 13321939df44de1705786c545cd1bf519d47250322dBen Murdochvoid TextInputController::setMarkedText(const QString& string, int start, int end) 13421939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 13521939df44de1705786c545cd1bf519d47250322dBen Murdoch QList<QInputMethodEvent::Attribute> attributes; 13621939df44de1705786c545cd1bf519d47250322dBen Murdoch QInputMethodEvent::Attribute selection(QInputMethodEvent::Selection, start, end, QVariant()); 13721939df44de1705786c545cd1bf519d47250322dBen Murdoch attributes << selection; 13821939df44de1705786c545cd1bf519d47250322dBen Murdoch QInputMethodEvent event(string, attributes); 13921939df44de1705786c545cd1bf519d47250322dBen Murdoch QApplication::sendEvent(parent(), &event); 14021939df44de1705786c545cd1bf519d47250322dBen Murdoch} 14121939df44de1705786c545cd1bf519d47250322dBen Murdoch 14221939df44de1705786c545cd1bf519d47250322dBen Murdochvoid TextInputController::insertText(const QString& string) 14321939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 14421939df44de1705786c545cd1bf519d47250322dBen Murdoch QList<QInputMethodEvent::Attribute> attributes; 14521939df44de1705786c545cd1bf519d47250322dBen Murdoch QInputMethodEvent event(string, attributes); 14621939df44de1705786c545cd1bf519d47250322dBen Murdoch event.setCommitString(string); 14721939df44de1705786c545cd1bf519d47250322dBen Murdoch QApplication::sendEvent(parent(), &event); 14821939df44de1705786c545cd1bf519d47250322dBen Murdoch} 14921939df44de1705786c545cd1bf519d47250322dBen Murdoch 15021939df44de1705786c545cd1bf519d47250322dBen MurdochQVariantList TextInputController::selectedRange() 15121939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 15221939df44de1705786c545cd1bf519d47250322dBen Murdoch return DumpRenderTreeSupportQt::selectedRange(qobject_cast<QWebPage*>(parent())); 15321939df44de1705786c545cd1bf519d47250322dBen Murdoch} 15421939df44de1705786c545cd1bf519d47250322dBen Murdoch 15521939df44de1705786c545cd1bf519d47250322dBen MurdochQVariantList TextInputController::firstRectForCharacterRange(int location, int length) 15621939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 15721939df44de1705786c545cd1bf519d47250322dBen Murdoch return DumpRenderTreeSupportQt::firstRectForCharacterRange(qobject_cast<QWebPage*>(parent()), location, length); 15821939df44de1705786c545cd1bf519d47250322dBen Murdoch} 159