void tst_Q3RichText::cursorPosition() { Q3TextEdit textedit; textedit.setText( "This is a test" ); textedit.setCursorPosition( textedit.paragraphs() - 1, textedit.paragraphLength( textedit.paragraphs() - 1 ) ); int para; int index; textedit.getCursorPosition( ¶, &index ); QCOMPARE( para, 0 ); QCOMPARE( index, 14 ); textedit.setText( "This is a test\nThis is a test\nThis is a test" ); textedit.setCursorPosition( textedit.paragraphs() - 1, textedit.paragraphLength( textedit.paragraphs() - 1 ) ); textedit.getCursorPosition( ¶, &index ); QCOMPARE( para, 2 ); QCOMPARE( index, 14 ); }
void QUimTextUtil::Q3TextEditPositionForward( int *cursor_para, int *cursor_index ) { Q3TextEdit *edit = static_cast<Q3TextEdit *>( mWidget ); int n_para = edit->paragraphs(); int preedit_len, preedit_cursor_pos; int current_para_len; int para, index; int current_para, current_index; current_para = *cursor_para; current_index = *cursor_index; current_para_len = edit->paragraphLength( current_para ); if ( ! mPreeditSaved ) { preedit_len = mIc->getPreeditString().length(); preedit_cursor_pos = mIc->getPreeditCursorPosition(); } else { preedit_len = 0; preedit_cursor_pos = 0; } edit->getCursorPosition( ¶, &index ); if ( current_para == para && current_index >= ( index - preedit_cursor_pos ) && current_index < ( index - preedit_cursor_pos + preedit_len ) ) current_index = index - preedit_cursor_pos + preedit_len; if ( current_para == n_para - 1 ) { if ( current_index < current_para_len ) current_index++; } else { if ( current_index < current_para_len ) current_index++; else { current_para++; current_index = 0; } } *cursor_para = current_para; *cursor_index = current_index; }
int QUimTextUtil::acquirePrimaryTextInQ3TextEdit( enum UTextOrigin origin, int former_req_len, int latter_req_len, char **former, char **latter ) { Q3TextEdit *edit = static_cast<Q3TextEdit *>( mWidget ); QString text; int start_para, start_index, end_para, end_index, para, index; int n_para; int preedit_len, preedit_cursor_pos; int sel_start_para, sel_start_index, sel_end_para, sel_end_index; Qt::TextFormat format; format = edit->textFormat(); edit->setTextFormat( Qt::PlainText ); edit->getCursorPosition( ¶, &index ); // including preedit string // keep current selection edit->getSelection( &sel_start_para, &sel_start_index, &sel_end_para, &sel_end_index, 0 ); preedit_len = mIc->getPreeditString().length(); preedit_cursor_pos = mIc->getPreeditCursorPosition(); n_para = edit->paragraphs(); switch ( origin ) { case UTextOrigin_Cursor: start_index = index - preedit_cursor_pos; start_para = para; end_index = start_index + preedit_len; end_para = para; if ( former_req_len >= 0 ) { for ( int i = 0; i < former_req_len; i++ ) Q3TextEditPositionBackward( &start_para, &start_index ); } else { if ( former_req_len == UTextExtent_Line ) start_index = 0; else if ( former_req_len == UTextExtent_Full ) { start_para = 0; start_index = 0; } else { edit->setTextFormat( format ); return -1; } } edit->setSelection( start_para, start_index, para, index - preedit_cursor_pos, 0 ); *former = strdup( edit->selectedText().toUtf8().data() ); if ( latter_req_len >= 0 ) { for ( int i = 0; i < latter_req_len; i++ ) Q3TextEditPositionForward( &end_para, &end_index ); } else { if ( latter_req_len == UTextExtent_Line ) { end_index = edit->paragraphLength( end_para ); } else if ( latter_req_len == UTextExtent_Full ) { end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); } else { edit->setTextFormat( format ); return -1; } } edit->setSelection( para, index - preedit_cursor_pos + preedit_len, end_para, end_index, 0 ); *latter = strdup( edit->selectedText().toUtf8().data() ); break; case UTextOrigin_Beginning: *former = 0; start_para = 0; start_index = 0; end_para = start_para; end_index = start_index; if ( latter_req_len >= 0 ) { for ( int i = 0; i < latter_req_len; i++ ) Q3TextEditPositionForward( &end_para, &end_index ); } else { if ( latter_req_len == UTextExtent_Line ) end_index = edit->paragraphLength( end_para ); else if ( latter_req_len == UTextExtent_Full ) { end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); } else { edit->setTextFormat( format ); return -1; } } if ( end_para < para || ( end_para == para && end_index <= ( index - preedit_cursor_pos ) ) ) { edit->setSelection( start_para, start_index, end_para, end_index, 0 ); text = edit->selectedText(); } else { edit->setSelection( start_para, start_index, para, index - preedit_cursor_pos, 0 ); text = edit->selectedText(); edit->setSelection( para, index - preedit_cursor_pos + preedit_len, end_para, end_index, 0 ); text += edit->selectedText(); } *latter = strdup( text.toUtf8().data() ); break; case UTextOrigin_End: end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); start_para = end_para; start_index = end_index; if ( former_req_len >= 0 ) { for ( int i = 0; i < former_req_len; i++ ) Q3TextEditPositionBackward( &start_para, &start_index ); } else { if ( former_req_len == UTextExtent_Line ) start_index = 0; else if ( former_req_len == UTextExtent_Full ) { start_para = 0; start_index = 0; } else { edit->setTextFormat( format ); return -1; } } if ( start_para > para || ( start_para == para && start_index >= ( index - preedit_cursor_pos + preedit_len ) ) ) { edit->setSelection( start_para, start_index, end_para, end_index, 0 ); text = edit->selectedText(); } else { edit->setSelection( start_para, start_index, para, index - preedit_cursor_pos, 0 ); text = edit->selectedText(); edit->setSelection( para, index - preedit_cursor_pos + preedit_len, end_para, end_index, 0 ); text += edit->selectedText(); } *former = strdup( text.toUtf8().data() ); *latter = 0; break; case UTextOrigin_Unspecified: default: edit->setTextFormat( format ); return -1; } if ( sel_start_para != -1 && sel_start_index != -1 && sel_end_para != -1 && sel_end_index != -1 ) edit->setSelection( sel_start_index, sel_start_index, sel_end_para, sel_end_index, 0 ); else edit->removeSelection( 0 ); edit->setCursorPosition( para, index ); edit->setTextFormat( format ); return 0; }
int QUimTextUtil::deletePrimaryTextInQ3TextEdit( enum UTextOrigin origin, int former_req_len, int latter_req_len ) { Q3TextEdit *edit = static_cast<Q3TextEdit *>( mWidget ); int start_para, start_index, end_para, end_index, para, index; int n_para; savePreedit(); edit->getCursorPosition( ¶, &index ); n_para = edit->paragraphs(); switch ( origin ) { case UTextOrigin_Cursor: start_index = index; start_para = para; end_index = start_index; end_para = para; if ( former_req_len >= 0 ) { for ( int i = 0; i < former_req_len; i++ ) Q3TextEditPositionBackward( &start_para, &start_index ); } else { if ( former_req_len == UTextExtent_Line ) { start_index = 0; } else if ( former_req_len == UTextExtent_Full ) { start_para = 0; start_index = 0; } else { restorePreedit(); return -1; } } if ( latter_req_len >= 0 ) { for ( int i = 0; i < latter_req_len; i++ ) Q3TextEditPositionForward( &end_para, &end_index ); } else { if ( latter_req_len == UTextExtent_Line ) { end_index = edit->paragraphLength( end_para ); } else if ( latter_req_len == UTextExtent_Full ) { end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); } else { restorePreedit(); return -1; } } break; case UTextOrigin_Beginning: start_para = 0; start_index = 0; end_para = start_para; end_index = start_index; if ( latter_req_len >= 0 ) { for ( int i = 0; i < latter_req_len; i++ ) Q3TextEditPositionForward( &end_para, &end_index ); } else { if ( latter_req_len == UTextExtent_Line ) { end_index = edit->paragraphLength( end_para ); } else if ( latter_req_len == UTextExtent_Full ) { end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); } else { restorePreedit(); return -1; } } break; case UTextOrigin_End: end_para = n_para - 1; end_index = edit->paragraphLength( end_para ); start_para = end_para; start_index = end_index; if ( former_req_len >= 0 ) { for ( int i = 0; i < former_req_len; i++ ) Q3TextEditPositionBackward( &start_para, &start_index ); } else { if ( former_req_len == UTextExtent_Line ) start_index = 0; else if ( former_req_len == UTextExtent_Full ) { start_para = 0; start_index = 0; } else { restorePreedit(); return -1; } } break; case UTextOrigin_Unspecified: default: restorePreedit(); return -1; } edit->setSelection( start_para, start_index, end_para, end_index, 1 ); edit->removeSelectedText( 1 ); edit->setCursorPosition( start_para, start_index ); restorePreedit(); return 0; }