File indexing completed on 2024-04-28 17:01:40

0001 /*
0002 SPDX-FileCopyrightText: 2001-2004,2009 Otto Bruggeman <bruggie@gmail.com>
0003 SPDX-FileCopyrightText: 2001-2003 John Firebaugh <jfirebaugh@kde.org>
0004 
0005 SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef KOMPAREDIFF2_DIFFMODEL_H
0009 #define KOMPAREDIFF2_DIFFMODEL_H
0010 
0011 #include <QObject>
0012 #include <QStringList>
0013 #include "diffhunk.h"
0014 #include "kompare.h"
0015 #include "komparediff2_export.h"
0016 
0017 namespace Diff2
0018 {
0019 
0020 /**
0021  * @class DiffModel diffmodel.h <KompareDiff2/DiffModel>
0022  *
0023  * A model describing the differences between two files.
0024  */
0025 class KOMPAREDIFF2_EXPORT DiffModel : public QObject
0026 {
0027     Q_OBJECT
0028 public:
0029 
0030     DiffModel(const QString& srcBaseURL, const QString& destBaseURL);
0031     DiffModel();
0032     ~DiffModel() override;
0033 
0034 private:
0035     DiffModel(const DiffModel&) : QObject() {}
0036 
0037 public:
0038     int parseDiff(enum Kompare::Format format, const QStringList& list);
0039 
0040     QString recreateDiff() const;
0041 
0042     int hunkCount() const       { return m_hunks.count(); }
0043     int differenceCount() const { return m_differences.count(); }
0044     int appliedCount() const    { return m_appliedCount; }
0045 
0046     DiffHunk* hunkAt(int i)               { return (m_hunks.at(i)); }
0047     const Difference* differenceAt(int i) const { return (m_differences.at(i)); }
0048     Difference* differenceAt(int i) { return (m_differences.at(i)); }
0049 
0050     DiffHunkList*         hunks()             { return &m_hunks; }
0051     const DiffHunkList*   hunks() const       { return &m_hunks; }
0052     DifferenceList*       differences()       { return &m_differences; }
0053     const DifferenceList* differences() const { return &m_differences; }
0054 
0055     int findDifference(Difference* diff) const { return m_differences.indexOf(diff); }
0056 
0057     Difference* firstDifference();
0058     Difference* lastDifference();
0059     Difference* prevDifference();
0060     Difference* nextDifference();
0061 
0062     const QString source() const               { return m_source; }
0063     const QString destination() const          { return m_destination; }
0064     const QString sourceFile() const;
0065     const QString destinationFile() const;
0066     const QString sourcePath() const;
0067     const QString destinationPath() const;
0068     const QString sourceTimestamp() const      { return m_sourceTimestamp; }
0069     const QString destinationTimestamp() const { return m_destinationTimestamp; }
0070     const QString sourceRevision() const       { return m_sourceRevision; }
0071     const QString destinationRevision() const  { return m_destinationRevision; }
0072 
0073     void setSourceFile(QString path);
0074     void setDestinationFile(QString path);
0075     void setSourceTimestamp(QString timestamp);
0076     void setDestinationTimestamp(QString timestamp);
0077     void setSourceRevision(QString revision);
0078     void setDestinationRevision(QString revision);
0079 
0080     void addHunk(DiffHunk* hunk);
0081     void addDiff(Difference* diff);
0082     bool hasUnsavedChanges() const;
0083 
0084     int  diffIndex(void) const       { return m_diffIndex; }
0085     void setDiffIndex(int diffIndex) { m_diffIndex = diffIndex; }
0086 
0087     void applyDifference(bool apply);
0088     void applyAllDifferences(bool apply);
0089 
0090     bool setSelectedDifference(Difference* diff);
0091 
0092     DiffModel& operator=(const DiffModel& model);
0093     bool operator<(const DiffModel& model);
0094 
0095     int localeAwareCompareSource(const DiffModel& model);
0096 
0097     bool isBlended() const { return m_blended; }
0098     void setBlended(bool blended) { m_blended = blended; }
0099 
0100     /**
0101      * @p oldlines - lines that were removed.
0102      * @p newLines - lines that were inserted.
0103      * @p startPos - number of line at which the change occurred
0104      */
0105     QPair<QList<Difference*>, QList<Difference*> > linesChanged(const QStringList& oldLines, const QStringList& newLines, int editLineNumber);
0106 
0107 private:
0108     void splitSourceInPathAndFileName();
0109     void splitDestinationInPathAndFileName();
0110     void computeDiffStats(Difference* diff);
0111     void processStartMarker(Difference* diff, const QStringList& lines, MarkerListConstIterator& currentMarker, int& currentListLine, bool isSource);
0112 
0113 private:
0114     QString m_source;
0115     QString m_destination;
0116 
0117     QString m_sourcePath;
0118     QString m_destinationPath;
0119 
0120     QString m_sourceFile;
0121     QString m_destinationFile;
0122 
0123     QString m_sourceTimestamp;
0124     QString m_destinationTimestamp;
0125 
0126     QString m_sourceRevision;
0127     QString m_destinationRevision;
0128 
0129     DiffHunkList   m_hunks;
0130     DifferenceList m_differences;
0131 
0132     int  m_appliedCount;
0133 
0134     int          m_diffIndex;
0135     Difference*  m_selectedDifference;
0136 
0137     bool m_blended;
0138 
0139 private Q_SLOTS:
0140     void slotDifferenceApplied(Difference* diff);
0141 };
0142 
0143 } // End of namespace Diff2
0144 
0145 #endif
0146