File indexing completed on 2024-04-14 03:55:27

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, const KPluginMetaData &data, QObject *parent)
0013     : KParts::ReadWritePart(parent, data)
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->editStart();
0059         d->transactionRunning = true;
0060     }
0061 }
0062 
0063 void Document::EditingTransaction::finish()
0064 {
0065     if (d->document && d->transactionRunning) {
0066         d->document->editEnd();
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 bool KTextEditor::Document::replaceText(Range range, const QString &text, bool block)
0086 {
0087     bool success = true;
0088     EditingTransaction transaction(this);
0089     success &= removeText(range, block);
0090     success &= insertText(range.start(), text, block);
0091     return success;
0092 }
0093 
0094 bool Document::replaceText(Range range, const QStringList &text, bool block)
0095 {
0096     bool success = true;
0097     EditingTransaction transaction(this);
0098     success &= removeText(range, block);
0099     success &= insertText(range.start(), text, block);
0100     return success;
0101 }
0102 
0103 bool Document::isEmpty() const
0104 {
0105     return documentEnd() == Cursor::start();
0106 }
0107 
0108 QList<KTextEditor::Range> Document::searchText(KTextEditor::Range range, const QString &pattern, const SearchOptions options) const
0109 {
0110     return d->searchText(range, pattern, options);
0111 }