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 "qt4desktoptargetfactory.h"
35 #include "buildconfigurationinfo.h"
36 #include "qt4projectmanagerconstants.h"
37 #include "qt4project.h"
38 #include "qt4runconfiguration.h"
39 #include "qt4desktoptarget.h"
41 #include <projectexplorer/deployconfiguration.h>
42 #include <projectexplorer/projectexplorerconstants.h>
43 #include <projectexplorer/customexecutablerunconfiguration.h>
44 #include <projectexplorer/projectexplorerconstants.h>
46 #include <QtGui/QVBoxLayout>
47 #include <QtGui/QApplication>
48 #include <QtGui/QStyle>
49 #include <QtGui/QLabel>
51 using namespace Qt4ProjectManager;
52 using namespace Qt4ProjectManager::Internal;
53 using ProjectExplorer::idFromMap;
55 Qt4DesktopTargetFactory::Qt4DesktopTargetFactory(QObject *parent) :
56 Qt4BaseTargetFactory(parent)
58 connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
59 this, SIGNAL(supportedTargetIdsChanged()));
62 Qt4DesktopTargetFactory::~Qt4DesktopTargetFactory()
66 bool Qt4DesktopTargetFactory::supportsTargetId(const QString &id) const
68 return id == QLatin1String(Constants::DESKTOP_TARGET_ID);
71 QStringList Qt4DesktopTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
73 if (parent && !qobject_cast<Qt4Project *>(parent))
75 if (!QtVersionManager::instance()->supportsTargetId(Constants::DESKTOP_TARGET_ID))
77 return QStringList() << QLatin1String(Constants::DESKTOP_TARGET_ID);
80 QString Qt4DesktopTargetFactory::displayNameForId(const QString &id) const
82 if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
83 return Qt4DesktopTarget::defaultDisplayName();
87 QIcon Qt4DesktopTargetFactory::iconForId(const QString &id) const
89 if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
90 return qApp->style()->standardIcon(QStyle::SP_ComputerIcon);
94 bool Qt4DesktopTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
96 if (!qobject_cast<Qt4Project *>(parent))
98 return supportsTargetId(id);
101 bool Qt4DesktopTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
103 return canCreate(parent, idFromMap(map));
106 ProjectExplorer::Target *Qt4DesktopTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
108 if (!canRestore(parent, map))
111 Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
112 Qt4DesktopTarget *target = new Qt4DesktopTarget(qt4project, QLatin1String("transient ID"));
114 if (target->fromMap(map))
120 QString Qt4DesktopTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
122 if (id != QLatin1String(Constants::DESKTOP_TARGET_ID))
125 // currently we can't have the build directory to be deeper than the source directory
126 // since that is broken in qmake
127 // Once qmake is fixed we can change that to have a top directory and
128 // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
129 return projectLocation + QLatin1String("-desktop");
132 QList<BuildConfigurationInfo> Qt4DesktopTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion)
134 Q_ASSERT(id == Constants::DESKTOP_TARGET_ID);
135 QList<BuildConfigurationInfo> infoList;
136 QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion);
138 foreach (QtVersion *version, knownVersions) {
139 if (!version->isValid() || !version->toolChainAvailable())
141 QtVersion::QmakeBuildConfigs config = version->defaultBuildConfig();
143 QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), id);
144 infoList.append(BuildConfigurationInfo(version, config, QString(), dir));
145 infoList.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir));
150 Qt4TargetSetupWidget *Qt4DesktopTargetFactory::createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtVersionNumber &number, bool importEnabled, QList<BuildConfigurationInfo> importInfos)
152 Qt4DefaultTargetSetupWidget *widget
153 = static_cast<Qt4DefaultTargetSetupWidget *>(
154 Qt4BaseTargetFactory::createTargetSetupWidget(id, proFilePath,
155 number, importEnabled,
158 widget->setShadowBuildCheckBoxVisible(true);
162 ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
164 if (!canCreate(parent, id))
167 QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
168 if (knownVersions.isEmpty())
171 QtVersion *qtVersion = knownVersions.first();
172 QtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig();
174 QList<BuildConfigurationInfo> infos;
175 infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
176 infos.append(BuildConfigurationInfo(qtVersion, config ^ QtVersion::DebugBuild, QString(), QString()));
178 return create(parent, id, infos);
181 bool Qt4DesktopTargetFactory::isMobileTarget(const QString &id)
187 bool Qt4DesktopTargetFactory::supportsShadowBuilds(const QString &id)
193 ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos)
195 if (!canCreate(parent, id))
199 Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), id);
201 foreach (const BuildConfigurationInfo &info, infos)
202 t->addQt4BuildConfiguration(msgBuildConfigurationName(info),
203 info.version, info.buildConfig,
204 info.additionalArguments, info.directory);
206 t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
208 t->createApplicationProFiles();
210 if (t->runConfigurations().isEmpty())
211 t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));