Revision: 7257
Author: nogu.dev
Date: Fri Aug 12 01:51:38 2011
Log: * qt4/immodule/qtextutil.cpp
- (QUimTextUtil::acquirePrimaryTextInQTextEdit,
QUimTextUtil::acquireSelectionTextInQTextEdit,
QUimTextUtil::deletePrimaryTextInQTextEdit,
QUimTextUtil::deleteSelectionTextInQTextEdit): Implement function.
http://code.google.com/p/uim/source/detail?r=7257
Modified:
/trunk/qt4/immodule/qtextutil.cpp
=======================================
--- /trunk/qt4/immodule/qtextutil.cpp Sat Mar 19 21:05:41 2011
+++ /trunk/qt4/immodule/qtextutil.cpp Fri Aug 12 01:51:38 2011
@@ -31,7 +31,6 @@
*/
-// FIXME: Support Qt4 TextEdit
#include "qtextutil.h"
#include <cstdlib>
@@ -254,13 +253,110 @@
int latter_req_len,
char **former, char **latter )
{
- // FIXME: Implement this
- Q_UNUSED( origin )
- Q_UNUSED( former_req_len )
- Q_UNUSED( latter_req_len )
- Q_UNUSED( former )
- Q_UNUSED( latter )
- return -1;
+ QTextEdit *edit = static_cast<QTextEdit *>( mWidget );
+ QString text = edit->toPlainText(); // including preedit string
+ int len = text.length();
+ int cursor_index = edit->textCursor().position();
+
+ int preedit_len = mIc->getPreeditString().length();
+ int preedit_cursor_pos = mIc->getPreeditCursorPosition();
+ int precedence_len = cursor_index - preedit_cursor_pos;
+ int following_len = len - precedence_len - preedit_len;
+
+ QString former_text;
+ QString latter_text;
+ switch ( origin ) {
+ case UTextOrigin_Cursor:
+ {
+ int offset = 0;
+ if ( former_req_len >= 0 ) {
+ if ( precedence_len > former_req_len )
+ offset = precedence_len - former_req_len;
+ } else {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ *former = strdup(
+ text.mid( offset, precedence_len - offset
).toUtf8().data() );
+
+ offset = 0;
+ if ( latter_req_len >= 0 ) {
+ if ( following_len > latter_req_len )
+ offset = following_len - latter_req_len;
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) ) {
+ free( *former );
+ return -1;
+ }
+ }
+ *latter = strdup( text.mid( precedence_len + preedit_len,
+ following_len - offset ).toUtf8().data() );
+ break;
+ }
+
+ case UTextOrigin_Beginning:
+ *former = 0;
+ if ( latter_req_len >= 0 ) {
+ if ( precedence_len >= latter_req_len )
+ text = text.left( latter_req_len );
+ else {
+ former_text = text.left( precedence_len );
+ if ( following_len >= ( latter_req_len - precedence_len ) )
+ latter_text = text.mid( precedence_len + preedit_len,
+ ( latter_req_len - precedence_len ) );
+ else
+ latter_text = text.mid( precedence_len + preedit_len,
+ following_len );
+ text = former_text + latter_text;
+ }
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+
+ former_text = text.left( precedence_len );
+ latter_text = text.mid( precedence_len + preedit_len,
+ following_len );
+ text = former_text + latter_text;
+ }
+ *latter = strdup( text.toUtf8().data() );
+ break;
+
+ case UTextOrigin_End:
+ if ( former_req_len >= 0 ) {
+ if ( following_len >= former_req_len )
+ text = text.right( former_req_len );
+ else {
+ latter_text = text.right( following_len );
+ if ( precedence_len >= ( former_req_len - following_len ) )
+ former_text = text.mid( precedence_len
+ - ( former_req_len - following_len ),
+ former_req_len - following_len );
+ else
+ former_text = text.left( precedence_len );
+ text = former_text + latter_text;
+ }
+ } else {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+
+ former_text = text.left( precedence_len );
+ latter_text = text.right( following_len );
+ text = former_text + latter_text;
+ }
+ *former = strdup( text.toUtf8().data() );
+ *latter = 0;
+ break;
+
+ case UTextOrigin_Unspecified:
+ default:
+ return -1;
+ }
+
+ return 0;
}
#ifdef ENABLE_QT4_QT3SUPPORT
@@ -515,13 +611,51 @@
int latter_req_len,
char **former, char
**latter )
{
- // FIXME: Implement this
- Q_UNUSED( origin )
- Q_UNUSED( former_req_len )
- Q_UNUSED( latter_req_len )
- Q_UNUSED( former )
- Q_UNUSED( latter )
- return -1;
+ QTextEdit *edit = static_cast<QTextEdit *>( mWidget );
+ QTextCursor cursor = edit->textCursor();
+ if ( ! cursor.hasSelection() )
+ return -1;
+
+ bool cursor_at_beginning = false;
+ int current = cursor.position();
+ int start = cursor.selectionStart();
+ if ( current == start )
+ cursor_at_beginning = true;
+
+ QString text = cursor.selectedText();
+ int len = text.length();
+ int offset;
+ if ( origin == UTextOrigin_Beginning ||
+ ( origin == UTextOrigin_Cursor && cursor_at_beginning ) ) {
+ *former = 0;
+ offset = 0;
+ if ( latter_req_len >= 0 ) {
+ if ( len > latter_req_len )
+ offset = len - latter_req_len;
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ *latter = strdup( text.left( len - offset ).toUtf8().data() );
+ } else if ( origin == UTextOrigin_End ||
+ ( origin == UTextOrigin_Cursor && !cursor_at_beginning ) )
{
+ offset = 0;
+ if ( former_req_len >= 0 ) {
+ if ( len > former_req_len )
+ offset = len - former_req_len;
+ } else {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ *former = strdup( text.mid( offset, len - offset ).toUtf8().data()
);
+ *latter = 0;
+ } else {
+ return -1;
+ }
+
+ return 0;
}
#ifdef ENABLE_QT4_QT3SUPPORT
@@ -772,11 +906,81 @@
int former_req_len,
int latter_req_len )
{
- // FIXME: Implement this
- Q_UNUSED( origin )
- Q_UNUSED( former_req_len )
- Q_UNUSED( latter_req_len )
- return -1;
+ QTextEdit *edit = static_cast<QTextEdit *>( mWidget );
+ QString text = edit->toPlainText(); // including preedit string
+ int len = text.length();
+ QTextCursor cursor = edit->textCursor();
+ int cursor_index = cursor.position();
+
+ int preedit_len = mIc->getPreeditString().length();
+ int preedit_cursor_pos = mIc->getPreeditCursorPosition();
+ int precedence_len = cursor_index - preedit_cursor_pos;
+ int following_len = len - precedence_len - preedit_len;
+
+ int former_del_start;
+ int latter_del_end;
+ switch ( origin ) {
+ case UTextOrigin_Cursor:
+ former_del_start = 0;
+ if ( former_req_len >= 0 ) {
+ if ( precedence_len > former_req_len )
+ former_del_start = precedence_len - former_req_len;
+ } else {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ latter_del_end = len;
+ if ( latter_req_len >= 0 ) {
+ if ( following_len > latter_req_len )
+ latter_del_end = precedence_len + preedit_len +
latter_req_len;
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ break;
+
+ case UTextOrigin_Beginning:
+ former_del_start = 0;
+ latter_del_end = precedence_len + preedit_len;
+ if ( latter_req_len >= 0 ) {
+ if ( precedence_len < latter_req_len ) {
+ if ( following_len >= ( latter_req_len - precedence_len ) )
+ latter_del_end = preedit_len + latter_req_len;
+ else
+ latter_del_end = len;
+ }
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ latter_del_end = len;
+ }
+ break;
+
+ case UTextOrigin_End:
+ former_del_start = precedence_len;
+ latter_del_end = len;
+ if ( former_req_len < 0 ) {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+
+ former_del_start = 0;
+ }
+ break;
+
+ case UTextOrigin_Unspecified:
+ default:
+ return -1;
+ }
+
+ edit->setText( text.left( former_del_start )
+ + text.right( len - latter_del_end ) );
+ cursor.setPosition( former_del_start );
+
+ return 0;
}
#ifdef ENABLE_QT4_QT3SUPPORT
@@ -972,11 +1176,49 @@
int former_req_len,
int latter_req_len )
{
- // FIXME: Implement this
- Q_UNUSED( origin )
- Q_UNUSED( former_req_len )
- Q_UNUSED( latter_req_len )
- return -1;
+ QTextEdit *edit = static_cast<QTextEdit *>( mWidget );
+ QTextCursor cursor = edit->textCursor();
+ if ( ! cursor.hasSelection() )
+ return -1;
+
+ bool cursor_at_beginning = false;
+ int current = cursor.position();
+ int start = cursor.selectionStart();
+ if ( current == start )
+ cursor_at_beginning = true;
+
+ QString text = cursor.selectedText();
+ int len = text.length();
+ int end = start + len;
+ if ( origin == UTextOrigin_Beginning ||
+ ( origin == UTextOrigin_Cursor && cursor_at_beginning ) ) {
+ if ( latter_req_len >= 0 ) {
+ if ( len > latter_req_len )
+ end = start + latter_req_len;
+ } else {
+ if (! ( ~latter_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ } else if ( origin == UTextOrigin_End ||
+ ( origin == UTextOrigin_Cursor && !cursor_at_beginning ) )
{
+ if ( former_req_len >= 0 ) {
+ if ( len > former_req_len )
+ start = end - former_req_len;
+ } else {
+ if (! ( ~former_req_len
+ & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+ cursor.setPosition( start );
+ cursor.setPosition( end - start + 1, QTextCursor::KeepAnchor );
+ edit->setTextCursor( cursor );
+ cursor.deleteChar();
+
+ return 0;
}
#ifdef ENABLE_QT4_QT3SUPPORT