From 98bfc8b8db811eb902290dbe87660ce799a44c27 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Tue, 6 Jul 2010 13:48:23 +1000
Subject: Fix input methods for TextInput elements with key handlers

Task-number: QTBUG-10297
Reviewed-by: Martin Jones
---
 .../graphicsitems/qdeclarativetextinput.cpp        |  1 +
 .../data/inputmethodhints.qml                      |  6 -----
 .../qdeclarativetextinput/data/inputmethods.qml    |  7 ++++++
 .../tst_qdeclarativetextinput.cpp                  | 29 ++++++++++++++++------
 4 files changed, 29 insertions(+), 14 deletions(-)
 delete mode 100644 tests/auto/declarative/qdeclarativetextinput/data/inputmethodhints.qml
 create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml

diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 374f371..c2eea6e 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -908,6 +908,7 @@ void QDeclarativeTextInput::keyPressEvent(QKeyEvent* ev)
 void QDeclarativeTextInput::inputMethodEvent(QInputMethodEvent *ev)
 {
     Q_D(QDeclarativeTextInput);
+    ev->ignore();
     inputMethodPreHandler(ev);
     if (ev->isAccepted())
         return;
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/inputmethodhints.qml b/tests/auto/declarative/qdeclarativetextinput/data/inputmethodhints.qml
deleted file mode 100644
index da6b81f..0000000
--- a/tests/auto/declarative/qdeclarativetextinput/data/inputmethodhints.qml
+++ /dev/null
@@ -1,6 +0,0 @@
-import Qt 4.7
-
-TextInput {
-    text: "Hello world!"
-    inputMethodHints: Qt.ImhNoPredictiveText
-}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml b/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml
new file mode 100644
index 0000000..405ee22
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml
@@ -0,0 +1,7 @@
+import Qt 4.7
+
+TextInput {
+    text: "Hello world!"
+    inputMethodHints: Qt.ImhNoPredictiveText
+    Keys.onLeftPressed: {}
+}
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index b6ca7e5..5354f42 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -79,7 +79,7 @@ private slots:
     void maxLength();
     void masks();
     void validators();
-    void inputMethodHints();
+    void inputMethods();
 
     void cursorDelegate();
     void navigation();
@@ -609,18 +609,31 @@ void tst_qdeclarativetextinput::validators()
     delete canvas;
 }
 
-void tst_qdeclarativetextinput::inputMethodHints()
+void tst_qdeclarativetextinput::inputMethods()
 {
-    QDeclarativeView *canvas = createView(SRCDIR "/data/inputmethodhints.qml");
+    QDeclarativeView *canvas = createView(SRCDIR "/data/inputmethods.qml");
     canvas->show();
     canvas->setFocus();
+    QApplication::setActiveWindow(canvas);
+    QTest::qWaitForWindowShown(canvas);
 
+    // test input method hints
     QVERIFY(canvas->rootObject() != 0);
-    QDeclarativeTextInput *textinputObject = qobject_cast<QDeclarativeTextInput *>(canvas->rootObject());
-    QVERIFY(textinputObject != 0);
-    QVERIFY(textinputObject->inputMethodHints() & Qt::ImhNoPredictiveText);
-    textinputObject->setInputMethodHints(Qt::ImhUppercaseOnly);
-    QVERIFY(textinputObject->inputMethodHints() & Qt::ImhUppercaseOnly);
+    QDeclarativeTextInput *input = qobject_cast<QDeclarativeTextInput *>(canvas->rootObject());
+    QVERIFY(input != 0);
+    QVERIFY(input->inputMethodHints() & Qt::ImhNoPredictiveText);
+    input->setInputMethodHints(Qt::ImhUppercaseOnly);
+    QVERIFY(input->inputMethodHints() & Qt::ImhUppercaseOnly);
+
+    QVERIFY(canvas->rootObject() != 0);
+
+    input->setFocus(true);
+    QVERIFY(input->hasFocus() == true);
+    // test that input method event is committed
+    QInputMethodEvent event;
+    event.setCommitString( "My ", -12, 0);
+    QApplication::sendEvent(canvas, &event);
+    QCOMPARE(input->text(), QString("My Hello world!"));
 
     delete canvas;
 }
-- 
cgit v0.12