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