File indexing completed on 2024-05-05 05:45:47
0001 /* 0002 SPDX-FileCopyrightText: 2001-2004, 2009 Otto Bruggeman <bruggie@gmail.com> 0003 SPDX-FileCopyrightText: 2001-2003 John Firebaugh <jfirebaugh@kde.org> 0004 SPDX-FileCopyrightText: 2004 Jeff Snyder <jeff@caffeinated.me.uk> 0005 SPDX-FileCopyrightText: 2011 Kevin Kofler <kevin.kofler@chello.at> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #ifndef KOMPARELISTVIEW_H 0011 #define KOMPARELISTVIEW_H 0012 0013 #include <QHash> 0014 #include <QLabel> 0015 #include <QResizeEvent> 0016 #include <QWheelEvent> 0017 #include <QVBoxLayout> 0018 #include <QMouseEvent> 0019 #include <QFrame> 0020 #include <QTreeWidget> 0021 #include <QStyledItemDelegate> 0022 0023 namespace KompareDiff2 { 0024 class DiffModel; 0025 class DiffHunk; 0026 class Difference; 0027 class DifferenceString; 0028 } 0029 class ViewSettings; 0030 class KompareSplitter; 0031 class KompareListView; 0032 class KompareListViewItem; 0033 class KompareListViewItemDelegate; 0034 class KompareListViewDiffItem; 0035 class KompareListViewLineContainerItem; 0036 0037 class KompareListView : public QTreeWidget 0038 { 0039 Q_OBJECT 0040 0041 friend class KompareListViewItemDelegate; 0042 0043 public: 0044 KompareListView(bool isSource, ViewSettings* settings, QWidget* parent, const char* name = nullptr); 0045 ~KompareListView() override; 0046 0047 KompareListViewItem* itemAtIndex(int i); 0048 int firstVisibleDifference(); 0049 int lastVisibleDifference(); 0050 QRect itemRect(int i); 0051 int minScrollId(); 0052 int maxScrollId(); 0053 int contentsHeight(); 0054 int contentsWidth(); 0055 int visibleHeight(); 0056 int visibleWidth(); 0057 int contentsX(); 0058 int contentsY(); 0059 int nextPaintOffset() const; 0060 void setNextPaintOffset(int offset); 0061 0062 bool isSource() const { return m_isSource; }; 0063 ViewSettings* settings() const { return m_settings; }; 0064 0065 void setSelectedDifference(const KompareDiff2::Difference* diff, bool scroll); 0066 0067 public Q_SLOTS: 0068 void slotSetSelection(const KompareDiff2::DiffModel* model, const KompareDiff2::Difference* diff); 0069 void slotSetSelection(const KompareDiff2::Difference* diff); 0070 void setXOffset(int x); 0071 void scrollToId(int id); 0072 int scrollId(); 0073 void slotApplyDifference(bool apply); 0074 void slotApplyAllDifferences(bool apply); 0075 void slotApplyDifference(const KompareDiff2::Difference* diff, bool apply); 0076 0077 Q_SIGNALS: 0078 void differenceClicked(const KompareDiff2::Difference* diff); 0079 void applyDifference(bool apply); 0080 void resized(); 0081 0082 protected: 0083 void wheelEvent(QWheelEvent* e) override; 0084 void resizeEvent(QResizeEvent* e) override; 0085 void mousePressEvent(QMouseEvent* e) override; 0086 void mouseDoubleClickEvent(QMouseEvent*) override; 0087 void mouseReleaseEvent(QMouseEvent*) override {}; 0088 void mouseMoveEvent(QMouseEvent*) override {}; 0089 0090 private: 0091 QRect totalVisualItemRect(QTreeWidgetItem* item); 0092 KompareListViewDiffItem* diffItemAt(const QPoint& pos); 0093 void renumberLines(); 0094 0095 QList<KompareListViewDiffItem*> m_items; 0096 QHash<const KompareDiff2::Difference*, KompareListViewDiffItem*> m_itemDict; 0097 bool m_isSource; 0098 ViewSettings* m_settings; 0099 int m_scrollId; 0100 const KompareDiff2::DiffModel* m_selectedModel; 0101 const KompareDiff2::Difference* m_selectedDifference; 0102 int m_nextPaintOffset; 0103 }; 0104 0105 class KompareListViewFrame : public QFrame 0106 { 0107 Q_OBJECT 0108 0109 public: 0110 KompareListViewFrame(bool isSource, ViewSettings* settings, KompareSplitter* parent, const char* name = nullptr); 0111 ~KompareListViewFrame() override {}; 0112 KompareListView* view() { return &m_view; }; 0113 0114 public Q_SLOTS: 0115 void slotSetModel(const KompareDiff2::DiffModel* model); 0116 0117 private: 0118 KompareListView m_view; 0119 QLabel m_label; 0120 QVBoxLayout m_layout; 0121 }; 0122 0123 class KompareListViewItemDelegate : public QStyledItemDelegate 0124 { 0125 Q_OBJECT 0126 0127 public: 0128 explicit KompareListViewItemDelegate(QObject* parent); 0129 ~KompareListViewItemDelegate() override; 0130 void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; 0131 QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; 0132 }; 0133 0134 class KompareListViewItem : public QTreeWidgetItem 0135 { 0136 public: 0137 KompareListViewItem(KompareListView* parent, int type); 0138 KompareListViewItem(KompareListView* parent, KompareListViewItem* after, int type); 0139 KompareListViewItem(KompareListViewItem* parent, int type); 0140 KompareListViewItem(KompareListViewItem* parent, KompareListViewItem* after, int type); 0141 0142 virtual void paintCell(QPainter* p, const QStyleOptionViewItem& option, int column); 0143 0144 void repaint(); 0145 int height() const; 0146 void setHeight(int h); 0147 int paintHeight() const; 0148 int paintOffset() const; 0149 bool isCurrent() const; 0150 int scrollId() const { return m_scrollId; }; 0151 0152 virtual int maxHeight() = 0; 0153 0154 KompareListView* kompareListView() const; 0155 0156 enum ListViewItemType { Diff = QTreeWidgetItem::UserType + 1, Container = QTreeWidgetItem::UserType + 2, Line = QTreeWidgetItem::UserType + 3, Blank = QTreeWidgetItem::UserType + 4, Hunk = QTreeWidgetItem::UserType + 5 }; 0157 0158 private: 0159 int m_scrollId; 0160 int m_height; 0161 int m_paintHeight; 0162 int m_paintOffset; 0163 }; 0164 0165 class KompareListViewDiffItem : public KompareListViewItem 0166 { 0167 public: 0168 KompareListViewDiffItem(KompareListView* parent, KompareDiff2::Difference* difference); 0169 KompareListViewDiffItem(KompareListView* parent, KompareListViewItem* after, KompareDiff2::Difference* difference); 0170 ~KompareListViewDiffItem() override; 0171 0172 void applyDifference(bool apply); 0173 0174 KompareDiff2::Difference* difference() { return m_difference; }; 0175 0176 int maxHeight() override; 0177 0178 private: 0179 void init(); 0180 void setVisibility(); 0181 0182 private: 0183 KompareDiff2::Difference* m_difference; 0184 KompareListViewLineContainerItem* m_sourceItem; 0185 KompareListViewLineContainerItem* m_destItem; 0186 }; 0187 0188 class KompareListViewLineItem; 0189 class KompareListViewBlankLineItem; 0190 0191 class KompareListViewLineContainerItem : public KompareListViewItem 0192 { 0193 public: 0194 KompareListViewLineContainerItem(KompareListViewDiffItem* parent, bool isSource); 0195 ~KompareListViewLineContainerItem() override; 0196 0197 int maxHeight() override { return 0; } 0198 0199 KompareListViewDiffItem* diffItemParent() const; 0200 0201 private: 0202 int lineCount() const; 0203 int lineNumber() const; 0204 KompareDiff2::DifferenceString* lineAt(int i) const; 0205 0206 private: 0207 KompareListViewBlankLineItem* m_blankLineItem; 0208 bool m_isSource; 0209 }; 0210 0211 class KompareListViewLineItem : public KompareListViewItem 0212 { 0213 public: 0214 KompareListViewLineItem(KompareListViewLineContainerItem* parent, int line, KompareDiff2::DifferenceString* text); 0215 KompareListViewLineItem(KompareListViewLineContainerItem* parent, int line, KompareDiff2::DifferenceString* text, int type); 0216 ~KompareListViewLineItem() override; 0217 0218 int maxHeight() override { return 0; } 0219 0220 void paintCell(QPainter* p, const QStyleOptionViewItem& option, int column) override; 0221 0222 KompareListViewDiffItem* diffItemParent() const; 0223 0224 protected: 0225 virtual void paintText(QPainter* p, const QColor& bg, int column, int width, int align); 0226 0227 private: 0228 void init(int line, KompareDiff2::DifferenceString* text); 0229 void expandTabs(QString& text, int tabstop, int startPos = 0) const; 0230 0231 private: 0232 KompareDiff2::DifferenceString* m_text; 0233 }; 0234 0235 class KompareListViewBlankLineItem : public KompareListViewLineItem 0236 { 0237 public: 0238 explicit KompareListViewBlankLineItem(KompareListViewLineContainerItem* parent); 0239 0240 protected: 0241 void paintText(QPainter* p, const QColor& bg, int column, int width, int align) override; 0242 }; 0243 0244 class KompareListViewHunkItem : public KompareListViewItem 0245 { 0246 public: 0247 KompareListViewHunkItem(KompareListView* parent, KompareDiff2::DiffHunk* hunk, bool zeroHeight = false); 0248 KompareListViewHunkItem(KompareListView* parent, KompareListViewItem* after, KompareDiff2::DiffHunk* hunk, bool zeroHeight = false); 0249 ~KompareListViewHunkItem() override; 0250 0251 void paintCell(QPainter* p, const QStyleOptionViewItem& option, int column) override; 0252 0253 int maxHeight() override; 0254 0255 private: 0256 bool m_zeroHeight; 0257 KompareDiff2::DiffHunk* m_hunk; 0258 }; 0259 0260 #endif