OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qt4projectmanager / qt-s60 / qt4symbiantargetfactory.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 (info@qt.nokia.com)
8 **
9 **
10 ** GNU Lesser General Public License Usage
11 **
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 **
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 **
23 ** Other Usage
24 **
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **************************************************************************/
32
33 #include "qt4symbiantargetfactory.h"
34 #include "qt4projectmanagerconstants.h"
35 #include "qt4project.h"
36 #include "buildconfigurationinfo.h"
37
38 #include "qt-s60/s60deployconfiguration.h"
39 #include "qt-s60/s60devicerunconfiguration.h"
40 #include "qt-s60/s60emulatorrunconfiguration.h"
41 #include "qt-s60/s60createpackagestep.h"
42 #include "qt-s60/s60deploystep.h"
43 #include "qt-s60/qt4symbiantarget.h"
44
45 #include <projectexplorer/projectexplorerconstants.h>
46 #include <projectexplorer/customexecutablerunconfiguration.h>
47 #include <projectexplorer/toolchainmanager.h>
48
49 using ProjectExplorer::idFromMap;
50 using ProjectExplorer::Task;
51 using namespace Qt4ProjectManager;
52 using namespace Qt4ProjectManager::Internal;
53
54 // -------------------------------------------------------------------------
55 // Qt4SymbianTargetFactory
56 // -------------------------------------------------------------------------
57
58 Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) :
59     Qt4BaseTargetFactory(parent)
60 {
61     connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
62             this, SIGNAL(supportedTargetIdsChanged()));
63 }
64
65 Qt4SymbianTargetFactory::~Qt4SymbianTargetFactory()
66 {
67 }
68
69 bool Qt4SymbianTargetFactory::supportsTargetId(const QString &id) const
70 {
71     return id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)
72             || id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
73 }
74
75 QStringList Qt4SymbianTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
76 {
77     if (parent && !qobject_cast<Qt4Project *>(parent))
78         return QStringList();
79
80     QStringList ids;
81     if (QtVersionManager::instance()->supportsTargetId(Constants::S60_DEVICE_TARGET_ID))
82         ids << QLatin1String(Constants::S60_DEVICE_TARGET_ID);
83     if (QtVersionManager::instance()->supportsTargetId(Constants::S60_EMULATOR_TARGET_ID))
84         ids << QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
85
86     return ids;
87 }
88
89 QString Qt4SymbianTargetFactory::displayNameForId(const QString &id) const
90 {
91     return Qt4SymbianTarget::defaultDisplayName(id);
92 }
93
94 QIcon Qt4SymbianTargetFactory::iconForId(const QString &id) const
95 {
96     if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
97         return QIcon(":/projectexplorer/images/SymbianEmulator.png");
98     if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
99         return QIcon(":/projectexplorer/images/SymbianDevice.png");
100     return QIcon();
101 }
102
103 bool Qt4SymbianTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
104 {
105     if (!qobject_cast<Qt4Project *>(parent))
106         return false;
107     return supportsTargetId(id);
108 }
109
110 bool Qt4SymbianTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
111 {
112     return canCreate(parent, idFromMap(map));
113 }
114
115 ProjectExplorer::Target *Qt4SymbianTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
116 {
117     if (!canRestore(parent, map))
118         return 0;
119
120     Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
121     Qt4SymbianTarget *target = new Qt4SymbianTarget(qt4project, idFromMap(map));
122
123     if (target->fromMap(map))
124         return target;
125     delete target;
126     return 0;
127 }
128
129 QString Qt4SymbianTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
130 {
131     Q_UNUSED(projectLocation);
132     Q_UNUSED(id);
133     // should not be called from anywhere, since we override Qt4BaseTarget::defaultBuldDirectory()
134     return QString();
135 }
136
137 QList<ProjectExplorer::Task> Qt4SymbianTargetFactory::reportIssues(const QString &proFile)
138 {
139     QList<ProjectExplorer::Task> results;
140     // Warn of strange characters in project name and path:
141     const QString projectName = proFile.mid(proFile.lastIndexOf(QLatin1Char('/')) + 1);
142     QString projectPath = proFile.left(proFile.lastIndexOf(QLatin1Char('/')));
143 #if defined (Q_OS_WIN)
144     if (projectPath.at(1) == QChar(':') && projectPath.at(0).toUpper() >= QChar('A') && projectPath.at(0).toUpper() <= QChar('Z'))
145         projectPath = projectPath.mid(2);
146 #endif
147     if (projectPath.contains(QLatin1Char(' '))) {
148         results.append(Task(Task::Warning,
149                             QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker",
150                                                         "The Symbian tool chain does not handle spaces "
151                                                         "in the project path '%1'.").arg(projectPath),
152                             QString(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
153     }
154     if (projectName.contains(QRegExp("[^a-zA-Z0-9.-]"))) {
155         results.append(Task(Task::Warning,
156                             QCoreApplication::translate("ProjectExplorer::Internal::S60ProjectChecker",
157                                                         "The Symbian tool chain does not handle special "
158                                                         "characters in the project name '%1' well.")
159                             .arg(projectName),
160                             QString(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
161     }
162     return results;
163 }
164
165 QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion)
166 {
167     QList<BuildConfigurationInfo> infos;
168     QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion);
169
170     foreach (QtVersion *version, knownVersions) {
171         if (!version->isValid() || !version->toolChainAvailable())
172             continue;
173
174         bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
175         QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
176         QString dir = QFileInfo(proFilePath).absolutePath(), id;
177         if (id == Constants::S60_EMULATOR_TARGET_ID) {
178             infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
179         } else {
180             infos.append(BuildConfigurationInfo(version, config, QString(), dir));
181             infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir));
182         }
183     }
184
185     return infos;
186 }
187
188 bool Qt4SymbianTargetFactory::isMobileTarget(const QString &id)
189 {
190     Q_UNUSED(id)
191     return true;
192 }
193
194 bool Qt4SymbianTargetFactory::supportsShadowBuilds(const QString &id)
195 {
196     Q_UNUSED(id);
197     return false;
198 }
199
200 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
201 {
202     if (!canCreate(parent, id))
203         return 0;
204
205     QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
206     if (knownVersions.isEmpty())
207         return 0;
208
209     QtVersion *qtVersion = knownVersions.first();
210     QtVersion::QmakeBuildConfigs config = qtVersion->defaultBuildConfig();
211
212     QList<BuildConfigurationInfo> infos;
213     if (id != Constants::S60_EMULATOR_TARGET_ID) {
214         infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
215         infos.append(BuildConfigurationInfo(qtVersion, config ^ QtVersion::DebugBuild, QString(), QString()));
216     } else {
217         if(config & QtVersion::DebugBuild)
218             infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
219         else
220             infos.append(BuildConfigurationInfo(qtVersion, config ^ QtVersion::DebugBuild, QString(), QString()));
221     }
222
223     return create(parent, id, infos);
224 }
225
226 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos)
227 {
228     if (!canCreate(parent, id))
229         return 0;
230     Qt4SymbianTarget *t = new Qt4SymbianTarget(static_cast<Qt4Project *>(parent), id);
231     foreach (const BuildConfigurationInfo &info, infos)
232         t->addQt4BuildConfiguration(msgBuildConfigurationName(info),
233                                     info.version, info.buildConfig,
234                                     info.additionalArguments, info.directory);
235
236     t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID)));
237
238     t->createApplicationProFiles();
239
240     if (t->runConfigurations().isEmpty())
241         t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
242     return t;
243 }
244
245 ProjectExplorer::Target *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget)
246 {
247     if (!widget->isTargetSelected())
248         return 0;
249     Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget);
250     return create(parent, id, w->buildConfigurationInfos());
251 }