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;
}