Author: yamakenz
Date: Thu Sep 20 11:33:59 2007
New Revision: 4988
Modified:
trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.cpp
trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.h
Log:
* qt/quiminputcontextplugin-qt4/quiminputcontext.h
- (QUimInputContext::getPreeditAttrs): New function decl
* qt/quiminputcontextplugin-qt4/quiminputcontext.cpp
- Include QInputMethodEvent and QTextCharFormat
- (QUimInputContext::getPreeditAttrs): New function
- (QUimInputContext::updatePreedit): Replace cursor-only attribute
generation with full-featured attr-list with getPreeditAttrs()
Modified: trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.cpp
==============================================================================
--- trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.cpp (original)
+++ trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.cpp Thu Sep 20
11:33:59 2007
@@ -10,6 +10,8 @@
#include <qwidget.h>
#include <qpoint.h>
#include <qlabel.h>
+#include <QInputMethodEvent>
+#include <QTextCharFormat>
#include <ctype.h>
#include <string.h>
@@ -421,8 +423,6 @@
void QUimInputContext::updatePreedit()
{
QString newString = getPreeditString();
- int cursor = getPreeditCursorPosition();
- int selLength = getPreeditSelectionLength();
if ( newString.isEmpty() && preeditString.isEmpty() && ! isComposing() )
return ;
@@ -436,13 +436,7 @@
if ( ! newString.isEmpty() )
{
- qDebug( "cursor = %d, length = %d", cursor, newString.length() );
-
- QInputMethodEvent::Attribute cursor_attr( QInputMethodEvent::Cursor,
- cursor, selLength, 0 );
- QList<QInputMethodEvent::Attribute> attrs;
- attrs.append( cursor_attr );
- QInputMethodEvent e( newString, attrs );
+ QInputMethodEvent e( newString, getPreeditAttrs() );
sendEvent( e );
}
@@ -544,6 +538,57 @@
}
return 0;
+}
+
+QList<QInputMethodEvent::Attribute> QUimInputContext::getPreeditAttrs()
+{
+ const int HIDE_CARET = 0;
+ const int SHOW_CARET = 1;
+ const int DUMMY = 0;
+ QList<QInputMethodEvent::Attribute> attrs;
+
+ QList<PreeditSegment *>::ConstIterator seg = psegs.begin();
+ const QList<PreeditSegment *>::ConstIterator end = psegs.end();
+ int segPos = 0;
+ for ( ; seg != end; ++seg ) {
+ int uimAttr = ( *seg )->attr;
+ int segStrLen = ( *seg )->str.length();
+ QTextCharFormat segFmt;
+
+ if ( uimAttr & UPreeditAttr_Cursor ) {
+ if ( segStrLen ) {
+ QInputMethodEvent::Attribute dummyCursor(
QInputMethodEvent::Cursor,
+ segStrLen,
+ HIDE_CARET, DUMMY );
+ attrs << dummyCursor;
+ } else {
+ QInputMethodEvent::Attribute cursor( QInputMethodEvent::Cursor,
+ segPos,
+ SHOW_CARET, DUMMY );
+ attrs << cursor;
+ }
+ } else if ( uimAttr & UPreeditAttr_Separator ) {
+ if ( !segStrLen )
+ segStrLen = QString( DEFAULT_SEPARATOR_STR ).length();
+ }
+
+ if ( segStrLen ) {
+ if ( uimAttr & UPreeditAttr_Reverse ) {
+ // FIXME: Retrieve customized colors from the text widget
+ segFmt.setForeground( Qt::white );
+ segFmt.setBackground( Qt::black );
+ }
+ if ( uimAttr & UPreeditAttr_UnderLine ) {
+ segFmt.setFontUnderline( TRUE );
+ }
+ QInputMethodEvent::Attribute segAttr( QInputMethodEvent::TextFormat,
+ segPos, segStrLen, segFmt );
+ attrs << segAttr;
+ segPos += segStrLen;
+ }
+ }
+
+ return attrs;
}
Modified: trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.h
==============================================================================
--- trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.h (original)
+++ trunk/qt/quiminputcontextplugin-qt4/quiminputcontext.h Thu Sep 20
11:33:59 2007
@@ -62,6 +62,7 @@
QString getPreeditString();
int getPreeditCursorPosition();
int getPreeditSelectionLength();
+ QList<QInputMethodEvent::Attribute> getPreeditAttrs();
/* callbacks for uim */
static void commit_cb( void *ptr, const char *str );