OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qt4projectmanager / wizards / abstractmobileappwizard.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 "abstractmobileappwizard.h"
34
35 #include "abstractmobileapp.h"
36 #include "mobileappwizardpages.h"
37 #include "targetsetuppage.h"
38
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>
46
47 #include <QtGui/QIcon>
48
49 namespace Qt4ProjectManager {
50
51 AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, const QtVersionNumber &minimumQtVersionNumber)
52     : ProjectExplorer::BaseProjectWizardDialog(parent)
53 {
54     m_targetsPage = new TargetSetupPage;
55     m_targetsPage->setPreferMobile(true);
56     m_targetsPage->setMinimumQtVersion(minimumQtVersionNumber);
57     resize(900, 450);
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"));
68
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);
73
74     m_targetItem->setNextShownItem(0);
75     m_genericItem->setNextShownItem(0);
76     m_symbianItem->setNextShownItem(0);
77 }
78
79 TargetSetupPage *AbstractMobileAppWizardDialog::targetsPage() const
80 {
81     return m_targetsPage;
82 }
83
84 int AbstractMobileAppWizardDialog::addPageWithTitle(QWizardPage *page, const QString &title)
85 {
86     const int pageId = addPage(page);
87     wizardProgress()->item(pageId)->setTitle(title);
88     return pageId;
89 }
90
91 int AbstractMobileAppWizardDialog::nextId() const
92 {
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));
101
102     if (currentPage() == m_targetsPage) {
103         if (symbianTargetSelected || fremantleTargetSelected)
104             return m_genericOptionsPageId;
105         else if (maemoTargetSelected)
106             return m_maemoOptionsPageId;
107         else
108             return idOfNextGenericPage();
109     } else if (currentPage() == m_genericOptionsPage) {
110         if (symbianTargetSelected)
111             return m_symbianOptionsPageId;
112         else
113             return m_maemoOptionsPageId;
114     } else if (currentPage() == m_symbianOptionsPage) {
115         if (maemoTargetSelected)
116             return m_maemoOptionsPageId;
117         else
118             return idOfNextGenericPage();
119     } else {
120         return BaseProjectWizardDialog::nextId();
121     }
122 }
123
124 void AbstractMobileAppWizardDialog::initializePage(int id)
125 {
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));
138
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();
146
147         for (int i = 0; i < order.count() - 1; i++)
148             order.at(i)->setNextShownItem(order.at(i + 1));
149     }
150     BaseProjectWizardDialog::initializePage(id);
151 }
152
153 void AbstractMobileAppWizardDialog::cleanupPage(int id)
154 {
155     if (id == m_genericOptionsPageId) {
156         m_genericItem->setNextShownItem(0);
157         m_symbianItem->setNextShownItem(0);
158     }
159     BaseProjectWizardDialog::cleanupPage(id);
160 }
161
162 int AbstractMobileAppWizardDialog::idOfNextGenericPage() const
163 {
164     return pageIds().at(pageIds().indexOf(m_maemoOptionsPageId) + 1);
165 }
166
167 Utils::WizardProgressItem *AbstractMobileAppWizardDialog::itemOfNextGenericPage() const
168 {
169     return wizardProgress()->item(idOfNextGenericPage());
170 }
171
172 AbstractMobileAppWizard::AbstractMobileAppWizard(const Core::BaseFileWizardParameters &params,
173     QObject *parent) : Core::BaseFileWizard(params, parent)
174 {
175 }
176
177 QWizard *AbstractMobileAppWizard::createWizardDialog(QWidget *parent,
178     const QString &defaultPath, const WizardPageList &extensionPages) const
179 {
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));
192     return wdlg;
193 }
194
195 Core::GeneratedFiles AbstractMobileAppWizard::generateFiles(const QWizard *wizard,
196     QString *errorMessage) const
197 {
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);
207 }
208
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)
214 {
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)
220             return uncleanFile;
221     return QString();
222 }
223
224 bool AbstractMobileAppWizard::postGenerateFiles(const QWizard *w,
225     const Core::GeneratedFiles &l, QString *errorMessage)
226 {
227     Q_UNUSED(w)
228     Q_UNUSED(l)
229     Q_UNUSED(errorMessage)
230     Qt4Manager * const manager
231         = ExtensionSystem::PluginManager::instance()->getObject<Qt4Manager>();
232     Q_ASSERT(manager);
233     Qt4Project project(manager, app()->path(AbstractMobileApp::AppPro));
234     bool success = wizardDialog()->m_targetsPage->setupProject(&project);
235     if (success) {
236         project.saveSettings();
237         success = ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage);
238         if (success) {
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);
243             }
244         }
245     }
246     return success;
247 }
248
249 void AbstractMobileAppWizard::useProjectPath(const QString &projectName,
250     const QString &projectPath)
251 {
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));
257 }
258
259 } // namespace Qt4ProjectManager