reimplemented Q3TextDocument::find() to be like the qt3 version

This commit is contained in:
dockes 2009-12-07 17:43:56 +00:00
parent e5efa41462
commit 1fc6bdba56
2 changed files with 109 additions and 0 deletions

View File

@ -140,6 +140,111 @@ void PreviewTextEdit::moveToAnchor(const QString& name)
}
}
#if (QT_VERSION >= 0x040000)
// Had to reimplement Qtextdocument::find() by duplicating the qt3
// version. The version in qt4 qt3support was modified for some
// unknown reason and exhibits quadratic behaviour, and is totally
// unusable on big documents
static bool QTextDocument_find(Q3TextDocument *doc, Q3TextCursor& cursor,
const QString &expr, bool cs, bool wo,
bool forward)
{
Qt::CaseSensitivity caseSensitive = cs ? Qt::CaseSensitive :
Qt::CaseInsensitive;
doc->removeSelection(Q3TextDocument::Standard);
Q3TextParagraph *p = 0;
if ( expr.isEmpty() )
return FALSE;
for (;;) {
if ( p != cursor.paragraph() ) {
p = cursor.paragraph();
QString s = cursor.paragraph()->string()->toString();
int start = cursor.index();
for ( ;; ) {
int res = forward ? s.indexOf(expr, start, caseSensitive ) :
s.lastIndexOf(expr, start, caseSensitive);
int end = res + expr.length();
if ( res == -1 || ( !forward && start <= res ) )
break;
if (!wo || ((res == 0||s[res - 1].isSpace() ||
s[res - 1].isPunct()) &&
(end == (int)s.length() || s[end].isSpace() ||
s[end].isPunct()))) {
doc->removeSelection(Q3TextDocument::Standard);
cursor.setIndex( forward ? end : res );
doc->setSelectionStart(Q3TextDocument::Standard, cursor);
cursor.setIndex( forward ? res : end );
doc->setSelectionEnd(Q3TextDocument::Standard, cursor);
if ( !forward )
cursor.setIndex( res );
return TRUE;
}
start = res + (forward ? 1 : -1);
}
}
if ( forward ) {
if ( cursor.paragraph() == doc->lastParagraph() &&
cursor.atParagEnd() )
break;
cursor.gotoNextLetter();
} else {
if ( cursor.paragraph() == doc->firstParagraph() &&
cursor.atParagStart() )
break;
cursor.gotoPreviousLetter();
}
}
return FALSE;
}
bool PreviewTextEdit::find(const QString &expr, bool cs, bool wo,
bool forward, int *para, int *index)
{
drawCursor(false);
#ifndef QT_NO_CURSOR
viewport()->setCursor(isReadOnly() ? Qt::ArrowCursor : Qt::IBeamCursor);
#endif
Q3TextCursor findcur = *textCursor();
if (para && index) {
if (document()->paragAt(*para))
findcur.gotoPosition(document()->paragAt(*para), *index);
else
findcur.gotoEnd();
} else if (document()->hasSelection(Q3TextDocument::Standard)){
// maks sure we do not find the same selection again
if (forward)
findcur.gotoNextLetter();
else
findcur.gotoPreviousLetter();
} else if (!forward && findcur.index() == 0 && findcur.paragraph() == findcur.topParagraph()) {
findcur.gotoEnd();
}
removeSelection(Q3TextDocument::Standard);
bool found = QTextDocument_find(document(), findcur, expr, cs, wo, forward);
if (found) {
if (para)
*para = findcur.paragraph()->paragId();
if (index)
*index = findcur.index();
*textCursor() = findcur;
repaintChanged();
ensureCursorVisible();
}
drawCursor(true);
if (found) {
emit cursorPositionChanged(textCursor());
emit cursorPositionChanged(textCursor()->paragraph()->paragId(),
textCursor()->index());
}
return found;
}
#endif
void Preview::init()
{
setName("Preview");

View File

@ -73,6 +73,10 @@ public:
: QTEXTEDIT(parent, name), m_preview(pv), m_dspflds(false)
{}
void moveToAnchor(const QString& name);
#if (QT_VERSION >= 0x040000)
virtual bool find(const QString &expr, bool cs, bool wo,bool forward = true,
int *para = 0, int *index = 0);
#endif
public slots:
virtual void toggleFields();
virtual void print();