OSDN Git Service

55eea5895dfc2b353b73cf9e266999ff09929199
[qt-creator-jp/qt-creator-jp.git] / src / plugins / projectexplorer / processstep.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
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
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
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.
24 **
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.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #include "processstep.h"
35 #include "buildstep.h"
36 #include "project.h"
37 #include "buildconfiguration.h"
38 #include "projectexplorerconstants.h"
39
40 #include <coreplugin/ifile.h>
41 #include <utils/qtcprocess.h>
42 #include <utils/qtcassert.h>
43
44 #include <QtCore/QDebug>
45 #include <QtGui/QFileDialog>
46
47 using namespace ProjectExplorer;
48 using namespace ProjectExplorer::Internal;
49
50 namespace {
51 const char * const PROCESS_STEP_ID("ProjectExplorer.ProcessStep");
52
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");
57 }
58
59 ProcessStep::ProcessStep(BuildStepList *bsl) :
60     AbstractProcessStep(bsl, QLatin1String(PROCESS_STEP_ID))
61 {
62     ctor();
63 }
64
65 ProcessStep::ProcessStep(BuildStepList *bsl, const QString &id) :
66     AbstractProcessStep(bsl, id)
67 {
68     ctor();
69 }
70
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),
76     m_env(bs->m_env),
77     m_enabled(bs->m_enabled)
78 {
79     ctor();
80 }
81
82 void ProcessStep::ctor()
83 {
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);
88 }
89
90 ProcessStep::~ProcessStep()
91 {
92 }
93
94 bool ProcessStep::init()
95 {
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();
106 }
107
108 void ProcessStep::run(QFutureInterface<bool> & fi)
109 {
110     return AbstractProcessStep::run(fi);
111 }
112
113 BuildStepConfigWidget *ProcessStep::createConfigWidget()
114 {
115     return new ProcessStepConfigWidget(this);
116 }
117
118 bool ProcessStep::immutable() const
119 {
120     return false;
121 }
122
123 QString ProcessStep::command() const
124 {
125     return m_command;
126 }
127
128 QString ProcessStep::arguments() const
129 {
130     return m_arguments;
131 }
132
133 bool ProcessStep::enabled() const
134 {
135     return m_enabled;
136 }
137
138 QString ProcessStep::workingDirectory() const
139 {
140     return m_workingDirectory;
141 }
142
143 void ProcessStep::setCommand(const QString &command)
144 {
145     m_command = command;
146 }
147
148 void ProcessStep::setArguments(const QString &arguments)
149 {
150     m_arguments = arguments;
151 }
152
153 void ProcessStep::setEnabled(bool enabled)
154 {
155     m_enabled = enabled;
156 }
157
158 void ProcessStep::setWorkingDirectory(const QString &workingDirectory)
159 {
160     if (workingDirectory.isEmpty())
161         m_workingDirectory = QLatin1String(ProjectExplorer::Constants::DEFAULT_WORKING_DIR);
162     else
163         m_workingDirectory = workingDirectory;
164 }
165
166 QVariantMap ProcessStep::toMap() const
167 {
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());
173
174     return map;
175 }
176
177 bool ProcessStep::fromMap(const QVariantMap &map)
178 {
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);
184 }
185
186 //*******
187 // ProcessStepFactory
188 //*******
189
190 ProcessStepFactory::ProcessStepFactory()
191 {
192 }
193
194 ProcessStepFactory::~ProcessStepFactory()
195 {
196 }
197
198 bool ProcessStepFactory::canCreate(BuildStepList *parent, const QString &id) const
199 {
200     Q_UNUSED(parent);
201     return id == QLatin1String(PROCESS_STEP_ID);
202 }
203
204 BuildStep *ProcessStepFactory::create(BuildStepList *parent, const QString &id)
205 {
206     if (!canCreate(parent, id))
207         return 0;
208     return new ProcessStep(parent);
209 }
210
211 bool ProcessStepFactory::canClone(BuildStepList *parent, BuildStep *bs) const
212 {
213     return canCreate(parent, bs->id());
214 }
215
216 BuildStep *ProcessStepFactory::clone(BuildStepList *parent, BuildStep *bs)
217 {
218     if (!canClone(parent, bs))
219         return 0;
220     return new ProcessStep(parent, static_cast<ProcessStep *>(bs));
221 }
222
223 bool ProcessStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
224 {
225     QString id(ProjectExplorer::idFromMap(map));
226     return canCreate(parent, id);
227 }
228
229 BuildStep *ProcessStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
230 {
231     if (!canRestore(parent, map))
232         return 0;
233
234     ProcessStep *bs(new ProcessStep(parent));
235     if (bs->fromMap(map))
236         return bs;
237     delete bs;
238     return 0;
239 }
240
241 QStringList ProcessStepFactory::availableCreationIds(BuildStepList *parent) const
242 {
243     Q_UNUSED(parent);
244     return QStringList() << QLatin1String(PROCESS_STEP_ID);
245 }
246 QString ProcessStepFactory::displayNameForId(const QString &id) const
247 {
248     if (id == QLatin1String(PROCESS_STEP_ID))
249         return ProcessStep::tr("Custom Process Step", "item in combobox");
250     return QString();
251 }
252
253 //*******
254 // ProcessStepConfigWidget
255 //*******
256
257 ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step)
258         : m_step(step)
259 {
260     m_ui.setupUi(this);
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()));
266
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)));
271 }
272
273 void ProcessStepConfigWidget::updateDetails()
274 {
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);
288     }
289     emit updateSummary();
290 }
291
292 QString ProcessStepConfigWidget::displayName() const
293 {
294     return m_step->displayName();
295 }
296
297 void ProcessStepConfigWidget::init()
298 {
299     m_ui.command->setEnvironment(m_step->buildConfiguration()->environment());
300     m_ui.command->setPath(m_step->command());
301
302     m_ui.workingDirectory->setEnvironment(m_step->buildConfiguration()->environment());
303     m_ui.workingDirectory->setPath(m_step->workingDirectory());
304
305     m_ui.commandArgumentsLineEdit->setText(m_step->arguments());
306     m_ui.enabledCheckBox->setChecked(m_step->enabled());
307
308     updateDetails();
309 }
310
311 QString ProcessStepConfigWidget::summaryText() const
312 {
313     return m_summaryText;
314 }
315
316 void ProcessStepConfigWidget::commandLineEditTextEdited()
317 {
318     m_step->setCommand(m_ui.command->rawPath());
319     updateDetails();
320 }
321
322 void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited()
323 {
324     m_step->setWorkingDirectory(m_ui.workingDirectory->rawPath());
325 }
326
327 void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited()
328 {
329     m_step->setArguments(m_ui.commandArgumentsLineEdit->text());
330     updateDetails();
331 }
332
333 void ProcessStepConfigWidget::enabledCheckBoxClicked(bool)
334 {
335     m_step->setEnabled(m_ui.enabledCheckBox->isChecked());
336     updateDetails();
337 }