File indexing completed on 2024-04-14 05:45:46

0001 /*
0002     This file is part of the Okteta Core library, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008-2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #ifndef OKTETA_PIECETABLEBYTEARRAYMODEL_HPP
0010 #define OKTETA_PIECETABLEBYTEARRAYMODEL_HPP
0011 
0012 // lib
0013 #include "abstractbytearraymodel.hpp"
0014 #include "versionable.hpp"
0015 #include "bookmarkable.hpp"
0016 #include "changesdescribable.hpp"
0017 #include "changehistory.hpp"
0018 
0019 namespace Okteta {
0020 
0021 class PieceTableByteArrayModelPrivate;
0022 
0023 /**
0024  * @author Friedrich W. H. Kossebau
0025  */
0026 
0027 class OKTETACORE_EXPORT PieceTableByteArrayModel : public AbstractByteArrayModel
0028                                                  , public Versionable
0029                                                  , public Bookmarkable
0030                                                  , public ChangesDescribable
0031                                                  , public ChangeHistory
0032 {
0033     Q_OBJECT
0034     Q_INTERFACES(
0035         Okteta::Versionable
0036         Okteta::Bookmarkable
0037         Okteta::ChangesDescribable
0038         Okteta::ChangeHistory
0039     )
0040 
0041     friend class PieceTableByteArrayModelPrivate;
0042 
0043 public:
0044     explicit PieceTableByteArrayModel(const QByteArray& data, QObject* parent = nullptr);
0045     explicit PieceTableByteArrayModel(int size = 0, Byte fillByte = '\0', QObject* parent = nullptr);
0046 
0047     ~PieceTableByteArrayModel() override;
0048 
0049 public: // AbstractByteArrayModel API
0050     Byte byte(Address offset) const override;
0051     Size size() const override;
0052     bool isReadOnly() const override;
0053     bool isModified() const override;
0054 
0055     Size insert(Address offset, const Byte* insertData, int insertLength) override;
0056     Size remove(const AddressRange& removeRange) override;
0057     Size replace(const AddressRange& removeRange, const Byte* insertData, int insertLength) override;
0058     bool swap(Address firstStart, const AddressRange& secondRange) override;
0059     Size fill(Byte fillByte, Address offset = 0, Size fillLength = -1) override;
0060     void setByte(Address offset, Byte byte) override;
0061 
0062     void setModified(bool modified = true) override;
0063     void setReadOnly(bool isReadOnly = true) override;
0064 
0065 //     virtual int indexOf( const char *searchString, int length, int from  = 0 ) const;
0066 //     virtual int lastIndexOf( const char *searchString, int length, int from = -1 ) const;
0067 
0068 public: // Versionable API
0069     int versionIndex() const override;
0070     int versionCount() const override;
0071     QString versionDescription(int versionIndex) const override;
0072 
0073 public: // set/action
0074     void revertToVersionByIndex(int versionIndex) override;
0075 
0076 public: // Bookmarkable API
0077     void addBookmarks(const QVector<Okteta::Bookmark>& bookmarks) override;
0078     void removeBookmarks(const QVector<Okteta::Bookmark>& bookmarks) override;
0079     void removeAllBookmarks() override;
0080     void setBookmark(unsigned int index, const Okteta::Bookmark& bookmark) override;
0081 
0082     Okteta::BookmarksConstIterator createBookmarksConstIterator() const override;
0083     const Okteta::Bookmark& bookmarkAt(unsigned int index) const override;
0084     const Okteta::Bookmark& bookmarkFor(int offset) const override;
0085     bool containsBookmarkFor(int offset) const override;
0086     unsigned int bookmarksCount() const override;
0087 
0088 public: // ChangesDescribable API
0089     void openGroupedChange(const QString& description) override;
0090     void cancelGroupedChange() override;
0091     void closeGroupedChange(const QString& description) override;
0092 
0093 public: // ChangeHistory API
0094     QVector<ByteArrayChange> changes(int firstVersionIndex, int lastVersionIndex) const override;
0095     QByteArray initialData() const override;
0096     void doChanges(const QVector<Okteta::ByteArrayChange>& changes,
0097                    int oldVersionIndex, int newVersionIndex) override;
0098 
0099 public:
0100     void setData(const QByteArray& data);
0101 
0102 Q_SIGNALS: // Versionable signals
0103     void revertedToVersionIndex(int versionIndex) override;
0104     void headVersionDescriptionChanged(const QString& versionDescription) override;
0105     void headVersionChanged(int newHeadVersionIndex) override;
0106 
0107 Q_SIGNALS: // Bookmarkable signals
0108     void bookmarksAdded(const QVector<Okteta::Bookmark>& bookmarks) override;
0109     void bookmarksRemoved(const QVector<Okteta::Bookmark>& bookmarks) override;
0110     void bookmarksModified(bool modified) override;
0111     void bookmarksModified(const QVector<int>& indizes) override;
0112 
0113 Q_SIGNALS: // ChangeHistory signals
0114     void changesDone(const QVector<Okteta::ByteArrayChange>& changes,
0115                      int oldVersionIndex, int newVersionIndex) override;
0116 
0117 private:
0118     Q_DECLARE_PRIVATE(PieceTableByteArrayModel)
0119 };
0120 
0121 }
0122 
0123 #endif