reimplemented Q3TextDocument::find() to be like the qt3 version
This commit is contained in:
parent
e5efa41462
commit
1fc6bdba56
@ -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()
|
void Preview::init()
|
||||||
{
|
{
|
||||||
setName("Preview");
|
setName("Preview");
|
||||||
|
|||||||
@ -73,6 +73,10 @@ public:
|
|||||||
: QTEXTEDIT(parent, name), m_preview(pv), m_dspflds(false)
|
: QTEXTEDIT(parent, name), m_preview(pv), m_dspflds(false)
|
||||||
{}
|
{}
|
||||||
void moveToAnchor(const QString& name);
|
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:
|
public slots:
|
||||||
virtual void toggleFields();
|
virtual void toggleFields();
|
||||||
virtual void print();
|
virtual void print();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user