OSDN Git Service

5708711315e679da7c8c92ef4139eb1ca6bf3aea
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qt4projectmanager / wizards / html5app.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 (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
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
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
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.
24 **
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.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #include "html5app.h"
35
36 #include <QtCore/QDir>
37 #include <QtCore/QFile>
38 #include <QtCore/QRegExp>
39 #include <QtCore/QTextStream>
40 #include <QtCore/QCoreApplication>
41
42 #ifndef CREATORLESSTEST
43 #include <coreplugin/icore.h>
44 #endif // CREATORLESSTEST
45
46 namespace Qt4ProjectManager {
47 namespace Internal {
48
49 const QString appViewerBaseName(QLatin1String("html5applicationviewer"));
50 const QString appViewerPriFileName(appViewerBaseName + QLatin1String(".pri"));
51 const QString appViewerCppFileName(appViewerBaseName + QLatin1String(".cpp"));
52 const QString appViewerHFileName(appViewerBaseName + QLatin1String(".h"));
53 const QString appViewerOriginsSubDir(appViewerBaseName + QLatin1Char('/'));
54
55 Html5App::Html5App()
56     : AbstractMobileApp()
57     , m_mainHtmlMode(ModeGenerate)
58     , m_touchOptimizedNavigationEnabled(false)
59 {
60 }
61
62 Html5App::~Html5App()
63 {
64 }
65
66 void Html5App::setMainHtml(Mode mode, const QString &data)
67 {
68     Q_ASSERT(mode != ModeGenerate || data.isEmpty());
69     m_mainHtmlMode = mode;
70     m_mainHtmlData = data;
71 }
72
73 Html5App::Mode Html5App::mainHtmlMode() const
74 {
75     return m_mainHtmlMode;
76 }
77
78 void Html5App::setTouchOptimizedNavigationEnabled(bool enabled)
79 {
80     m_touchOptimizedNavigationEnabled = enabled;
81 }
82
83 bool Html5App::touchOptimizedNavigationEnabled() const
84 {
85     return m_touchOptimizedNavigationEnabled;
86 }
87
88 QString Html5App::pathExtended(int fileType) const
89 {
90     const QString appViewerTargetSubDir = appViewerOriginsSubDir;
91     const QString indexHtml = QLatin1String("index.html");
92     const QString pathBase = outputPathBase();
93     const QDir appProFilePath(pathBase);
94     const bool generateHtml = m_mainHtmlMode == ModeGenerate;
95     const bool importHtml = m_mainHtmlMode == ModeImport;
96     const QFileInfo importedHtmlFile(m_mainHtmlData);
97     const QString htmlSubDir = importHtml ? importedHtmlFile.canonicalPath().split(QLatin1Char('/')).last() + QLatin1Char('/')
98                                           : QString::fromLatin1("html/");
99
100     switch (fileType) {
101         case MainHtml:                      return generateHtml ? pathBase + htmlSubDir + indexHtml
102                                                                 : importedHtmlFile.canonicalFilePath();
103         case MainHtmlDeployed:              return generateHtml ? QString(htmlSubDir + indexHtml)
104                                                                 : htmlSubDir + importedHtmlFile.fileName();
105         case MainHtmlOrigin:                return originsRoot() + QLatin1String("html/") + indexHtml;
106         case AppViewerPri:                  return pathBase + appViewerTargetSubDir + appViewerPriFileName;
107         case AppViewerPriOrigin:            return originsRoot() + appViewerOriginsSubDir + appViewerPriFileName;
108         case AppViewerCpp:                  return pathBase + appViewerTargetSubDir + appViewerCppFileName;
109         case AppViewerCppOrigin:            return originsRoot() + appViewerOriginsSubDir + appViewerCppFileName;
110         case AppViewerH:                    return pathBase + appViewerTargetSubDir + appViewerHFileName;
111         case AppViewerHOrigin:              return originsRoot() + appViewerOriginsSubDir + appViewerHFileName;
112         case HtmlDir:                       return pathBase + htmlSubDir;
113         case HtmlDirProFileRelative:        return generateHtml ? QString(htmlSubDir).remove(htmlSubDir.length() - 1, 1)
114                                                                 : appProFilePath.relativeFilePath(importedHtmlFile.canonicalPath());
115         default:                            qFatal("Html5App::pathExtended() needs more work");
116     }
117     return QString();
118 }
119
120 QString Html5App::originsRoot() const
121 {
122     return templatesRoot() + QLatin1String("html5app/");
123 }
124
125 QString Html5App::mainWindowClassName() const
126 {
127     return QLatin1String("Html5ApplicationViewer");
128 }
129
130 bool Html5App::adaptCurrentMainCppTemplateLine(QString &line) const
131 {
132     const QLatin1Char quote('"');
133     bool adaptLine = true;
134     if (line.contains(QLatin1String("// MAINHTMLFILE"))) {
135         if (m_mainHtmlMode != ModeUrl)
136             insertParameter(line, quote + path(MainHtmlDeployed) + quote);
137         else
138             adaptLine = false;
139     } else if (line.contains(QLatin1String("// MAINHTMLURL"))) {
140         if (m_mainHtmlMode == ModeUrl)
141             insertParameter(line, quote + m_mainHtmlData + quote);
142         else
143             adaptLine = false;
144     }
145     return adaptLine;
146 }
147
148 void Html5App::handleCurrentProFileTemplateLine(const QString &line,
149     QTextStream &proFileTemplate, QTextStream &proFile,
150     bool &commentOutNextLine) const
151 {
152     Q_UNUSED(proFileTemplate)
153     Q_UNUSED(proFile)
154     if (line.contains(QLatin1String("# TOUCH_OPTIMIZED_NAVIGATION")))
155         commentOutNextLine = !m_touchOptimizedNavigationEnabled;
156 }
157
158 #ifndef CREATORLESSTEST
159 Core::GeneratedFiles Html5App::generateFiles(QString *errorMessage) const
160 {
161     Core::GeneratedFiles files = AbstractMobileApp::generateFiles(errorMessage);
162     if (m_mainHtmlMode == ModeGenerate) {
163         files.append(file(generateFile(Html5AppGeneratedFileInfo::MainHtmlFile, errorMessage), path(MainHtml)));
164         files.last().setAttributes(Core::GeneratedFile::OpenEditorAttribute);
165     }
166
167     files.append(file(generateFile(Html5AppGeneratedFileInfo::AppViewerPriFile, errorMessage), path(AppViewerPri)));
168     files.append(file(generateFile(Html5AppGeneratedFileInfo::AppViewerCppFile, errorMessage), path(AppViewerCpp)));
169     files.append(file(generateFile(Html5AppGeneratedFileInfo::AppViewerHFile, errorMessage), path(AppViewerH)));
170
171     return files;
172 }
173 #endif // CREATORLESSTEST
174
175 QByteArray Html5App::generateFileExtended(int fileType,
176     bool *versionAndCheckSum, QString *comment, QString *errorMessage) const
177 {
178     QByteArray data;
179     switch (fileType) {
180         case Html5AppGeneratedFileInfo::MainHtmlFile:
181             data = readBlob(path(MainHtmlOrigin), errorMessage);
182             break;
183         case Html5AppGeneratedFileInfo::AppViewerPriFile:
184             data = readBlob(path(AppViewerPriOrigin), errorMessage);
185             data.append(readBlob(path(DeploymentPriOrigin), errorMessage));
186             *comment = ProFileComment;
187             *versionAndCheckSum = true;
188             break;
189         case Html5AppGeneratedFileInfo::AppViewerCppFile:
190             data = readBlob(path(AppViewerCppOrigin), errorMessage);
191             *versionAndCheckSum = true;
192             break;
193         case Html5AppGeneratedFileInfo::AppViewerHFile:
194         default:
195             data = readBlob(path(AppViewerHOrigin), errorMessage);
196             *versionAndCheckSum = true;
197             break;
198     }
199     return data;
200 }
201
202 int Html5App::stubVersionMinor() const
203 {
204     return StubVersion;
205 }
206
207 QList<AbstractGeneratedFileInfo> Html5App::updateableFiles(const QString &mainProFile) const
208 {
209     QList<AbstractGeneratedFileInfo> result;
210     static const struct {
211         int fileType;
212         QString fileName;
213     } files[] = {
214         {Html5AppGeneratedFileInfo::AppViewerPriFile, appViewerPriFileName},
215         {Html5AppGeneratedFileInfo::AppViewerHFile, appViewerHFileName},
216         {Html5AppGeneratedFileInfo::AppViewerCppFile, appViewerCppFileName}
217     };
218     const QFileInfo mainProFileInfo(mainProFile);
219     const int size = sizeof(files) / sizeof(files[0]);
220     for (int i = 0; i < size; ++i) {
221         const QString fileName = mainProFileInfo.dir().absolutePath()
222                 + QLatin1Char('/') + appViewerOriginsSubDir + files[i].fileName;
223         if (!QFile::exists(fileName))
224             continue;
225         Html5AppGeneratedFileInfo file;
226         file.fileType = files[i].fileType;
227         file.fileInfo = QFileInfo(fileName);
228         file.currentVersion = AbstractMobileApp::makeStubVersion(Html5App::StubVersion);
229         result.append(file);
230     }
231     if (result.count() != size)
232         result.clear(); // All files must be found. No wrong/partial updates, please.
233     return result;
234 }
235
236 QList<DeploymentFolder> Html5App::deploymentFolders() const
237 {
238     QList<DeploymentFolder> result;
239     if (m_mainHtmlMode != ModeUrl)
240         result.append(DeploymentFolder(path(HtmlDirProFileRelative), QLatin1String(".")));
241     return result;
242 }
243
244 const int Html5App::StubVersion = 10;
245
246 } // namespace Internal
247 } // namespace Qt4ProjectManager