aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vcsbase/vcsoutputwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/vcsbase/vcsoutputwindow.cpp')
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.cpp74
1 files changed, 35 insertions, 39 deletions
diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp
index 1cff2dc4b7..39b8d51d57 100644
--- a/src/plugins/vcsbase/vcsoutputwindow.cpp
+++ b/src/plugins/vcsbase/vcsoutputwindow.cpp
@@ -31,7 +31,6 @@
#include <coreplugin/find/basetextfind.h>
#include <coreplugin/outputwindow.h>
#include <utils/fileutils.h>
-#include <utils/outputformatter.h>
#include <utils/qtcprocess.h>
#include <texteditor/behaviorsettings.h>
#include <texteditor/fontsettings.h>
@@ -47,7 +46,7 @@
#include <QPlainTextEdit>
#include <QPoint>
#include <QPointer>
-#include <QRegExp>
+#include <QRegularExpression>
#include <QTextBlock>
#include <QTextBlockUserData>
#include <QTextCharFormat>
@@ -97,22 +96,22 @@ class OutputWindowPlainTextEdit : public Core::OutputWindow
{
public:
explicit OutputWindowPlainTextEdit(QWidget *parent = nullptr);
- ~OutputWindowPlainTextEdit() override;
void appendLines(const QString &s, const QString &repository = QString());
void appendLinesWithStyle(const QString &s, VcsOutputWindow::MessageStyle style,
const QString &repository = QString());
- VcsOutputFormatter *formatter();
+ VcsOutputLineParser *parser();
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
+ void handleLink(const QPoint &pos) override;
private:
void setFormat(VcsOutputWindow::MessageStyle style);
QString identifierUnderCursor(const QPoint &pos, QString *repository = nullptr) const;
Utils::OutputFormat m_format;
- VcsOutputFormatter *m_formatter = nullptr;
+ VcsOutputLineParser *m_parser = nullptr;
};
OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) :
@@ -121,19 +120,14 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) :
setReadOnly(true);
setUndoRedoEnabled(false);
setFrameStyle(QFrame::NoFrame);
- m_formatter = new VcsOutputFormatter;
- m_formatter->setBoldFontEnabled(false);
- setFormatter(m_formatter);
+ outputFormatter()->setBoldFontEnabled(false);
+ m_parser = new VcsOutputLineParser;
+ setLineParsers({m_parser});
auto agg = new Aggregation::Aggregate;
agg->add(this);
agg->add(new Core::BaseTextFind(this));
}
-OutputWindowPlainTextEdit::~OutputWindowPlainTextEdit()
-{
- delete m_formatter;
-}
-
// Search back for beginning of word
static inline int firstWordCharacter(const QString &s, int startPos)
{
@@ -181,9 +175,9 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
QString repository;
const QString token = identifierUnderCursor(event->pos(), &repository);
if (!repository.isEmpty()) {
- if (VcsOutputFormatter *f = formatter()) {
+ if (VcsOutputLineParser * const p = parser()) {
if (!href.isEmpty())
- f->fillLinkContextMenu(menu, repository, href);
+ p->fillLinkContextMenu(menu, repository, href);
}
}
QAction *openAction = nullptr;
@@ -221,6 +215,23 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
delete menu;
}
+void OutputWindowPlainTextEdit::handleLink(const QPoint &pos)
+{
+ const QString href = anchorAt(pos);
+ if (href.isEmpty())
+ return;
+ QString repository;
+ identifierUnderCursor(pos, &repository);
+ if (repository.isEmpty()) {
+ OutputWindow::handleLink(pos);
+ return;
+ }
+ if (outputFormatter()->handleFileLink(href))
+ return;
+ if (VcsOutputLineParser * const p = parser())
+ p->handleVcsLink(repository, href);
+}
+
void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &repository)
{
if (s.isEmpty())
@@ -228,10 +239,7 @@ void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &rep
const int previousLineCount = document()->lineCount();
- const QChar newLine('\n');
- const QChar lastChar = s.at(s.size() - 1);
- const bool appendNewline = (lastChar != '\r' && lastChar != newLine);
- m_formatter->appendMessage(appendNewline ? s + newLine : s, m_format);
+ outputFormatter()->appendMessage(s, m_format);
// Scroll down
moveCursor(QTextCursor::End);
@@ -258,24 +266,24 @@ void OutputWindowPlainTextEdit::appendLinesWithStyle(const QString &s,
}
}
-VcsOutputFormatter *OutputWindowPlainTextEdit::formatter()
+VcsOutputLineParser *OutputWindowPlainTextEdit::parser()
{
- return m_formatter;
+ return m_parser;
}
void OutputWindowPlainTextEdit::setFormat(VcsOutputWindow::MessageStyle style)
{
- m_formatter->setBoldFontEnabled(style == VcsOutputWindow::Command);
+ outputFormatter()->setBoldFontEnabled(style == VcsOutputWindow::Command);
switch (style) {
case VcsOutputWindow::Warning:
m_format = LogMessageFormat;
break;
case VcsOutputWindow::Error:
- m_format = ErrorMessageFormat;
+ m_format = StdErrFormat;
break;
case VcsOutputWindow::Message:
- m_format = NormalMessageFormat;
+ m_format = StdOutFormat;
break;
case VcsOutputWindow::Command:
m_format = NormalMessageFormat;
@@ -295,7 +303,7 @@ class VcsOutputWindowPrivate
public:
Internal::OutputWindowPlainTextEdit widget;
QString repository;
- QRegExp passwordRegExp;
+ const QRegularExpression passwordRegExp = QRegularExpression("://([^@:]+):([^@]+)@");
};
static VcsOutputWindow *m_instance = nullptr;
@@ -304,7 +312,6 @@ static VcsOutputWindowPrivate *d = nullptr;
VcsOutputWindow::VcsOutputWindow()
{
d = new VcsOutputWindowPrivate;
- d->passwordRegExp = QRegExp("://([^@:]+):([^@]+)@");
Q_ASSERT(d->passwordRegExp.isValid());
m_instance = this;
@@ -321,22 +328,11 @@ VcsOutputWindow::VcsOutputWindow()
connect(this, &IOutputPane::resetZoom, &d->widget, &Core::OutputWindow::resetZoom);
connect(TextEditor::TextEditorSettings::instance(), &TextEditor::TextEditorSettings::behaviorSettingsChanged,
this, updateBehaviorSettings);
- connect(d->widget.formatter(), &VcsOutputFormatter::referenceClicked,
- VcsOutputWindow::instance(), &VcsOutputWindow::referenceClicked);
}
-static QString filterPasswordFromUrls(const QString &input)
+static QString filterPasswordFromUrls(QString input)
{
- int pos = 0;
- QString result = input;
- while ((pos = d->passwordRegExp.indexIn(result, pos)) >= 0) {
- QString tmp = result.left(pos + 3) + d->passwordRegExp.cap(1) + ":***@";
- int newStart = tmp.count();
- tmp += result.midRef(pos + d->passwordRegExp.matchedLength());
- result = tmp;
- pos = newStart;
- }
- return result;
+ return input.replace(d->passwordRegExp, "://\\1:***@");
}
VcsOutputWindow::~VcsOutputWindow()