File indexing completed on 2024-05-05 10:04:51

0001 /*
0002     SPDX-FileCopyrightText: 2001-2004 Otto Bruggeman <otto.bruggeman@home.nl>
0003     SPDX-FileCopyrightText: 2001-2003 John Firebaugh <jfirebaugh@kde.org>
0004     SPDX-FileCopyrightText: 2007-2011 Kevin Kofler <kevin.kofler@chello.at>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #ifndef KOMPARENAVTREEPART_H
0010 #define KOMPARENAVTREEPART_H
0011 
0012 // Qt
0013 #include <QHash>
0014 #include <QSplitter>
0015 #include <QTreeWidget>
0016 #include <QTreeWidgetItem>
0017 // KF
0018 #include <kparts_version.h>
0019 #include <KParts/ReadOnlyPart>
0020 // KompareDiff2
0021 #include <KompareDiff2/Kompare>
0022 #include <KompareDiff2/DiffModelList>
0023 
0024 namespace Diff2 {
0025 class DiffModel;
0026 class Difference;
0027 }
0028 
0029 class KDirLVI;
0030 class KFileLVI;
0031 class KChangeLVI;
0032 
0033 class KompareNavTreePart : public KParts::ReadOnlyPart
0034 {
0035     Q_OBJECT
0036 
0037 public:
0038     explicit KompareNavTreePart(QWidget* parentWidget, QObject* parent,
0039                                 const KPluginMetaData& metaData, const QVariantList& args);
0040     ~KompareNavTreePart() override;
0041 
0042 public:
0043     bool openFile() override { return false; };
0044 
0045 public Q_SLOTS:
0046     void slotSetSelection(const Diff2::DiffModel* model, const Diff2::Difference* diff);
0047     void slotSetSelection(const Diff2::Difference* diff);
0048     void slotModelsChanged(const Diff2::DiffModelList* modelList);
0049     void slotKompareInfo(Kompare::Info* info);
0050 
0051 Q_SIGNALS:
0052     void selectionChanged(const Diff2::DiffModel* model, const Diff2::Difference* diff);
0053     void selectionChanged(const Diff2::Difference* diff);
0054 
0055 private Q_SLOTS:
0056     void slotSrcDirTreeSelectionChanged(QTreeWidgetItem* item);
0057     void slotDestDirTreeSelectionChanged(QTreeWidgetItem* item);
0058     void slotFileListSelectionChanged(QTreeWidgetItem* item);
0059     void slotChangesListSelectionChanged(QTreeWidgetItem* item);
0060 
0061     void slotApplyDifference(bool apply);
0062     void slotApplyAllDifferences(bool apply);
0063     void slotApplyDifference(const Diff2::Difference* diff, bool apply);
0064 
0065     void buildTreeInMemory();
0066 
0067 private:
0068     void setSelectedDir(const Diff2::DiffModel* model);
0069     void setSelectedFile(const Diff2::DiffModel* model);
0070     void setSelectedDifference(const Diff2::Difference* diff);
0071 
0072     void buildDirectoryTree();
0073 
0074     QString compareFromEndAndReturnSame(const QString& string1, const QString& string2);
0075 
0076 private:
0077     QSplitter*                         m_splitter;
0078     const Diff2::DiffModelList*        m_modelList;
0079 
0080     QHash<const Diff2::Difference*, KChangeLVI*>    m_diffToChangeItemDict;
0081     QHash<const Diff2::DiffModel*, KFileLVI*>       m_modelToFileItemDict;
0082     QHash<const Diff2::DiffModel*, KDirLVI*>        m_modelToSrcDirItemDict;
0083     QHash<const Diff2::DiffModel*, KDirLVI*>        m_modelToDestDirItemDict;
0084 
0085     QTreeWidget*                       m_srcDirTree;
0086     QTreeWidget*                       m_destDirTree;
0087     QTreeWidget*                       m_fileList;
0088     QTreeWidget*                       m_changesList;
0089 
0090     KDirLVI*                           m_srcRootItem;
0091     KDirLVI*                           m_destRootItem;
0092 
0093     const Diff2::DiffModel*            m_selectedModel;
0094     const Diff2::Difference*           m_selectedDifference;
0095 
0096     QString                            m_source;
0097     QString                            m_destination;
0098 
0099     struct Kompare::Info*              m_info;
0100 };
0101 
0102 // These 3 classes are need to store the models into a tree so it is easier
0103 // to extract the info we need for the navigation widgets
0104 
0105 class KChangeLVI : public QTreeWidgetItem
0106 {
0107 public:
0108     KChangeLVI(QTreeWidget* parent, Diff2::Difference* diff);
0109     ~KChangeLVI() override;
0110 public:
0111     Diff2::Difference* difference() { return m_difference; };
0112     bool operator<(const QTreeWidgetItem& item) const override;
0113 
0114     void setDifferenceText();
0115 private:
0116     Diff2::Difference* m_difference;
0117 };
0118 
0119 class KFileLVI : public QTreeWidgetItem
0120 {
0121 public:
0122     KFileLVI(QTreeWidget* parent, Diff2::DiffModel* model);
0123     ~KFileLVI() override;
0124 public:
0125     Diff2::DiffModel* model() { return m_model; };
0126     void fillChangesList(QTreeWidget* changesList, QHash<const Diff2::Difference*, KChangeLVI*>* diffToChangeItemDict);
0127 private:
0128     bool hasExtension(const QString& extensions, const QString& fileName);
0129     const QString getIcon(const QString& fileName);
0130 private:
0131     Diff2::DiffModel* m_model;
0132 };
0133 
0134 class KDirLVI : public QTreeWidgetItem
0135 {
0136 public:
0137     KDirLVI(KDirLVI* parent, const QString& dir);
0138     KDirLVI(QTreeWidget* parent, const QString& dir);
0139     ~KDirLVI() override;
0140 public:
0141     void addModel(QString& dir, Diff2::DiffModel* model, QHash<const Diff2::DiffModel*, KDirLVI*>* modelToDirItemDict);
0142     QString& dirName() { return m_dirName; };
0143     QString fullPath(QString& path);
0144 
0145     KDirLVI* setSelected(const QString& dir);
0146     void setSelected(bool selected) { QTreeWidgetItem::setSelected(selected); }
0147 
0148     void fillFileList(QTreeWidget* fileList, QHash<const Diff2::DiffModel*, KFileLVI*>* modelToFileItemDict);
0149     bool isRootItem() { return m_rootItem; };
0150 
0151 private:
0152     KDirLVI* findChild(const QString& dir);
0153 private:
0154     Diff2::DiffModelList m_modelList;
0155     QString m_dirName;
0156     bool m_rootItem;
0157 };
0158 
0159 #endif