add QInputMethodQueryEvent
authorLars Knoll <lars.knoll@nokia.com>
Tue, 21 Jun 2011 14:45:00 +0000 (16:45 +0200)
committerLars Knoll <lars.knoll@nokia.com>
Wed, 22 Jun 2011 08:46:12 +0000 (10:46 +0200)
QInputMethodQueryEvent will replace the old
inputMethodHints() and inputMethodQuery() APIs
in QWidget. It has the advantage that it works
nicely with any kind of QObject.

src/corelib/global/qnamespace.h
src/corelib/kernel/qcoreevent.h
src/gui/kernel/qevent.cpp
src/gui/kernel/qevent.h
src/widgets/kernel/qwidget.cpp

index 4a663fc..38d4a85 100644 (file)
@@ -1488,7 +1488,8 @@ public:
         ImSurroundingText,
         ImCurrentSelection,
         ImMaximumTextLength,
-        ImAnchorPosition
+        ImAnchorPosition,
+        ImHints
     };
 
     enum InputMethodHint {
index 432f6a8..791b207 100644 (file)
@@ -296,6 +296,8 @@ public:
 
         Expose = 208,
 
+        InputMethodQuery = 209,
+
         // 512 reserved for Qt Jambi's MetaCall event
         // 513 reserved for Qt Jambi's DeleteOnMainThread event
 
index 988d70c..9e6a8d6 100644 (file)
@@ -1755,6 +1755,53 @@ void QInputMethodEvent::setCommitString(const QString &commitString, int replace
     \sa replacementStart(), setCommitString()
 */
 
+
+/*! \class QInputMethodQueryEvent
+
+    This event is sent by the input context to input objects.
+
+    It is used by the
+    input method to query a set of properties of the object to be
+    able to support complex input method operations as support for
+    surrounding text and reconversions.
+
+    query() specifies which property is queried.
+
+    The object should call setValue() on the event to fill in the requested
+    data before calling accept().
+*/
+QInputMethodQueryEvent::QInputMethodQueryEvent(Qt::InputMethodQuery query)
+    : QEvent(InputMethodQuery),
+      m_query(query)
+{
+}
+
+QInputMethodQueryEvent::~QInputMethodQueryEvent()
+{
+}
+
+/*!
+    \fn Qt::InputMethodQuery QInputMethodQueryEvent::query() const
+
+    returns the type of data queried.
+*/
+
+/*!
+    \fn QVariant QInputMethodQueryEvent::value() const
+
+    returns the value set by the receiving object. Mainly used by the input method.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn QVariant QInputMethodQueryEvent::setValue()
+
+    Used by the receiving object to set the value requested by query().
+
+    \sa setValue()
+*/
+
 #ifndef QT_NO_TABLETEVENT
 
 /*!
index 809a3d6..59d50df 100644 (file)
@@ -427,6 +427,22 @@ private:
     int replace_from;
     int replace_length;
 };
+
+class Q_GUI_EXPORT QInputMethodQueryEvent : public QEvent
+{
+public:
+    QInputMethodQueryEvent(Qt::InputMethodQuery query);
+    ~QInputMethodQueryEvent();
+
+    Qt::InputMethodQuery query() const { return m_query; }
+
+    void setValue(const QVariant &v) { m_value = v; }
+    QVariant value() const { return m_value; }
+private:
+    Qt::InputMethodQuery m_query;
+    QVariant m_value;
+};
+
 #endif // QT_NO_INPUTMETHOD
 
 #ifndef QT_NO_DRAGANDDROP
index 0646983..a8bd5ca 100644 (file)
@@ -8297,6 +8297,21 @@ bool QWidget::event(QEvent *event)
         inputMethodEvent((QInputMethodEvent *) event);
         break;
 
+    case QEvent::InputMethodQuery:
+        if (testAttribute(Qt::WA_InputMethodEnabled)) {
+            QInputMethodQueryEvent *query = static_cast<QInputMethodQueryEvent *>(event);
+            QVariant v = inputMethodQuery(query->query());
+
+            if (query->query() == Qt::ImMicroFocus) {
+                QRect r = v.toRect();
+                v = QRect(mapToGlobal(r.topLeft()), r.size());
+            }
+
+            query->setValue(v);
+            query->accept();
+            break;
+        }
+
     case QEvent::PolishRequest:
         ensurePolished();
         break;
@@ -9215,6 +9230,8 @@ QVariant QWidget::inputMethodQuery(Qt::InputMethodQuery query) const
     case Qt::ImAnchorPosition:
         // Fallback.
         return inputMethodQuery(Qt::ImCursorPosition);
+    case Qt::ImHints:
+        return (int)inputMethodHints();
     default:
         return QVariant();
     }