diff --git a/src/plugins/projectexplorer/outputformatter.cpp b/src/plugins/projectexplorer/outputformatter.cpp index 69bb04b72ea6a10c80065c9825da26229536205f..9cf37e31036cddaa42e895cc106a515546e7a1a5 100644 --- a/src/plugins/projectexplorer/outputformatter.cpp +++ b/src/plugins/projectexplorer/outputformatter.cpp @@ -37,8 +37,8 @@ using namespace ProjectExplorer; using namespace TextEditor; -OutputFormatter::OutputFormatter(QObject *parent) - : QObject(parent) +OutputFormatter::OutputFormatter() + : QObject() , m_formats(0) { initFormats(); @@ -58,7 +58,6 @@ QPlainTextEdit *OutputFormatter::plainTextEdit() const void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText) { m_plainTextEdit = plainText; - setParent(m_plainTextEdit); } void OutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr) @@ -83,15 +82,6 @@ void OutputFormatter::append(const QString &text, const QTextCharFormat &format) cursor.insertText(text, format); } -void OutputFormatter::mousePressEvent(QMouseEvent * /*e*/) -{} - -void OutputFormatter::mouseReleaseEvent(QMouseEvent * /*e*/) -{} - -void OutputFormatter::mouseMoveEvent(QMouseEvent * /*e*/) -{} - void OutputFormatter::initFormats() { FontSettings fs = TextEditorSettings::instance()->fontSettings(); @@ -117,3 +107,8 @@ void OutputFormatter::initFormats() m_formats[StdErrFormat].setFont(font); m_formats[StdErrFormat].setForeground(QColor(200, 0, 0)); } + +void OutputFormatter::handleLink(const QString &href) +{ + Q_UNUSED(href); +} diff --git a/src/plugins/projectexplorer/outputformatter.h b/src/plugins/projectexplorer/outputformatter.h index effff7725a0eaa25e7fdfb97abda7baeb2c05fd7..71737a9e7c161d180953ff95d4cf387d006c78d1 100644 --- a/src/plugins/projectexplorer/outputformatter.h +++ b/src/plugins/projectexplorer/outputformatter.h @@ -46,7 +46,7 @@ class PROJECTEXPLORER_EXPORT OutputFormatter: public QObject Q_OBJECT public: - OutputFormatter(QObject *parent = 0); + OutputFormatter(); virtual ~OutputFormatter(); QPlainTextEdit *plainTextEdit() const; @@ -55,9 +55,7 @@ public: virtual void appendApplicationOutput(const QString &text, bool onStdErr); virtual void appendMessage(const QString &text, bool isError); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - virtual void mouseMoveEvent(QMouseEvent *e); + virtual void handleLink(const QString &href); protected: enum Format { diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp index 481bf4deb78b79b328df11c3260f8cdced379116..a12c94fa1e6abd84955a3177f600613d2e3594a1 100644 --- a/src/plugins/projectexplorer/outputwindow.cpp +++ b/src/plugins/projectexplorer/outputwindow.cpp @@ -44,6 +44,8 @@ #include <coreplugin/icontext.h> #include <find/basetextfind.h> #include <aggregation/aggregate.h> +#include <texteditor/basetexteditor.h> +#include <projectexplorer/project.h> #include <QtGui/QIcon> #include <QtGui/QScrollBar> @@ -211,7 +213,7 @@ void OutputPane::createNewOutputWindow(RunControl *rc) OutputWindow *ow = static_cast<OutputWindow *>(m_tabWidget->widget(i)); ow->grayOutOldContent(); ow->verticalScrollBar()->setValue(ow->verticalScrollBar()->maximum()); - ow->setFormatter(rc->createOutputFormatter(ow)); + ow->setFormatter(rc->outputFormatter()); m_outputWindows.insert(rc, ow); found = true; break; @@ -219,7 +221,7 @@ void OutputPane::createNewOutputWindow(RunControl *rc) } if (!found) { OutputWindow *ow = new OutputWindow(m_tabWidget); - ow->setFormatter(rc->createOutputFormatter(ow)); + ow->setFormatter(rc->outputFormatter()); Aggregation::Aggregate *agg = new Aggregation::Aggregate; agg->add(ow); agg->add(new Find::BaseTextFind(ow)); @@ -376,6 +378,8 @@ OutputWindow::OutputWindow(QWidget *parent) : QPlainTextEdit(parent) , m_enforceNewline(false) , m_scrollToBottom(false) + , m_linksActive(true) + , m_mousePressed(false) { setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); //setCenterOnScroll(false); @@ -429,6 +433,42 @@ OutputWindow::~OutputWindow() delete m_outputWindowContext; } +void OutputWindow::mousePressEvent(QMouseEvent *e) +{ + m_mousePressed = true; + QPlainTextEdit::mousePressEvent(e); +} + + +void OutputWindow::mouseReleaseEvent(QMouseEvent *e) +{ + m_mousePressed = false; + + if (!m_linksActive) { + // Mouse was released, activate links again + m_linksActive = true; + return; + } + + const QString href = anchorAt(e->pos()); + if (m_formatter) + m_formatter->handleLink(href); + QPlainTextEdit::mouseReleaseEvent(e); +} + +void OutputWindow::mouseMoveEvent(QMouseEvent *e) +{ + // Cursor was dragged to make a selection, deactivate links + if (m_mousePressed && textCursor().hasSelection()) + m_linksActive = false; + + if (!m_linksActive || anchorAt(e->pos()).isEmpty()) + viewport()->setCursor(Qt::IBeamCursor); + else + viewport()->setCursor(Qt::PointingHandCursor); + QPlainTextEdit::mouseMoveEvent(e); +} + OutputFormatter *OutputWindow::formatter() const { return m_formatter; @@ -554,21 +594,3 @@ void OutputWindow::enableUndoRedo() setMaximumBlockCount(0); setUndoRedoEnabled(true); } - -void OutputWindow::mousePressEvent(QMouseEvent *e) -{ - QPlainTextEdit::mousePressEvent(e); - m_formatter->mousePressEvent(e); -} - -void OutputWindow::mouseReleaseEvent(QMouseEvent *e) -{ - QPlainTextEdit::mouseReleaseEvent(e); - m_formatter->mouseReleaseEvent(e); -} - -void OutputWindow::mouseMoveEvent(QMouseEvent *e) -{ - QPlainTextEdit::mouseMoveEvent(e); - m_formatter->mouseMoveEvent(e); -} diff --git a/src/plugins/projectexplorer/outputwindow.h b/src/plugins/projectexplorer/outputwindow.h index 6822b1cfcf709e6d97fef7e5213033202b438d91..33ef4aca48855ca818261cdc65eb26fdbb4998d0 100644 --- a/src/plugins/projectexplorer/outputwindow.h +++ b/src/plugins/projectexplorer/outputwindow.h @@ -49,6 +49,7 @@ namespace Core { namespace ProjectExplorer { class OutputFormatter; class RunControl; +class Project; namespace Constants { const char * const C_APP_OUTPUT = "Application Output"; @@ -140,23 +141,24 @@ public: void showEvent(QShowEvent *); protected: - void mousePressEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *e); - void mouseMoveEvent(QMouseEvent *e); - bool isScrollbarAtBottom() const; void scrollToBottom(); + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + virtual void mouseMoveEvent(QMouseEvent *e); + private: void enableUndoRedo(); QString doNewlineEnfocement(const QString &out); -private: Core::BaseContext *m_outputWindowContext; OutputFormatter *m_formatter; bool m_enforceNewline; bool m_scrollToBottom; + bool m_linksActive; + bool m_mousePressed; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 33b59d6984a9e084bc1cf7684477b3d5e956650e..d089ef8ecfb2baba16d5df50d9e98500eff09a4b 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -179,6 +179,11 @@ Target *RunConfiguration::target() const return m_target; } +ProjectExplorer::OutputFormatter *RunConfiguration::createOutputFormatter() const +{ + return new OutputFormatter(); +} + IRunConfigurationFactory::IRunConfigurationFactory(QObject *parent) : QObject(parent) { @@ -218,13 +223,23 @@ IRunControlFactory::~IRunControlFactory() RunControl::RunControl(RunConfiguration *runConfiguration, QString mode) : m_runMode(mode), m_runConfiguration(runConfiguration) { - if (runConfiguration) + if (runConfiguration) { m_displayName = runConfiguration->displayName(); + m_outputFormatter = runConfiguration->createOutputFormatter(); + } + // We need to ensure that there's always a OutputFormatter + if (!m_outputFormatter) + m_outputFormatter = new OutputFormatter(); } RunControl::~RunControl() { + delete m_outputFormatter; +} +OutputFormatter *RunControl::outputFormatter() +{ + return m_outputFormatter; } QString RunControl::runMode() const @@ -242,11 +257,6 @@ bool RunControl::sameRunConfiguration(RunControl *other) return other->m_runConfiguration.data() == m_runConfiguration.data(); } -OutputFormatter *RunControl::createOutputFormatter(QObject *parent) -{ - return new OutputFormatter(parent); -} - void RunControl::bringApplicationToForeground(qint64 pid) { #ifdef Q_OS_MAC diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index f9e897e509fbda10e016b174bd832d31ab59bc93..c1532590f65135d8a0beac9837e16f6e5c4b3e2d 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -85,6 +85,8 @@ public: Target *target() const; + virtual ProjectExplorer::OutputFormatter *createOutputFormatter() const; + signals: void isEnabledChanged(bool value); @@ -169,7 +171,7 @@ public: bool sameRunConfiguration(RunControl *other); - virtual OutputFormatter *createOutputFormatter(QObject *parent = 0); + OutputFormatter *outputFormatter(); QString runMode() const; signals: @@ -189,6 +191,7 @@ private: QString m_displayName; QString m_runMode; const QWeakPointer<RunConfiguration> m_runConfiguration; + OutputFormatter *m_outputFormatter; #ifdef Q_OS_MAC //these two are used to bring apps in the foreground on Mac diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro index 72e0d2cadd7ed07c9a9a6cd356aab756a573c5c1..3fca4d496c27e7ace933521ec134312a8fc91b8a 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro @@ -22,8 +22,7 @@ HEADERS += qmlproject.h \ qmltaskmanager.h \ qmlprojectmanager_global.h \ qmlprojectmanagerconstants.h \ - qmlprojecttarget.h \ - qmloutputformatter.h + qmlprojecttarget.h SOURCES += qmlproject.cpp \ qmlprojectplugin.cpp \ qmlprojectmanager.cpp \ @@ -35,8 +34,7 @@ SOURCES += qmlproject.cpp \ qmlprojectrunconfigurationfactory.cpp \ qmlprojectapplicationwizard.cpp \ qmltaskmanager.cpp \ - qmlprojecttarget.cpp \ - qmloutputformatter.cpp + qmlprojecttarget.cpp RESOURCES += qmlproject.qrc OTHER_FILES += QmlProjectManager.pluginspec \ diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 3b959f83af023b2a768f511780df1c3d43843039..0a664a6fff645c5b77494899150b7903302fdcf5 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -27,9 +27,9 @@ ** **************************************************************************/ +#include "qmlprojectrunconfiguration.h" #include "qmlproject.h" #include "qmlprojectmanagerconstants.h" -#include "qmlprojectrunconfiguration.h" #include "qmlprojecttarget.h" #include "projectexplorer/projectexplorer.h" diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp index 9d3cbbd1df31eec731063a312153a1037eaa26ec..5de043e92bccaafd5c667ed62f7685a89d7312c7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp @@ -27,7 +27,6 @@ ** **************************************************************************/ -#include "qmloutputformatter.h" #include "qmlprojectruncontrol.h" #include "qmlprojectrunconfiguration.h" #include "qmlprojectconstants.h" @@ -103,11 +102,6 @@ bool QmlRunControl::isRunning() const return m_applicationLauncher.isRunning(); } -ProjectExplorer::OutputFormatter *QmlRunControl::createOutputFormatter(QObject *parent) -{ - return new QmlOutputFormatter(parent); -} - void QmlRunControl::slotBringApplicationToForeground(qint64 pid) { bringApplicationToForeground(pid); diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h index 89d0d7dc5469261fe4fc9d1af2208484314bec38..7e85370a6eb49ef4ca76be295be723772405ddc7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h @@ -51,8 +51,6 @@ public: virtual void stop(); virtual bool isRunning() const; - virtual ProjectExplorer::OutputFormatter *createOutputFormatter(QObject *parent = 0); - private slots: void processExited(int exitCode); void slotBringApplicationToForeground(qint64 pid); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 4d40f7de890f0c0359b2ba277bec5c0977a1d131..6b09682b13d004cb7191a9f0bb6bc2528490003f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -35,6 +35,7 @@ #include "maemorunconfigurationwidget.h" #include "maemotoolchain.h" #include "qemuruntimemanager.h" +#include "qtoutputformatter.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -113,6 +114,11 @@ QWidget *MaemoRunConfiguration::createConfigurationWidget() return new MaemoRunConfigurationWidget(this); } +ProjectExplorer::OutputFormatter *MaemoRunConfiguration::createConfigurationWidget() const +{ + return new QtOutputFormatter(qt4Target()->qt4Project()); +} + void MaemoRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode *pro) { if (m_proFilePath == pro->path()) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h index 1f674bbc1a49e8e17e6fc67211ec5d038a4a2f88..81a2897d53fd6bb3dbc2e1023cdda4316fa50e94 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h @@ -68,6 +68,7 @@ public: bool isEnabled(ProjectExplorer::BuildConfiguration *config) const; QWidget *createConfigurationWidget(); + ProjectExplorer::OutputFormatter *createConfigurationWidget() const; Qt4Target *qt4Target() const; Qt4BuildConfiguration *activeQt4BuildConfiguration() const; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index c92eab72e1bad17c99d5347814492f5e9ac4640a..3070b8a2124f79aac38129d8417b11c8ace43f46 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -41,6 +41,7 @@ #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" #include "s60createpackagestep.h" +#include "qtoutputformatter.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -207,6 +208,11 @@ QWidget *S60DeviceRunConfiguration::createConfigurationWidget() return new S60DeviceRunConfigurationWidget(this); } +ProjectExplorer::OutputFormatter *S60DeviceRunConfiguration::createOutputFormatter() const +{ + return new QtOutputFormatter(qt4Target()->qt4Project()); +} + QVariantMap S60DeviceRunConfiguration::toMap() const { QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index a1cb5d45906c68ad1e28c747e4322c6c8654a2cd..7776692d256a6f20f4e296a0c28f6685d588d75b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -74,6 +74,8 @@ public: bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *createConfigurationWidget(); + ProjectExplorer::OutputFormatter *createOutputFormatter() const; + QString serialPortName() const; void setSerialPortName(const QString &name); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index 9ae33ff517aae649d524da693ab61e2d6dcd2b50..20dc6b8c2c13f8876d1740df2b0747c7cfb26564 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -37,6 +37,7 @@ #include "s60devices.h" #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" +#include "qtoutputformatter.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -131,6 +132,11 @@ QWidget *S60EmulatorRunConfiguration::createConfigurationWidget() return new S60EmulatorRunConfigurationWidget(this); } +ProjectExplorer::OutputFormatter *S60EmulatorRunConfiguration::createOutputFormatter() const +{ + return new QtOutputFormatter(qt4Target()->qt4Project()); +} + QVariantMap S60EmulatorRunConfiguration::toMap() const { QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h index 917eac35b3b116bda3678301fa7a14f7e5a1e89b..62f0435e5f219161a6af49ab0b0f10e899ad73e0 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h @@ -67,6 +67,8 @@ public: bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *createConfigurationWidget(); + ProjectExplorer::OutputFormatter *createOutputFormatter() const; + QString executable() const; QVariantMap toMap() const; diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index f4c492ac33b7189a631d9b4a1d4caa263de35912..678bd5a9bce8c5b8940db4b49b407b9f8541b65e 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -44,7 +44,8 @@ HEADERS += qt4projectmanagerplugin.h \ gettingstartedwelcomepage.h \ qt4buildconfiguration.h \ qt4target.h \ - qmakeparser.h + qmakeparser.h \ + qtoutputformatter.h SOURCES += qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ qt4project.cpp \ @@ -85,7 +86,8 @@ SOURCES += qt4projectmanagerplugin.cpp \ gettingstartedwelcomepage.cpp \ qt4buildconfiguration.cpp \ qt4target.cpp \ - qmakeparser.cpp + qmakeparser.cpp \ + qtoutputformatter.cpp FORMS += makestep.ui \ qmakestep.ui \ qt4projectconfigwidget.ui \ diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index a50d08eca1eb52769ae7e73798696f18157f7285..d866299aa53ae91a55bc982d4f61cf27cf30f83d 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -36,6 +36,7 @@ #include "qt4target.h" #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" +#include "qtoutputformatter.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -669,6 +670,11 @@ ProjectExplorer::ToolChain::ToolChainType Qt4RunConfiguration::toolChainType() c return qt4bc->toolChainType(); } +ProjectExplorer::OutputFormatter *Qt4RunConfiguration::createOutputFormatter() const +{ + return new QtOutputFormatter(qt4Target()->qt4Project()); +} + /// /// Qt4RunConfigurationFactory /// This class is used to restore run settings (saved in .user files) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index 10ac7960f6eba472e567469871fc0abe7bc03ff2..882131c5c5b4bce18739033a176502270626b300 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -93,6 +93,8 @@ public: // TODO detectQtShadowBuild() ? how did this work ? QVariantMap toMap() const; + ProjectExplorer::OutputFormatter *createOutputFormatter() const; + signals: void commandLineArgumentsChanged(const QString&); void workingDirectoryChanged(const QString&); diff --git a/src/plugins/qmlprojectmanager/qmloutputformatter.cpp b/src/plugins/qt4projectmanager/qtoutputformatter.cpp similarity index 53% rename from src/plugins/qmlprojectmanager/qmloutputformatter.cpp rename to src/plugins/qt4projectmanager/qtoutputformatter.cpp index bd371334db133284689f2024c8d4fb24f414d2a0..4fe349be511d87fa9c938e01f478011d03a44703 100644 --- a/src/plugins/qmlprojectmanager/qmloutputformatter.cpp +++ b/src/plugins/qt4projectmanager/qtoutputformatter.cpp @@ -27,24 +27,28 @@ ** **************************************************************************/ -#include "qmloutputformatter.h" +#include "qtoutputformatter.h" #include <texteditor/basetexteditor.h> +#include <qt4projectmanager/qt4project.h> +#include <QtCore/QFileInfo> #include <QtGui/QPlainTextEdit> using namespace ProjectExplorer; -using namespace QmlProjectManager::Internal; +using namespace Qt4ProjectManager; -QmlOutputFormatter::QmlOutputFormatter(QObject *parent) - : OutputFormatter(parent) +QtOutputFormatter::QtOutputFormatter(Qt4Project *project) + : OutputFormatter() , m_qmlError(QLatin1String("(file:///[^:]+:\\d+:\\d+):")) - , m_linksActive(true) - , m_mousePressed(false) + , m_qtError(QLatin1String("Object::.*in (.*:\\d+)")) + , m_project(project) + { + } -void QmlOutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr) +void QtOutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr) { QTextCharFormat linkFormat; linkFormat.setForeground(plainTextEdit()->palette().link().color()); @@ -52,37 +56,33 @@ void QmlOutputFormatter::appendApplicationOutput(const QString &text, bool onStd linkFormat.setAnchor(true); // Create links from QML errors (anything of the form "file:///...:[line]:[column]:") - int index = 0; - while (m_qmlError.indexIn(text, index) != -1) { + if (m_qmlError.indexIn(text) != -1) { const int matchPos = m_qmlError.pos(1); - const QString leader = text.mid(index, matchPos - index); + const QString leader = text.left(matchPos); append(leader, onStdErr ? StdErrFormat : StdOutFormat); const QString matched = m_qmlError.cap(1); linkFormat.setAnchorHref(matched); append(matched, linkFormat); - index = matchPos + m_qmlError.matchedLength() - 1; - } - append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat); -} - -void QmlOutputFormatter::mousePressEvent(QMouseEvent * /*e*/) -{ - m_mousePressed = true; -} + int index = matchPos + m_qmlError.matchedLength() - 1; + append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat); + } else if (m_qtError.indexIn(text) != -1) { + const int matchPos = m_qtError.pos(1); + const QString leader = text.left(matchPos); + append(leader, onStdErr ? StdErrFormat : StdOutFormat); -void QmlOutputFormatter::mouseReleaseEvent(QMouseEvent *e) -{ - m_mousePressed = false; + const QString matched = m_qtError.cap(1); + linkFormat.setAnchorHref(m_qtError.cap(1)); + append(matched, linkFormat); - if (!m_linksActive) { - // Mouse was released, activate links again - m_linksActive = true; - return; + int index = matchPos + m_qtError.matchedLength() - 1; + append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat); } +} - const QString href = plainTextEdit()->anchorAt(e->pos()); +void QtOutputFormatter::handleLink(const QString &href) +{ if (!href.isEmpty()) { QRegExp qmlErrorLink(QLatin1String("^file://(/[^:]+):(\\d+):(\\d+)")); @@ -91,18 +91,30 @@ void QmlOutputFormatter::mouseReleaseEvent(QMouseEvent *e) const int line = qmlErrorLink.cap(2).toInt(); const int column = qmlErrorLink.cap(3).toInt(); TextEditor::BaseTextEditor::openEditorAt(fileName, line, column - 1); + return; } - } -} -void QmlOutputFormatter::mouseMoveEvent(QMouseEvent *e) -{ - // Cursor was dragged to make a selection, deactivate links - if (m_mousePressed && plainTextEdit()->textCursor().hasSelection()) - m_linksActive = false; - - if (!m_linksActive || plainTextEdit()->anchorAt(e->pos()).isEmpty()) - plainTextEdit()->viewport()->setCursor(Qt::IBeamCursor); - else - plainTextEdit()->viewport()->setCursor(Qt::PointingHandCursor); + QRegExp qtErrorLink(QLatin1String("^(.*):(\\d+)$")); + if (qtErrorLink.indexIn(href) != 1) { + QString fileName = qtErrorLink.cap(1); + const int line = qtErrorLink.cap(2).toInt(); + QFileInfo fi(fileName); + if (fi.isRelative()) { + // Yeah fileName is relative, no suprise + Qt4Project *pro = m_project.data(); + if (pro) { + QString baseName = fi.fileName(); + foreach (const QString &file, pro->files(Project::AllFiles)) { + if (file.endsWith(baseName)) { + // pick the first one... + fileName = file; + break; + } + } + } + } + TextEditor::BaseTextEditor::openEditorAt(fileName, line, 0); + return; + } + } } diff --git a/src/plugins/qmlprojectmanager/qmloutputformatter.h b/src/plugins/qt4projectmanager/qtoutputformatter.h similarity index 80% rename from src/plugins/qmlprojectmanager/qmloutputformatter.h rename to src/plugins/qt4projectmanager/qtoutputformatter.h index 8d0e64d6d515a8f83259f6018eeae6e719e09d32..9a039581db6889594d19400118223f3c2320ab33 100644 --- a/src/plugins/qmlprojectmanager/qmloutputformatter.h +++ b/src/plugins/qt4projectmanager/qtoutputformatter.h @@ -31,30 +31,29 @@ #define QMLOUTPUTFORMATTER_H #include <projectexplorer/outputformatter.h> - #include <QtCore/QRegExp> +#include <QSharedPointer> -namespace QmlProjectManager { -namespace Internal { +namespace Qt4ProjectManager +{ +class Qt4Project; -class QmlOutputFormatter: public ProjectExplorer::OutputFormatter +class QtOutputFormatter: public ProjectExplorer::OutputFormatter { public: - QmlOutputFormatter(QObject *parent = 0); + QtOutputFormatter(Qt4Project *project); virtual void appendApplicationOutput(const QString &text, bool onStdErr); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - virtual void mouseMoveEvent(QMouseEvent *e); + virtual void handleLink(const QString &href); private: QRegExp m_qmlError; - bool m_linksActive; - bool m_mousePressed; + QRegExp m_qtError; + QWeakPointer<Qt4Project> m_project; }; -} // namespace Internal + } // namespace QmlProjectManager #endif // QMLOUTPUTFORMATTER_H