diff --git a/doc/qtcreator-vcs-annotate.png b/doc/qtcreator-vcs-annotate.png new file mode 100644 index 0000000000000000000000000000000000000000..87b7ed117352fe8b04cf6ce032560a5e93a3eb93 Binary files /dev/null and b/doc/qtcreator-vcs-annotate.png differ diff --git a/doc/qtcreator-vcs-commit.png b/doc/qtcreator-vcs-commit.png new file mode 100644 index 0000000000000000000000000000000000000000..2c58ad57732edbbd1d83f96dce548ffd65c34bf9 Binary files /dev/null and b/doc/qtcreator-vcs-commit.png differ diff --git a/doc/qtcreator-vcs-describe.png b/doc/qtcreator-vcs-describe.png new file mode 100644 index 0000000000000000000000000000000000000000..d0949b1e59e657fa34f1f9c926eae082533973af Binary files /dev/null and b/doc/qtcreator-vcs-describe.png differ diff --git a/doc/qtcreator-vcs-diff.png b/doc/qtcreator-vcs-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb9a0f5da83259e30a92995bba2349349cef858 Binary files /dev/null and b/doc/qtcreator-vcs-diff.png differ diff --git a/doc/qtcreator-vcs-gitbranch.png b/doc/qtcreator-vcs-gitbranch.png new file mode 100644 index 0000000000000000000000000000000000000000..398de10ee6595f196b5dac31407a310c1b201f31 Binary files /dev/null and b/doc/qtcreator-vcs-gitbranch.png differ diff --git a/doc/qtcreator-vcs-log.png b/doc/qtcreator-vcs-log.png new file mode 100644 index 0000000000000000000000000000000000000000..e74cd3dade8ba9bffbb30affe5a688fbdd38d315 Binary files /dev/null and b/doc/qtcreator-vcs-log.png differ diff --git a/doc/qtcreator-vcs-pane.png b/doc/qtcreator-vcs-pane.png new file mode 100644 index 0000000000000000000000000000000000000000..faea0cf32e1a20cfceb71e79274d694cfdb04354 Binary files /dev/null and b/doc/qtcreator-vcs-pane.png differ diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc index 4918da9f61aec137311f837e1387775e1e2083cf..68dc857c0ae0a0e907163d271006dd205d4ae3eb 100644 --- a/doc/qtcreator.qdoc +++ b/doc/qtcreator.qdoc @@ -53,6 +53,7 @@ \o \l{Build Settings} \o \l{Qt Version Management} \o \l{Writing a Simple Program with Qt Creator} + \o \l{Qt Creator and Version Control Systems} \o \l{Navigating Quickly Around Your Code with Locator} \o \l{Debugging with Qt Creator} \o \l{Tips and Tricks} @@ -237,10 +238,14 @@ \i \row - \i Indenting + \i Indenting Blocks \i \row - \i Commenting or Uncommenting + \i Commenting or Uncommenting Blocks + \i + + \row + \i Switch between Header and Source \i \endtable @@ -265,6 +270,11 @@ */ +/*! + +*/ + + /*! \contentspage index.html @@ -758,6 +768,136 @@ */ +/*! + \contentspage index.html + \previouspage creator-navigation.html + \page creator-version-control.html + \nextpage creator-debugging.html + + \title Qt Creator and Version Control Systems + + \table + \caption Version control systems supported by Qt Creator + \row + \i \bold{git} + \i \l{http://git-scm.com/} + \row + \i \bold{Subversion} + \i \l{http://subversion.tigris.org/} + \row + \i \bold{Perforce} + \i \l{http://www.perforce.com} + \endtable + + + \section1 Setup + + Qt Creator uses the version control system's command line clients to + access your repositories. To set it up, you must ensure that these command + line clients can be located via the \c{PATH} environment variable. You can + specify the path to the command line client's executable in the settings + pages that can be found under \gui{Options...} in the \gui{Tools} menu. + + + \section1 Usage + + You can find the version control menu entires in a sub-menu of the + \gui{Tools} menu. The version control system displayed here is the system + that manages the current project. + + Each version control system adds a pane to the \gui{Application Output} + panes within which it will log the commands it executes, prepended by a + timestamp and the relevant output. + + \image qtcreator-vcs-pane.png + + + \section2 Addings Files + + When you create a new file or a new project, the wizards will display page + requesting whether the files should be added to a version control system. + This depends on whether the parent directory or the project is already + under version control and the system supports the concept of adding files, + e.g., \bold{Perforce} and \bold{Subversion}. Alternatively, you can also + add files later on using the version control tool menus. + + With \bold{git}, there is no concept of adding files. Instead, all modified + files must be \e{staged} for a commit. + + + \section2 Viewing Diff Output + + All version control systems provide menu options to \e{diff} the current + file or project - comparing with the latest version stored in the + repository and displaying the differences. In Qt Creator, a diff is + displayed in a read-only editor. If the file is accessible, you can double + -click on a selected diff chunk and Qt Creator will open an editor + displaying the file, scrolled to the line in question. + + \image qtcreator-vcs-diff.png + + + \section2 Viewing Versioning History and Change Details + + The versioning history of a file can be displayed by selecting the + \gui{Log} (for \bold{git}) or \gui{Filelog (for \bold{Perforce} and + \bold{Subversion})} option. Typically, the log output will contain the + date, the commit message, and a change or revision identifier. If you + click on the identifier, a description of the change including the diff + will be displayed. + + \image qtcreator-vcs-log.png + \image qtcreator-vcs-describe.png + + + \section2 Annotating Files + + Annotation views are obtained by selecting \gui{Annotate} or \gui{Blame}. + This will display the lines of the file prepended by the change identifier + they originate from. Clicking on the change identifier shows a detailed + description of the file. + + + \section2 Committing Changes + + Once you have finished making changes, you can submit them to the version + control system by choosing \gui{Commit} or \gui{Submit}. Qt Creator will + display a commit page containing a text editor, where you can enter your + commit message, and a checkable list of modified files to be included. + When you are done, click \gui{Commit} to start committing. In addition, + there is a \gui{Diff selected} button that brings up a diff view of the + files selected in the file list. Since the commit page is just another + editor, you can go back to it by closing the diff view. Alternatively, you + can view it from the editor combo box showing the \gui{Opened files}. + + \image qtcreator-vcs-commit.png + + + \section2 Menu Entries Specific to git + + The git sub-menu contains additional entries: + + \table + \row + \i \gui{Stash} + \i Stash local changes prior to executing a \bold{pull}. + \row + \i \gui{Pull} + \i Pull changes from the remote repository. If there are locally + modified files, you will be prompted to stash those changes. + \row + \i \gui{Branches...} + \i Displays the branch dialog showing the local branches at the + top and remote branches at the bottom. To switch to the local + branch, simply double-click on it. Double-clicking on a remote + branch will first create a local branch with the same name that + tracks the remote branch, and then switch to it. + + \image qtcreator-vcs-gitbranch.png + \endtable + +*/ + /*! \contentspage index.html diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index d98539969afc79073744f6da6b35c387245a1dcb..65bf70fe584a8668b134a6329c6cbf2265ba8d4f 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -87,6 +87,7 @@ void CMakeProject::parseCMakeLists(const QDir &directory) CMakeCbpParser cbpparser; qDebug()<<"Parsing file "<<cbpFile; if (cbpparser.parseCbpFile(cbpFile)) { + m_projectName = cbpparser.projectName(); qDebug()<<"Building Tree"; // TODO do a intelligent updating of the tree buildTree(m_rootNode, cbpparser.fileList()); @@ -200,8 +201,7 @@ ProjectExplorer::FolderNode *CMakeProject::findOrCreateFolder(CMakeProjectNode * QString CMakeProject::name() const { - // TODO - return ""; + return m_projectName; } Core::IFile *CMakeProject::file() const @@ -469,6 +469,8 @@ void CMakeCbpParser::parseProject() readNext(); if (isEndElement()) { return; + } else if (name() == "Option") { + parseOption(); } else if (name() == "Unit") { parseUnit(); } else if (name() == "Build") { @@ -537,6 +539,26 @@ void CMakeCbpParser::parseTargetOption() } } +QString CMakeCbpParser::projectName() const +{ + return m_projectName; +} + +void CMakeCbpParser::parseOption() +{ + if (attributes().hasAttribute("title")) + m_projectName = attributes().value("title").toString(); + + while (!atEnd()) { + readNext(); + if (isEndElement()) { + return; + } else if(isStartElement()) { + parseUnknownElement(); + } + } +} + void CMakeCbpParser::parseMakeCommand() { while (!atEnd()) { diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index cad7b5fe5df1dd46042d36edf963380031a6a88a..cdabdf1d0845d1bb77b732352fbed79df44a48d1 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -118,6 +118,7 @@ private: CMakeManager *m_manager; QString m_fileName; CMakeFile *m_file; + QString m_projectName; // TODO probably need a CMake specific node structure CMakeProjectNode* m_rootNode; @@ -137,10 +138,12 @@ public: QList<ProjectExplorer::FileNode *> fileList(); QStringList includeFiles(); QList<CMakeTarget> targets(); + QString projectName() const; private: void parseCodeBlocks_project_file(); void parseProject(); void parseBuild(); + void parseOption(); void parseTarget(); void parseTargetOption(); void parseMakeCommand(); @@ -157,6 +160,7 @@ private: CMakeTarget m_target; bool m_targetType; QList<CMakeTarget> m_targets; + QString m_projectName; }; class CMakeFile : public Core::IFile diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 5a21d6a42d7a56248d4d2d0e1b21896f98a23985..469ea3460112218d7cec8eb0cfa7b2f5d836494b 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -30,6 +30,7 @@ HEADERS += attachexternaldialog.h \ imports.h \ moduleshandler.h \ moduleswindow.h \ + outputcollector.h \ procinterrupt.h \ registerhandler.h \ registerwindow.h \ @@ -40,7 +41,7 @@ HEADERS += attachexternaldialog.h \ threadswindow.h \ watchhandler.h \ watchwindow.h - + SOURCES += attachexternaldialog.cpp \ attachremotedialog.cpp \ breakhandler.cpp \ @@ -54,9 +55,9 @@ SOURCES += attachexternaldialog.cpp \ disassemblerwindow.cpp \ gdbengine.cpp \ gdbmi.cpp \ - gdbengine.h \ moduleshandler.cpp \ moduleswindow.cpp \ + outputcollector.cpp \ procinterrupt.cpp \ registerhandler.cpp \ registerwindow.cpp \ diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ea0e6623b067aec04e98f8b272e476c426d3da36..7b0e6c24273b37bf50216f8b1d113fa56396dec0 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -94,7 +94,7 @@ DebuggerSettings::DebuggerSettings() m_skipKnownFrames = false; m_debugDumpers = false; m_useToolTips = false; - m_useToolTips = false; + m_useTerminal = false; m_useCustomDumpers = true; } @@ -590,9 +590,9 @@ void DebuggerManager::notifyInferiorPidChanged(int pid) emit inferiorPidChanged(pid); } -void DebuggerManager::showApplicationOutput(const QString &prefix, const QString &str) +void DebuggerManager::showApplicationOutput(const QString &str) { - emit applicationOutputAvailable(prefix, str); + emit applicationOutputAvailable(str); } void DebuggerManager::shutdown() diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 9a5b5da37d3e2e55dc7dcf7054e7755aeecd6f27..5d5e7abd0da7f5e475fde605698004d4d4aa9cd0 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -166,7 +166,7 @@ private: virtual ThreadsHandler *threadsHandler() = 0; virtual WatchHandler *watchHandler() = 0; - virtual void showApplicationOutput(const QString &prefix, const QString &data) = 0; + virtual void showApplicationOutput(const QString &data) = 0; //virtual QAction *useCustomDumpersAction() const = 0; //virtual QAction *debugDumpersAction() const = 0; virtual bool skipKnownFrames() const = 0; @@ -200,6 +200,7 @@ public: bool m_debugDumpers; bool m_useFastStart; bool m_useToolTips; + bool m_useTerminal; QString m_scriptFile; }; @@ -285,7 +286,7 @@ public slots: private slots: void showDebuggerOutput(const QString &prefix, const QString &msg); void showDebuggerInput(const QString &prefix, const QString &msg); - void showApplicationOutput(const QString &prefix, const QString &msg); + void showApplicationOutput(const QString &data); void reloadDisassembler(); void disassemblerDockToggled(bool on); @@ -365,7 +366,7 @@ signals: void setSessionValueRequested(const QString &name, const QVariant &value); void configValueRequested(const QString &name, QVariant *value); void setConfigValueRequested(const QString &name, const QVariant &value); - void applicationOutputAvailable(const QString &prefix, const QString &msg); + void applicationOutputAvailable(const QString &output); public: // FIXME: make private diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index bf8edf404e29f6458d29162b3c246d9f07efe476..204345a0220d35fa2ec4f00bed50dbf4f960b33b 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -106,13 +106,7 @@ const char * const JUMP_TO_LINE = "Debugger.JumpToLine"; const char * const TOGGLE_BREAK = "Debugger.ToggleBreak"; const char * const BREAK_BY_FUNCTION = "Debugger.BreakByFunction"; const char * const BREAK_AT_MAIN = "Debugger.BreakAtMain"; -const char * const DEBUG_DUMPERS = "Debugger.DebugDumpers"; const char * const ADD_TO_WATCH = "Debugger.AddToWatch"; -const char * const USE_CUSTOM_DUMPERS = "Debugger.UseCustomDumpers"; -const char * const USE_FAST_START = "Debugger.UseFastStart"; -const char * const USE_TOOL_TIPS = "Debugger.UseToolTips"; -const char * const SKIP_KNOWN_FRAMES = "Debugger.SkipKnownFrames"; -const char * const DUMP_LOG = "Debugger.DumpLog"; #ifdef Q_OS_MAC const char * const INTERRUPT_KEY = "Shift+F5"; @@ -283,6 +277,7 @@ QWidget *GdbOptionPage::createPage(QWidget *parent) m_ui.checkBoxUseCustomDumpers->setChecked(m_settings.m_useCustomDumpers); m_ui.checkBoxFastStart->setChecked(m_settings.m_useFastStart); m_ui.checkBoxUseToolTips->setChecked(m_settings.m_useToolTips); + m_ui.checkBoxUseTerminal->setChecked(m_settings.m_useTerminal); #ifndef QT_DEBUG #if 0 @@ -291,10 +286,6 @@ QWidget *GdbOptionPage::createPage(QWidget *parent) //cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L"))); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11"))); mdebug->addAction(cmd); - - cmd = am->registerAction(m_manager->m_debugDumpersAction, - Constants::DEBUG_DUMPERS, debuggercontext); - mdebug->addAction(cmd); #endif #endif @@ -325,6 +316,7 @@ void GdbOptionPage::apply() m_settings.m_useCustomDumpers = m_ui.checkBoxUseCustomDumpers->isChecked(); m_settings.m_useFastStart = m_ui.checkBoxFastStart->isChecked(); m_settings.m_useToolTips = m_ui.checkBoxUseToolTips->isChecked(); + m_settings.m_useTerminal = m_ui.checkBoxUseTerminal->isChecked(); *m_plugin->m_manager->settings() = m_settings; m_plugin->writeSettings(); @@ -907,6 +899,7 @@ void DebuggerPlugin::writeSettings() const s->setValue("UseFastStart", m->m_useFastStart); s->setValue("UseToolTips", m->m_useToolTips); + s->setValue("UseTerminal", m->m_useTerminal); s->setValue("UseCustomDumpers", m->m_useCustomDumpers); s->setValue("SkipKnowFrames", m->m_skipKnownFrames); s->setValue("DebugDumpers", m->m_debugDumpers); @@ -940,6 +933,7 @@ void DebuggerPlugin::readSettings() m->m_useCustomDumpers = s->value("UseCustomDupers", false).toBool(); m->m_useFastStart = s->value("UseFastStart", false).toBool(); m->m_useToolTips = s->value("UseToolTips", false).toBool(); + m->m_useTerminal = s->value("UseTerminal", false).toBool(); s->endGroup(); m_manager->mainWindow()->restoreState(ba); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 45eecd6514e5919d3142043353c5bb721143d5bb..7f3e42f47fa122af31fd00454dbd7ca595c141ee 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -108,8 +108,8 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager, { connect(m_manager, SIGNAL(debuggingFinished()), this, SLOT(debuggingFinished())); - connect(m_manager, SIGNAL(applicationOutputAvailable(QString, QString)), - this, SLOT(slotAddToOutputWindow(QString, QString))); + connect(m_manager, SIGNAL(applicationOutputAvailable(QString)), + this, SLOT(slotAddToOutputWindowInline(QString))); connect(m_manager, SIGNAL(inferiorPidChanged(qint64)), this, SLOT(bringApplicationToForeground(qint64))); } @@ -138,12 +138,9 @@ void DebuggerRunControl::start() debuggingFinished(); } -void DebuggerRunControl::slotAddToOutputWindow(const QString &prefix, const QString &line) +void DebuggerRunControl::slotAddToOutputWindowInline(const QString &data) { - Q_UNUSED(prefix); - foreach (const QString &l, line.split('\n')) - emit addToOutputWindow(this, prefix + Qt::escape(l)); - //emit addToOutputWindow(this, prefix + Qt::escape(line)); + emit addToOutputWindowInline(this, data); } void DebuggerRunControl::stop() diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h index c10a84e479513583acbc5c642f78edb7ff30f24e..0c6d979c0107f89e79ce196beb4511ac5e577abb 100644 --- a/src/plugins/debugger/debuggerrunner.h +++ b/src/plugins/debugger/debuggerrunner.h @@ -84,7 +84,7 @@ public: private slots: void debuggingFinished(); - void slotAddToOutputWindow(const QString &prefix, const QString &line); + void slotAddToOutputWindowInline(const QString &output); private: DebuggerManager *m_manager; diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 2370a55eed2ec637c359c595bfe95268495d3012..78d2522639b22d572a29c9c915516465bcddc200 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -252,6 +252,7 @@ void GdbEngine::init() m_pendingRequests = 0; m_gdbVersion = 100; m_shared = 0; + m_outputCodec = QTextCodec::codecForLocale(); m_oldestAcceptableToken = -1; @@ -266,6 +267,8 @@ void GdbEngine::init() SLOT(exitDebugger())); // Output + connect(&m_outputCollector, SIGNAL(byteDelivery(QByteArray)), + SLOT(readDebugeeOutput(QByteArray))); connect(this, SIGNAL(gdbResponseAvailable()), this, SLOT(handleResponse()), Qt::QueuedConnection); @@ -275,8 +278,8 @@ void GdbEngine::init() connect(this, SIGNAL(gdbInputAvailable(QString,QString)), q, SLOT(showDebuggerInput(QString,QString)), Qt::QueuedConnection); - connect(this, SIGNAL(applicationOutputAvailable(QString,QString)), - q, SLOT(showApplicationOutput(QString,QString)), + connect(this, SIGNAL(applicationOutputAvailable(QString)), + q, SLOT(showApplicationOutput(QString)), Qt::QueuedConnection); } @@ -355,6 +358,12 @@ static void skipTerminator(const char *&from, const char *to) skipSpaces(from, to); } +void GdbEngine::readDebugeeOutput(const QByteArray &data) +{ + emit applicationOutputAvailable(m_outputCodec->toUnicode( + data.constData(), data.length(), &m_outputCodecState)); +} + // called asyncronously as response to Gdb stdout output in // gdbResponseAvailable() void GdbEngine::handleResponse() @@ -407,22 +416,6 @@ void GdbEngine::handleResponse() break; } - if (token == -1 && *from != '&' && *from != '~' && *from != '*') { - // FIXME: On Linux the application's std::out is merged in here. - // High risk of falsely interpreting this as MI output. - // We assume that we _always_ use tokens, so not finding a token - // is a positive indication for the presence of application output. - QString s; - while (from != to && *from != '\n') - s += *from++; - //qDebug() << "UNREQUESTED DATA " << s << " TAKEN AS APPLICATION OUTPUT"; - //s += '\n'; - - m_inbuffer = QByteArray(from, to - from); - emit applicationOutputAvailable("app-stdout: ", s); - continue; - } - // next char decides kind of record const char c = *from++; //qDebug() << "CODE:" << c; @@ -590,8 +583,7 @@ static void fixMac(QByteArray &out) void GdbEngine::readGdbStandardError() { - QByteArray err = m_gdbProc.readAllStandardError(); - emit applicationOutputAvailable("app-stderr:", err); + qWarning() << "Unexpected gdb stderr:" << m_gdbProc.readAllStandardError(); } void GdbEngine::readGdbStandardOutput() @@ -1078,7 +1070,7 @@ void GdbEngine::handleStreamOutput(const QString &data, char code) // On Windows, the contents seem to depend on the debugger // version and/or OS version used. if (data.startsWith("warning:")) - qq->showApplicationOutput(QString(), data); + qq->showApplicationOutput(data); break; } @@ -1484,6 +1476,7 @@ void GdbEngine::exitDebugger() m_varToType.clear(); m_dataDumperState = DataDumperUninitialized; m_shared = 0; + m_outputCollector.shutdown(); //q->settings()->m_debugDumpers = false; } @@ -1506,6 +1499,15 @@ bool GdbEngine::startDebugger() return false; } + if (!m_outputCollector.listen()) { + QMessageBox::critical(q->mainWindow(), tr("Debugger Startup Failure"), + tr("Cannot set up communication with child process: %1") + .arg(m_outputCollector.errorString())); + return false; + } + + gdbArgs.prepend(QLatin1String("--tty=") + m_outputCollector.serverName()); + //gdbArgs.prepend(QLatin1String("--quiet")); gdbArgs.prepend(QLatin1String("mi")); gdbArgs.prepend(QLatin1String("-i")); @@ -1530,8 +1532,12 @@ bool GdbEngine::startDebugger() m_gdbProc.start(q->settings()->m_gdbCmd, gdbArgs); m_gdbProc.waitForStarted(); - if (m_gdbProc.state() != QProcess::Running) + if (m_gdbProc.state() != QProcess::Running) { + QMessageBox::critical(q->mainWindow(), tr("Debugger Startup Failure"), + tr("Cannot start debugger: %1").arg(m_gdbProc.errorString())); + m_outputCollector.shutdown(); return false; + } q->showStatusMessage(tr("Gdb Running")); diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index e07e6a228c39950761b53c41542f7930d2b6e459..60493a53e582233c19efbd7cd42e3b95f82cf17b 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -36,6 +36,7 @@ #include "idebuggerengine.h" #include "gdbmi.h" +#include "outputcollector.h" #include <QtCore/QByteArray> #include <QtCore/QHash> @@ -43,6 +44,7 @@ #include <QtCore/QObject> #include <QtCore/QProcess> #include <QtCore/QPoint> +#include <QtCore/QTextCodec> #include <QtCore/QVariant> QT_BEGIN_NAMESPACE @@ -93,7 +95,7 @@ signals: void gdbResponseAvailable(); void gdbInputAvailable(const QString &prefix, const QString &msg); void gdbOutputAvailable(const QString &prefix, const QString &msg); - void applicationOutputAvailable(const QString &prefix, const QString &msg); + void applicationOutputAvailable(const QString &output); private: // @@ -173,6 +175,7 @@ private slots: void gdbProcError(QProcess::ProcessError error); void readGdbStandardOutput(); void readGdbStandardError(); + void readDebugeeOutput(const QByteArray &data); private: int terminationIndex(const QByteArray &buffer, int &length); @@ -190,6 +193,10 @@ private: void handleQueryPwd(const GdbResultRecord &response); void handleQuerySources(const GdbResultRecord &response); + OutputCollector m_outputCollector; + QTextCodec *m_outputCodec; + QTextCodec::ConverterState m_outputCodecState; + QByteArray m_inbuffer; QProcess m_gdbProc; diff --git a/src/plugins/debugger/gdboptionpage.ui b/src/plugins/debugger/gdboptionpage.ui index 354eb64233ff5753b73150f81e9f8ca27f4ce886..dcd5744335028aed9ba39145733e2d222d153695 100644 --- a/src/plugins/debugger/gdboptionpage.ui +++ b/src/plugins/debugger/gdboptionpage.ui @@ -36,7 +36,7 @@ <widget class="QLineEdit" name="environmentEdit"/> </item> <item row="0" column="0"> - <widget class="QLabel" name="labelGdbLocaltion"> + <widget class="QLabel" name="labelGdbLocation"> <property name="toolTip"> <string>This is either a full abolute path leading to the gdb binary you intend to use or the name of a gdb binary that wiull be searched in your PATH.</string> </property> @@ -84,6 +84,16 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="checkBoxUseTerminal"> + <property name="toolTip"> + <string>Start debugged process in a separte terminal.</string> + </property> + <property name="text"> + <string>Start in terminal</string> + </property> + </widget> + </item> <item> <widget class="QCheckBox" name="checkBoxFastStart"> <property name="toolTip"> diff --git a/src/plugins/debugger/outputcollector.cpp b/src/plugins/debugger/outputcollector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f091ca9208409a73817d9d9fe241c8e87f181c9f --- /dev/null +++ b/src/plugins/debugger/outputcollector.cpp @@ -0,0 +1,180 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception +** version 1.3, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ + +#include "outputcollector.h" + +#ifdef Q_OS_WIN + +#include <QtNetwork/QLocalServer> +#include <QtNetwork/QLocalSocket> +#include <QtCore/QCoreApplication> + +#else + +#include <QtCore/QFile> +#include <QtCore/QSocketNotifier> +#include <QtCore/QTemporaryFile> +#include <QtCore/QVarLengthArray> + +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> + +#endif + +namespace Debugger { +namespace Internal { + +OutputCollector::OutputCollector(QObject *parent) + : QObject(parent) +{ +#ifdef Q_OS_WIN + m_server = 0; + m_socket = 0; +#endif +} + +OutputCollector::~OutputCollector() +{ + shutdown(); +} + +bool OutputCollector::listen() +{ +#ifdef Q_OS_WIN + if (m_server) + return m_server->isListening(); + m_server = new QLocalServer(this); + connect(m_server, SIGNAL(newConnection()), SLOT(newConnectionAvailable())); + return m_server->listen(QLatin1String("creator-") + QCoreApplication::applicationPid()); // XXX how to make that secure? +#else + if (!m_serverPath.isEmpty()) + return true; + QByteArray codedServerPath; + forever { + { + QTemporaryFile tf; + if (!tf.open()) { + m_errorString = tr("Cannot create temporary file: %2").arg(tf.errorString()); + m_serverPath.clear(); + return false; + } + m_serverPath = tf.fileName(); + } + // By now the temp file was deleted again + codedServerPath = QFile::encodeName(m_serverPath); + if (!::mkfifo(codedServerPath.constData(), 0600)) + break; + if (errno != EEXIST) { + m_errorString = tr("Cannot create FiFo %1: %2").arg(m_serverPath, strerror(errno)); + m_serverPath.clear(); + return false; + } + } + if ((m_serverFd = ::open(codedServerPath.constData(), O_RDONLY|O_NONBLOCK)) < 0) { + m_errorString = tr("Cannot open FiFo %1: %2").arg(m_serverPath, strerror(errno)); + m_serverPath.clear(); + return false; + } + m_serverNotifier = new QSocketNotifier(m_serverFd, QSocketNotifier::Read, this); + connect(m_serverNotifier, SIGNAL(activated(int)), SLOT(bytesAvailable())); + return true; +#endif +} + +void OutputCollector::shutdown() +{ +#ifdef Q_OS_WIN + delete m_server; // Deletes socket as well (QObject parent) + m_server = 0; + m_socket = 0; +#else + if (!m_serverPath.isEmpty()) { + ::close(m_serverFd); + ::unlink(QFile::encodeName(m_serverPath).constData()); + delete m_serverNotifier; + m_serverPath.clear(); + } +#endif +} + +QString OutputCollector::errorString() const +{ +#ifdef Q_OS_WIN + return m_socket ? m_socket->errorString() : m_server->errorString(); +#else + return m_errorString; +#endif +} + +QString OutputCollector::serverName() const +{ +#ifdef Q_OS_WIN + return m_server->fullServerName(); +#else + return m_serverPath; +#endif +} + +#ifdef Q_OS_WIN +void OutputCollector::newConnectionAvailable() +{ + if (m_socket) + return; + m_socket = m_server->nextPendingConnection(); + connect(m_socket, SIGNAL(bytesAvailable()), SLOT(bytesAvailable())); +} +#endif + +void OutputCollector::bytesAvailable() +{ +#ifdef Q_OS_WIN + emit byteDelivery(m_socket->readAll()); +#else + size_t nbytes = 0; + if (::ioctl(m_serverFd, FIONREAD, (char *) &nbytes) < 0) + return; + QVarLengthArray<char, 8192> buff(nbytes); + if (::read(m_serverFd, buff.data(), nbytes) != (int)nbytes) + return; + if (nbytes) // Skip EOF notifications + emit byteDelivery(QByteArray::fromRawData(buff.data(), nbytes)); +#endif +} + +} // namespace Internal +} // namespace Debugger diff --git a/src/plugins/debugger/outputcollector.h b/src/plugins/debugger/outputcollector.h new file mode 100644 index 0000000000000000000000000000000000000000..b84a1b361001de100bedae5a1c6859139adaf4a2 --- /dev/null +++ b/src/plugins/debugger/outputcollector.h @@ -0,0 +1,91 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception +** version 1.3, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ + +#ifndef OUTPUT_COLLECTOR_H +#define OUTPUT_COLLECTOR_H + +#include <QtCore/QByteArray> +#include <QtCore/QObject> + +QT_BEGIN_NAMESPACE +class QLocalServer; +class QLocalSocket; +class QSocketNotifier; +QT_END_NAMESPACE + +namespace Debugger { +namespace Internal { + +/////////////////////////////////////////////////////////////////////// +// +// OutputCollector +// +/////////////////////////////////////////////////////////////////////// + +class OutputCollector : public QObject +{ + Q_OBJECT + +public: + OutputCollector(QObject *parent = 0); + ~OutputCollector(); + bool listen(); + void shutdown(); + QString serverName() const; + QString errorString() const; + +signals: + void byteDelivery(const QByteArray &data); + +private slots: + void bytesAvailable(); +#ifdef Q_OS_WIN + void newConnectionAvailable(); +#endif + +private: +#ifdef Q_OS_WIN + QLocalServer *m_server; + QLocalSocket *m_socket; +#else + QString m_serverPath; + int m_serverFd; + QSocketNotifier *m_serverNotifier; + QString m_errorString; +#endif +}; + +} // namespace Internal +} // namespace Debugger + +#endif // OUTPUT_COLLECTOR_H diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 4a69ff97ea67da35e9c7cdf6ce011a52869a3155..087d225207f76bf440fe9800f54e6d0a6fb83d01 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -35,6 +35,13 @@ #include "fakevimconstants.h" +// Please do not add any direct dependencies to other Qt Creator code here. +// Instead emit signals and let the FakeVimPlugin channel the information to +// Qt Creator. The idea is to keep this file here in a "clean" state that +// allows easy reuse with any QTextEdit or QPlainTextEdit derived class. + +//#include <indenter.h> + #include <QtCore/QDebug> #include <QtCore/QFile> #include <QtCore/QObject> @@ -53,11 +60,6 @@ #include <QtGui/QTextDocumentFragment> #include <QtGui/QTextEdit> -//#include <texteditor/basetexteditor.h> -//#include <texteditor/textblockiterator.h> -//#include <cppeditor/cppeditor.h> - -//#include <indenter.h> using namespace FakeVim::Internal; using namespace FakeVim::Constants; @@ -382,6 +384,9 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) return; } + if (m_visualMode != NoVisualMode) + m_marks['>'] = m_tc.position(); + if (m_submode == ChangeSubMode) { if (!dotCommand.isEmpty()) m_dotCommand = "c" + dotCommand; @@ -613,10 +618,8 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) } else if (key == ':') { m_mode = ExMode; m_commandBuffer.clear(); - if (m_visualMode != NoVisualMode) { + if (m_visualMode != NoVisualMode) m_commandBuffer = "'<,'>"; - leaveVisualMode(); - } m_commandHistory.append(QString()); m_commandHistoryIndex = m_commandHistory.size() - 1; updateMiniBuffer(); @@ -638,7 +641,6 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) m_submode = FilterSubMode; } else if (key == '!' && m_visualMode == VisualLineMode) { m_mode = ExMode; - m_marks['>'] = m_tc.position(); m_commandBuffer = "'<,'>!"; m_commandHistory.append(QString()); m_commandHistoryIndex = m_commandHistory.size() - 1; @@ -724,7 +726,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) } else if (key == 'G') { int n = m_mvcount.isEmpty() ? linesInDocument() : count(); m_tc.setPosition(positionForLine(n), KeepAnchor); - if (m_config.contains(ConfigStartOfLine)) + if (m_config[ConfigStartOfLine] == ConfigOn) moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == 'h' || key == Key_Left) { @@ -1019,6 +1021,7 @@ bool FakeVimHandler::Private::handleMiniBufferModes(int key, const QString &text m_commandHistory.takeLast(); m_commandHistory.append(m_commandBuffer); handleExCommand(m_commandBuffer); + leaveVisualMode(); } } else if (key == Key_Return && isSearchMode()) { if (!m_commandBuffer.isEmpty()) { @@ -1138,7 +1141,6 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) if (cmd.startsWith("%")) cmd = "1,$" + cmd.mid(1); - m_marks['>'] = m_tc.position(); int beginLine = -1; int endLine = -1; @@ -1192,10 +1194,9 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName)); } else if (file.open(QIODevice::ReadWrite)) { QTextCursor tc = selectRange(beginLine, endLine); - qDebug() << "ANCHOR: " << tc.position() << tc.anchor() - << tc.selection().toPlainText(); - { QTextStream ts(&file); ts << tc.selection().toPlainText(); } - file.close(); + QString contents = tc.selection().toPlainText(); + emit q->writeFile(fileName, contents); + // check by reading back file.open(QIODevice::ReadOnly); QByteArray ba = file.readAll(); showBlackMessage(tr("\"%1\" %2 %3L, %4C written") @@ -1813,3 +1814,8 @@ void FakeVimHandler::quit() { d->quit(); } + +void FakeVimHandler::setCurrentFileName(const QString &fileName) +{ + d->m_currentFileName = fileName; +} diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h index 08df6d21b12a526f307b34346e3517cd2c662673..aeba5ace87005fbb9a88460335122ac8743aa722 100644 --- a/src/plugins/fakevim/fakevimhandler.h +++ b/src/plugins/fakevim/fakevimhandler.h @@ -58,6 +58,7 @@ public slots: // FIXME: good idea? void addWidget(QWidget *widget); void removeWidget(QWidget *widget); + void setCurrentFileName(const QString &fileName); // This executes an "ex" style command taking context // information from \p widget; @@ -72,6 +73,7 @@ signals: void quitRequested(QWidget *); void selectionChanged(QWidget *widget, const QList<QTextEdit::ExtraSelection> &selection); + void writeFile(const QString &fileName, const QString &contents); private: bool eventFilter(QObject *ob, QEvent *ev); diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 0a06fe7c112700e3fc54a8b108b10c25218d0c85..a27e988f4b4fd7fe81a5b4fa980446ad38ca3801 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -39,7 +39,9 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/coreconstants.h> #include <coreplugin/editormanager/editormanager.h> +#include <coreplugin/filemanager.h> #include <coreplugin/icore.h> +#include <coreplugin/ifile.h> #include <coreplugin/messagemanager.h> #include <coreplugin/modemanager.h> #include <coreplugin/uniqueidmanager.h> @@ -117,12 +119,14 @@ private slots: void editorAboutToClose(Core::IEditor *); void changeSelection(QWidget *widget, const QList<QTextEdit::ExtraSelection> &selections); + void writeFile(const QString &fileName, const QString &contents); private: FakeVimPlugin *q; FakeVimHandler *m_handler; QAction *m_installHandlerAction; Core::ICore *m_core; + Core::IFile *m_currentFile; }; } // namespace Internal @@ -134,6 +138,7 @@ FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin) m_handler = 0; m_installHandlerAction = 0; m_core = 0; + m_currentFile = 0; } FakeVimPluginPrivate::~FakeVimPluginPrivate() @@ -206,6 +211,12 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget) this, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>))); m_handler->addWidget(widget); + TextEditor::BaseTextEditor* editor = + qobject_cast<TextEditor::BaseTextEditor*>(widget); + if (editor) { + m_currentFile = editor->file(); + m_handler->setCurrentFileName(editor->file()->fileName()); + } BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget); if (bt) { @@ -225,12 +236,29 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget) } } +void FakeVimPluginPrivate::writeFile(const QString &fileName, + const QString &contents) +{ + if (m_currentFile && fileName == m_currentFile->fileName()) { + // Handle that as a special case for nicer interaction with core + m_core->fileManager()->blockFileChange(m_currentFile); + m_currentFile->save(fileName); + m_core->fileManager()->unblockFileChange(m_currentFile); + } else { + QFile file(fileName); + file.open(QIODevice::ReadWrite); + { QTextStream ts(&file); ts << contents; } + file.close(); + } +} + void FakeVimPluginPrivate::removeHandler(QWidget *widget) { Q_UNUSED(widget); m_handler->removeWidget(widget); Core::EditorManager::instance()->hideEditorInfoBar( QLatin1String(Constants::MINI_BUFFER)); + m_currentFile = 0; } void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor) diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h index ead2799453e5722472b2508577c62fb1ed7869c3..82876e61f76b372da90ea9694331e3ee953069af 100644 --- a/src/plugins/projectexplorer/applicationlauncher.h +++ b/src/plugins/projectexplorer/applicationlauncher.h @@ -37,6 +37,9 @@ #include <QtCore/QObject> #include <QtCore/QStringList> #include <QtCore/QProcess> +#ifndef Q_OS_WIN +#include <QtCore/QTextCodec> +#endif namespace ProjectExplorer { namespace Internal { @@ -88,7 +91,12 @@ private: ConsoleProcess *m_consoleProcess; Mode m_currentMode; +#ifdef Q_OS_WIN WinGuiProcess *m_winGuiProcess; +#else + QTextCodec *m_outputCodec; + QTextCodec::ConverterState m_outputCodecState; +#endif }; } // namespace Internal diff --git a/src/plugins/projectexplorer/applicationlauncher_win.cpp b/src/plugins/projectexplorer/applicationlauncher_win.cpp index c6279b4c3cffd0b6da3508b1e44aa594b06808cd..374d26c97b15ea52280e047ba0d59070ea058710 100644 --- a/src/plugins/projectexplorer/applicationlauncher_win.cpp +++ b/src/plugins/projectexplorer/applicationlauncher_win.cpp @@ -116,10 +116,7 @@ qint64 ApplicationLauncher::applicationPID() const void ApplicationLauncher::readWinDebugOutput(const QString &output) { - QString s = output; - if (s.endsWith(QLatin1Char('\n'))) - s.chop(1); - emit appendOutput(s); + emit appendOutput(output); } void ApplicationLauncher::processStopped() diff --git a/src/plugins/projectexplorer/applicationlauncher_x11.cpp b/src/plugins/projectexplorer/applicationlauncher_x11.cpp index 79933d4518bddc89cf995ea2d33f1e8f3e86bb07..78214746a2ee8d0f7de68978a7c29b5c5a57cf6e 100644 --- a/src/plugins/projectexplorer/applicationlauncher_x11.cpp +++ b/src/plugins/projectexplorer/applicationlauncher_x11.cpp @@ -41,6 +41,7 @@ using namespace ProjectExplorer::Internal; ApplicationLauncher::ApplicationLauncher(QObject *parent) : QObject(parent) { + m_outputCodec = QTextCodec::codecForLocale(); m_currentMode = Gui; m_guiProcess = new QProcess(this); m_guiProcess->setReadChannelMode(QProcess::MergedChannels); @@ -132,13 +133,9 @@ void ApplicationLauncher::guiProcessError() void ApplicationLauncher::readStandardOutput() { - m_guiProcess->setReadChannel(QProcess::StandardOutput); - while (m_guiProcess->canReadLine()) { - QString line = QString::fromLocal8Bit(m_guiProcess->readLine()); - if (line.endsWith(QLatin1Char('\n'))) - line.chop(1); - emit appendOutput(line); - } + QByteArray data = m_guiProcess->readAllStandardOutput(); + emit appendOutput(m_outputCodec->toUnicode( + data.constData(), data.length(), &m_outputCodecState)); } void ApplicationLauncher::processStopped() diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.cpp b/src/plugins/projectexplorer/applicationrunconfiguration.cpp index fc936d2c4311abe7911f03e6af8e20bc3baa42f2..0eeae6e8eef955d0a5dc30ee3710e03d847c6900 100644 --- a/src/plugins/projectexplorer/applicationrunconfiguration.cpp +++ b/src/plugins/projectexplorer/applicationrunconfiguration.cpp @@ -141,7 +141,7 @@ void ApplicationRunControl::start() m_executable, rc->commandLineArguments()); emit started(); - emit addToOutputWindow(this, tr("Starting %1").arg(m_executable)); + emit addToOutputWindow(this, tr("Starting %1...").arg(m_executable)); } void ApplicationRunControl::stop() @@ -162,7 +162,7 @@ void ApplicationRunControl::slotError(const QString & err) void ApplicationRunControl::slotAddToOutputWindow(const QString &line) { - emit addToOutputWindow(this, Qt::escape(line)); + emit addToOutputWindowInline(this, line); } void ApplicationRunControl::processExited(int exitCode) diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp index c02f21ff34b32bc597edbf25fc8e3ae669e93ae3..d34c3f2bb0e3645d0928731c72c6b1587d3e5916 100644 --- a/src/plugins/projectexplorer/outputwindow.cpp +++ b/src/plugins/projectexplorer/outputwindow.cpp @@ -215,6 +215,12 @@ void OutputPane::appendOutput(RunControl *rc, const QString &out) ow->appendOutput(out); } +void OutputPane::appendOutputInline(RunControl *rc, const QString &out) +{ + OutputWindow *ow = m_outputWindows.value(rc); + ow->appendOutputInline(out); +} + void OutputPane::showTabFor(RunControl *rc) { OutputWindow *ow = m_outputWindows.value(rc); @@ -318,7 +324,16 @@ OutputWindow::~OutputWindow() void OutputWindow::appendOutput(const QString &out) { - appendPlainText(out); + if (out.endsWith('\n')) + appendPlainText(out); + else + appendPlainText(out + '\n'); +} + +void OutputWindow::appendOutputInline(const QString &out) +{ + moveCursor(QTextCursor::End); + insertPlainText(out); } void OutputWindow::insertLine() diff --git a/src/plugins/projectexplorer/outputwindow.h b/src/plugins/projectexplorer/outputwindow.h index 6bda6121af66f36e9b81ccc80ea60f1469f2ac8b..674f25cd51d728f41fd45b216e3faa73ee7e6fa4 100644 --- a/src/plugins/projectexplorer/outputwindow.h +++ b/src/plugins/projectexplorer/outputwindow.h @@ -83,6 +83,7 @@ public: // ApplicationOutputspecifics void createNewOutputWindow(RunControl *rc); void appendOutput(RunControl *rc, const QString &out); + void appendOutputInline(RunControl *rc, const QString &out); void showTabFor(RunControl *rc); public slots: @@ -119,6 +120,7 @@ public: ~OutputWindow(); void appendOutput(const QString &out); + void appendOutputInline(const QString &out); void insertLine(); }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 2d6224bbdda90745ef71dee7fa8f90e7084f4f4a..c6cb624fb86bcc68d1bac08a803dc8049de768cd 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1084,6 +1084,8 @@ void ProjectExplorerPlugin::buildQueueFinished(bool success) connect(control, SIGNAL(addToOutputWindow(RunControl *, const QString &)), this, SLOT(addToApplicationOutputWindow(RunControl *, const QString &))); + connect(control, SIGNAL(addToOutputWindowInline(RunControl *, const QString &)), + this, SLOT(addToApplicationOutputWindowInline(RunControl *, const QString &))); connect(control, SIGNAL(error(RunControl *, const QString &)), this, SLOT(addErrorToApplicationOutputWindow(RunControl *, const QString &))); connect(control, SIGNAL(finished()), @@ -1379,6 +1381,11 @@ void ProjectExplorerPlugin::addToApplicationOutputWindow(RunControl *rc, const Q m_outputPane->appendOutput(rc, line); } +void ProjectExplorerPlugin::addToApplicationOutputWindowInline(RunControl *rc, const QString &line) +{ + m_outputPane->appendOutputInline(rc, line); +} + void ProjectExplorerPlugin::addErrorToApplicationOutputWindow(RunControl *rc, const QString &error) { m_outputPane->appendOutput(rc, error); diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 2c1127ff5c63b06ef201db6f6a41d4359bace26e..1d270226d1ae1c370634be30a06fcd4720f698d3 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -180,6 +180,7 @@ private slots: void updateRunAction(); void addToApplicationOutputWindow(RunControl *, const QString &line); + void addToApplicationOutputWindowInline(RunControl *, const QString &line); void addErrorToApplicationOutputWindow(RunControl *, const QString &error); void updateTaskActions(); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index acc11cd932ad0bdd68495d5287ddbc9968e8ea33..0bd593c20e24c40abd388252924694f234776908 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -143,6 +143,7 @@ public: QSharedPointer<RunConfiguration> runConfiguration(); signals: void addToOutputWindow(RunControl *, const QString &line); + void addToOutputWindowInline(RunControl *, const QString &line); void error(RunControl *, const QString &error); void started(); void finished(); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 14fb56a38e951e040bc2e3bdc527a38e391605cb..c7bf1e5803503c0e085fcb8ffacc02cf47adf403 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -730,9 +730,7 @@ namespace { // updateSourceFiles() for files that changed // It does so by storing a modification time for each ui file we know about. -// TODO this function should also be called if the build configuration changes -// since the build directory could change, and thus the generated files that are present -// TODO check that it works +// TODO this function should also be called if the build directory is changed void Qt4ProFileNode::updateUiFiles() { // Only those two project types can have ui files for us diff --git a/src/plugins/qt4projectmanager/speinfo.cpp b/src/plugins/qt4projectmanager/speinfo.cpp index 04df918bb518e1a877a620382cddcadabf0c5196..16fa58741275bfbace74948515f5dd36e805df75 100644 --- a/src/plugins/qt4projectmanager/speinfo.cpp +++ b/src/plugins/qt4projectmanager/speinfo.cpp @@ -491,7 +491,7 @@ public: class InfoItemModulesTest : public SPEInfoItem { public: - InfoItemModulesTest(): SPEInfoItem("qtestlib", QtModule) + InfoItemModulesTest(): SPEInfoItem("testlib", QtModule) { m_data.insert(keyIncludedByDefault, false); } diff --git a/tests/manual/gdbdebugger/simple/plugin.cpp b/tests/manual/gdbdebugger/simple/plugin.cpp index 4e02c7f9f7e5628c7b000cfa93a41684dc0905d8..5e140d5811e85b65fbabd3307d2a2e0ada9aeade 100644 --- a/tests/manual/gdbdebugger/simple/plugin.cpp +++ b/tests/manual/gdbdebugger/simple/plugin.cpp @@ -39,6 +39,6 @@ extern "C" Q_DECL_EXPORT int pluginTest() int s = 0; for (int i = 1; i != 2000; ++i) s += i; - fprintf(stderr, "in plugin test"); + fprintf(stderr, "in plugin test\n"); return s; }