| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (C) 2015 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: http://www.qt.io/licensing
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and The Qt Company.  For licensing terms and | 
					
						
							|  |  |  | ** conditions see http://www.qt.io/terms-conditions.  For further information
 | 
					
						
							|  |  |  | ** use the contact form at http://www.qt.io/contact-us.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 or version 3 as published by the Free | 
					
						
							|  |  |  | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and | 
					
						
							|  |  |  | ** LICENSE.LGPLv3 included in the packaging of this file.  Please review the | 
					
						
							|  |  |  | ** following information to ensure the GNU Lesser General Public License | 
					
						
							|  |  |  | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
 | 
					
						
							|  |  |  | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, The Qt Company gives you certain additional | 
					
						
							|  |  |  | ** rights.  These rights are described in The Qt Company LGPL Exception | 
					
						
							|  |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "runconfigurationaspects.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "project.h"
 | 
					
						
							|  |  |  | #include "runconfiguration.h"
 | 
					
						
							|  |  |  | #include "environmentaspect.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <coreplugin/coreconstants.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <utils/fancylineedit.h>
 | 
					
						
							|  |  |  | #include <utils/pathchooser.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QCheckBox>
 | 
					
						
							|  |  |  | #include <QLineEdit>
 | 
					
						
							|  |  |  | #include <QDebug>
 | 
					
						
							|  |  |  | #include <QFormLayout>
 | 
					
						
							|  |  |  | #include <QLabel>
 | 
					
						
							|  |  |  | #include <QToolButton>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace Utils; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace ProjectExplorer { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \class ProjectExplorer::TerminalAspect | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  | TerminalAspect::TerminalAspect(RunConfiguration *runConfig, const QString &key, bool useTerminal, bool userSet) | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  |     : IRunConfigurationAspect(runConfig), m_useTerminal(useTerminal), | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |       m_userSet(userSet), m_checkBox(0), m_key(key) | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     setDisplayName(tr("Terminal")); | 
					
						
							|  |  |  |     setId("TerminalAspect"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | TerminalAspect *TerminalAspect::create(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new TerminalAspect(runConfig, m_key, false, false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | TerminalAspect *TerminalAspect::clone(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |     return new TerminalAspect(runConfig, m_key, m_useTerminal, m_userSet); | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TerminalAspect::addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTC_CHECK(!m_checkBox); | 
					
						
							|  |  |  |     m_checkBox = new QCheckBox(tr("Run in terminal"), parent); | 
					
						
							|  |  |  |     m_checkBox->setChecked(m_useTerminal); | 
					
						
							|  |  |  |     layout->addRow(QString(), m_checkBox); | 
					
						
							|  |  |  |     connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] { | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |         m_userSet = true; | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  |         setUseTerminal(true); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TerminalAspect::fromMap(const QVariantMap &map) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (map.contains(m_key)) { | 
					
						
							|  |  |  |         m_useTerminal = map.value(m_key).toBool(); | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |         m_userSet = true; | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |         m_userSet = false; | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TerminalAspect::toMap(QVariantMap &data) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-12 12:29:09 +02:00
										 |  |  |     if (m_userSet) | 
					
						
							| 
									
										
										
										
											2015-04-29 11:57:43 +02:00
										 |  |  |         data.insert(m_key, m_useTerminal); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool TerminalAspect::useTerminal() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_useTerminal; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TerminalAspect::setUseTerminal(bool useTerminal) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_useTerminal != useTerminal) { | 
					
						
							|  |  |  |         m_useTerminal = useTerminal; | 
					
						
							|  |  |  |         emit useTerminalChanged(useTerminal); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:26:58 +02:00
										 |  |  | ApplicationLauncher::Mode TerminalAspect::runMode() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_useTerminal ? ApplicationLauncher::Console : ApplicationLauncher::Gui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TerminalAspect::setRunMode(ApplicationLauncher::Mode runMode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setUseTerminal(runMode == ApplicationLauncher::Console); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |     \class ProjectExplorer::WorkingDirectoryAspect | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WorkingDirectoryAspect::WorkingDirectoryAspect(RunConfiguration *runConfig, const QString &key, const QString &dir) | 
					
						
							|  |  |  |     : IRunConfigurationAspect(runConfig), m_workingDirectory(dir), m_chooser(0), m_key(key) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setDisplayName(tr("Working Directory")); | 
					
						
							|  |  |  |     setId("WorkingDirectoryAspect"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | WorkingDirectoryAspect *WorkingDirectoryAspect::create(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new WorkingDirectoryAspect(runConfig, m_key); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | WorkingDirectoryAspect *WorkingDirectoryAspect::clone(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new WorkingDirectoryAspect(runConfig, m_key, m_workingDirectory); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WorkingDirectoryAspect::addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTC_CHECK(!m_chooser); | 
					
						
							|  |  |  |     m_chooser = new PathChooser(parent); | 
					
						
							|  |  |  |     m_chooser->setHistoryCompleter(m_key); | 
					
						
							|  |  |  |     m_chooser->setExpectedKind(Utils::PathChooser::Directory); | 
					
						
							|  |  |  |     m_chooser->setPromptDialogTitle(tr("Select Working Directory")); | 
					
						
							|  |  |  |     connect(m_chooser, &PathChooser::pathChanged, this, &WorkingDirectoryAspect::setWorkingDirectory); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto resetButton = new QToolButton(parent); | 
					
						
							|  |  |  |     resetButton->setToolTip(tr("Reset to default")); | 
					
						
							|  |  |  |     resetButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_RESET))); | 
					
						
							|  |  |  |     connect(resetButton, &QAbstractButton::clicked, this, [this] { m_chooser->setPath(QString()); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (auto envAspect = runConfiguration()->extraAspect<EnvironmentAspect>()) { | 
					
						
							|  |  |  |         connect(envAspect, &EnvironmentAspect::environmentChanged, this, [this, envAspect] { | 
					
						
							|  |  |  |             m_chooser->setEnvironment(envAspect->environment()); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         m_chooser->setEnvironment(envAspect->environment()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto hbox = new QHBoxLayout; | 
					
						
							|  |  |  |     hbox->addWidget(m_chooser); | 
					
						
							|  |  |  |     hbox->addWidget(resetButton); | 
					
						
							|  |  |  |     layout->addRow(tr("Working directory:"), hbox); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WorkingDirectoryAspect::fromMap(const QVariantMap &map) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_workingDirectory = map.value(m_key).toBool(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WorkingDirectoryAspect::toMap(QVariantMap &data) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     data.insert(m_key, m_workingDirectory); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString WorkingDirectoryAspect::workingDirectory() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return runConfiguration()->macroExpander()->expandProcessArgs(m_workingDirectory); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString WorkingDirectoryAspect::unexpandedWorkingDirectory() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_workingDirectory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WorkingDirectoryAspect::setWorkingDirectory(const QString &workingDirectory) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_workingDirectory = workingDirectory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     \class ProjectExplorer::ArgumentsAspect | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ArgumentsAspect::ArgumentsAspect(RunConfiguration *runConfig, const QString &key, const QString &arguments) | 
					
						
							|  |  |  |     : IRunConfigurationAspect(runConfig), m_arguments(arguments), m_chooser(0), m_key(key) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setDisplayName(tr("Arguments")); | 
					
						
							|  |  |  |     setId("ArgumentsAspect"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ArgumentsAspect::arguments() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return runConfiguration()->macroExpander()->expandProcessArgs(m_arguments); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ArgumentsAspect::unexpandedArguments() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_arguments; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ArgumentsAspect::setArguments(const QString &arguments) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_arguments = arguments; | 
					
						
							|  |  |  |     if (m_chooser) | 
					
						
							|  |  |  |         m_chooser->setText(m_arguments); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ArgumentsAspect::fromMap(const QVariantMap &map) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-06 13:00:15 +10:00
										 |  |  |     m_arguments = map.value(m_key).toString(); | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ArgumentsAspect::toMap(QVariantMap &map) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     map.insert(m_key, m_arguments); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | ArgumentsAspect *ArgumentsAspect::create(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new ArgumentsAspect(runConfig, m_key); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | ArgumentsAspect *ArgumentsAspect::clone(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new ArgumentsAspect(runConfig, m_key, m_arguments); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ArgumentsAspect::addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTC_CHECK(!m_chooser); | 
					
						
							|  |  |  |     m_chooser = new FancyLineEdit(parent); | 
					
						
							|  |  |  |     m_chooser->setHistoryCompleter(m_key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connect(m_chooser, &QLineEdit::textChanged, this, &ArgumentsAspect::setArguments); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     layout->addRow(tr("Command line arguments:"), m_chooser); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     \class ProjectExplorer::ExecutableAspect | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ExecutableAspect::ExecutableAspect(RunConfiguration *runConfig, const QString &key, const QString &executable) | 
					
						
							|  |  |  |     : IRunConfigurationAspect(runConfig), m_executable(executable), m_chooser(0), m_key(key) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setDisplayName(tr("Executable")); | 
					
						
							|  |  |  |     setId("ExecutableAspect"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ExecutableAspect::executable() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return runConfiguration()->macroExpander()->expandProcessArgs(m_executable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString ExecutableAspect::unexpandedExecutable() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_executable; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ExecutableAspect::setExectuable(const QString &executable) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_executable = executable; | 
					
						
							|  |  |  |     if (m_chooser) | 
					
						
							|  |  |  |         m_chooser->setText(m_executable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ExecutableAspect::fromMap(const QVariantMap &map) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_executable = map.value(m_key).toBool(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ExecutableAspect::toMap(QVariantMap &map) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     map.insert(m_key, m_executable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | ExecutableAspect *ExecutableAspect::create(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new ExecutableAspect(runConfig, m_key); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 15:13:35 +02:00
										 |  |  | ExecutableAspect *ExecutableAspect::clone(RunConfiguration *runConfig) const | 
					
						
							| 
									
										
										
										
											2015-04-29 09:07:05 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return new ExecutableAspect(runConfig, m_key, m_executable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ExecutableAspect::addToMainConfigurationWidget(QWidget *parent, QFormLayout *layout) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTC_CHECK(!m_chooser); | 
					
						
							|  |  |  |     m_chooser = new FancyLineEdit(parent); | 
					
						
							|  |  |  |     m_chooser->setHistoryCompleter(m_key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     connect(m_chooser, &QLineEdit::textChanged, this, &ExecutableAspect::setExectuable); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     layout->addRow(tr("Command line arguments:"), m_chooser); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace ProjectExplorer
 |