File indexing completed on 2024-04-21 05:43:03

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