diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index b3728fd5ee23887442b5cd546d74abfe10534ab8..8f52541cea86711e50deaa7d3a0bc633f0976e35 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -101,6 +101,7 @@ const char * const C_DESIGN_MODE = "Core.DesignMode"; const char * const C_EDITORMANAGER = "Core.EditorManager"; const char * const C_NAVIGATION_PANE = "Core.NavigationPane"; const char * const C_PROBLEM_PANE = "Core.ProblemPane"; +const char * const C_GENERAL_OUTPUT_PANE = "Core.GeneralOutputPane"; //default editor kind const char * const K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME = QT_TRANSLATE_NOOP("OpenWith::Editors", "Plain Text Editor"); diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index a26e042410acc7edea29c6800f3353ee95db3a1d..33127c0b1c9f3dfdd9321434c8d0cf6ec51316fa 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -27,6 +27,7 @@ SOURCES += mainwindow.cpp \ messagemanager.cpp \ messageoutputwindow.cpp \ outputpane.cpp \ + outputwindow.cpp \ vcsmanager.cpp \ statusbarmanager.cpp \ versiondialog.cpp \ @@ -104,6 +105,7 @@ HEADERS += mainwindow.h \ messagemanager.h \ messageoutputwindow.h \ outputpane.h \ + outputwindow.h \ vcsmanager.h \ statusbarmanager.h \ editormanager/editormanager.h \ diff --git a/src/plugins/coreplugin/messageoutputwindow.cpp b/src/plugins/coreplugin/messageoutputwindow.cpp index ab635095c346b8bf71d4646f616f66db2bf26f26..52d037377e3c3efbe833a4486deb8bd9cfb0343c 100644 --- a/src/plugins/coreplugin/messageoutputwindow.cpp +++ b/src/plugins/coreplugin/messageoutputwindow.cpp @@ -31,6 +31,8 @@ **************************************************************************/ #include "messageoutputwindow.h" +#include "icontext.h" +#include "coreconstants.h" #include <QtGui/QScrollBar> @@ -38,9 +40,8 @@ using namespace Core::Internal; MessageOutputWindow::MessageOutputWindow() { - m_widget = new TextView; + m_widget = new Core::OutputWindow(Core::Context(Core::Constants::C_GENERAL_OUTPUT_PANE)); m_widget->setReadOnly(true); - m_widget->setFrameStyle(QFrame::NoFrame); } MessageOutputWindow::~MessageOutputWindow() @@ -85,10 +86,7 @@ void MessageOutputWindow::visibilityChanged(bool /*b*/) void MessageOutputWindow::append(const QString &text) { - bool scroll = m_widget->isScrollbarAtBottom() || !m_widget->isVisible(); - m_widget->append(text); - if (scroll) - m_widget->scrollToBottom(); + m_widget->appendText(text); } int MessageOutputWindow::priorityInStatusBar() const @@ -120,34 +118,3 @@ bool MessageOutputWindow::canNavigate() { return false; } - -// -------- Copied from OutputWindow which should be shared instead - -bool TextView::isScrollbarAtBottom() const -{ - return verticalScrollBar()->value() == verticalScrollBar()->maximum(); -} - -void TextView::scrollToBottom() -{ - verticalScrollBar()->setValue(verticalScrollBar()->maximum()); -} - -void TextView::showEvent(QShowEvent *e) -{ - bool atBottom = isScrollbarAtBottom(); - QTextEdit::showEvent(e); - if (atBottom) - scrollToBottom(); -} - -void TextView::resizeEvent(QResizeEvent *e) -{ - //Keep scrollbar at bottom of window while resizing, to ensure we keep scrolling - //This can happen if window is resized while building, or if the horizontal scrollbar appears - bool atBottom = isScrollbarAtBottom(); - QTextEdit::resizeEvent(e); - if (atBottom) - scrollToBottom(); -} - diff --git a/src/plugins/coreplugin/messageoutputwindow.h b/src/plugins/coreplugin/messageoutputwindow.h index f37e564c81fe3cb285fd41ba74a649d4e2b4c24d..b8c435dddc612ab80edcf90181e594fac113be14 100644 --- a/src/plugins/coreplugin/messageoutputwindow.h +++ b/src/plugins/coreplugin/messageoutputwindow.h @@ -33,7 +33,8 @@ #ifndef MESSAGEOUTPUTWINDOW_H #define MESSAGEOUTPUTWINDOW_H -#include <coreplugin/ioutputpane.h> +#include "ioutputpane.h" +#include "outputwindow.h" #include <QtGui/QShowEvent> #include <QtGui/QResizeEvent> @@ -42,21 +43,6 @@ namespace Core { namespace Internal { -class TextView : public QTextEdit -{ - Q_OBJECT - -public: - TextView(QWidget *parent = 0) : QTextEdit(parent) {} - - void showEvent(QShowEvent *); - void scrollToBottom(); - bool isScrollbarAtBottom() const; - -protected: - void resizeEvent(QResizeEvent *e); -}; - class MessageOutputWindow : public Core::IOutputPane { Q_OBJECT @@ -85,7 +71,7 @@ public: bool canNavigate(); private: - TextView *m_widget; + OutputWindow *m_widget; }; } // namespace Internal diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index e992df6546a26f877249ec961afde8da56d04e05..ef37d5fb7f6fc217a633b384c2c1b139c21c8b52 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -32,10 +32,10 @@ #include "outputwindow.h" -#include <coreplugin/actionmanager/actionmanager.h> -#include <coreplugin/actionmanager/command.h> -#include <coreplugin/coreconstants.h> -#include <coreplugin/icore.h> +#include "actionmanager/actionmanager.h" +#include "actionmanager/command.h" +#include "coreconstants.h" +#include "icore.h" #include <utils/qtcassert.h> #include <utils/outputformatter.h> @@ -47,8 +47,7 @@ static const int MaxBlockCount = 100000; using namespace Utils; -namespace ProjectExplorer { -namespace Internal { +namespace Core { /*******************/ @@ -259,7 +258,7 @@ void OutputWindow::appendText(const QString &textIn, const QTextCharFormat &form { QString text = textIn; text.remove(QLatin1Char('\r')); - if (document()->blockCount() > maxLineCount) + if (maxLineCount > 0 && document()->blockCount() > maxLineCount) return; const bool atBottom = isScrollbarAtBottom(); QTextCursor cursor = QTextCursor(document()); @@ -267,7 +266,7 @@ void OutputWindow::appendText(const QString &textIn, const QTextCharFormat &form cursor.beginEditBlock(); cursor.insertText(doNewlineEnfocement(text), format); - if (document()->blockCount() > maxLineCount) { + if (maxLineCount > 0 && document()->blockCount() > maxLineCount) { QTextCharFormat tmp; tmp.setFontWeight(QFont::Bold); cursor.insertText(tr("Additional output omitted\n"), tmp); @@ -292,6 +291,10 @@ void OutputWindow::clear() void OutputWindow::scrollToBottom() { verticalScrollBar()->setValue(verticalScrollBar()->maximum()); + // QPlainTextEdit destroys the first calls value in case of multiline + // text, so make sure that the scroll bar actually gets the value set. + // Is a noop if the first call succeeded. + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } void OutputWindow::grayOutOldContent() @@ -331,5 +334,4 @@ void OutputWindow::setWordWrapEnabled(bool wrap) setWordWrapMode(QTextOption::NoWrap); } -} // namespace Internal -} // namespace ProjectExplorer +} // namespace Core diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h index 37bde299863ceda444f225f4174ed3dc24a92dd0..085db26ce9b61dd646be299087de121097aa7c6e 100644 --- a/src/plugins/coreplugin/outputwindow.h +++ b/src/plugins/coreplugin/outputwindow.h @@ -33,20 +33,18 @@ #ifndef OUTPUTWINDOW_H #define OUTPUTWINDOW_H +#include "core_global.h" +#include "icontext.h" + #include <utils/outputformatter.h> -#include <coreplugin/icontext.h> #include <QtGui/QPlainTextEdit> namespace Core { - class IContext; -} - -namespace ProjectExplorer { -namespace Internal { +class IContext; -class OutputWindow : public QPlainTextEdit +class CORE_EXPORT OutputWindow : public QPlainTextEdit { Q_OBJECT @@ -59,7 +57,7 @@ public: void appendMessage(const QString &out, Utils::OutputFormat format); /// appends a \p text using \p format without using formater - void appendText(const QString &text, const QTextCharFormat &format, int maxLineCount); + void appendText(const QString &text, const QTextCharFormat &format = QTextCharFormat(), int maxLineCount = -1); void grayOutOldContent(); void clear(); @@ -93,7 +91,6 @@ private: bool m_mousePressed; }; -} // namespace Internal -} // namespace ProjectExplorer +} // namespace Core #endif // OUTPUTWINDOW_H diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 1b7b9aaf20b6566b0a1c693ba585ce42ac2f204e..1ac35488f04b5cc827e79d66e8d5e0f68623c9b1 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -32,7 +32,6 @@ **************************************************************************/ #include "appoutputpane.h" -#include "outputwindow.h" #include "projectexplorerconstants.h" #include "projectexplorer.h" #include "projectexplorersettings.h" @@ -65,7 +64,7 @@ enum { debug = 0 }; using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; -AppOutputPane::RunControlTab::RunControlTab(RunControl *rc, OutputWindow *w) : +AppOutputPane::RunControlTab::RunControlTab(RunControl *rc, Core::OutputWindow *w) : runControl(rc), window(w), asyncClosing(false) { } @@ -203,7 +202,7 @@ int AppOutputPane::priorityInStatusBar() const void AppOutputPane::clearContents() { - OutputWindow *currentWindow = qobject_cast<OutputWindow *>(m_tabWidget->currentWidget()); + Core::OutputWindow *currentWindow = qobject_cast<Core::OutputWindow *>(m_tabWidget->currentWidget()); if (currentWindow) currentWindow->clear(); } @@ -259,7 +258,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) // Create new static uint counter = 0; Core::Context context(Constants::C_APP_OUTPUT, counter++); - OutputWindow *ow = new OutputWindow(context, m_tabWidget); + Core::OutputWindow *ow = new Core::OutputWindow(context, m_tabWidget); ow->setWindowTitle(tr("Application Output Window")); // TODO the following is a hidden impossible dependency of projectexplorer on qt4projectmanager ow->setWindowIcon(QIcon(QLatin1String(Qt4ProjectManager::Constants::ICON_WINDOW))); @@ -274,7 +273,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) qDebug() << "OutputPane::createNewOutputWindow: Adding tab for " << rc; } -void AppOutputPane::handleOldOutput(OutputWindow *window) const +void AppOutputPane::handleOldOutput(Core::OutputWindow *window) const { if (ProjectExplorerPlugin::instance()->projectExplorerSettings().cleanOldAppOutput) window->clear(); diff --git a/src/plugins/projectexplorer/appoutputpane.h b/src/plugins/projectexplorer/appoutputpane.h index 75e6948991ae5ec470029a5f18de68332d146e56..ee92c3d6dafcd7c0824d489a3cfc11cab6fbfbf8 100644 --- a/src/plugins/projectexplorer/appoutputpane.h +++ b/src/plugins/projectexplorer/appoutputpane.h @@ -34,8 +34,7 @@ #ifndef APPOUTPUTPANE_H #define APPOUTPUTPANE_H -#include "outputwindow.h" - +#include <coreplugin/outputwindow.h> #include <coreplugin/ioutputpane.h> QT_BEGIN_NAMESPACE @@ -110,9 +109,9 @@ private slots: private: struct RunControlTab { explicit RunControlTab(RunControl *runControl = 0, - OutputWindow *window = 0); + Core::OutputWindow *window = 0); RunControl* runControl; - OutputWindow *window; + Core::OutputWindow *window; // Is the run control stopping asynchronously, close the tab once it finishes bool asyncClosing; }; @@ -126,7 +125,7 @@ private: int currentIndex() const; RunControl *currentRunControl() const; int tabWidgetIndexOf(int runControlIndex) const; - void handleOldOutput(OutputWindow *window) const; + void handleOldOutput(Core::OutputWindow *window) const; QWidget *m_mainWidget; QTabWidget *m_tabWidget; diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 21c6c837d56dc8e933bf28eb8e4127c78d566a52..bc497c4d61b8e8479c01d5cec64fd88208a35deb 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -63,7 +63,7 @@ const int MAX_LINECOUNT = 50000; CompileOutputWindow::CompileOutputWindow(BuildManager * /*bm*/) { Core::Context context(Constants::C_COMPILE_OUTPUT); - m_outputWindow = new OutputWindow(context); + m_outputWindow = new Core::OutputWindow(context); m_outputWindow->setWindowTitle(tr("Compile Output")); m_outputWindow->setWindowIcon(QIcon(QLatin1String(Qt4ProjectManager::Constants::ICON_WINDOW))); m_outputWindow->setReadOnly(true); diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index 86a812d14515006ffb67f2f5436ae1157b0ed50b..9ec3355f99f6b7afecdb35023fe24e838fe651b1 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -33,8 +33,8 @@ #ifndef COMPILEOUTPUTWINDOW_H #define COMPILEOUTPUTWINDOW_H -#include "outputwindow.h" #include "buildstep.h" +#include <coreplugin/outputwindow.h> #include <coreplugin/ioutputpane.h> #include <QtCore/QHash> @@ -86,7 +86,7 @@ private slots: void updateWordWrapMode(); private: - OutputWindow *m_outputWindow; + Core::OutputWindow *m_outputWindow; QHash<unsigned int, int> m_taskPositions; ShowOutputTaskHandler * m_handler; }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 6d4421649a806846498f33cbc52c013150165b3a..eee65b4920dc134e4bf103db8a06bc2251a00712 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -58,7 +58,6 @@ #include "iprojectmanager.h" #include "metatypedeclarations.h" #include "nodesvisitor.h" -#include "outputwindow.h" #include "appoutputpane.h" #include "persistentsettings.h" #include "pluginfilefactory.h" diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 488a213b9a5c76384c2b9531d705cd320f071539..60cadb2a14f9b2fd382c5fe730a3b1eb0d248c05 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -28,7 +28,6 @@ HEADERS += projectexplorer.h \ showoutputtaskhandler.h \ vcsannotatetaskhandler.h \ taskwindow.h \ - outputwindow.h \ persistentsettings.h \ projectfilewizardextension.h \ session.h \ @@ -125,7 +124,6 @@ SOURCES += projectexplorer.cpp \ showoutputtaskhandler.cpp \ vcsannotatetaskhandler.cpp \ taskwindow.cpp \ - outputwindow.cpp \ persistentsettings.cpp \ projectfilewizardextension.cpp \ session.cpp \