Commit 10b6b293 authored by con's avatar con
Browse files

Make the "sort selection" tool do something.

* Handle <input> tag.
* Pass input to running process.
* Search for executable in path.
* Add "CurrentSelection" variable.

Remaining issue: ReplaceSelection output handling.
parent 6c696387
......@@ -32,11 +32,11 @@
<externaltool id="sort">
<description>Sorts the selected text</description>
<description xml:lang="de">Sortiert den ausgewählten Text</description>
<displayname>Sort</displayname>
<displayname xml:lang="de">Sortieren</displayname>
<displayname>Sort Selection</displayname>
<displayname xml:lang="de">Selektion Sortieren</displayname>
<category>Text</category>
<category xml:lang="de">Text</category>
<executable output="replaceselection">
<executable output="showinpane" error="ignore">
<path>sort</path>
<input>%{CurrentSelection}</input>
<workingdirectory>%{CurrentPath}</workingdirectory>
......
......@@ -38,6 +38,7 @@
#include <coreplugin/messagemanager.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/environment.h>
#include <QtCore/QXmlStreamReader>
#include <QtCore/QDir>
......@@ -60,6 +61,7 @@ namespace {
const char * const kExecutable = "executable";
const char * const kPath = "path";
const char * const kArguments = "arguments";
const char * const kInput = "input";
const char * const kWorkingDirectory = "workingdirectory";
const char * const kXmlLang = "xml:lang";
......@@ -120,6 +122,11 @@ QString ExternalTool::arguments() const
return m_arguments;
}
QString ExternalTool::input() const
{
return m_input;
}
QString ExternalTool::workingDirectory() const
{
return m_workingDirectory;
......@@ -244,6 +251,12 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error
break;
}
tool->m_arguments = reader.readElementText();
} else if (reader.name() == QLatin1String(kInput)) {
if (!tool->m_input.isEmpty()) {
reader.raiseError(QLatin1String("only one <input> element allowed"));
break;
}
tool->m_input = reader.readElementText();
} else if (reader.name() == QLatin1String(kWorkingDirectory)) {
if (!tool->m_workingDirectory.isEmpty()) {
reader.raiseError(QLatin1String("only one <workingdirectory> element allowed"));
......@@ -290,14 +303,10 @@ bool ExternalToolRunner::resolve()
foreach (const QString &executable, m_tool->executables()) {
QString resolved = Utils::expandMacros(executable,
Core::VariableManager::instance()->macroExpander());
QFileInfo info(resolved);
// TODO search in path
if (info.exists() && info.isExecutable()) {
m_resolvedExecutable = resolved;
break;
}
m_resolvedExecutable =
Utils::Environment::systemEnvironment().searchInPath(resolved);
}
if (m_resolvedExecutable.isNull())
if (m_resolvedExecutable.isEmpty())
return false;
}
{ // arguments
......@@ -306,6 +315,10 @@ bool ExternalToolRunner::resolve()
// TODO stupid, do it right
m_resolvedArguments = resolved.split(QLatin1Char(' '), QString::SkipEmptyParts);
}
{ // input
m_resolvedInput = Utils::expandMacros(m_tool->input(),
Core::VariableManager::instance()->macroExpander());
}
{ // working directory
m_resolvedWorkingDirectory = Utils::expandMacros(m_tool->workingDirectory(),
Core::VariableManager::instance()->macroExpander());
......@@ -321,17 +334,30 @@ void ExternalToolRunner::run()
}
m_process = new QProcess;
// TODO error handling, finish reporting, reading output, etc
connect(m_process, SIGNAL(started()), this, SLOT(started()));
connect(m_process, SIGNAL(finished(int)), this, SLOT(finished()));
connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError)));
connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandardOutput()));
connect(m_process, SIGNAL(readyReadStandardError()), this, SLOT(readStandardError()));
if (!m_resolvedWorkingDirectory.isEmpty())
m_process->setWorkingDirectory(m_resolvedWorkingDirectory);
m_process->start(m_resolvedExecutable, m_resolvedArguments, QIODevice::ReadOnly);
ICore::instance()->messageManager()->printToOutputPane(
tr("Starting external tool '%1'").arg(m_resolvedExecutable), false);
m_process->start(m_resolvedExecutable, m_resolvedArguments, QIODevice::ReadWrite);
}
void ExternalToolRunner::started()
{
if (!m_resolvedInput.isEmpty()) {
m_process->write(m_resolvedInput.toLocal8Bit());
}
m_process->closeWriteChannel();
}
void ExternalToolRunner::finished()
{
ICore::instance()->messageManager()->printToOutputPane(
tr("'%1' finished").arg(m_resolvedExecutable), false);
// TODO handle the ReplaceSelection and ReloadDocument flags
m_process->deleteLater();
deleteLater();
......
......@@ -66,6 +66,7 @@ public:
QStringList executables() const;
QString arguments() const;
QString input() const;
QString workingDirectory() const;
static ExternalTool *createFromXml(const QByteArray &xml, QString *errorMessage = 0, const QString &locale = QString());
......@@ -78,6 +79,7 @@ private:
int m_order;
QStringList m_executables;
QString m_arguments;
QString m_input;
QString m_workingDirectory;
OutputHandling m_outputHandling;
OutputHandling m_errorHandling;
......@@ -90,6 +92,7 @@ public:
ExternalToolRunner(const ExternalTool *tool);
private slots:
void started();
void finished();
void error(QProcess::ProcessError error);
void readStandardOutput();
......@@ -102,6 +105,7 @@ private:
const ExternalTool *m_tool;
QString m_resolvedExecutable;
QStringList m_resolvedArguments;
QString m_resolvedInput;
QString m_resolvedWorkingDirectory;
QProcess *m_process;
QTextCodec *m_outputCodec;
......
......@@ -50,6 +50,7 @@
#include <coreplugin/icore.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/mimedatabase.h>
#include <coreplugin/variablemanager.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
#include <coreplugin/editormanager/editormanager.h>
......@@ -175,6 +176,9 @@ void TextEditorPlugin::extensionsInitialized()
addAutoReleasedObject(new FindInFiles(Find::SearchResultWindow::instance()));
addAutoReleasedObject(new FindInCurrentFile(Find::SearchResultWindow::instance()));
connect(Core::VariableManager::instance(), SIGNAL(variableUpdateRequested(QString)),
this, SLOT(updateVariable(QString)));
}
void TextEditorPlugin::initializeEditor(PlainTextEditor *editor)
......@@ -208,4 +212,19 @@ void TextEditorPlugin::updateSearchResultsFont(const FontSettings &settings)
settings.fontSize() * settings.fontZoom() / 100));
}
void TextEditorPlugin::updateVariable(const QString &variable)
{
static const char * const kCurrentSelectionVar = "CurrentSelection";
if (variable == QLatin1String(kCurrentSelectionVar)) {
QString selectedText;
Core::IEditor *iface = Core::EditorManager::instance()->currentEditor();
ITextEditor *editor = qobject_cast<ITextEditor *>(iface);
if (editor) {
selectedText = editor->selectedText();
selectedText.replace(QChar::ParagraphSeparator, QLatin1String("\n"));
}
Core::VariableManager::instance()->insert(variable, selectedText);
}
}
Q_EXPORT_PLUGIN(TextEditorPlugin)
......@@ -76,6 +76,7 @@ private slots:
void invokeCompletion();
void invokeQuickFix();
void updateSearchResultsFont(const TextEditor::FontSettings &);
void updateVariable(const QString &variable);
private:
static TextEditorPlugin *m_instance;
......
......@@ -35,7 +35,7 @@ static const char * const TEST_XML2 =
" <category xml:lang=\"de\">Text</category>"
" <executable output=\"replaceselection\">"
" <path>sort</path>"
" <arguments>%{CurrentSelectionFilePath}</arguments>"
" <input>%{CurrentSelection}</input>"
" <workingdirectory>%{CurrentPath}</workingdirectory>"
" </executable>"
"</externaltool>";
......@@ -99,6 +99,7 @@ void ExternaltoolTest::testRead1()
QCOMPARE(tool->executables().at(0), QString::fromLatin1("%{QT_INSTALL_BINS}/lupdate"));
QCOMPARE(tool->executables().at(1), QString::fromLatin1("lupdate"));
QCOMPARE(tool->arguments(), QString::fromLatin1("%{CurrentProjectFilePath}"));
QCOMPARE(tool->input(), QString());
QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentProjectPath}"));
QCOMPARE(tool->outputHandling(), ExternalTool::ShowInPane);
QCOMPARE(tool->errorHandling(), ExternalTool::Ignore);
......@@ -118,7 +119,8 @@ void ExternaltoolTest::testRead2()
QCOMPARE(tool->order(), -1);
QCOMPARE(tool->executables().size(), 1);
QCOMPARE(tool->executables().at(0), QString::fromLatin1("sort"));
QCOMPARE(tool->arguments(), QString::fromLatin1("%{CurrentSelectionFilePath}"));
QCOMPARE(tool->arguments(), QString());
QCOMPARE(tool->input(), QString::fromLatin1("%{CurrentSelection}"));
QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentPath}"));
QCOMPARE(tool->outputHandling(), ExternalTool::ReplaceSelection);
QCOMPARE(tool->errorHandling(), ExternalTool::ShowInPane);
......@@ -139,6 +141,7 @@ void ExternaltoolTest::testRead3()
QCOMPARE(tool->executables().size(), 1);
QCOMPARE(tool->executables().at(0), QString::fromLatin1("xterm"));
QVERIFY(tool->arguments().startsWith(QLatin1String("-geom %{")));
QCOMPARE(tool->input(), QString());
QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentPath}"));
QCOMPARE(tool->outputHandling(), ExternalTool::ReloadDocument);
QCOMPARE(tool->errorHandling(), ExternalTool::ShowInPane);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment