diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp index cc04b50c208..64c84ecd8cf 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp @@ -73,7 +73,8 @@ QString ExternalToolConfig::searchKeywords() const << ui->workingDirectoryLabel->text() << ui->outputLabel->text() << ui->errorOutputLabel->text() - << ui->inputCheckbox->text(); + << ui->modifiesDocumentCheckbox->text() + << ui->inputLabel->text(); return keywords; } @@ -128,7 +129,7 @@ void ExternalToolConfig::showInfoForItem(QTreeWidgetItem *item) ui->workingDirectory->setPath(tool->workingDirectory()); ui->outputBehavior->setCurrentIndex((int)tool->outputHandling()); ui->errorOutputBehavior->setCurrentIndex((int)tool->errorHandling()); - ui->inputCheckbox->setChecked(!tool->input().isEmpty()); + ui->modifiesDocumentCheckbox->setChecked(tool->modifiesCurrentDocument()); ui->inputText->setPlainText(tool->input()); ui->description->setCursorPosition(0); ui->arguments->setCursorPosition(0); diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.ui b/src/plugins/coreplugin/dialogs/externaltoolconfig.ui index fb4b5e020d1..0ef84c4aed5 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.ui +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.ui @@ -87,6 +87,14 @@ + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">What to do with the executable's standard output. +<ul><li>Ignore: Do nothing with it</li><li>Show in pane: Show it in the general output pane</li><li>Replace selection: Replace the current selection in the current document with it</li></ul></p></body></html> + Output: @@ -109,15 +117,21 @@ Replace selection - - - Reload document - - + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">What to do with the executable's standard error output.</p> +<ul><li>Ignore: Do nothing with it</li> +<li>Show in pane: Show it in the general output pane</li> +<li>Replace selection: Replace the current selection in the current document with it</li> +</ul></body></html> + Error output: @@ -140,27 +154,35 @@ Replace selection - - - Reload document - - - - + + + + Text to pass to the executable via standard input. Leave empty if the executable should not receive any input. + Input: - + QPlainTextEdit::NoWrap + + + + If the tool modifies the current document, set this flag to ensure that the document is saved before running the tool and is reloaded after the tool finished. + + + Modifies current document + + + diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 8024746ecfa..592b4474370 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -70,8 +70,12 @@ namespace { const char * const kError = "error"; const char * const kOutputShowInPane = "showinpane"; const char * const kOutputReplaceSelection = "replaceselection"; - const char * const kOutputReloadDocument = "reloaddocument"; const char * const kOutputIgnore = "ignore"; + const char * const kModifiesDocument = "modifiesdocument"; + const char * const kYes = "yes"; + const char * const kNo = "no"; + const char * const kTrue= "true"; + const char * const kFalse = "false"; } // #pragma mark -- ExternalTool @@ -80,6 +84,7 @@ ExternalTool::ExternalTool() : m_order(-1), m_outputHandling(ShowInPane), m_errorHandling(ShowInPane), + m_modifiesCurrentDocument(false), m_isDisplayNameChanged(false) { } @@ -96,6 +101,7 @@ ExternalTool::ExternalTool(const ExternalTool *other) m_workingDirectory(other->m_workingDirectory), m_outputHandling(other->m_outputHandling), m_errorHandling(other->m_errorHandling), + m_modifiesCurrentDocument(other->m_modifiesCurrentDocument), m_isDisplayNameChanged(other->m_isDisplayNameChanged) { } @@ -167,6 +173,11 @@ ExternalTool::OutputHandling ExternalTool::errorHandling() const return m_errorHandling; } +bool ExternalTool::modifiesCurrentDocument() const +{ + return m_modifiesCurrentDocument; +} + static QStringList splitLocale(const QString &locale) { QString value = locale; @@ -217,12 +228,10 @@ static bool parseOutputAttribute(const QString &attribute, QXmlStreamReader *rea *value = ExternalTool::ShowInPane; } else if (output == QLatin1String(kOutputReplaceSelection)) { *value = ExternalTool::ReplaceSelection; - } else if (output == QLatin1String(kOutputReloadDocument)) { - *value = ExternalTool::ReloadDocument; } else if (output == QLatin1String(kOutputIgnore)) { *value = ExternalTool::Ignore; } else { - reader->raiseError(QLatin1String("Allowed values for output attribute are 'showinpane','replaceselection','reloaddocument'")); + reader->raiseError(QLatin1String("Allowed values for output attribute are 'showinpane','replaceselection','ignore'")); return false; } return true; @@ -267,6 +276,17 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error if (!parseOutputAttribute(QLatin1String(kError), &reader, &tool->m_errorHandling)) break; } + if (reader.attributes().hasAttribute(QLatin1String(kModifiesDocument))) { + const QString &value = reader.attributes().value(QLatin1String(kModifiesDocument)).toString(); + if (value == QLatin1String(kYes) || value == QLatin1String(kTrue)) { + tool->m_modifiesCurrentDocument = true; + } else if (value == QLatin1String(kNo) || value == QLatin1String(kFalse)) { + tool->m_modifiesCurrentDocument = false; + } else { + reader.raiseError(QLatin1String("Allowed values for modifiesdocument attribute are 'yes','true','no','false'")); + break; + } + } while (reader.readNextStartElement()) { if (reader.name() == QLatin1String(kPath)) { tool->m_executables.append(reader.readElementText()); @@ -319,6 +339,7 @@ bool ExternalTool::operator==(const ExternalTool &other) && m_input == other.m_input && m_workingDirectory == other.m_workingDirectory && m_outputHandling == other.m_outputHandling + && m_modifiesCurrentDocument == other.m_modifiesCurrentDocument && m_errorHandling == other.m_errorHandling; } @@ -376,8 +397,7 @@ void ExternalToolRunner::run() deleteLater(); return; } - if (m_tool->outputHandling() == ExternalTool::ReloadDocument - || m_tool->errorHandling() == ExternalTool::ReloadDocument) { + if (m_tool->modifiesCurrentDocument()) { if (IEditor *editor = EditorManager::instance()->currentEditor()) { m_expectedFileName = editor->file()->fileName(); bool cancelled = false; @@ -421,8 +441,8 @@ void ExternalToolRunner::finished(int exitCode, QProcess::ExitStatus status) if (m_tool->outputHandling() == ExternalTool::ReplaceSelection || m_tool->errorHandling() == ExternalTool::ReplaceSelection) { emit ExternalToolManager::instance()->replaceSelectionRequested(m_processOutput); - } else if (m_tool->outputHandling() == ExternalTool::ReloadDocument - || m_tool->errorHandling() == ExternalTool::ReloadDocument) { + } + if (m_tool->modifiesCurrentDocument()) { FileManager::instance()->unexpectFileChange(m_expectedFileName); } } @@ -433,8 +453,7 @@ void ExternalToolRunner::finished(int exitCode, QProcess::ExitStatus status) void ExternalToolRunner::error(QProcess::ProcessError error) { - if (m_tool->outputHandling() == ExternalTool::ReloadDocument - || m_tool->errorHandling() == ExternalTool::ReloadDocument) { + if (m_tool->modifiesCurrentDocument()) { FileManager::instance()->unexpectFileChange(m_expectedFileName); } // TODO inform about errors diff --git a/src/plugins/coreplugin/externaltool.h b/src/plugins/coreplugin/externaltool.h index 05a118e9b88..5c3ab3ff7e1 100644 --- a/src/plugins/coreplugin/externaltool.h +++ b/src/plugins/coreplugin/externaltool.h @@ -54,8 +54,7 @@ public: enum OutputHandling { Ignore, ShowInPane, - ReplaceSelection, - ReloadDocument + ReplaceSelection }; ExternalTool(); @@ -70,6 +69,7 @@ public: int order() const; OutputHandling outputHandling() const; OutputHandling errorHandling() const; + bool modifiesCurrentDocument() const; QStringList executables() const; QString arguments() const; @@ -95,6 +95,8 @@ private: QString m_workingDirectory; OutputHandling m_outputHandling; OutputHandling m_errorHandling; + bool m_modifiesCurrentDocument; + bool m_isDisplayNameChanged; }; diff --git a/src/share/qtcreator/externaltools/vi.xml b/src/share/qtcreator/externaltools/vi.xml index 792401c0717..a93771dfeac 100644 --- a/src/share/qtcreator/externaltools/vi.xml +++ b/src/share/qtcreator/externaltools/vi.xml @@ -36,7 +36,7 @@ In vi öffnen Text Text - + xterm -geom %{CurrentDocument:ColumnCount}x%{CurrentDocument:RowCount}+%{CurrentDocument:XPos}+%{CurrentDocument:YPos} -e vi "%{CurrentDocument:FilePath}" +%{CurrentDocument:Row} +"normal %{CurrentDocument:Column}|" %{CurrentDocument:Path} diff --git a/src/share/qtcreator/externaltools/vi_mac.xml b/src/share/qtcreator/externaltools/vi_mac.xml index f1b2d155136..eca14163c4e 100644 --- a/src/share/qtcreator/externaltools/vi_mac.xml +++ b/src/share/qtcreator/externaltools/vi_mac.xml @@ -36,7 +36,7 @@ In vi öffnen Text Text - + osascript --Terminal opens a window by default when it is not running, so check diff --git a/tests/auto/externaltool/tst_externaltooltest.cpp b/tests/auto/externaltool/tst_externaltooltest.cpp index c21a6aece77..6bee760aa31 100644 --- a/tests/auto/externaltool/tst_externaltooltest.cpp +++ b/tests/auto/externaltool/tst_externaltooltest.cpp @@ -49,7 +49,7 @@ static const char * const TEST_XML3 = " In vi öffnen" " Text" " Text" -" " +" " " xterm" " -geom %{EditorCharWidth}x%{EditorCharHeight}+%{EditorXPos}+%{EditorYPos} -e vi %{CurrentFilePath} +%{EditorLine} +\"normal %{EditorColumn}|\"" " %{CurrentPath}" @@ -143,7 +143,8 @@ void ExternaltoolTest::testRead3() QVERIFY(tool->arguments().startsWith(QLatin1String("-geom %{"))); QCOMPARE(tool->input(), QString()); QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentPath}")); - QCOMPARE(tool->outputHandling(), ExternalTool::ReloadDocument); + QCOMPARE(tool->outputHandling(), ExternalTool::ShowInPane); + QCOMPARE(tool->modifiesCurrentDocument(), true); QCOMPARE(tool->errorHandling(), ExternalTool::ShowInPane); delete tool; }