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