File indexing completed on 2024-04-28 15:30:51
0001 /* 0002 SPDX-FileCopyrightText: 2010 Bernhard Beschow <bbeschow@cs.tu-berlin.de> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "document.h" 0008 #include "katedocument.h" 0009 0010 using namespace KTextEditor; 0011 0012 Document::Document(DocumentPrivate *impl, QObject *parent) 0013 : KParts::ReadWritePart(parent) 0014 , d(impl) 0015 { 0016 } 0017 0018 Document::~Document() = default; 0019 0020 namespace KTextEditor 0021 { 0022 /** 0023 * Private d-pointer type for EditingTransaction 0024 */ 0025 class EditingTransactionPrivate 0026 { 0027 public: 0028 /** 0029 * real document implementation 0030 */ 0031 DocumentPrivate *document; 0032 0033 /** 0034 * Indicator for running editing transaction 0035 */ 0036 bool transactionRunning; 0037 }; 0038 0039 } 0040 0041 Document::EditingTransaction::EditingTransaction(Document *document) 0042 : d(new EditingTransactionPrivate()) 0043 { 0044 // Although it works in release-mode, we usually want a valid document 0045 Q_ASSERT(document != nullptr); 0046 0047 // initialize d-pointer 0048 d->document = qobject_cast<KTextEditor::DocumentPrivate *>(document); 0049 d->transactionRunning = false; 0050 0051 // start the editing transaction 0052 start(); 0053 } 0054 0055 void Document::EditingTransaction::start() 0056 { 0057 if (d->document && !d->transactionRunning) { 0058 d->document->startEditing(); 0059 d->transactionRunning = true; 0060 } 0061 } 0062 0063 void Document::EditingTransaction::finish() 0064 { 0065 if (d->document && d->transactionRunning) { 0066 d->document->finishEditing(); 0067 d->transactionRunning = false; 0068 } 0069 } 0070 0071 Document::EditingTransaction::~EditingTransaction() 0072 { 0073 // finish the editing transaction 0074 finish(); 0075 0076 // delete our d-pointer 0077 delete d; 0078 } 0079 0080 bool Document::openingError() const 0081 { 0082 return d->m_openingError; 0083 } 0084 0085 QString Document::openingErrorMessage() const 0086 { 0087 return d->m_openingErrorMessage; 0088 } 0089 0090 bool KTextEditor::Document::replaceText(const Range &range, const QString &text, bool block) 0091 { 0092 bool success = true; 0093 EditingTransaction transaction(this); 0094 success &= removeText(range, block); 0095 success &= insertText(range.start(), text, block); 0096 return success; 0097 } 0098 0099 bool Document::replaceText(const Range &range, const QStringList &text, bool block) 0100 { 0101 bool success = true; 0102 EditingTransaction transaction(this); 0103 success &= removeText(range, block); 0104 success &= insertText(range.start(), text, block); 0105 return success; 0106 } 0107 0108 bool Document::isEmpty() const 0109 { 0110 return documentEnd() == Cursor::start(); 0111 } 0112 0113 QVector<KTextEditor::Range> Document::searchText(const KTextEditor::Range &range, const QString &pattern, const SearchOptions options) const 0114 { 0115 return d->searchText(range, pattern, options); 0116 }