1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
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.
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.
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.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
31 **************************************************************************/
33 #include "abstractmobileappwizard.h"
35 #include "abstractmobileapp.h"
36 #include "mobileappwizardpages.h"
37 #include "targetsetuppage.h"
39 #include <extensionsystem/pluginmanager.h>
40 #include <qt4projectmanager/qt4project.h>
41 #include <qt4projectmanager/qt4projectmanager.h>
42 #include <qt4projectmanager/qt4projectmanagerconstants.h>
43 #include <projectexplorer/projectexplorer.h>
44 #include <projectexplorer/customwizard/customwizard.h>
45 #include <coreplugin/editormanager/editormanager.h>
47 #include <QtGui/QIcon>
49 namespace Qt4ProjectManager {
51 AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, const QtVersionNumber &minimumQtVersionNumber)
52 : ProjectExplorer::BaseProjectWizardDialog(parent)
54 m_targetsPage = new TargetSetupPage;
55 m_targetsPage->setPreferMobile(true);
56 m_targetsPage->setMinimumQtVersion(minimumQtVersionNumber);
58 m_targetsPageId = addPageWithTitle(m_targetsPage, tr("Qt Versions"));
59 m_genericOptionsPage = new Internal::MobileAppWizardGenericOptionsPage;
60 m_genericOptionsPageId = addPageWithTitle(m_genericOptionsPage,
61 tr("Mobile Options"));
62 m_symbianOptionsPage = new Internal::MobileAppWizardSymbianOptionsPage;
63 m_symbianOptionsPageId = addPageWithTitle(m_symbianOptionsPage,
64 QLatin1String(" ") + tr("Symbian Specific"));
65 m_maemoOptionsPage = new Internal::MobileAppWizardMaemoOptionsPage;
66 m_maemoOptionsPageId = addPageWithTitle(m_maemoOptionsPage,
67 QLatin1String(" ") + tr("Maemo Specific"));
69 m_targetItem = wizardProgress()->item(m_targetsPageId);
70 m_genericItem = wizardProgress()->item(m_genericOptionsPageId);
71 m_symbianItem = wizardProgress()->item(m_symbianOptionsPageId);
72 m_maemoItem = wizardProgress()->item(m_maemoOptionsPageId);
74 m_targetItem->setNextShownItem(0);
75 m_genericItem->setNextShownItem(0);
76 m_symbianItem->setNextShownItem(0);
79 TargetSetupPage *AbstractMobileAppWizardDialog::targetsPage() const
84 int AbstractMobileAppWizardDialog::addPageWithTitle(QWizardPage *page, const QString &title)
86 const int pageId = addPage(page);
87 wizardProgress()->item(pageId)->setTitle(title);
91 int AbstractMobileAppWizardDialog::nextId() const
93 const bool symbianTargetSelected =
94 m_targetsPage->isTargetSelected(QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
95 || m_targetsPage->isTargetSelected(QLatin1String(Constants::S60_DEVICE_TARGET_ID));
96 const bool fremantleTargetSelected
97 = m_targetsPage->isTargetSelected(QLatin1String(Constants::MAEMO5_DEVICE_TARGET_ID));
98 const bool maemoTargetSelected = fremantleTargetSelected
99 || m_targetsPage->isTargetSelected(QLatin1String(Constants::HARMATTAN_DEVICE_TARGET_ID))
100 || m_targetsPage->isTargetSelected(QLatin1String(Constants::MEEGO_DEVICE_TARGET_ID));
102 if (currentPage() == m_targetsPage) {
103 if (symbianTargetSelected || fremantleTargetSelected)
104 return m_genericOptionsPageId;
105 else if (maemoTargetSelected)
106 return m_maemoOptionsPageId;
108 return idOfNextGenericPage();
109 } else if (currentPage() == m_genericOptionsPage) {
110 if (symbianTargetSelected)
111 return m_symbianOptionsPageId;
113 return m_maemoOptionsPageId;
114 } else if (currentPage() == m_symbianOptionsPage) {
115 if (maemoTargetSelected)
116 return m_maemoOptionsPageId;
118 return idOfNextGenericPage();
120 return BaseProjectWizardDialog::nextId();
124 void AbstractMobileAppWizardDialog::initializePage(int id)
126 if (id == startId()) {
127 m_targetItem->setNextItems(QList<Utils::WizardProgressItem *>() << m_genericItem << m_maemoItem << itemOfNextGenericPage());
128 m_genericItem->setNextItems(QList<Utils::WizardProgressItem *>() << m_symbianItem << m_maemoItem);
129 m_symbianItem->setNextItems(QList<Utils::WizardProgressItem *>() << m_maemoItem << itemOfNextGenericPage());
130 } else if (id == m_genericOptionsPageId) {
131 const bool symbianTargetSelected =
132 m_targetsPage->isTargetSelected(QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
133 || m_targetsPage->isTargetSelected(QLatin1String(Constants::S60_DEVICE_TARGET_ID));
134 const bool maemoTargetSelected =
135 m_targetsPage->isTargetSelected(QLatin1String(Constants::MAEMO5_DEVICE_TARGET_ID))
136 || m_targetsPage->isTargetSelected(QLatin1String(Constants::HARMATTAN_DEVICE_TARGET_ID))
137 || m_targetsPage->isTargetSelected(QLatin1String(Constants::MEEGO_DEVICE_TARGET_ID));
139 QList<Utils::WizardProgressItem *> order;
140 order << m_genericItem;
141 if (symbianTargetSelected)
142 order << m_symbianItem;
143 if (maemoTargetSelected)
144 order << m_maemoItem;
145 order << itemOfNextGenericPage();
147 for (int i = 0; i < order.count() - 1; i++)
148 order.at(i)->setNextShownItem(order.at(i + 1));
150 BaseProjectWizardDialog::initializePage(id);
153 void AbstractMobileAppWizardDialog::cleanupPage(int id)
155 if (id == m_genericOptionsPageId) {
156 m_genericItem->setNextShownItem(0);
157 m_symbianItem->setNextShownItem(0);
159 BaseProjectWizardDialog::cleanupPage(id);
162 int AbstractMobileAppWizardDialog::idOfNextGenericPage() const
164 return pageIds().at(pageIds().indexOf(m_maemoOptionsPageId) + 1);
167 Utils::WizardProgressItem *AbstractMobileAppWizardDialog::itemOfNextGenericPage() const
169 return wizardProgress()->item(idOfNextGenericPage());
172 AbstractMobileAppWizard::AbstractMobileAppWizard(const Core::BaseFileWizardParameters ¶ms,
173 QObject *parent) : Core::BaseFileWizard(params, parent)
177 QWizard *AbstractMobileAppWizard::createWizardDialog(QWidget *parent,
178 const QString &defaultPath, const WizardPageList &extensionPages) const
180 AbstractMobileAppWizardDialog * const wdlg
181 = createWizardDialogInternal(parent);
182 wdlg->setPath(defaultPath);
183 wdlg->setProjectName(ProjectExplorer::BaseProjectWizardDialog::uniqueProjectName(defaultPath));
184 wdlg->m_genericOptionsPage->setOrientation(app()->orientation());
185 wdlg->m_symbianOptionsPage->setSvgIcon(app()->symbianSvgIcon());
186 wdlg->m_symbianOptionsPage->setNetworkEnabled(app()->networkEnabled());
187 wdlg->m_maemoOptionsPage->setPngIcon(app()->maemoPngIcon());
188 connect(wdlg, SIGNAL(projectParametersChanged(QString, QString)),
189 SLOT(useProjectPath(QString, QString)));
190 foreach (QWizardPage *p, extensionPages)
191 BaseFileWizard::applyExtensionPageShortTitle(wdlg, wdlg->addPage(p));
195 Core::GeneratedFiles AbstractMobileAppWizard::generateFiles(const QWizard *wizard,
196 QString *errorMessage) const
198 prepareGenerateFiles(wizard, errorMessage);
199 const AbstractMobileAppWizardDialog *wdlg
200 = qobject_cast<const AbstractMobileAppWizardDialog*>(wizard);
201 app()->setOrientation(wdlg->m_genericOptionsPage->orientation());
202 app()->setSymbianTargetUid(wdlg->m_symbianOptionsPage->symbianUid());
203 app()->setSymbianSvgIcon(wdlg->m_symbianOptionsPage->svgIcon());
204 app()->setNetworkEnabled(wdlg->m_symbianOptionsPage->networkEnabled());
205 app()->setMaemoPngIcon(wdlg->m_maemoOptionsPage->pngIcon());
206 return app()->generateFiles(errorMessage);
209 // TODO remove this workaround:
210 // SessionManager::projectContainsFile() incorrectly returns false if the
211 // file name in the .pro file (and thus also in m_projectFileCache)
212 // contains relative path segments ("../").
213 inline static QString fileInCurrentProject(const QString &file)
215 const QStringList filesInProject =
216 ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject()->files(
217 ProjectExplorer::Project::ExcludeGeneratedFiles);
218 foreach (const QString &uncleanFile, filesInProject)
219 if (QDir::cleanPath(uncleanFile) == file)
224 bool AbstractMobileAppWizard::postGenerateFiles(const QWizard *w,
225 const Core::GeneratedFiles &l, QString *errorMessage)
229 Q_UNUSED(errorMessage)
230 Qt4Manager * const manager
231 = ExtensionSystem::PluginManager::instance()->getObject<Qt4Manager>();
233 Qt4Project project(manager, app()->path(AbstractMobileApp::AppPro));
234 bool success = wizardDialog()->m_targetsPage->setupProject(&project);
236 project.saveSettings();
237 success = ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage);
239 const QString fileToOpen = fileInCurrentProject(fileToOpenPostGeneration());
240 if (!fileToOpen.isEmpty()) {
241 Core::EditorManager::instance()->openEditor(fileToOpen, QString(), Core::EditorManager::ModeSwitch);
242 ProjectExplorer::ProjectExplorerPlugin::instance()->setCurrentFile(0, fileToOpen);
249 void AbstractMobileAppWizard::useProjectPath(const QString &projectName,
250 const QString &projectPath)
252 wizardDialog()->m_symbianOptionsPage->setSymbianUid(app()->symbianUidForPath(projectPath + projectName));
253 app()->setProjectName(projectName);
254 app()->setProjectPath(projectPath);
255 wizardDialog()->m_targetsPage->setProFilePath(app()->path(AbstractMobileApp::AppPro));
256 projectPathChanged(app()->path(AbstractMobileApp::AppPro));
259 } // namespace Qt4ProjectManager