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