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::acquireSelectionTextInQ3TextEdit( enum UTextOrigin origin, int former_req_len, int latter_req_len, char **former, char **latter ) { Q3TextEdit *edit = static_cast<Q3TextEdit *>( mWidget ); QString text; int len, offset, newline; int start_para, start_index, end_para, end_index; int para, index; bool cursor_at_beginning = false; Qt::TextFormat format; if ( ! edit->hasSelectedText() ) return -1; format = edit->textFormat(); edit->setTextFormat( Qt::PlainText ); edit->getCursorPosition( ¶, &index ); edit->getSelection(&start_para, &start_index, &end_para, &end_index, 0 ); if ( para == start_para && index == start_index ) cursor_at_beginning = true; text = edit->selectedText(); len = text.length(); 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 ) ) ) { edit->setTextFormat( format ); return -1; } if ( latter_req_len == UTextExtent_Line && ( ( newline = text.indexOf( '\n' ) ) != -1 ) ) offset = len - newline; } *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 ) ) ) { edit->setTextFormat( format ); return -1; } if ( former_req_len == UTextExtent_Line && ( ( newline = text.lastIndexOf( '\n' ) ) != -1 ) ) offset = newline + 1; } *former = strdup( text.mid( offset, len - offset ).toUtf8().data() ); *latter = 0; } else { edit->setTextFormat( format ); return -1; } edit->setTextFormat( format ); return 0; }
int QUimTextUtil::deleteSelectionTextInQ3TextEdit( enum UTextOrigin origin, int former_req_len, int latter_req_len ) { Q3TextEdit *edit = static_cast<Q3TextEdit *>( mWidget ); QString text; int len, newline; int para, index; int sel_para_from, sel_index_from, sel_para_to, sel_index_to; int start_para, start_index, end_para, end_index; bool cursor_at_beginning = false; if ( ! edit->hasSelectedText() ) return -1; edit->getCursorPosition( ¶, &index ); edit->getSelection( &sel_para_from, &sel_index_from, &sel_para_to, &sel_index_to, 0 ); if ( para == sel_para_from && index == sel_index_from ) cursor_at_beginning = true; text = edit->selectedText(); len = text.length(); start_para = sel_para_from; start_index = sel_index_from; end_para = sel_para_to; end_index = sel_index_to; if ( origin == UTextOrigin_Beginning || ( origin == UTextOrigin_Cursor && cursor_at_beginning ) ) { edit->setCursorPosition( sel_para_from, sel_index_from ); if ( latter_req_len >= 0 ) { if ( len > latter_req_len ) { end_para = sel_para_from; end_index = sel_index_from; for ( int i = 0; i < latter_req_len; i++) Q3TextEditPositionForward( &end_para, &end_index ); } } else { if (! ( ~latter_req_len & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) ) return -1; if ( latter_req_len == UTextExtent_Line && ( ( newline = text.indexOf('\n') ) != -1 ) ) { end_para = sel_para_from; end_index = sel_index_from + newline; } } } else if ( origin == UTextOrigin_End || ( origin == UTextOrigin_Cursor && !cursor_at_beginning ) ) { if ( former_req_len >= 0 ) { if ( len > former_req_len ) { start_para = sel_para_to; start_index = sel_index_to; for ( int i = 0; i < former_req_len; i++) Q3TextEditPositionBackward( &start_para, &start_index ); } } else { if (! ( ~former_req_len & ( ~UTextExtent_Line | ~UTextExtent_Full ) ) ) return -1; if ( former_req_len == UTextExtent_Line && ( ( newline = text.lastIndexOf( '\n' ) ) != -1 ) ) { start_para = sel_para_to; start_index = 0; } } } else { return -1; } edit->setSelection( start_para, start_index, end_para, end_index, 1 ); edit->removeSelectedText( 1 ); return 0; }