Fix tst_qlineedit.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Thu, 23 Feb 2012 16:27:47 +0000 (17:27 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 24 Feb 2012 15:21:37 +0000 (16:21 +0100)
- Fix key handling in QWidgetLineControl according to
  the keyboard scheme returned by the QPlatformTheme,
  remove #ifdefs.
- Do the same in the test.

Task-number: QTBUG-21402

Change-Id: I36d836584e7122309061af72819a4147cadd0a74
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
src/widgets/widgets/qwidgetlinecontrol.cpp
src/widgets/widgets/qwidgetlinecontrol_p.h
tests/auto/widgets/widgets/qlineedit/qlineedit.pro
tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp

index 2f5793b..73c3d14 100644 (file)
@@ -45,6 +45,8 @@
 
 #include "qabstractitemview.h"
 #include "qclipboard.h"
+#include <private/qguiapplication_p.h>
+#include <qplatformtheme_qpa.h>
 #ifndef QT_NO_ACCESSIBILITY
 #include "qaccessible.h"
 #endif
@@ -374,6 +376,14 @@ void QWidgetLineControl::init(const QString &txt)
     m_text = txt;
     updateDisplayText();
     m_cursor = m_text.length();
+    if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+        m_keyboardScheme = theme->themeHint(QPlatformTheme::KeyboardScheme).toInt();
+    // Generalize for X11
+    if (m_keyboardScheme == QPlatformTheme::KdeKeyboardScheme
+        || m_keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
+        || m_keyboardScheme == QPlatformTheme::CdeKeyboardScheme) {
+        m_keyboardScheme = QPlatformTheme::X11KeyboardScheme;
+    }
 }
 
 /*!
@@ -1630,10 +1640,11 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
     else if (event == QKeySequence::Paste) {
         if (!isReadOnly()) {
             QClipboard::Mode mode = QClipboard::Clipboard;
-#ifdef Q_WS_X11
-            if (event->modifiers() == (Qt::CTRL | Qt::SHIFT) && event->key() == Qt::Key_Insert)
+            if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme
+                && event->modifiers() == (Qt::CTRL | Qt::SHIFT)
+                && event->key() == Qt::Key_Insert) {
                 mode = QClipboard::Selection;
-#endif
+            }
             paste(mode);
         }
     }
@@ -1664,12 +1675,14 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
         end(1);
     }
     else if (event == QKeySequence::MoveToNextChar) {
-#if !defined(Q_WS_WIN) || defined(QT_NO_COMPLETER)
-        if (hasSelectedText()) {
+#if defined(QT_NO_COMPLETER)
+        const bool inlineCompletion = false;
 #else
-        if (hasSelectedText() && m_completer
-            && m_completer->completionMode() == QCompleter::InlineCompletion) {
+        const bool inlineCompletion = m_completer && m_completer->completionMode() == QCompleter::InlineCompletion;
 #endif
+        if (hasSelectedText()
+           && (m_keyboardScheme != QPlatformTheme::WindowsKeyboardScheme
+               || inlineCompletion)) {
             moveCursor(selectionEnd(), false);
         } else {
             cursorForward(0, visual ? 1 : (layoutDirection() == Qt::LeftToRight ? 1 : -1));
@@ -1679,12 +1692,14 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
         cursorForward(1, visual ? 1 : (layoutDirection() == Qt::LeftToRight ? 1 : -1));
     }
     else if (event == QKeySequence::MoveToPreviousChar) {
-#if !defined(Q_WS_WIN) || defined(QT_NO_COMPLETER)
-        if (hasSelectedText()) {
+#if defined(QT_NO_COMPLETER)
+        const bool inlineCompletion = false;
 #else
-        if (hasSelectedText() && m_completer
-            && m_completer->completionMode() == QCompleter::InlineCompletion) {
+        const bool inlineCompletion = m_completer && m_completer->completionMode() == QCompleter::InlineCompletion;
 #endif
+        if (hasSelectedText()
+            && (m_keyboardScheme != QPlatformTheme::WindowsKeyboardScheme
+                || inlineCompletion)) {
             moveCursor(selectionStart(), false);
         } else {
             cursorForward(0, visual ? -1 : (layoutDirection() == Qt::LeftToRight ? -1 : 1));
@@ -1737,8 +1752,8 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
 #endif // QT_NO_SHORTCUT
     else {
         bool handled = false;
-#ifdef Q_WS_MAC
-        if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down) {
+        if (m_keyboardScheme == QPlatformTheme::MacKeyboardScheme
+            && (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down)) {
             Qt::KeyboardModifiers myModifiers = (event->modifiers() & ~Qt::KeypadModifier);
             if (myModifiers & Qt::ShiftModifier) {
                 if (myModifiers == (Qt::ControlModifier|Qt::ShiftModifier)
@@ -1756,7 +1771,6 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
             }
             handled = true;
         }
-#endif
         if (event->modifiers() & Qt::ControlModifier) {
             switch (event->key()) {
             case Qt::Key_Backspace:
@@ -1771,13 +1785,13 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
                 complete(event->key());
                 break;
 #endif
-#if defined(Q_WS_X11)
             case Qt::Key_E:
-                end(0);
+                if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme)
+                    end(0);
                 break;
 
             case Qt::Key_U:
-                if (!isReadOnly()) {
+                if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme && !isReadOnly()) {
                     setSelection(0, text().size());
 #ifndef QT_NO_CLIPBOARD
                     copy();
@@ -1785,7 +1799,6 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
                     del();
                 }
             break;
-#endif
             default:
                 if (!handled)
                     unknown = true;
index a019118..72f25e9 100644 (file)
@@ -100,6 +100,7 @@ public:
         , m_threadChecks(false)
         , m_textLayoutThread(0)
  #endif
+        , m_keyboardScheme(0)
     {
         init(txt);
     }
@@ -527,6 +528,8 @@ private Q_SLOTS:
     void _q_clipboardChanged();
     void _q_deleteSelected();
 
+private:
+    int m_keyboardScheme;
 };
 
 QT_END_NAMESPACE
index 77b2ae5..f674ea3 100644 (file)
@@ -1,6 +1,4 @@
 CONFIG += testcase
 TARGET = tst_qlineedit
-QT += widgets testlib
+QT += gui-private core-private widgets testlib
 SOURCES  += tst_qlineedit.cpp
-
-CONFIG += insignificant_test # QTBUG-21402
index 645f47f..17632ec 100644 (file)
@@ -48,6 +48,8 @@
 #include "qvalidator.h"
 #include "qcompleter.h"
 #include "qstandarditemmodel.h"
+#include "qplatformtheme_qpa.h"
+#include <private/qguiapplication_p.h>
 
 #ifndef QT_NO_CLIPBOARD
 #include "qclipboard.h"
@@ -300,6 +302,7 @@ private:
     int lastCursorPos;
     int newCursorPos;
     QLineEdit *testWidget;
+    int m_keyboardScheme;
 };
 
 typedef QList<int> IntList;
@@ -327,9 +330,16 @@ void tst_QLineEdit::getSetCheck()
     QCOMPARE(true, obj1.dragEnabled());
 }
 
-tst_QLineEdit::tst_QLineEdit()
+tst_QLineEdit::tst_QLineEdit() : validInput(false), m_keyboardScheme(0)
 {
-    validInput = false;
+    if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+        m_keyboardScheme = theme->themeHint(QPlatformTheme::KeyboardScheme).toInt();
+    // Generalize for X11
+    if (m_keyboardScheme == QPlatformTheme::KdeKeyboardScheme
+            || m_keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
+            || m_keyboardScheme == QPlatformTheme::CdeKeyboardScheme) {
+        m_keyboardScheme = QPlatformTheme::X11KeyboardScheme;
+    }
 }
 
 tst_QLineEdit::~tst_QLineEdit()
@@ -1071,25 +1081,26 @@ void tst_QLineEdit::undo()
     QVERIFY(!testWidget->isUndoAvailable());
     QVERIFY(testWidget->text().isEmpty());
 
-#ifdef Q_WS_WIN
-    // Repeat the test using shortcut instead of undo()
-    for (i=0; i<insertString.size(); ++i) {
-        if (insertIndex[i] > -1)
-            testWidget->setCursorPosition(insertIndex[i]);
-        if (insertMode[i] == REPLACE_UNTIL_END) {
-            testWidget->setSelection(insertIndex[i], 8);
+
+    if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
+        // Repeat the test using shortcut instead of undo()
+        for (i=0; i<insertString.size(); ++i) {
+            if (insertIndex[i] > -1)
+                testWidget->setCursorPosition(insertIndex[i]);
+            if (insertMode[i] == REPLACE_UNTIL_END)
+                testWidget->setSelection(insertIndex[i], 8);
+            if (use_keys)
+                QTest::keyClicks(testWidget, insertString[i]);
+            else
+                testWidget->insert(insertString[i]);
+        }
+        for (i=0; i<expectedString.size()-1; ++i) {
+            QCOMPARE(testWidget->text(), expectedString[i]);
+            QVERIFY(testWidget->isUndoAvailable());
+            QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
         }
-        if (use_keys)
-            QTest::keyClicks(testWidget, insertString[i]);
-        else
-            testWidget->insert(insertString[i]);
-    }
-    for (i=0; i<expectedString.size()-1; ++i) {
-        QCOMPARE(testWidget->text(), expectedString[i]);
-        QVERIFY(testWidget->isUndoAvailable());
-        QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
     }
-#endif
+
 }
 
 void tst_QLineEdit::redo_data()
@@ -1152,21 +1163,22 @@ void tst_QLineEdit::redo()
 
     QVERIFY(!testWidget->isRedoAvailable());
 
-#ifdef Q_WS_WIN
-    // repeat test, this time using shortcuts instead of undo()/redo()
 
-    while (!testWidget->text().isEmpty())
-        QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
+    if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
+        // repeat test, this time using shortcuts instead of undo()/redo()
 
-    for (i = 0; i < expectedString.size(); ++i) {
-        QVERIFY(testWidget->isRedoAvailable());
-        QTest::keyClick(testWidget, Qt::Key_Backspace,
-                        Qt::ShiftModifier | Qt::AltModifier);
-        QCOMPARE(testWidget->text() , expectedString[i]);
-    }
+        while (!testWidget->text().isEmpty())
+            QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
 
-    QVERIFY(!testWidget->isRedoAvailable());
-#endif
+        for (i = 0; i < expectedString.size(); ++i) {
+            QVERIFY(testWidget->isRedoAvailable());
+            QTest::keyClick(testWidget, Qt::Key_Backspace,
+                            Qt::ShiftModifier | Qt::AltModifier);
+            QCOMPARE(testWidget->text() , expectedString[i]);
+        }
+
+        QVERIFY(!testWidget->isRedoAvailable());
+    }
 }
 
 void tst_QLineEdit::undo_keypressevents_data()
@@ -1263,7 +1275,7 @@ void tst_QLineEdit::undo_keypressevents_data()
 
         // unselect any current selection
         keys.addKeyClick(Qt::Key_Right);
-#ifdef Q_WS_WIN //Mac has a specialcase to handle jumping to the end of a selection
+#ifdef Q_OS_WIN //Mac has a specialcase to handle jumping to the end of a selection
         keys.addKeyClick(Qt::Key_Left);
 #endif
 
@@ -3080,6 +3092,7 @@ void tst_QLineEdit::leftKeyOnSelectedText()
 #ifdef Q_OS_WIN
     QCOMPARE(testWidget->cursorPosition(), 1);
 #else
+    // Selection is cleared ands cursor remains at position 2.
     // X11 used to behave like window prior to 4.2. Changes caused by QKeySequence
     // resulted in an inadvertant change in behavior
     QCOMPARE(testWidget->cursorPosition(), 2);
@@ -3624,9 +3637,8 @@ void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut()
 
 void tst_QLineEdit::QTBUG697_paletteCurrentColorGroup()
 {
-#ifndef Q_WS_X11
-    QSKIP("Only tested on X11");
-#endif
+    if (m_keyboardScheme != QPlatformTheme::X11KeyboardScheme)
+        QSKIP("Only tested on X11");
     QLineEdit le;
     le.setText("               ");
     QPalette p = le.palette();