Changeset View
Changeset View
Standalone View
Standalone View
src/search/katematch.cpp
Show All 16 Lines | |||||
17 | * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 17 | * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
18 | * Boston, MA 02110-1301, USA. | 18 | * Boston, MA 02110-1301, USA. | ||
19 | */ | 19 | */ | ||
20 | 20 | | |||
21 | #include "katematch.h" | 21 | #include "katematch.h" | ||
22 | 22 | | |||
23 | #include "kateregexpsearch.h" | 23 | #include "kateregexpsearch.h" | ||
24 | #include "katedocument.h" | 24 | #include "katedocument.h" | ||
25 | #include <ktexteditor/movingrange.h> | | |||
26 | 25 | | |||
27 | KateMatch::KateMatch(KTextEditor::DocumentPrivate *document, KTextEditor::SearchOptions options) | 26 | KateMatch::KateMatch(KTextEditor::DocumentPrivate *document, KTextEditor::SearchOptions options) | ||
28 | : m_document(document) | 27 | : m_document(document) | ||
29 | , m_options(options) | 28 | , m_options(options) | ||
30 | { | 29 | { | ||
31 | m_resultRanges.append(KTextEditor::Range::invalid()); | 30 | m_resultRanges.append(KTextEditor::Range::invalid()); | ||
32 | } | 31 | } | ||
33 | 32 | | |||
34 | KTextEditor::Range KateMatch::searchText(const KTextEditor::Range &range, const QString &pattern) | 33 | KTextEditor::Range KateMatch::searchText(const KTextEditor::Range &range, const QString &pattern) | ||
35 | { | 34 | { | ||
36 | m_resultRanges = m_document->searchText(range, pattern, m_options); | 35 | m_resultRanges = m_document->searchText(range, pattern, m_options); | ||
37 | 36 | | |||
38 | return m_resultRanges[0]; | 37 | return m_resultRanges[0]; | ||
39 | } | 38 | } | ||
40 | 39 | | |||
41 | KTextEditor::Range KateMatch::replace(const QString &replacement, bool blockMode, int replacementCounter) | 40 | KTextEditor::Range KateMatch::replace(const QString &replacement, bool blockMode, int replacementCounter) | ||
42 | { | 41 | { | ||
43 | // Placeholders depending on search mode | 42 | // Placeholders depending on search mode | ||
44 | const bool usePlaceholders = m_options.testFlag(KTextEditor::Regex) || | 43 | // skip place-holder stuff if we have no \ at all inside the replacement, the buildReplacement is expensive | ||
45 | m_options.testFlag(KTextEditor::EscapeSequences); | 44 | const bool usePlaceholders = (m_options.testFlag(KTextEditor::Regex) || | ||
45 | m_options.testFlag(KTextEditor::EscapeSequences)) | ||||
46 | && replacement.contains(QLatin1Char('\\')); | ||||
46 | 47 | | |||
47 | const QString finalReplacement = usePlaceholders ? buildReplacement(replacement, blockMode, replacementCounter) | 48 | const QString finalReplacement = usePlaceholders ? buildReplacement(replacement, blockMode, replacementCounter) | ||
48 | : replacement; | 49 | : replacement; | ||
49 | 50 | | |||
50 | // Track replacement operation | 51 | // Track replacement operation, reuse range if already there | ||
51 | KTextEditor::MovingRange *const afterReplace = m_document->newMovingRange(range(), KTextEditor::MovingRange::ExpandLeft | KTextEditor::MovingRange::ExpandRight); | 52 | if (m_afterReplaceRange) { | ||
52 | 53 | m_afterReplaceRange->setRange(range()); | |||
53 | blockMode = blockMode && !range().onSingleLine(); | 54 | } else { | ||
54 | m_document->replaceText(range(), finalReplacement, blockMode); | 55 | m_afterReplaceRange.reset(m_document->newMovingRange(range(), KTextEditor::MovingRange::ExpandLeft | KTextEditor::MovingRange::ExpandRight)); | ||
55 | 56 | } | |||
56 | const KTextEditor::Range result = *afterReplace; | | |||
57 | delete afterReplace; | | |||
58 | 57 | | |||
59 | return result; | 58 | // replace and return results range | ||
59 | m_document->replaceText(range(), finalReplacement, blockMode && !range().onSingleLine()); | ||||
60 | return m_afterReplaceRange->toRange(); | ||||
60 | } | 61 | } | ||
61 | 62 | | |||
62 | KTextEditor::Range KateMatch::range() const | 63 | KTextEditor::Range KateMatch::range() const | ||
63 | { | 64 | { | ||
64 | if (m_resultRanges.size() > 0) { | 65 | if (m_resultRanges.size() > 0) { | ||
65 | return m_resultRanges[0]; | 66 | return m_resultRanges[0]; | ||
66 | } | 67 | } | ||
67 | 68 | | |||
Show All 24 Lines |