Fix pasting with the middle button in TextInput and TextEdit.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Fri, 3 Aug 2012 06:50:24 +0000 (16:50 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 6 Aug 2012 07:06:24 +0000 (09:06 +0200)
Neither item accepted the middle button which prevented the mouse events
ever reaching them.

Change-Id: Ia8f693099df4d6c248976453d554fef96d1d3b33
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquicktextcontrol.cpp
src/quick/items/qquicktextedit.cpp
src/quick/items/qquicktextinput.cpp
tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp

index af3f509..dc61b36 100644 (file)
@@ -974,7 +974,7 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po
 {
     Q_Q(QQuickTextControl);
 
-    mousePressed = (interactionFlags & Qt::TextSelectableByMouse);
+    mousePressed = (interactionFlags & Qt::TextSelectableByMouse) && (e->button() & Qt::LeftButton);
     mousePressPos = pos.toPoint();
 
     if (sendMouseEventToInputContext(e, pos))
@@ -989,7 +989,9 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po
             cursor.clearSelection();
         }
     }
-    if (!(e->button() & Qt::LeftButton)) {
+    if (e->button() & Qt::MiddleButton) {
+        return;
+    } else  if (!(e->button() & Qt::LeftButton)) {
         e->ignore();
         return;
     } else if (!(interactionFlags & (Qt::TextSelectableByMouse | Qt::TextEditable))) {
index 4d1eb61..2855070 100644 (file)
@@ -1748,7 +1748,13 @@ void QQuickTextEditPrivate::init()
 {
     Q_Q(QQuickTextEdit);
 
-    q->setAcceptedMouseButtons(Qt::LeftButton);
+#ifndef QT_NO_CLIPBOARD
+    if (QGuiApplication::clipboard()->supportsSelection())
+        q->setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton);
+    else
+#endif
+        q->setAcceptedMouseButtons(Qt::LeftButton);
+
     q->setFlag(QQuickItem::ItemAcceptsInputMethod);
     q->setFlag(QQuickItem::ItemHasContents);
 
index ced2e62..54cea8b 100644 (file)
@@ -2466,7 +2466,13 @@ bool QQuickTextInput::isInputMethodComposing() const
 void QQuickTextInputPrivate::init()
 {
     Q_Q(QQuickTextInput);
-    q->setAcceptedMouseButtons(Qt::LeftButton);
+#ifndef QT_NO_CLIPBOARD
+    if (QGuiApplication::clipboard()->supportsSelection())
+        q->setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton);
+    else
+#endif
+        q->setAcceptedMouseButtons(Qt::LeftButton);
+
     q->setFlag(QQuickItem::ItemAcceptsInputMethod);
     q->setFlag(QQuickItem::ItemHasContents);
 #ifndef QT_NO_CLIPBOARD
index 9f38105..4953874 100644 (file)
@@ -153,6 +153,7 @@ private slots:
     void copyAndPaste();
     void canPaste();
     void canPasteEmpty();
+    void middleClickPaste();
     void textInput();
     void inputMethodUpdate();
     void openInputPanel();
@@ -2706,6 +2707,58 @@ void tst_qquicktextedit::canPasteEmpty() {
 }
 
 
+void tst_qquicktextedit::middleClickPaste()
+{
+#ifndef QT_NO_CLIPBOARD
+
+#ifdef Q_OS_MAC
+    {
+        PasteboardRef pasteboard;
+        OSStatus status = PasteboardCreate(0, &pasteboard);
+        if (status == noErr)
+            CFRelease(pasteboard);
+        else
+            QSKIP("This machine doesn't support the clipboard");
+    }
+#endif
+
+    QQuickView window(testFileUrl("mouseselection_true.qml"));
+
+    window.show();
+    window.requestActivateWindow();
+    QTest::qWaitForWindowActive(&window);
+
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextEdit *textEditObject = qobject_cast<QQuickTextEdit *>(window.rootObject());
+    QVERIFY(textEditObject != 0);
+
+    textEditObject->setFocus(true);
+
+    QString originalText = textEditObject->text();
+    QString selectedText = "234567";
+
+    // press-and-drag-and-release from x1 to x2
+    const QPoint p1 = textEditObject->positionToRectangle(2).center().toPoint();
+    const QPoint p2 = textEditObject->positionToRectangle(8).center().toPoint();
+    const QPoint p3 = textEditObject->positionToRectangle(1).center().toPoint();
+    QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p1);
+    QTest::mouseMove(&window, p2);
+    QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p2);
+    QTRY_COMPARE(textEditObject->selectedText(), selectedText);
+
+    // Middle click pastes the selected text, assuming the platform supports it.
+    QTest::mouseClick(&window, Qt::MiddleButton, Qt::NoModifier, p3);
+
+    // ### This is to prevent double click detection from carrying over to the next test.
+    QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10);
+
+    if (QGuiApplication::clipboard()->supportsSelection())
+        QCOMPARE(textEditObject->text().mid(1, selectedText.length()), selectedText);
+    else
+        QCOMPARE(textEditObject->text(), originalText);
+#endif
+}
+
 void tst_qquicktextedit::readOnly()
 {
     QQuickView window(testFileUrl("readOnly.qml"));
index 8beb871..7b98099 100644 (file)
@@ -159,6 +159,7 @@ private slots:
     void copyAndPasteKeySequence();
     void canPasteEmpty();
     void canPaste();
+    void middleClickPaste();
     void readOnly();
     void focusOnPress();
 
@@ -2639,6 +2640,58 @@ void tst_qquicktextinput::canPaste() {
 #endif
 }
 
+void tst_qquicktextinput::middleClickPaste()
+{
+#ifndef QT_NO_CLIPBOARD
+
+#ifdef Q_OS_MAC
+    {
+        PasteboardRef pasteboard;
+        OSStatus status = PasteboardCreate(0, &pasteboard);
+        if (status == noErr)
+            CFRelease(pasteboard);
+        else
+            QSKIP("This machine doesn't support the clipboard");
+    }
+#endif
+
+    QQuickView window(testFileUrl("mouseselection_true.qml"));
+
+    window.show();
+    window.requestActivateWindow();
+    QTest::qWaitForWindowActive(&window);
+
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextInput *textInputObject = qobject_cast<QQuickTextInput *>(window.rootObject());
+    QVERIFY(textInputObject != 0);
+
+    textInputObject->setFocus(true);
+
+    QString originalText = textInputObject->text();
+    QString selectedText = "234567";
+
+    // press-and-drag-and-release from x1 to x2
+    const QPoint p1 = textInputObject->positionToRectangle(2).center().toPoint();
+    const QPoint p2 = textInputObject->positionToRectangle(8).center().toPoint();
+    const QPoint p3 = textInputObject->positionToRectangle(1).center().toPoint();
+    QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p1);
+    QTest::mouseMove(&window, p2);
+    QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p2);
+    QTRY_COMPARE(textInputObject->selectedText(), selectedText);
+
+    // Middle click pastes the selected text, assuming the platform supports it.
+    QTest::mouseClick(&window, Qt::MiddleButton, Qt::NoModifier, p3);
+
+    // ### This is to prevent double click detection from carrying over to the next test.
+    QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10);
+
+    if (QGuiApplication::clipboard()->supportsSelection())
+        QCOMPARE(textInputObject->text().mid(1, selectedText.length()), selectedText);
+    else
+        QCOMPARE(textInputObject->text(), originalText);
+#endif
+}
+
 void tst_qquicktextinput::passwordCharacter()
 {
     QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\"; font.family: \"Helvetica\"; echoMode: TextInput.Password }";