1
|
1 /****************************************************************************
|
|
2 **
|
|
3 ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
|
|
4 ** Contact: Qt Software Information (qt-info@nokia.com)
|
|
5 **
|
|
6 ** This file is part of the tools applications of the Qt Toolkit.
|
|
7 **
|
|
8 ** Commercial Usage
|
|
9 ** Licensees holding valid Qt Commercial licenses may use this file in
|
|
10 ** accordance with the Qt Commercial License Agreement provided with the
|
|
11 ** Software or, alternatively, in accordance with the terms contained in
|
|
12 ** a written agreement between you and Nokia.
|
|
13 **
|
|
14 **
|
|
15 ** GNU General Public License Usage
|
|
16 ** Alternatively, this file may be used under the terms of the GNU
|
|
17 ** General Public License versions 2.0 or 3.0 as published by the Free
|
|
18 ** Software Foundation and appearing in the file LICENSE.GPL included in
|
|
19 ** the packaging of this file. Please review the following information
|
|
20 ** to ensure GNU General Public Licensing requirements will be met:
|
|
21 ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
|
22 ** http://www.gnu.org/copyleft/gpl.html. In addition, as a special
|
|
23 ** exception, Nokia gives you certain additional rights. These rights
|
|
24 ** are described in the Nokia Qt GPL Exception version 1.3, included in
|
|
25 ** the file GPL_EXCEPTION.txt in this package.
|
|
26 **
|
|
27 ** Qt for Windows(R) Licensees
|
|
28 ** As a special exception, Nokia, as the sole copyright holder for Qt
|
|
29 ** Designer, grants users of the Qt/Eclipse Integration plug-in the
|
|
30 ** right for the Qt/Eclipse Integration to link to functionality
|
|
31 ** provided by Qt Designer and its related libraries.
|
|
32 **
|
|
33 ** If you are unsure which license is appropriate for your use, please
|
|
34 ** contact the sales department at qt-sales@nokia.com.
|
|
35 **
|
|
36 ****************************************************************************/
|
|
37
|
|
38 #include "uic.h"
|
|
39 #include "ui4.h"
|
|
40 #include "driver.h"
|
|
41 #include "option.h"
|
|
42 #include "treewalker.h"
|
|
43 #include "validator.h"
|
|
44
|
|
45 #ifdef QT_UIC_D_GENERATOR
|
|
46 #include "dwriteincludes.h"
|
|
47 #include "dwritedeclaration.h"
|
|
48 #endif
|
|
49
|
|
50 #ifdef QT_UIC_JAVA_GENERATOR
|
|
51 #include "javawriteincludes.h"
|
|
52 #include "javawritedeclaration.h"
|
|
53 #endif
|
|
54
|
|
55 #include <QtXml/QDomDocument>
|
|
56 #include <QtCore/QFileInfo>
|
|
57 #include <QtCore/QRegExp>
|
|
58 #include <QtCore/QTextStream>
|
|
59 #include <QtCore/QDateTime>
|
|
60
|
|
61 #if defined Q_WS_WIN
|
|
62 #include <qt_windows.h>
|
|
63 #endif
|
|
64
|
|
65 QT_BEGIN_NAMESPACE
|
|
66
|
|
67 Uic::Uic(Driver *d)
|
|
68 : drv(d),
|
|
69 out(d->output()),
|
|
70 opt(d->option()),
|
|
71 info(d),
|
|
72 externalPix(true)
|
|
73 {
|
|
74 }
|
|
75
|
|
76 Uic::~Uic()
|
|
77 {
|
|
78 }
|
|
79
|
|
80 bool Uic::printDependencies()
|
|
81 {
|
|
82 QString fileName = opt.inputFile;
|
|
83
|
|
84 QFile f;
|
|
85 if (fileName.isEmpty())
|
|
86 f.open(stdin, QIODevice::ReadOnly);
|
|
87 else {
|
|
88 f.setFileName(fileName);
|
|
89 if (!f.open(QIODevice::ReadOnly))
|
|
90 return false;
|
|
91 }
|
|
92
|
|
93 QDomDocument doc; // ### generalize. share more code with the other tools!
|
|
94 if (!doc.setContent(&f))
|
|
95 return false;
|
|
96
|
|
97 QDomElement root = doc.firstChildElement();
|
|
98 DomUI *ui = new DomUI();
|
|
99 ui->read(root);
|
|
100
|
|
101 double version = ui->attributeVersion().toDouble();
|
|
102 if (version < 4.0) {
|
|
103 delete ui;
|
|
104
|
|
105 fprintf(stderr, "uic: File generated with too old version of Qt Designer\n");
|
|
106 return false;
|
|
107 }
|
|
108
|
|
109 if (DomIncludes *includes = ui->elementIncludes()) {
|
|
110 foreach (DomInclude *incl, includes->elementInclude()) {
|
|
111 QString file = incl->text();
|
|
112 if (file.isEmpty())
|
|
113 continue;
|
|
114
|
|
115 fprintf(stdout, "%s\n", file.toLocal8Bit().constData());
|
|
116 }
|
|
117 }
|
|
118
|
|
119 if (DomCustomWidgets *customWidgets = ui->elementCustomWidgets()) {
|
|
120 foreach (DomCustomWidget *customWidget, customWidgets->elementCustomWidget()) {
|
|
121 if (DomHeader *header = customWidget->elementHeader()) {
|
|
122 QString file = header->text();
|
|
123 if (file.isEmpty())
|
|
124 continue;
|
|
125
|
|
126 fprintf(stdout, "%s\n", file.toLocal8Bit().constData());
|
|
127 }
|
|
128 }
|
|
129 }
|
|
130
|
|
131 delete ui;
|
|
132
|
|
133 return true;
|
|
134 }
|
|
135
|
|
136 void Uic::writeCopyrightHeader(DomUI *ui)
|
|
137 {
|
|
138 QString comment = ui->elementComment();
|
|
139 if (comment.size())
|
|
140 out << "/*\n" << comment << "\n*/\n\n";
|
|
141
|
|
142 out << "/********************************************************************************\n";
|
|
143 out << "** Form generated from reading ui file '" << QFileInfo(opt.inputFile).fileName() << "'\n";
|
|
144 out << "**\n";
|
|
145 out << "** Created: " << QDateTime::currentDateTime().toString() << "\n";
|
|
146 out << "** " << QString::fromLatin1("by: QtD User Interface Compiler version %1\n").arg(QLatin1String(QT_VERSION_STR));
|
|
147 out << "**\n";
|
|
148 out << "** WARNING! All changes made in this file will be lost when recompiling ui file!\n";
|
|
149 out << "********************************************************************************/\n\n";
|
|
150 }
|
|
151
|
|
152 bool Uic::write(QIODevice *in)
|
|
153 {
|
|
154 QDomDocument doc;
|
|
155 if (!doc.setContent(in))
|
|
156 return false;
|
|
157
|
|
158 if (option().generator == Option::JavaGenerator || option().generator == Option::DGenerator) {
|
|
159 // the Java generator ignores header protection
|
|
160 opt.headerProtection = false;
|
|
161 }
|
|
162
|
|
163 QDomElement root = doc.firstChildElement();
|
|
164 DomUI *ui = new DomUI();
|
|
165 ui->read(root);
|
|
166
|
|
167 double version = ui->attributeVersion().toDouble();
|
|
168 if (version < 4.0) {
|
|
169 delete ui;
|
|
170
|
|
171 fprintf(stderr, "uic: File generated with too old version of Qt Designer\n");
|
|
172 return false;
|
|
173 }
|
|
174
|
|
175 QString language = ui->attributeLanguage();
|
|
176
|
|
177
|
|
178 bool rtn = false;
|
|
179
|
|
180 if (option().generator == Option::JavaGenerator) {
|
|
181 #ifdef QT_UIC_JAVA_GENERATOR
|
|
182 if (language.toLower() != QLatin1String("jambi")) {
|
|
183 fprintf(stderr, "uic: File is not a 'jambi' form\n");
|
|
184 return false;
|
|
185 }
|
|
186 rtn = jwrite (ui);
|
|
187 #else
|
|
188 fprintf(stderr, "uic: option to generate java code not compiled in\n");
|
|
189 #endif
|
|
190 } else {
|
|
191 #ifdef QT_UIC_D_GENERATOR
|
|
192 if (!language.isEmpty() && language.toLower() != QLatin1String("d")) {
|
|
193 fprintf(stderr, "uic: File is not a 'd' ui file, language=%s\n", qPrintable(language));
|
|
194 return false;
|
|
195 }
|
|
196
|
|
197 rtn = write (ui);
|
|
198 #else
|
|
199 fprintf(stderr, "uic: option to generate d code not compiled in\n");
|
|
200 #endif
|
|
201 }
|
|
202
|
|
203 delete ui;
|
|
204
|
|
205 return rtn;
|
|
206 }
|
|
207
|
|
208 #ifdef QT_UIC_D_GENERATOR
|
|
209 bool Uic::write(DomUI *ui)
|
|
210 {
|
|
211 using namespace D;
|
|
212
|
|
213 if (!ui || !ui->elementWidget())
|
|
214 return false;
|
|
215
|
|
216 if (opt.copyrightHeader)
|
|
217 writeCopyrightHeader(ui);
|
|
218
|
|
219 if (opt.headerProtection) {
|
|
220 writeHeaderProtectionStart();
|
|
221 out << "\n";
|
|
222 }
|
|
223
|
|
224 pixFunction = ui->elementPixmapFunction();
|
|
225 if (pixFunction == QLatin1String("QPixmap::fromMimeSource"))
|
|
226 pixFunction = QLatin1String("qPixmapFromMimeSource");
|
|
227
|
|
228 externalPix = ui->elementImages() == 0;
|
|
229
|
|
230 info.acceptUI(ui);
|
|
231 cWidgetsInfo.acceptUI(ui);
|
|
232 WriteIncludes writeIncludes(this);
|
|
233 writeIncludes.acceptUI(ui);
|
|
234
|
|
235 Validator(this).acceptUI(ui);
|
|
236 WriteDeclaration(this, writeIncludes.scriptsActivated()).acceptUI(ui);
|
|
237
|
|
238 if (opt.headerProtection)
|
|
239 writeHeaderProtectionEnd();
|
|
240
|
|
241 return true;
|
|
242 }
|
|
243 #endif
|
|
244
|
|
245 #ifdef QT_UIC_JAVA_GENERATOR
|
|
246 bool Uic::jwrite(DomUI *ui)
|
|
247 {
|
|
248 using namespace Java;
|
|
249
|
|
250 if (!ui || !ui->elementWidget())
|
|
251 return false;
|
|
252
|
|
253 if (opt.copyrightHeader)
|
|
254 writeCopyrightHeader(ui);
|
|
255
|
|
256 pixFunction = ui->elementPixmapFunction();
|
|
257 if (pixFunction == QLatin1String("QPixmap::fromMimeSource"))
|
|
258 pixFunction = QLatin1String("qPixmapFromMimeSource");
|
|
259
|
|
260 externalPix = ui->elementImages() == 0;
|
|
261
|
|
262 info.acceptUI(ui);
|
|
263 cWidgetsInfo.acceptUI(ui);
|
|
264 WriteIncludes(this).acceptUI(ui);
|
|
265
|
|
266 Validator(this).acceptUI(ui);
|
|
267 WriteDeclaration(this).acceptUI(ui);
|
|
268
|
|
269 return true;
|
|
270 }
|
|
271 #endif
|
|
272
|
|
273 #ifdef QT_UIC_D_GENERATOR
|
|
274
|
|
275 void Uic::writeHeaderProtectionStart()
|
|
276 {
|
|
277 QString h = drv->headerFileName();
|
|
278 out << "#ifndef " << h << "\n"
|
|
279 << "#define " << h << "\n";
|
|
280 }
|
|
281
|
|
282 void Uic::writeHeaderProtectionEnd()
|
|
283 {
|
|
284 QString h = drv->headerFileName();
|
|
285 out << "#endif // " << h << "\n";
|
|
286 }
|
|
287 #endif
|
|
288
|
|
289 bool Uic::isMainWindow(const QString &className) const
|
|
290 {
|
|
291 return customWidgetsInfo()->extends(className, QLatin1String("Q3MainWindow"))
|
|
292 || customWidgetsInfo()->extends(className, QLatin1String("QMainWindow"));
|
|
293 }
|
|
294
|
|
295 bool Uic::isToolBar(const QString &className) const
|
|
296 {
|
|
297 return customWidgetsInfo()->extends(className, QLatin1String("Q3ToolBar"))
|
|
298 || customWidgetsInfo()->extends(className, QLatin1String("QToolBar"));
|
|
299 }
|
|
300
|
|
301 bool Uic::isButton(const QString &className) const
|
|
302 {
|
|
303 return customWidgetsInfo()->extends(className, QLatin1String("QRadioButton"))
|
|
304 || customWidgetsInfo()->extends(className, QLatin1String("QToolButton"))
|
|
305 || customWidgetsInfo()->extends(className, QLatin1String("QCheckBox"))
|
|
306 || customWidgetsInfo()->extends(className, QLatin1String("QPushButton"));
|
|
307 }
|
|
308
|
|
309 bool Uic::isContainer(const QString &className) const
|
|
310 {
|
|
311 return customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget"))
|
|
312 || customWidgetsInfo()->extends(className, QLatin1String("QToolBox"))
|
|
313 || customWidgetsInfo()->extends(className, QLatin1String("QTabWidget"))
|
|
314 || customWidgetsInfo()->extends(className, QLatin1String("QScrollArea"))
|
|
315 || customWidgetsInfo()->extends(className, QLatin1String("QMdiArea"))
|
|
316 || customWidgetsInfo()->extends(className, QLatin1String("QWizard"))
|
|
317 || customWidgetsInfo()->extends(className, QLatin1String("QDockWidget"));
|
|
318 }
|
|
319
|
|
320 bool Uic::isStatusBar(const QString &className) const
|
|
321 {
|
|
322 return customWidgetsInfo()->extends(className, QLatin1String("QStatusBar"));
|
|
323 }
|
|
324
|
|
325 bool Uic::isMenuBar(const QString &className) const
|
|
326 {
|
|
327 return customWidgetsInfo()->extends(className, QLatin1String("QMenuBar"));
|
|
328 }
|
|
329
|
|
330 bool Uic::isMenu(const QString &className) const
|
|
331 {
|
|
332 return customWidgetsInfo()->extends(className, QLatin1String("QMenu"))
|
|
333 || customWidgetsInfo()->extends(className, QLatin1String("QPopupMenu"));
|
|
334 }
|
|
335
|
|
336 QT_END_NAMESPACE
|