// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once #include "selectabletexteditorwidget.h" #include "diffeditorwidgetcontroller.h" #include namespace Core { class IContext; } namespace TextEditor { class DisplaySettings; class FontSettings; } namespace DiffEditor { class ChunkData; class FileData; class ChunkSelection; namespace Internal { class DiffEditorDocument; class UnifiedDiffOutput { public: QString diffText; // 'foldingIndent' is populated with and folding indentation // value where 1 indicates start of new file and 2 indicates a diff chunk. // Remaining lines (diff contents) are assigned 3. QHash foldingIndent; QMap> selections; }; class UnifiedDiffData { public: UnifiedDiffOutput showDiff(QFutureInterface &fi, int progressMin, int progressMax, const DiffEditorInput &input); // block number, visual line number, chunk row number QMap> m_leftLineNumbers; QMap> m_rightLineNumbers; int m_leftLineNumberDigits = 1; int m_rightLineNumberDigits = 1; // block number, visual line number. QMap> m_fileInfo; // start block number, block count of a chunk, chunk index inside a file. QMap> m_chunkInfo; private: void setLeftLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk); void setRightLineNumber(int blockNumber, int lineNumber, int rowNumberInChunk); void setFileInfo(int blockNumber, const DiffFileInfo &leftInfo, const DiffFileInfo &rightInfo); void setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex); QString showChunk(const DiffEditorInput &input, const ChunkData &chunkData, bool lastChunk, int *blockNumber, int *charNumber, QMap> *selections); }; class UnifiedDiffEditorWidget final : public SelectableTextEditorWidget { Q_OBJECT public: UnifiedDiffEditorWidget(QWidget *parent = nullptr); ~UnifiedDiffEditorWidget(); void setDocument(DiffEditorDocument *document); DiffEditorDocument *diffDocument() const; void setDiff(const QList &diffFileList); void setCurrentDiffFileIndex(int diffFileIndex); void saveState(); using TextEditor::TextEditorWidget::restoreState; void restoreState(); void clear(const QString &message = QString()); void setDisplaySettings(const TextEditor::DisplaySettings &ds) override; signals: void currentDiffFileIndexChanged(int index); protected: void mouseDoubleClickEvent(QMouseEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void contextMenuEvent(QContextMenuEvent *e) override; QString lineNumber(int blockNumber) const override; int lineNumberDigits() const override; private: void setFontSettings(const TextEditor::FontSettings &fontSettings); void slotCursorPositionChangedInEditor(); void showDiff(); int blockNumberForFileIndex(int fileIndex) const; int fileIndexForBlockNumber(int blockNumber) const; int chunkIndexForBlockNumber(int blockNumber) const; void jumpToOriginalFile(const QTextCursor &cursor); void addContextMenuActions(QMenu *menu, int fileIndex, int chunkIndex, const ChunkSelection &selection); UnifiedDiffData m_data; DiffEditorWidgetController m_controller; QByteArray m_state; struct ShowResult { QSharedPointer textDocument; UnifiedDiffData diffData; QHash foldingIndent; QMap> selections; }; std::unique_ptr> m_watcher; }; } // namespace Internal } // namespace DiffEditor