1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "processstep.h"
35 #include "buildstep.h"
37 #include "buildconfiguration.h"
38 #include "projectexplorerconstants.h"
40 #include <coreplugin/ifile.h>
41 #include <utils/qtcprocess.h>
42 #include <utils/qtcassert.h>
44 #include <QtCore/QDebug>
45 #include <QtGui/QFileDialog>
47 using namespace ProjectExplorer;
48 using namespace ProjectExplorer::Internal;
51 const char * const PROCESS_STEP_ID("ProjectExplorer.ProcessStep");
53 const char * const PROCESS_COMMAND_KEY("ProjectExplorer.ProcessStep.Command");
54 const char * const PROCESS_WORKINGDIRECTORY_KEY("ProjectExplorer.ProcessStep.WorkingDirectory");
55 const char * const PROCESS_ARGUMENTS_KEY("ProjectExplorer.ProcessStep.Arguments");
56 const char * const PROCESS_ENABLED_KEY("ProjectExplorer.ProcessStep.Enabled");
59 ProcessStep::ProcessStep(BuildStepList *bsl) :
60 AbstractProcessStep(bsl, QLatin1String(PROCESS_STEP_ID))
65 ProcessStep::ProcessStep(BuildStepList *bsl, const QString &id) :
66 AbstractProcessStep(bsl, id)
71 ProcessStep::ProcessStep(BuildStepList *bsl, ProcessStep *bs) :
72 AbstractProcessStep(bsl, bs),
73 m_command(bs->m_command),
74 m_arguments(bs->m_arguments),
75 m_workingDirectory(bs->m_workingDirectory),
77 m_enabled(bs->m_enabled)
82 void ProcessStep::ctor()
84 //: Default ProcessStep display name
85 setDefaultDisplayName(tr("Custom Process Step"));
86 if (m_workingDirectory.isEmpty())
87 m_workingDirectory = QLatin1String(ProjectExplorer::Constants::DEFAULT_WORKING_DIR);
90 ProcessStep::~ProcessStep()
94 bool ProcessStep::init()
96 BuildConfiguration *bc = buildConfiguration();
97 ProcessParameters *pp = processParameters();
98 pp->setMacroExpander(bc->macroExpander());
99 pp->setEnvironment(bc->environment());
100 pp->setWorkingDirectory(workingDirectory());
101 pp->setCommand(m_command);
102 pp->setArguments(m_arguments);
103 AbstractProcessStep::setEnabled(m_enabled);
104 setOutputParser(bc->createOutputParser());
105 return AbstractProcessStep::init();
108 void ProcessStep::run(QFutureInterface<bool> & fi)
110 return AbstractProcessStep::run(fi);
113 BuildStepConfigWidget *ProcessStep::createConfigWidget()
115 return new ProcessStepConfigWidget(this);
118 bool ProcessStep::immutable() const
123 QString ProcessStep::command() const
128 QString ProcessStep::arguments() const
133 bool ProcessStep::enabled() const
138 QString ProcessStep::workingDirectory() const
140 return m_workingDirectory;
143 void ProcessStep::setCommand(const QString &command)
148 void ProcessStep::setArguments(const QString &arguments)
150 m_arguments = arguments;
153 void ProcessStep::setEnabled(bool enabled)
158 void ProcessStep::setWorkingDirectory(const QString &workingDirectory)
160 if (workingDirectory.isEmpty())
161 m_workingDirectory = QLatin1String(ProjectExplorer::Constants::DEFAULT_WORKING_DIR);
163 m_workingDirectory = workingDirectory;
166 QVariantMap ProcessStep::toMap() const
168 QVariantMap map(AbstractProcessStep::toMap());
169 map.insert(QLatin1String(PROCESS_COMMAND_KEY), command());
170 map.insert(QLatin1String(PROCESS_ARGUMENTS_KEY), arguments());
171 map.insert(QLatin1String(PROCESS_WORKINGDIRECTORY_KEY), workingDirectory());
172 map.insert(QLatin1String(PROCESS_ENABLED_KEY), enabled());
177 bool ProcessStep::fromMap(const QVariantMap &map)
179 setCommand(map.value(QLatin1String(PROCESS_COMMAND_KEY)).toString());
180 setArguments(map.value(QLatin1String(PROCESS_ARGUMENTS_KEY)).toString());
181 setWorkingDirectory(map.value(QLatin1String(PROCESS_WORKINGDIRECTORY_KEY)).toString());
182 setEnabled(map.value(QLatin1String(PROCESS_ENABLED_KEY), false).toBool());
183 return AbstractProcessStep::fromMap(map);
187 // ProcessStepFactory
190 ProcessStepFactory::ProcessStepFactory()
194 ProcessStepFactory::~ProcessStepFactory()
198 bool ProcessStepFactory::canCreate(BuildStepList *parent, const QString &id) const
201 return id == QLatin1String(PROCESS_STEP_ID);
204 BuildStep *ProcessStepFactory::create(BuildStepList *parent, const QString &id)
206 if (!canCreate(parent, id))
208 return new ProcessStep(parent);
211 bool ProcessStepFactory::canClone(BuildStepList *parent, BuildStep *bs) const
213 return canCreate(parent, bs->id());
216 BuildStep *ProcessStepFactory::clone(BuildStepList *parent, BuildStep *bs)
218 if (!canClone(parent, bs))
220 return new ProcessStep(parent, static_cast<ProcessStep *>(bs));
223 bool ProcessStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
225 QString id(ProjectExplorer::idFromMap(map));
226 return canCreate(parent, id);
229 BuildStep *ProcessStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
231 if (!canRestore(parent, map))
234 ProcessStep *bs(new ProcessStep(parent));
235 if (bs->fromMap(map))
241 QStringList ProcessStepFactory::availableCreationIds(BuildStepList *parent) const
244 return QStringList() << QLatin1String(PROCESS_STEP_ID);
246 QString ProcessStepFactory::displayNameForId(const QString &id) const
248 if (id == QLatin1String(PROCESS_STEP_ID))
249 return ProcessStep::tr("Custom Process Step", "item in combobox");
254 // ProcessStepConfigWidget
257 ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step)
261 m_ui.command->setExpectedKind(Utils::PathChooser::Command);
262 connect(m_ui.command, SIGNAL(changed(QString)),
263 this, SLOT(commandLineEditTextEdited()));
264 connect(m_ui.workingDirectory, SIGNAL(changed(QString)),
265 this, SLOT(workingDirectoryLineEditTextEdited()));
267 connect(m_ui.commandArgumentsLineEdit, SIGNAL(textEdited(const QString&)),
268 this, SLOT(commandArgumentsLineEditTextEdited()));
269 connect(m_ui.enabledCheckBox, SIGNAL(clicked(bool)),
270 this, SLOT(enabledCheckBoxClicked(bool)));
273 void ProcessStepConfigWidget::updateDetails()
275 QString displayName = m_step->displayName();
276 if (displayName.isEmpty())
277 displayName = tr("Custom Process Step");
278 ProcessParameters param;
279 param.setMacroExpander(m_step->buildConfiguration()->macroExpander());
280 param.setEnvironment(m_step->buildConfiguration()->environment());
281 param.setWorkingDirectory(m_step->workingDirectory());
282 param.setCommand(m_step->command());
283 param.setArguments(m_step->arguments());
284 m_summaryText = param.summary(displayName);
285 if (!m_step->enabled()) {
286 //: %1 is the custom process step summary
287 m_summaryText = tr("%1 (disabled)").arg(m_summaryText);
289 emit updateSummary();
292 QString ProcessStepConfigWidget::displayName() const
294 return m_step->displayName();
297 void ProcessStepConfigWidget::init()
299 m_ui.command->setEnvironment(m_step->buildConfiguration()->environment());
300 m_ui.command->setPath(m_step->command());
302 m_ui.workingDirectory->setEnvironment(m_step->buildConfiguration()->environment());
303 m_ui.workingDirectory->setPath(m_step->workingDirectory());
305 m_ui.commandArgumentsLineEdit->setText(m_step->arguments());
306 m_ui.enabledCheckBox->setChecked(m_step->enabled());
311 QString ProcessStepConfigWidget::summaryText() const
313 return m_summaryText;
316 void ProcessStepConfigWidget::commandLineEditTextEdited()
318 m_step->setCommand(m_ui.command->rawPath());
322 void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited()
324 m_step->setWorkingDirectory(m_ui.workingDirectory->rawPath());
327 void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited()
329 m_step->setArguments(m_ui.commandArgumentsLineEdit->text());
333 void ProcessStepConfigWidget::enabledCheckBoxClicked(bool)
335 m_step->setEnabled(m_ui.enabledCheckBox->isChecked());