Revision: 7263
Author:   nogu.dev
Date:     Fri Aug 12 03:06:40 2011
Log:      * Merge r7257,r7258,r7259,r7260,r7261,r7262 from trunk.
http://code.google.com/p/uim/source/detail?r=7263

Modified:
 /branches/1.7/qt4/immodule/qtextutil.cpp
 /branches/1.7/scm/tutcode.scm

=======================================
--- /branches/1.7/qt4/immodule/qtextutil.cpp    Sat Mar 19 21:05:41 2011
+++ /branches/1.7/qt4/immodule/qtextutil.cpp    Fri Aug 12 03:06:40 2011
@@ -31,7 +31,6 @@

 */

-// FIXME: Support Qt4 TextEdit
 #include "qtextutil.h"

 #include <cstdlib>
@@ -158,12 +157,12 @@
     preedit_len = mIc->getPreeditString().length();
     preedit_cursor_pos = mIc->getPreeditCursorPosition();

-    text = edit->text(); // including preedit string
+    text = edit->text(); // excluding preedit string
     len = text.length();
-    cursor_index = edit->cursorPosition();
+    cursor_index = edit->cursorPosition() + preedit_len;

     precedence_len = cursor_index - preedit_cursor_pos;
-    following_len = len - precedence_len - preedit_len;
+    following_len = len - precedence_len;

     switch ( origin ) {
     case UTextOrigin_Cursor:
@@ -254,13 +253,111 @@
                                              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(); // excluding preedit string
+    int len = text.length();
+
+    int preedit_len = mIc->getPreeditString().length();
+    int preedit_cursor_pos = mIc->getPreeditCursorPosition();
+
+    int cursor_index = edit->textCursor().position() + preedit_len;
+    int precedence_len = cursor_index - preedit_cursor_pos;
+    int following_len = len - precedence_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 +612,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
@@ -701,12 +836,12 @@
     preedit_len = mIc->getPreeditString().length();
     preedit_cursor_pos = mIc->getPreeditCursorPosition();

-    text = edit->text(); // including preedit string
+    text = edit->text(); // excluding preedit string
     len = text.length();
-    cursor_index = edit->cursorPosition();
+    cursor_index = edit->cursorPosition() + preedit_len;

     precedence_len = cursor_index - preedit_cursor_pos;
-    following_len = len - precedence_len - preedit_len;
+    following_len = len - precedence_len;

     switch ( origin ) {
     case UTextOrigin_Cursor:
@@ -718,7 +853,7 @@
if (! ( ~former_req_len & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
                 return -1;
         }
-        latter_del_end = len;
+        latter_del_end = len + preedit_len;
         if ( latter_req_len >= 0 ) {
             if ( following_len > latter_req_len )
latter_del_end = precedence_len + preedit_len + latter_req_len;
@@ -736,18 +871,18 @@
                 if ( following_len >= ( latter_req_len - precedence_len ) )
                     latter_del_end = preedit_len + latter_req_len;
                 else
-                    latter_del_end = len;
+                    latter_del_end = len + preedit_len;
             }
         } else {
if (! ( ~latter_req_len & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
                 return -1;
-            latter_del_end = len;
+            latter_del_end = len + preedit_len;
         }
         break;

     case UTextOrigin_End:
         former_del_start = precedence_len;
-        latter_del_end = len;
+        latter_del_end = len + preedit_len;
         if ( former_req_len < 0 ) {
if (! ( ~former_req_len & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
                 return -1;
@@ -761,7 +896,7 @@
         return -1;
     }

- edit->setText( text.left( former_del_start ) + text.right( len - latter_del_end ) ); + edit->setText( text.left( former_del_start ) + text.right( len - latter_del_end + preedit_len ) );
     edit->setCursorPosition( former_del_start );

     return 0;
@@ -772,11 +907,86 @@
                                             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(); // excluding preedit string
+    int len = text.length();
+
+    int preedit_len = mIc->getPreeditString().length();
+    int preedit_cursor_pos = mIc->getPreeditCursorPosition();
+
+    QTextCursor cursor = edit->textCursor();
+    int cursor_index = cursor.position() + preedit_len;
+    int precedence_len = cursor_index - preedit_cursor_pos;
+    int following_len = len - precedence_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 + preedit_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 + preedit_len;
+            }
+        } else {
+            if (! ( ~latter_req_len
+                    & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) )
+                return -1;
+            latter_del_end = len + preedit_len;
+        }
+        break;
+
+    case UTextOrigin_End:
+        former_del_start = precedence_len;
+        latter_del_end = len + preedit_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;
+    }
+
+    if ( len < latter_del_end )
+        return 0;
+
+    cursor.setPosition( latter_del_end );
+    cursor.setPosition( former_del_start, QTextCursor::KeepAnchor );
+    edit->setTextCursor( cursor );
+    cursor.deleteChar();
+
+    return 0;
 }

 #ifdef ENABLE_QT4_QT3SUPPORT
@@ -972,11 +1182,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
=======================================
--- /branches/1.7/scm/tutcode.scm       Fri Jul 22 17:12:12 2011
+++ /branches/1.7/scm/tutcode.scm       Fri Aug 12 03:06:40 2011
@@ -87,7 +87,7 @@
 ;;;   uim¤Îsurrounding text´Ø·¸¤ÎAPI¤ò»È¤Ã¤Æ¡¢
 ;;;   ¥«¡¼¥½¥ëÁ°¤Îʸ»úÎó¤Î¼èÆÀ¡¦ºï½ü¤ò¹Ô¤¤¤Þ¤¹¡£
 ;;;   ¤½¤Î¤¿¤á¡¢uim¤Îsurrounding text API¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¥Ö¥ê¥Ã¥¸
-;;;   (uim-gtk, uim-qt, uim-qt4(lineedit¤Î¤ß))¤Ç¤Î¤ß¸åÃÖ·¿ÊÑ´¹¤¬²Äǽ¤Ç¤¹¡£
+;;;   (uim-gtk, uim-qt3, uim-qt4)¤Ç¤Î¤ß¸åÃÖ·¿ÊÑ´¹¤¬²Äǽ¤Ç¤¹¡£
 ;;;
 ;;;   ¤³¤ì¤é°Ê³°¤Î¥Ö¥ê¥Ã¥¸¤Ç¤â¸åÃÖ·¿ÊÑ´¹¤ò»È¤¤¤¿¤¤¾ì¹ç¡¢
 ;;;   tutcode-enable-fallback-surrounding-text?¤ò#t¤ËÀßÄꤹ¤ë¤È¡¢

Reply via email to