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

Reply via email to