OSDN Git Service

It's 2011 now.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / cmakeprojectmanager / cmakerunconfiguration.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 "cmakerunconfiguration.h"
35
36 #include "cmakebuildconfiguration.h"
37 #include "cmakeproject.h"
38 #include "cmakeprojectconstants.h"
39 #include "cmaketarget.h"
40
41 #include <coreplugin/coreconstants.h>
42 #include <projectexplorer/debugginghelper.h>
43 #include <utils/qtcassert.h>
44 #include <utils/debuggerlanguagechooser.h>
45 #include <QtGui/QFormLayout>
46 #include <QtGui/QLineEdit>
47 #include <QtGui/QGroupBox>
48 #include <QtGui/QLabel>
49 #include <QtGui/QComboBox>
50 #include <QtGui/QToolButton>
51
52 using namespace CMakeProjectManager;
53 using namespace CMakeProjectManager::Internal;
54
55 namespace {
56 const char * const CMAKE_RC_ID("CMakeProjectManager.CMakeRunConfiguration");
57 const char * const CMAKE_RC_PREFIX("CMakeProjectManager.CMakeRunConfiguration.");
58
59 const char * const USER_WORKING_DIRECTORY_KEY("CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory");
60 const char * const USE_TERMINAL_KEY("CMakeProjectManager.CMakeRunConfiguration.UseTerminal");
61 const char * const TITLE_KEY("CMakeProjectManager.CMakeRunConfiguation.Title");
62 const char * const ARGUMENTS_KEY("CMakeProjectManager.CMakeRunConfiguration.Arguments");
63 const char * const USER_ENVIRONMENT_CHANGES_KEY("CMakeProjectManager.CMakeRunConfiguration.UserEnvironmentChanges");
64 const char * const BASE_ENVIRONMENT_BASE_KEY("CMakeProjectManager.BaseEnvironmentBase");
65
66 QString buildTargetFromId(const QString &id)
67 {
68     if (!id.startsWith(QLatin1String(CMAKE_RC_PREFIX)))
69         return QString();
70     return id.mid(QString::fromLatin1(CMAKE_RC_PREFIX).length());
71 }
72
73 QString idFromBuildTarget(const QString &target)
74 {
75     return QString::fromLatin1(CMAKE_RC_PREFIX) + target;
76 }
77
78 } // namespace
79
80 CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title) :
81     ProjectExplorer::LocalApplicationRunConfiguration(parent, QString::fromLatin1(CMAKE_RC_PREFIX)),
82     m_runMode(Gui),
83     m_buildTarget(target),
84     m_workingDirectory(workingDirectory),
85     m_title(title),
86     m_baseEnvironmentBase(CMakeRunConfiguration::BuildEnvironmentBase),
87     m_enabled(true)
88 {
89     ctor();
90 }
91
92 CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source) :
93     ProjectExplorer::LocalApplicationRunConfiguration(parent, source),
94     m_runMode(source->m_runMode),
95     m_buildTarget(source->m_buildTarget),
96     m_workingDirectory(source->m_workingDirectory),
97     m_userWorkingDirectory(source->m_userWorkingDirectory),
98     m_title(source->m_title),
99     m_arguments(source->m_arguments),
100     m_userEnvironmentChanges(source->m_userEnvironmentChanges),
101     m_baseEnvironmentBase(source->m_baseEnvironmentBase),
102     m_enabled(source->m_enabled)
103 {
104     ctor();
105 }
106
107 CMakeRunConfiguration::~CMakeRunConfiguration()
108 {
109 }
110
111 void CMakeRunConfiguration::ctor()
112 {
113     setDefaultDisplayName(defaultDisplayName());
114 }
115
116 CMakeTarget *CMakeRunConfiguration::cmakeTarget() const
117 {
118     return static_cast<CMakeTarget *>(target());
119 }
120
121 CMakeBuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const
122 {
123     return cmakeTarget()->activeBuildConfiguration();
124 }
125
126 QString CMakeRunConfiguration::executable() const
127 {
128     return m_buildTarget;
129 }
130
131 ProjectExplorer::LocalApplicationRunConfiguration::RunMode CMakeRunConfiguration::runMode() const
132 {
133     return m_runMode;
134 }
135
136 QString CMakeRunConfiguration::workingDirectory() const
137 {
138     return QDir::cleanPath(environment().expandVariables(
139                 Utils::expandMacros(baseWorkingDirectory(), macroExpander())));
140 }
141
142 QString CMakeRunConfiguration::baseWorkingDirectory() const
143 {
144     if (!m_userWorkingDirectory.isEmpty())
145         return m_userWorkingDirectory;
146     return m_workingDirectory;
147 }
148
149 QString CMakeRunConfiguration::commandLineArguments() const
150 {
151     return Utils::QtcProcess::expandMacros(m_arguments, macroExpander());
152 }
153
154 QString CMakeRunConfiguration::title() const
155 {
156     return m_title;
157 }
158
159 void CMakeRunConfiguration::setExecutable(const QString &executable)
160 {
161     m_buildTarget = executable;
162 }
163
164 void CMakeRunConfiguration::setBaseWorkingDirectory(const QString &wd)
165 {
166     const QString &oldWorkingDirectory = workingDirectory();
167
168     m_workingDirectory = wd;
169
170     const QString &newWorkingDirectory = workingDirectory();
171     if (oldWorkingDirectory != newWorkingDirectory)
172         emit baseWorkingDirectoryChanged(newWorkingDirectory);
173 }
174
175 void CMakeRunConfiguration::setUserWorkingDirectory(const QString &wd)
176 {
177     const QString & oldWorkingDirectory = workingDirectory();
178
179     m_userWorkingDirectory = wd;
180
181     const QString &newWorkingDirectory = workingDirectory();
182     if (oldWorkingDirectory != newWorkingDirectory)
183         emit baseWorkingDirectoryChanged(newWorkingDirectory);
184 }
185
186 QVariantMap CMakeRunConfiguration::toMap() const
187 {
188     QVariantMap map(ProjectExplorer::LocalApplicationRunConfiguration::toMap());
189
190     map.insert(QLatin1String(USER_WORKING_DIRECTORY_KEY), m_userWorkingDirectory);
191     map.insert(QLatin1String(USE_TERMINAL_KEY), m_runMode == Console);
192     map.insert(QLatin1String(TITLE_KEY), m_title);
193     map.insert(QLatin1String(ARGUMENTS_KEY), m_arguments);
194     map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userEnvironmentChanges));
195     map.insert(QLatin1String(BASE_ENVIRONMENT_BASE_KEY), m_baseEnvironmentBase);
196
197     return map;
198 }
199
200 bool CMakeRunConfiguration::fromMap(const QVariantMap &map)
201 {
202     m_userWorkingDirectory = map.value(QLatin1String(USER_WORKING_DIRECTORY_KEY)).toString();
203     m_runMode = map.value(QLatin1String(USE_TERMINAL_KEY)).toBool() ? Console : Gui;
204     m_title = map.value(QLatin1String(TITLE_KEY)).toString();
205     m_arguments = map.value(QLatin1String(ARGUMENTS_KEY)).toString();
206     m_userEnvironmentChanges = Utils::EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
207     m_baseEnvironmentBase = static_cast<BaseEnvironmentBase>(map.value(QLatin1String(BASE_ENVIRONMENT_BASE_KEY), static_cast<int>(CMakeRunConfiguration::BuildEnvironmentBase)).toInt());
208
209     return RunConfiguration::fromMap(map);
210 }
211
212 QString CMakeRunConfiguration::defaultDisplayName() const
213 {
214     if (m_title.isEmpty())
215         return tr("Run CMake target");
216     return m_title + (m_enabled ? "" : tr(" (disabled)"));
217 }
218
219 QWidget *CMakeRunConfiguration::createConfigurationWidget()
220 {
221     return new CMakeRunConfigurationWidget(this);
222 }
223
224 void CMakeRunConfiguration::setCommandLineArguments(const QString &newText)
225 {
226     m_arguments = newText;
227 }
228
229 QString CMakeRunConfiguration::dumperLibrary() const
230 {
231     QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment());
232     QString qtInstallData = ProjectExplorer::DebuggingHelperLibrary::qtInstallDataDir(qmakePath);
233     QString dhl = ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(qtInstallData);
234     return dhl;
235 }
236
237 QStringList CMakeRunConfiguration::dumperLibraryLocations() const
238 {
239     QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment());
240     QString qtInstallData = ProjectExplorer::DebuggingHelperLibrary::qtInstallDataDir(qmakePath);
241     return ProjectExplorer::DebuggingHelperLibrary::locationsByInstallData(qtInstallData);
242 }
243
244 Utils::Environment CMakeRunConfiguration::baseEnvironment() const
245 {
246     Utils::Environment env;
247     if (m_baseEnvironmentBase == CMakeRunConfiguration::CleanEnvironmentBase) {
248         // Nothing
249     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::SystemEnvironmentBase) {
250         env = Utils::Environment::systemEnvironment();
251     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::BuildEnvironmentBase) {
252         env = activeBuildConfiguration()->environment();
253     }
254     return env;
255 }
256
257 QString CMakeRunConfiguration::baseEnvironmentText() const
258 {
259     if (m_baseEnvironmentBase == CMakeRunConfiguration::CleanEnvironmentBase) {
260         return tr("Clean Environment");
261     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::SystemEnvironmentBase) {
262         return tr("System Environment");
263     } else  if (m_baseEnvironmentBase == CMakeRunConfiguration::BuildEnvironmentBase) {
264         return tr("Build Environment");
265     }
266     return QString();
267 }
268
269 void CMakeRunConfiguration::setBaseEnvironmentBase(BaseEnvironmentBase env)
270 {
271     if (m_baseEnvironmentBase == env)
272         return;
273     m_baseEnvironmentBase = env;
274     emit baseEnvironmentChanged();
275 }
276
277 CMakeRunConfiguration::BaseEnvironmentBase CMakeRunConfiguration::baseEnvironmentBase() const
278 {
279     return m_baseEnvironmentBase;
280 }
281
282 Utils::Environment CMakeRunConfiguration::environment() const
283 {
284     Utils::Environment env = baseEnvironment();
285     env.modify(userEnvironmentChanges());
286     return env;
287 }
288
289 QList<Utils::EnvironmentItem> CMakeRunConfiguration::userEnvironmentChanges() const
290 {
291     return m_userEnvironmentChanges;
292 }
293
294 void CMakeRunConfiguration::setUserEnvironmentChanges(const QList<Utils::EnvironmentItem> &diff)
295 {
296     if (m_userEnvironmentChanges != diff) {
297         m_userEnvironmentChanges = diff;
298         emit userEnvironmentChangesChanged(diff);
299     }
300 }
301
302 ProjectExplorer::ToolChainType CMakeRunConfiguration::toolChainType() const
303 {
304     CMakeBuildConfiguration *bc = activeBuildConfiguration();
305     if (!bc)
306         return ProjectExplorer::ToolChain_UNKNOWN;
307     return bc->toolChainType();
308 }
309
310 void CMakeRunConfiguration::setEnabled(bool b)
311 {
312     if (m_enabled == b)
313         return;
314     m_enabled = b;
315     emit isEnabledChanged(isEnabled());
316     setDefaultDisplayName(defaultDisplayName());
317 }
318
319 bool CMakeRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *bc) const
320 {
321     return m_enabled && LocalApplicationRunConfiguration::isEnabled(bc);
322 }
323
324 // Configuration widget
325 CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent)
326     : QWidget(parent), m_ignoreChange(false), m_cmakeRunConfiguration(cmakeRunConfiguration)
327 {
328     QFormLayout *fl = new QFormLayout();
329     fl->setMargin(0);
330     fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
331     QLineEdit *argumentsLineEdit = new QLineEdit();
332     argumentsLineEdit->setText(cmakeRunConfiguration->commandLineArguments());
333     connect(argumentsLineEdit, SIGNAL(textChanged(QString)),
334             this, SLOT(setArguments(QString)));
335     fl->addRow(tr("Arguments:"), argumentsLineEdit);
336
337     m_workingDirectoryEdit = new Utils::PathChooser();
338     m_workingDirectoryEdit->setBaseDirectory(m_cmakeRunConfiguration->target()->project()->projectDirectory());
339     m_workingDirectoryEdit->setPath(m_cmakeRunConfiguration->baseWorkingDirectory());
340     m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::Directory);
341     m_workingDirectoryEdit->setPromptDialogTitle(tr("Select Working Directory"));
342
343     QToolButton *resetButton = new QToolButton();
344     resetButton->setToolTip(tr("Reset to default"));
345     resetButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_RESET)));
346
347     QHBoxLayout *boxlayout = new QHBoxLayout();
348     boxlayout->addWidget(m_workingDirectoryEdit);
349     boxlayout->addWidget(resetButton);
350
351     fl->addRow(tr("Working directory:"), boxlayout);
352
353     QWidget *debuggerLabelWidget = new QWidget(this);
354     QVBoxLayout *debuggerLabelLayout = new QVBoxLayout(debuggerLabelWidget);
355     debuggerLabelLayout->setMargin(0);
356     debuggerLabelLayout->setSpacing(0);
357     debuggerLabelWidget->setLayout(debuggerLabelLayout);
358     QLabel *debuggerLabel = new QLabel(tr("Debugger:"), this);
359     debuggerLabelLayout->addWidget(debuggerLabel);
360     debuggerLabelLayout->addStretch(10);
361
362     m_debuggerLanguageChooser = new Utils::DebuggerLanguageChooser(this);
363     fl->addRow(debuggerLabelWidget, m_debuggerLanguageChooser);
364
365     m_debuggerLanguageChooser->setCppChecked(m_cmakeRunConfiguration->useCppDebugger());
366     m_debuggerLanguageChooser->setQmlChecked(m_cmakeRunConfiguration->useQmlDebugger());
367     m_debuggerLanguageChooser->setQmlDebugServerPort(m_cmakeRunConfiguration->qmlDebugServerPort());
368
369     m_detailsContainer = new Utils::DetailsWidget(this);
370     m_detailsContainer->setState(Utils::DetailsWidget::NoSummary);
371
372     QWidget *m_details = new QWidget(m_detailsContainer);
373     m_detailsContainer->setWidget(m_details);
374     m_details->setLayout(fl);
375
376     QVBoxLayout *vbx = new QVBoxLayout(this);
377     vbx->setMargin(0);;
378     vbx->addWidget(m_detailsContainer);
379
380     QLabel *environmentLabel = new QLabel(this);
381     environmentLabel->setText(tr("Run Environment"));
382     QFont f = environmentLabel->font();
383     f.setBold(true);
384     f.setPointSizeF(f.pointSizeF() *1.2);
385     environmentLabel->setFont(f);
386     vbx->addWidget(environmentLabel);
387
388     QWidget *baseEnvironmentWidget = new QWidget;
389     QHBoxLayout *baseEnvironmentLayout = new QHBoxLayout(baseEnvironmentWidget);
390     baseEnvironmentLayout->setMargin(0);
391     QLabel *label = new QLabel(tr("Base environment for this runconfiguration:"), this);
392     baseEnvironmentLayout->addWidget(label);
393     m_baseEnvironmentComboBox = new QComboBox(this);
394     m_baseEnvironmentComboBox->addItems(QStringList()
395                                         << tr("Clean Environment")
396                                         << tr("System Environment")
397                                         << tr("Build Environment"));
398     m_baseEnvironmentComboBox->setCurrentIndex(m_cmakeRunConfiguration->baseEnvironmentBase());
399     connect(m_baseEnvironmentComboBox, SIGNAL(currentIndexChanged(int)),
400             this, SLOT(baseEnvironmentComboBoxChanged(int)));
401     baseEnvironmentLayout->addWidget(m_baseEnvironmentComboBox);
402     baseEnvironmentLayout->addStretch(10);
403
404     m_environmentWidget = new ProjectExplorer::EnvironmentWidget(this, baseEnvironmentWidget);
405     m_environmentWidget->setBaseEnvironment(m_cmakeRunConfiguration->baseEnvironment());
406     m_environmentWidget->setBaseEnvironmentText(m_cmakeRunConfiguration->baseEnvironmentText());
407     m_environmentWidget->setUserChanges(m_cmakeRunConfiguration->userEnvironmentChanges());
408
409     vbx->addWidget(m_environmentWidget);
410
411     connect(m_workingDirectoryEdit, SIGNAL(changed(QString)),
412             this, SLOT(setWorkingDirectory()));
413
414     connect(resetButton, SIGNAL(clicked()),
415             this, SLOT(resetWorkingDirectory()));
416
417     connect(m_debuggerLanguageChooser, SIGNAL(cppLanguageToggled(bool)),
418             this, SLOT(useCppDebuggerToggled(bool)));
419     connect(m_debuggerLanguageChooser, SIGNAL(qmlLanguageToggled(bool)),
420             this, SLOT(useQmlDebuggerToggled(bool)));
421     connect(m_debuggerLanguageChooser, SIGNAL(qmlDebugServerPortChanged(uint)),
422             this, SLOT(qmlDebugServerPortChanged(uint)));
423
424     connect(m_environmentWidget, SIGNAL(userChangesChanged()),
425             this, SLOT(userChangesChanged()));
426
427     connect(m_cmakeRunConfiguration, SIGNAL(baseWorkingDirectoryChanged(QString)),
428             this, SLOT(workingDirectoryChanged(QString)));
429     connect(m_cmakeRunConfiguration, SIGNAL(baseEnvironmentChanged()),
430             this, SLOT(baseEnvironmentChanged()));
431     connect(m_cmakeRunConfiguration, SIGNAL(userEnvironmentChangesChanged(QList<Utils::EnvironmentItem>)),
432             this, SLOT(userEnvironmentChangesChanged()));
433
434     setEnabled(m_cmakeRunConfiguration->isEnabled());
435 }
436
437 void CMakeRunConfigurationWidget::setWorkingDirectory()
438 {
439     if (m_ignoreChange)
440         return;
441     m_ignoreChange = true;
442     m_cmakeRunConfiguration->setUserWorkingDirectory(m_workingDirectoryEdit->rawPath());
443     m_ignoreChange = false;
444 }
445
446 void CMakeRunConfigurationWidget::workingDirectoryChanged(const QString &workingDirectory)
447 {
448     if (!m_ignoreChange)
449         m_workingDirectoryEdit->setPath(workingDirectory);
450 }
451
452 void CMakeRunConfigurationWidget::resetWorkingDirectory()
453 {
454     // This emits a signal connected to workingDirectoryChanged()
455     // that sets the m_workingDirectoryEdit
456     m_cmakeRunConfiguration->setUserWorkingDirectory(QString());
457 }
458
459 void CMakeRunConfigurationWidget::useCppDebuggerToggled(bool toggled)
460 {
461     m_cmakeRunConfiguration->setUseCppDebugger(toggled);
462 }
463
464 void CMakeRunConfigurationWidget::useQmlDebuggerToggled(bool toggled)
465 {
466     m_cmakeRunConfiguration->setUseQmlDebugger(toggled);
467 }
468
469 void CMakeRunConfigurationWidget::qmlDebugServerPortChanged(uint port)
470 {
471     m_cmakeRunConfiguration->setQmlDebugServerPort(port);
472 }
473
474 void CMakeRunConfigurationWidget::userChangesChanged()
475 {
476     m_cmakeRunConfiguration->setUserEnvironmentChanges(m_environmentWidget->userChanges());
477 }
478
479 void CMakeRunConfigurationWidget::baseEnvironmentComboBoxChanged(int index)
480 {
481     m_ignoreChange = true;
482     m_cmakeRunConfiguration->setBaseEnvironmentBase(CMakeRunConfiguration::BaseEnvironmentBase(index));
483
484     m_environmentWidget->setBaseEnvironment(m_cmakeRunConfiguration->baseEnvironment());
485     m_environmentWidget->setBaseEnvironmentText(m_cmakeRunConfiguration->baseEnvironmentText());
486     m_ignoreChange = false;
487 }
488
489 void CMakeRunConfigurationWidget::baseEnvironmentChanged()
490 {
491     if (m_ignoreChange)
492         return;
493
494     m_baseEnvironmentComboBox->setCurrentIndex(m_cmakeRunConfiguration->baseEnvironmentBase());
495     m_environmentWidget->setBaseEnvironment(m_cmakeRunConfiguration->baseEnvironment());
496     m_environmentWidget->setBaseEnvironmentText(m_cmakeRunConfiguration->baseEnvironmentText());
497 }
498
499 void CMakeRunConfigurationWidget::userEnvironmentChangesChanged()
500 {
501     m_environmentWidget->setUserChanges(m_cmakeRunConfiguration->userEnvironmentChanges());
502 }
503
504 void CMakeRunConfigurationWidget::setArguments(const QString &args)
505 {
506     m_cmakeRunConfiguration->setCommandLineArguments(args);
507 }
508
509 // Factory
510 CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) :
511     ProjectExplorer::IRunConfigurationFactory(parent)
512 {
513 }
514
515 CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory()
516 {
517 }
518
519 // used to show the list of possible additons to a project, returns a list of ids
520 QStringList CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
521 {
522     CMakeTarget *t(qobject_cast<CMakeTarget *>(parent));
523     if (!t)
524         return QStringList();
525     QStringList allIds;
526     foreach (const QString &buildTarget, t->cmakeProject()->buildTargetTitles())
527         allIds << idFromBuildTarget(buildTarget);
528     return allIds;
529 }
530
531 // used to translate the ids to names to display to the user
532 QString CMakeRunConfigurationFactory::displayNameForId(const QString &id) const
533 {
534     return buildTargetFromId(id);
535 }
536
537 bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
538 {
539     CMakeTarget *t(qobject_cast<CMakeTarget *>(parent));
540     if (!t)
541         return false;
542     return t->cmakeProject()->hasBuildTarget(buildTargetFromId(id));
543 }
544
545 ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
546 {
547     if (!canCreate(parent, id))
548         return 0;
549     CMakeTarget *t(static_cast<CMakeTarget *>(parent));
550
551     const QString title(buildTargetFromId(id));
552     const CMakeBuildTarget &ct = t->cmakeProject()->buildTargetForTitle(title);
553     return new CMakeRunConfiguration(t, ct.executable, ct.workingDirectory, ct.title);
554 }
555
556 bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const
557 {
558     if (!qobject_cast<CMakeTarget *>(parent))
559         return false;
560     return source->id() == QLatin1String(CMAKE_RC_ID);
561 }
562
563 ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source)
564 {
565     if (!canClone(parent, source))
566         return 0;
567     CMakeTarget *t(static_cast<CMakeTarget *>(parent));
568     CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source));
569     return new CMakeRunConfiguration(t, crc);
570 }
571
572 bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
573 {
574     if (!qobject_cast<CMakeTarget *>(parent))
575         return false;
576     QString id(ProjectExplorer::idFromMap(map));
577     return id.startsWith(QLatin1String(CMAKE_RC_ID));
578 }
579
580 ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map)
581 {
582     if (!canRestore(parent, map))
583         return 0;
584     CMakeTarget *t(static_cast<CMakeTarget *>(parent));
585     CMakeRunConfiguration *rc(new CMakeRunConfiguration(t, QString(), QString(), QString()));
586     if (rc->fromMap(map))
587         return rc;
588     delete rc;
589     return 0;
590 }