source: trunk/src/tools/uic3/converter.cpp@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 50.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the tools applications of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "ui3reader.h"
43#include "parser.h"
44#include "domtool.h"
45#include "ui4.h"
46#include "widgetinfo.h"
47#include "globaldefs.h"
48#include "qt3to4.h"
49#include "utils.h"
50#include "option.h"
51#include "cppextractimages.h"
52
53#include <QtDebug>
54#include <QFile>
55#include <QHash>
56#include <QPair>
57#include <QStringList>
58#include <QDateTime>
59#include <QRegExp>
60#include <QSizePolicy>
61
62#include <stdio.h>
63#include <stdlib.h>
64
65QT_BEGIN_NAMESPACE
66
67enum { warnHeaderGeneration = 0 };
68
69#define CONVERT_PROPERTY(o, n) \
70 do { \
71 if (name == QLatin1String(o) \
72 && !WidgetInfo::isValidProperty(className, (o)) \
73 && WidgetInfo::isValidProperty(className, (n))) { \
74 prop->setAttributeName((n)); \
75 } \
76 } while (0)
77
78static QString classNameForObjectName(const QDomElement &widget, const QString &objectName)
79{
80 QList<QDomElement> widgetStack;
81 widgetStack.append(widget);
82 while (!widgetStack.isEmpty()) {
83 QDomElement w = widgetStack.takeFirst();
84 QDomElement child = w.firstChild().toElement();
85 while (!child.isNull()) {
86 if (child.tagName() == QLatin1String("property")
87 && child.attribute(QLatin1String("name")) == QLatin1String("name")) {
88 QDomElement name = child.firstChild().toElement();
89 DomString str;
90 str.read(name);
91 if (str.text() == objectName)
92 return w.attribute(QLatin1String("class"));
93 } else if (child.tagName() == QLatin1String("widget")
94 || child.tagName() == QLatin1String("vbox")
95 || child.tagName() == QLatin1String("hbox")
96 || child.tagName() == QLatin1String("grid")) {
97 widgetStack.prepend(child);
98 }
99 child = child.nextSibling().toElement();
100 }
101 }
102 return QString();
103}
104
105// Check for potential KDE classes like
106// K3ListView or KLineEdit as precise as possible
107static inline bool isKDEClass(const QString &className)
108{
109 if (className.indexOf(QLatin1Char(':')) != -1)
110 return false;
111 const int size = className.size();
112 if (size < 3 || className.at(0) != QLatin1Char('K'))
113 return false;
114 // K3ListView
115 if (className.at(1) == QLatin1Char('3')) {
116 if (size < 4)
117 return false;
118 return className.at(2).isUpper() && className.at(3).isLower();
119 }
120 // KLineEdit
121 return className.at(1) .isUpper() && className.at(2).isLower();
122}
123
124DomUI *Ui3Reader::generateUi4(const QDomElement &widget)
125{
126 QDomNodeList nl;
127 candidateCustomWidgets.clear();
128
129 QString objClass = getClassName(widget);
130 if (objClass.isEmpty())
131 return 0;
132 QString objName = getObjectName(widget);
133
134 DomUI *ui = new DomUI;
135 ui->setAttributeVersion(QLatin1String("4.0"));
136
137 QString pixmapFunction = QLatin1String("qPixmapFromMimeSource");
138 QStringList ui_tabstops;
139 QStringList ui_custom_slots;
140 QList<DomInclude*> ui_includes;
141 QList<DomWidget*> ui_toolbars;
142 QList<DomWidget*> ui_menubars;
143 QList<DomAction*> ui_action_list;
144 QList<DomActionGroup*> ui_action_group_list;
145 QList<DomCustomWidget*> ui_customwidget_list;
146 QList<DomConnection*> ui_connection_list;
147 QList<QPair<int, int> > ui_connection_lineinfo_list;
148 QString author, comment, exportMacro;
149 QString klass;
150
151 for (QDomElement n = root.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement()) {
152 QString tagName = n.tagName().toLower();
153
154 if (tagName == QLatin1String("tabstops")) {
155 QDomElement n2 = n.firstChild().toElement();
156 while (!n2.isNull()) {
157 if (n2.tagName().toLower() == QLatin1String("tabstop")) {
158 QString name = n2.firstChild().toText().data();
159 ui_tabstops.append(name);
160 }
161 n2 = n2.nextSibling().toElement();
162 }
163 } else if (tagName == QLatin1String("pixmapfunction")) {
164 pixmapFunction = n.firstChild().toText().data();
165 } else if (tagName == QLatin1String("class")) {
166 klass = n.firstChild().toText().data();
167 } else if (tagName == QLatin1String("author")) {
168 author = n.firstChild().toText().data();
169 } else if (tagName == QLatin1String("comment")) {
170 comment = n.firstChild().toText().data();
171 } else if (tagName == QLatin1String("exportmacro")) {
172 exportMacro = n.firstChild().toText().data();
173 } else if ( n.tagName() == QLatin1String("includehints") ) {
174 QDomElement n2 = n.firstChild().toElement();
175 while ( !n2.isNull() ) {
176 if ( n2.tagName() == QLatin1String("includehint") ) {
177 QString name = n2.firstChild().toText().data();
178
179 DomInclude *incl = new DomInclude();
180 incl->setText(fixHeaderName(name));
181 incl->setAttributeLocation(n.attribute(QLatin1String("location"), QLatin1String("local")));
182 ui_includes.append(incl);
183 }
184 n2 = n2.nextSibling().toElement();
185 }
186 } else if (tagName == QLatin1String("includes")) {
187 QDomElement n2 = n.firstChild().toElement();
188 while (!n2.isNull()) {
189 if (n2.tagName().toLower() == QLatin1String("include")) {
190 QString name = n2.firstChild().toText().data();
191 if (n2.attribute(QLatin1String("impldecl"), QLatin1String("in implementation")) == QLatin1String("in declaration")) {
192 if (name.right(5) == QLatin1String(".ui.h"))
193 continue;
194
195 DomInclude *incl = new DomInclude();
196 incl->setText(fixHeaderName(name));
197 incl->setAttributeLocation(n2.attribute(QLatin1String("location"), QLatin1String("global")));
198 ui_includes.append(incl);
199 }
200 }
201 n2 = n2.nextSibling().toElement();
202 }
203 } else if (tagName == QLatin1String("include")) {
204 QString name = n.firstChild().toText().data();
205 if (n.attribute(QLatin1String("impldecl"), QLatin1String("in implementation")) == QLatin1String("in declaration")) {
206 if (name.right(5) == QLatin1String(".ui.h"))
207 continue;
208
209 DomInclude *incl = new DomInclude();
210 incl->setText(fixHeaderName(name));
211 incl->setAttributeLocation(n.attribute(QLatin1String("location"), QLatin1String("global")));
212 ui_includes.append(incl);
213 }
214 } else if (tagName == QLatin1String("layoutdefaults")) {
215 QString margin = n.attribute(QLatin1String("margin"));
216 QString spacing = n.attribute(QLatin1String("spacing"));
217
218 DomLayoutDefault *layoutDefault = new DomLayoutDefault();
219
220 if (!margin.isEmpty())
221 layoutDefault->setAttributeMargin(margin.toInt());
222
223 if (!spacing.isEmpty())
224 layoutDefault->setAttributeSpacing(spacing.toInt());
225
226 ui->setElementLayoutDefault(layoutDefault);
227 } else if (tagName == QLatin1String("layoutfunctions")) {
228 QString margin = n.attribute(QLatin1String("margin"));
229 QString spacing = n.attribute(QLatin1String("spacing"));
230
231 DomLayoutFunction *layoutDefault = new DomLayoutFunction();
232
233 if (!margin.isEmpty())
234 layoutDefault->setAttributeMargin(margin);
235
236 if (!spacing.isEmpty())
237 layoutDefault->setAttributeSpacing(spacing);
238
239 ui->setElementLayoutFunction(layoutDefault);
240 } else if (tagName == QLatin1String("images")) {
241 QDomNodeList nl = n.elementsByTagName(QLatin1String("image"));
242 QList<DomImage*> ui_image_list;
243 for (int i=0; i<(int)nl.length(); i++) {
244 QDomElement e = nl.item(i).toElement();
245
246 QDomElement tmp = e.firstChild().toElement();
247 if (tmp.tagName().toLower() != QLatin1String("data"))
248 continue;
249
250 // create the image
251 DomImage *img = new DomImage();
252 img->setAttributeName(e.attribute(QLatin1String("name")));
253
254 // create the data
255 DomImageData *data = new DomImageData();
256 img->setElementData(data);
257
258 if (tmp.hasAttribute(QLatin1String("format")))
259 data->setAttributeFormat(tmp.attribute(QLatin1String("format"), QLatin1String("PNG")));
260
261 if (tmp.hasAttribute(QLatin1String("length")))
262 data->setAttributeLength(tmp.attribute(QLatin1String("length")).toInt());
263
264 data->setText(tmp.firstChild().toText().data());
265
266 ui_image_list.append(img);
267 QString format = img->elementData()->attributeFormat();
268 QString extension = format.left(format.indexOf('.')).toLower();
269 m_imageMap[img->attributeName()] = img->attributeName() + QLatin1Char('.') + extension;
270 }
271
272 if (ui_image_list.size()) {
273 DomImages *images = new DomImages();
274 images->setElementImage(ui_image_list);
275 ui->setElementImages(images);
276 }
277 } else if (tagName == QLatin1String("actions")) {
278 QDomElement n2 = n.firstChild().toElement();
279 while (!n2.isNull()) {
280 QString tag = n2.tagName().toLower();
281
282 if (tag == QLatin1String("action")) {
283 DomAction *action = new DomAction();
284 action->read(n2);
285
286 QList<DomProperty*> properties = action->elementProperty();
287 QString actionName = fixActionProperties(properties);
288 action->setAttributeName(actionName);
289 action->setElementProperty(properties);
290
291 if (actionName.isEmpty()) {
292 delete action;
293 } else
294 ui_action_list.append(action);
295 } else if (tag == QLatin1String("actiongroup")) {
296 DomActionGroup *g= new DomActionGroup();
297 g->read(n2);
298
299 fixActionGroup(g);
300 ui_action_group_list.append(g);
301 }
302 n2 = n2.nextSibling().toElement();
303 }
304 } else if (tagName == QLatin1String("toolbars")) {
305 QDomElement n2 = n.firstChild().toElement();
306 while (!n2.isNull()) {
307 if (n2.tagName().toLower() == QLatin1String("toolbar")) {
308 DomWidget *tb = createWidget(n2, QLatin1String("QToolBar"));
309 ui_toolbars.append(tb);
310 }
311 n2 = n2.nextSibling().toElement();
312 }
313 } else if (tagName == QLatin1String("menubar")) {
314 DomWidget *tb = createWidget(n, QLatin1String("QMenuBar"));
315 ui_menubars.append(tb);
316 } else if (tagName == QLatin1String("customwidgets")) {
317 QDomElement n2 = n.firstChild().toElement();
318 while (!n2.isNull()) {
319 if (n2.tagName().toLower() == QLatin1String("customwidget")) {
320
321 DomCustomWidget *customWidget = new DomCustomWidget;
322 customWidget->read(n2);
323
324 if (!customWidget->hasElementExtends())
325 customWidget->setElementExtends(QLatin1String("QWidget"));
326
327 QDomElement n3 = n2.firstChild().toElement();
328 QString cl;
329
330 QList<DomPropertyData*> ui_property_list;
331
332 while (!n3.isNull()) {
333 QString tagName = n3.tagName().toLower();
334
335 if (tagName == QLatin1String("property")) {
336 DomPropertyData *p = new DomPropertyData();
337 p->read(n3);
338
339 ui_property_list.append(p);
340 }
341
342 n3 = n3.nextSibling().toElement();
343 }
344
345 if (ui_property_list.size()) {
346 DomProperties *properties = new DomProperties();
347 properties->setElementProperty(ui_property_list);
348 customWidget->setElementProperties(properties);
349 }
350
351 ui_customwidget_list.append(customWidget);
352 }
353 n2 = n2.nextSibling().toElement();
354 }
355 } else if (tagName == QLatin1String("connections")) {
356 QDomElement n2 = n.firstChild().toElement();
357 while (!n2.isNull()) {
358 if (n2.tagName().toLower() == QLatin1String("connection")) {
359
360 DomConnection *connection = new DomConnection;
361 connection->read(n2);
362
363 QString signal = fixMethod(connection->elementSignal());
364 QString slot = fixMethod(connection->elementSlot());
365 connection->setElementSignal(signal);
366 connection->setElementSlot(slot);
367
368 ui_connection_list.append(connection);
369 ui_connection_lineinfo_list.append(
370 QPair<int, int>(n2.lineNumber(), n2.columnNumber()));
371 }
372 n2 = n2.nextSibling().toElement();
373 }
374 } else if (tagName == QLatin1String("slots")) {
375 QDomElement n2 = n.firstChild().toElement();
376 while (!n2.isNull()) {
377 if (n2.tagName().toLower() == QLatin1String("slot")) {
378 QString name = n2.firstChild().toText().data();
379 ui_custom_slots.append(fixMethod(Parser::cleanArgs(name)));
380 }
381 n2 = n2.nextSibling().toElement();
382 }
383 }
384 }
385
386 // validate the connections
387 for (int i = 0; i < ui_connection_list.size(); ++i) {
388 DomConnection *conn = ui_connection_list.at(i);
389 QPair<int, int> lineinfo = ui_connection_lineinfo_list.at(i);
390 QString sender = conn->elementSender();
391 QString senderClass = fixClassName(classNameForObjectName(widget, sender));
392 QString signal = conn->elementSignal();
393 QString receiver = conn->elementReceiver();
394 QString receiverClass = fixClassName(classNameForObjectName(widget, receiver));
395 QString slot = conn->elementSlot();
396
397 if (!WidgetInfo::isValidSignal(senderClass, signal)) {
398 errorInvalidSignal(signal, sender, senderClass,
399 lineinfo.first, lineinfo.second);
400 } else if (!WidgetInfo::isValidSlot(receiverClass, slot)) {
401 bool resolved = false;
402 if (objName == receiver) {
403 // see if it's a custom slot
404 foreach (QString cs, ui_custom_slots) {
405 if (cs == slot) {
406 resolved = true;
407 break;
408 }
409 }
410 }
411 if (!resolved) {
412 errorInvalidSlot(slot, receiver, receiverClass,
413 lineinfo.first, lineinfo.second);
414 }
415 }
416 }
417
418 DomWidget *w = createWidget(widget);
419 Q_ASSERT(w != 0);
420
421 QList<DomWidget*> l = w->elementWidget();
422 l += ui_toolbars;
423 l += ui_menubars;
424 w->setElementWidget(l);
425
426 if (ui_action_group_list.size())
427 w->setElementActionGroup(ui_action_group_list);
428
429 if (ui_action_list.size())
430 w->setElementAction(ui_action_list);
431
432 ui->setElementWidget(w);
433
434 if (klass.isEmpty())
435 klass = w->attributeName();
436
437 ui->setElementClass(klass);
438 ui->setElementAuthor(author);
439 ui->setElementComment(comment);
440 ui->setElementExportMacro(exportMacro);
441
442 if (!ui->elementImages())
443 ui->setElementPixmapFunction(pixmapFunction);
444
445 for (int i=0; i<ui_customwidget_list.size(); ++i) {
446 const QString name = ui_customwidget_list.at(i)->elementClass();
447 if (candidateCustomWidgets.contains(name))
448 candidateCustomWidgets.remove(name);
449 }
450
451
452 QMapIterator<QString, bool> it(candidateCustomWidgets);
453 while (it.hasNext()) {
454 it.next();
455
456 const QString customClass = it.key();
457 QString baseClass;
458
459 if (customClass.endsWith(QLatin1String("ListView")))
460 baseClass = QLatin1String("Q3ListView");
461 else if (customClass.endsWith(QLatin1String("ListBox")))
462 baseClass = QLatin1String("Q3ListBox");
463 else if (customClass.endsWith(QLatin1String("IconView")))
464 baseClass = QLatin1String("Q3IconView");
465 else if (customClass.endsWith(QLatin1String("ComboBox")))
466 baseClass = QLatin1String("QComboBox");
467
468 if (baseClass.isEmpty())
469 continue;
470
471 DomCustomWidget *customWidget = new DomCustomWidget();
472 customWidget->setElementClass(customClass);
473 customWidget->setElementExtends(baseClass);
474
475 // Magic header generation feature for legacy KDE forms
476 // (for example, filesharing/advanced/kcm_sambaconf/share.ui)
477 if ((m_options & ImplicitIncludes) && isKDEClass(customClass)) {
478 QString header = customClass.toLower();
479 header += QLatin1String(".h");
480 DomHeader *domHeader = new DomHeader;
481 domHeader->setText(header);
482 domHeader->setAttributeLocation(QLatin1String("global"));
483 customWidget->setElementHeader(domHeader);
484 if (warnHeaderGeneration) {
485 const QString msg = QString::fromUtf8("Warning: generated header '%1' for class '%2'.").arg(header).arg(customClass);
486 qWarning("%s", qPrintable(msg));
487 }
488 }
489 ui_customwidget_list.append(customWidget);
490 }
491
492 if (ui_customwidget_list.size()) {
493 DomCustomWidgets *customWidgets = new DomCustomWidgets();
494 customWidgets->setElementCustomWidget(ui_customwidget_list);
495 ui->setElementCustomWidgets(customWidgets);
496 }
497
498 if (ui_tabstops.size()) {
499 DomTabStops *tabStops = new DomTabStops();
500 tabStops->setElementTabStop(ui_tabstops);
501 ui->setElementTabStops(tabStops);
502 }
503
504 if (ui_includes.size()) {
505 DomIncludes *includes = new DomIncludes();
506 includes->setElementInclude(ui_includes);
507 ui->setElementIncludes(includes);
508 }
509
510 if (ui_connection_list.size()) {
511 DomConnections *connections = new DomConnections();
512 connections->setElementConnection(ui_connection_list);
513 ui->setElementConnections(connections);
514 }
515
516 ui->setAttributeStdSetDef(stdsetdef);
517
518 if (m_extractImages) {
519 Option opt;
520 opt.extractImages = m_extractImages;
521 opt.qrcOutputFile = m_qrcOutputFile;
522 CPP::ExtractImages(opt).acceptUI(ui);
523
524 ui->clearElementImages();
525
526 DomResources *res = ui->elementResources();
527 if (!res) {
528 res = new DomResources();
529 }
530 DomResource *incl = new DomResource();
531 incl->setAttributeLocation(m_qrcOutputFile);
532 QList<DomResource *> inclList = res->elementInclude();
533 inclList.append(incl);
534 res->setElementInclude(inclList);
535 if (!ui->elementResources())
536 ui->setElementResources(res);
537 }
538
539 return ui;
540}
541
542
543
544QString Ui3Reader::fixActionProperties(QList<DomProperty*> &properties,
545 bool isActionGroup)
546{
547 QString objectName;
548
549 QMutableListIterator<DomProperty*> it(properties);
550 while (it.hasNext()) {
551 DomProperty *prop = it.next();
552 QString name = prop->attributeName();
553
554 if (name == QLatin1String("name")) {
555 objectName = prop->elementCstring();
556 } else if (isActionGroup && name == QLatin1String("exclusive")) {
557 // continue
558 } else if (isActionGroup) {
559 errorInvalidProperty(name, objectName, isActionGroup ? QLatin1String("QActionGroup") : QLatin1String("QAction"), -1, -1);
560 delete prop;
561 it.remove();
562 } else if (name == QLatin1String("menuText")) {
563 prop->setAttributeName(QLatin1String("text"));
564 } else if (name == QLatin1String("text")) {
565 prop->setAttributeName(QLatin1String("iconText"));
566 } else if (name == QLatin1String("iconSet")) {
567 prop->setAttributeName(QLatin1String("icon"));
568 } else if (name == QLatin1String("accel")) {
569 prop->setAttributeName(QLatin1String("shortcut"));
570 } else if (name == QLatin1String("toggleAction")) {
571 prop->setAttributeName(QLatin1String("checkable"));
572 } else if (name == QLatin1String("on")) {
573 prop->setAttributeName(QLatin1String("checked"));
574 } else if (!WidgetInfo::isValidProperty(QLatin1String("QAction"), name)) {
575 errorInvalidProperty(name, objectName, isActionGroup ? QLatin1String("QActionGroup") : QLatin1String("QAction"), -1, -1);
576 delete prop;
577 it.remove();
578 }
579 }
580
581 return objectName;
582}
583
584void Ui3Reader::fixActionGroup(DomActionGroup *g)
585{
586 QList<DomActionGroup*> groups = g->elementActionGroup();
587 for (int i=0; i<groups.size(); ++i) {
588 fixActionGroup(groups.at(i));
589 }
590
591 QList<DomAction*> actions = g->elementAction();
592 for (int i=0; i<actions.size(); ++i) {
593 DomAction *a = actions.at(i);
594
595 QList<DomProperty*> properties = a->elementProperty();
596 QString name = fixActionProperties(properties);
597 a->setElementProperty(properties);
598
599 if (name.size())
600 a->setAttributeName(name);
601 }
602
603 QList<DomProperty*> properties = g->elementProperty();
604 QString name = fixActionProperties(properties, true);
605 g->setElementProperty(properties);
606
607 if (name.size())
608 g->setAttributeName(name);
609}
610
611QString Ui3Reader::fixClassName(const QString &className) const
612{
613 return m_porting->renameClass(className);
614}
615
616QString Ui3Reader::fixHeaderName(const QString &headerName) const
617{
618 return m_porting->renameHeader(headerName);
619}
620
621DomWidget *Ui3Reader::createWidget(const QDomElement &w, const QString &widgetClass)
622{
623 DomWidget *ui_widget = new DomWidget;
624
625 QString className = widgetClass;
626 if (className.isEmpty())
627 className = w.attribute(QLatin1String("class"));
628 className = fixClassName(className);
629
630 if ((className.endsWith(QLatin1String("ListView")) && className != QLatin1String("Q3ListView"))
631 || (className.endsWith(QLatin1String("ListBox")) && className != QLatin1String("Q3ListBox"))
632 || (className.endsWith(QLatin1String("ComboBox")) && className != QLatin1String("QComboBox"))
633 || (className.endsWith(QLatin1String("IconView")) && className != QLatin1String("Q3IconView")))
634 candidateCustomWidgets.insert(className, true);
635
636 bool isMenu = (className == QLatin1String("QMenuBar") || className == QLatin1String("QMenu"));
637
638 ui_widget->setAttributeClass(className);
639
640 QList<DomWidget*> ui_child_list;
641 QList<DomRow*> ui_row_list;
642 QList<DomColumn*> ui_column_list;
643 QList<DomItem*> ui_item_list;
644 QList<DomProperty*> ui_property_list;
645 QList<DomProperty*> ui_attribute_list;
646 QList<DomLayout*> ui_layout_list;
647 QList<DomActionRef*> ui_action_list;
648 QList<DomWidget*> ui_mainwindow_child_list;
649
650 createProperties(w, &ui_property_list, className);
651 createAttributes(w, &ui_attribute_list, className);
652
653 DomWidget *ui_mainWindow = 0;
654 DomWidget *ui_centralWidget = 0;
655 if (className == QLatin1String("QMainWindow") || className == QLatin1String("Q3MainWindow")) {
656 ui_centralWidget = new DomWidget;
657 ui_centralWidget->setAttributeClass(QLatin1String("QWidget"));
658 ui_mainwindow_child_list.append(ui_centralWidget);
659 ui_mainWindow = ui_widget;
660 }
661
662 QDomElement e = w.firstChild().toElement();
663 const bool inQ3ToolBar = className == QLatin1String("Q3ToolBar");
664 while (!e.isNull()) {
665 QString t = e.tagName().toLower();
666 if (t == QLatin1String("vbox") || t == QLatin1String("hbox") || t == QLatin1String("grid")) {
667 DomLayout *lay = createLayout(e);
668 Q_ASSERT(lay != 0);
669
670 if (ui_layout_list.isEmpty()) {
671 ui_layout_list.append(lay);
672 } else {
673 // it's not possible to have more than one layout for widget!
674 delete lay;
675 }
676 } else if (t == QLatin1String("spacer")) {
677 // hmm, spacer as child of a widget.. it doesn't make sense, so skip it!
678 } else if (t == QLatin1String("widget")) {
679 DomWidget *ui_child = createWidget(e);
680 Q_ASSERT(ui_child != 0);
681
682 bool isLayoutWidget = ui_child->attributeClass() == QLatin1String("QLayoutWidget");
683 if (isLayoutWidget)
684 ui_child->setAttributeClass(QLatin1String("QWidget"));
685
686 foreach (DomLayout *layout, ui_child->elementLayout()) {
687 fixLayoutMargin(layout);
688 }
689
690 QString widgetClass = ui_child->attributeClass();
691 if (widgetClass == QLatin1String("QMenuBar") || widgetClass == QLatin1String("QToolBar")
692 || widgetClass == QLatin1String("QStatusBar")) {
693 ui_mainwindow_child_list.append(ui_child);
694 } else {
695 ui_child_list.append(ui_child);
696 }
697
698 if (inQ3ToolBar) {
699 DomActionRef *ui_action_ref = new DomActionRef();
700 ui_action_ref->setAttributeName(ui_child->attributeName());
701 ui_action_list.append(ui_action_ref);
702 }
703 } else if (t == QLatin1String("action")) {
704 DomActionRef *a = new DomActionRef();
705 a->read(e);
706 ui_action_list.append(a);
707 } else if (t == QLatin1String("separator")) {
708 DomActionRef *a = new DomActionRef();
709 a->setAttributeName(QLatin1String("separator"));
710 ui_action_list.append(a);
711 } else if (t == QLatin1String("property")) {
712 // skip the property it is already handled by createProperties
713 const QString name = e.attribute(QLatin1String("name")); // change the varname this widget
714 if (name == QLatin1String("name")) {
715 // Do not name QLayoutWidget if layout names are to be used.
716 const bool applyName = !(m_options & PreserveLayoutNames) || className != QLatin1String("QLayoutWidget");
717 if (applyName)
718 ui_widget->setAttributeName(DomTool::readProperty(w, QLatin1String("name"), QVariant()).toString());
719 }
720 } else if (t == QLatin1String("row")) {
721 DomRow *row = new DomRow();
722 row->read(e);
723 ui_row_list.append(row);
724 } else if (t == QLatin1String("column")) {
725 DomColumn *column = new DomColumn();
726 column->read(e);
727 ui_column_list.append(column);
728 } else if (isMenu && t == QLatin1String("item")) {
729 QString text = e.attribute(QLatin1String("text"));
730 QString name = e.attribute(QLatin1String("name"));
731 QString accel = e.attribute(QLatin1String("accel"));
732
733 QList<DomProperty*> properties;
734
735 DomProperty *atitle = new DomProperty();
736 atitle->setAttributeName(QLatin1String("title"));
737 DomString *str = new DomString();
738 str->setText(text);
739 atitle->setElementString(str);
740 properties.append(atitle);
741
742 DomWidget *menu = createWidget(e, QLatin1String("QMenu"));
743 menu->setAttributeName(name);
744 menu->setElementProperty(properties);
745 ui_child_list.append(menu);
746
747 DomActionRef *a = new DomActionRef();
748 a->setAttributeName(name);
749 ui_action_list.append(a);
750
751 } else if (t == QLatin1String("item")) {
752 DomItem *item = new DomItem();
753 item->read(e);
754 ui_item_list.append(item);
755 }
756
757 e = e.nextSibling().toElement();
758 }
759
760 ui_widget->setElementProperty(ui_property_list);
761 ui_widget->setElementAttribute(ui_attribute_list);
762
763 if (ui_centralWidget != 0) {
764 Q_ASSERT(ui_mainWindow != 0);
765 ui_mainWindow->setElementWidget(ui_mainwindow_child_list);
766 ui_widget = ui_centralWidget;
767 }
768
769 ui_widget->setElementWidget(ui_child_list);
770 ui_widget->setElementAddAction(ui_action_list);
771 ui_widget->setElementRow(ui_row_list);
772 ui_widget->setElementColumn(ui_column_list);
773 ui_widget->setElementItem(ui_item_list);
774 ui_widget->setElementLayout(ui_layout_list);
775
776 //ui_widget->setAttributeName(p->elementCstring());
777
778 return ui_mainWindow ? ui_mainWindow : ui_widget;
779}
780
781DomLayout *Ui3Reader::createLayout(const QDomElement &w)
782{
783 DomLayout *lay = new DomLayout();
784
785 QList<DomLayoutItem*> ui_item_list;
786 QList<DomProperty*> ui_property_list;
787 QList<DomProperty*> ui_attribute_list;
788
789 QString tagName = w.tagName().toLower();
790
791 QString className;
792 if (tagName == QLatin1String("vbox"))
793 className = QLatin1String("QVBoxLayout");
794 else if (tagName == QLatin1String("hbox"))
795 className = QLatin1String("QHBoxLayout");
796 else
797 className = QLatin1String("QGridLayout");
798
799 lay->setAttributeClass(className);
800
801 createProperties(w, &ui_property_list, className);
802 createAttributes(w, &ui_attribute_list, className);
803 if (m_options & PreserveLayoutNames) {
804 const QString layoutName = getLayoutName(w);
805 if (!layoutName.isEmpty())
806 lay->setAttributeName(layoutName);
807 }
808
809 QDomElement e = w.firstChild().toElement();
810 while (!e.isNull()) {
811 QString t = e.tagName().toLower();
812 if (t == QLatin1String("vbox")
813 || t == QLatin1String("hbox")
814 || t == QLatin1String("grid")
815 || t == QLatin1String("spacer")
816 || t == QLatin1String("widget")) {
817 DomLayoutItem *lay_item = createLayoutItem(e);
818 Q_ASSERT(lay_item != 0);
819 ui_item_list.append(lay_item);
820 }
821
822 e = e.nextSibling().toElement();
823 }
824
825 lay->setElementItem(ui_item_list);
826 lay->setElementProperty(ui_property_list);
827 lay->setElementAttribute(ui_attribute_list);
828
829 return lay;
830}
831
832DomLayoutItem *Ui3Reader::createLayoutItem(const QDomElement &e)
833{
834 DomLayoutItem *lay_item = new DomLayoutItem;
835
836 QString tagName = e.tagName().toLower();
837 if (tagName == QLatin1String("widget")) {
838 DomWidget *ui_widget = createWidget(e);
839 Q_ASSERT(ui_widget != 0);
840
841 if (ui_widget->attributeClass() == QLatin1String("QLayoutWidget")
842 && ui_widget->elementLayout().size() == 1) {
843 QList<DomLayout*> layouts = ui_widget->elementLayout();
844
845 ui_widget->setElementLayout(QList<DomLayout*>());
846 delete ui_widget;
847
848 DomLayout *layout = layouts.first();
849 fixLayoutMargin(layout);
850 lay_item->setElementLayout(layout);
851 } else {
852 if (ui_widget->attributeClass() == QLatin1String("QLayoutWidget"))
853 ui_widget->setAttributeClass(QLatin1String("QWidget"));
854
855 lay_item->setElementWidget(ui_widget);
856 }
857 } else if (tagName == QLatin1String("spacer")) {
858 DomSpacer *ui_spacer = new DomSpacer();
859 QList<DomProperty*> properties;
860
861 QByteArray name = DomTool::readProperty(e, QLatin1String("name"), QLatin1String("spacer")).toByteArray();
862
863 Variant var;
864 var.createSize(0, 0);
865
866 QVariant def = qVariantFromValue(var);
867
868 Size size = asVariant(DomTool::readProperty(e, QLatin1String("sizeHint"), def)).size;
869 QString sizeType = QLatin1String("QSizePolicy::") + DomTool::readProperty(e, QLatin1String("sizeType"), QLatin1String("Expanding")).toString();
870 QString orientation = QLatin1String("Qt::") + DomTool::readProperty(e, QLatin1String("orientation"), QLatin1String("Horizontal")).toString();
871
872 ui_spacer->setAttributeName(QLatin1String(name));
873
874 DomProperty *prop = 0;
875
876 // sizeHint
877 prop = new DomProperty();
878 prop->setAttributeName(QLatin1String("sizeHint"));
879 prop->setElementSize(new DomSize());
880 prop->elementSize()->setElementWidth(size.width);
881 prop->elementSize()->setElementHeight(size.height);
882 properties.append(prop);
883
884 // sizeType
885 prop = new DomProperty();
886 prop->setAttributeName(QLatin1String("sizeType"));
887 prop->setElementEnum(sizeType);
888 properties.append(prop);
889
890 // orientation
891 prop = new DomProperty();
892 prop->setAttributeName(QLatin1String("orientation"));
893 prop->setElementEnum(orientation);
894 properties.append(prop);
895
896 ui_spacer->setElementProperty(properties);
897 lay_item->setElementSpacer(ui_spacer);
898 } else {
899 DomLayout *ui_layout = createLayout(e);
900 Q_ASSERT(ui_layout != 0);
901
902 fixLayoutMargin(ui_layout);
903 lay_item->setElementLayout(ui_layout);
904 }
905
906 if (e.hasAttribute(QLatin1String("row")))
907 lay_item->setAttributeRow(e.attribute(QLatin1String("row")).toInt());
908 if (e.hasAttribute(QLatin1String("column")))
909 lay_item->setAttributeColumn(e.attribute(QLatin1String("column")).toInt());
910 if (e.hasAttribute(QLatin1String("rowspan")))
911 lay_item->setAttributeRowSpan(e.attribute(QLatin1String("rowspan")).toInt());
912 if (e.hasAttribute(QLatin1String("colspan")))
913 lay_item->setAttributeColSpan(e.attribute(QLatin1String("colspan")).toInt());
914
915 return lay_item;
916}
917
918void Ui3Reader::fixLayoutMargin(DomLayout *ui_layout)
919{
920 Q_UNUSED(ui_layout)
921}
922
923static void addBooleanFontSubProperty(QDomDocument &doc,
924 const QString &name, const QString &value,
925 QDomElement &fontElement)
926{
927 if (value == QLatin1String("true") || value == QLatin1String("1")) {
928 QDomElement child = doc.createElement(name);
929 child.appendChild(doc.createTextNode(QLatin1String("true")));
930 fontElement.appendChild(child);
931 } else {
932 if (value == QLatin1String("false") || value == QLatin1String("0")) {
933 QDomElement child = doc.createElement(name);
934 child.appendChild(doc.createTextNode(QLatin1String("false")));
935 fontElement.appendChild(child);
936 }
937 }
938}
939
940QDomElement Ui3Reader::findDerivedFontProperties(const QDomElement &n) const
941{
942 bool italic = false;
943 bool bold = false;
944 bool underline = false;
945 bool strikeout = false;
946 bool family = false;
947 bool pointsize = false;
948
949 QDomDocument doc = n.ownerDocument();
950 QDomElement result = doc.createElement(QLatin1String("font"));
951
952 QDomNode pn = n.parentNode();
953 while (!pn.isNull()) {
954 for (QDomElement e = pn.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
955 if (e.tagName().toLower() == QLatin1String("property") &&
956 e.attribute(QLatin1String("name")) == QLatin1String("font")) {
957 QDomElement f = e.firstChild().toElement();
958 for (QDomElement fp = f.firstChild().toElement(); !fp.isNull(); fp = fp.nextSibling().toElement()) {
959 QString name = fp.tagName().toLower();
960 QString text = fp.text();
961 if (!italic && name == QLatin1String("italic")) {
962 italic = true;
963 addBooleanFontSubProperty(doc, name, text, result);
964 } else if (!bold && name == QLatin1String("bold")) {
965 bold = true;
966 addBooleanFontSubProperty(doc, name, text, result);
967 } else if (!underline && name == QLatin1String("underline")) {
968 underline = true;
969 addBooleanFontSubProperty(doc, name, text, result);
970 } else if (!strikeout && name == QLatin1String("strikeout")) {
971 strikeout = true;
972 addBooleanFontSubProperty(doc, name, text, result);
973 } else if (!family && name == QLatin1String("family")) {
974 family = true;
975 QDomElement child = doc.createElement(name);
976 child.appendChild(doc.createTextNode(text));
977 result.appendChild(child);
978 } else if (!pointsize && name == QLatin1String("pointsize")) {
979 pointsize = true;
980 QDomElement child = doc.createElement(name);
981 child.appendChild(doc.createTextNode(text));
982 result.appendChild(child);
983 }
984 }
985 }
986 }
987 pn = pn.parentNode();
988 }
989
990 return result;
991}
992
993void Ui3Reader::createProperties(const QDomElement &n, QList<DomProperty*> *properties,
994 const QString &className)
995{
996 QString objectName;
997
998 bool wordWrapFound = false;
999 bool wordWrapPropertyFound = false;
1000
1001 for (QDomElement e=n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
1002 if (e.tagName().toLower() == QLatin1String("property")) {
1003 QString name = e.attribute(QLatin1String("name"));
1004
1005 // changes in QPalette
1006 if (name == QLatin1String("colorGroup")
1007 || name == QLatin1String("paletteForegroundColor")
1008 || name == QLatin1String("paletteBackgroundColor")
1009 || name == QLatin1String("backgroundMode")
1010 || name == QLatin1String("backgroundOrigin")
1011 || name == QLatin1String("paletteBackgroundPixmap")
1012 || name == QLatin1String("backgroundBrush")) {
1013 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
1014 continue;
1015 }
1016
1017 // changes in QFrame
1018 if (name == QLatin1String("contentsRect")) {
1019 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
1020 continue;
1021 }
1022
1023 // changes in QWidget
1024 if (name == QLatin1String("underMouse")
1025 || name == QLatin1String("ownFont")) {
1026 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
1027 continue;
1028 }
1029
1030 if (name == QLatin1String("font")) {
1031 QDomElement f = e.firstChild().toElement();
1032 e.appendChild(findDerivedFontProperties(f));
1033 e.removeChild(f);
1034 }
1035
1036 DomProperty *prop = readProperty(e);
1037 if (!prop)
1038 continue;
1039
1040 if (prop->kind() == DomProperty::String) {
1041 QDomNodeList comments = e.elementsByTagName(QLatin1String("comment"));
1042 if (comments.length()) {
1043 QString comment = comments.item(0).firstChild().toText().data();
1044 if (!comment.isEmpty())
1045 prop->elementString()->setAttributeComment(comment);
1046 }
1047 }
1048
1049 // objectName
1050 if (name == QLatin1String("name")) {
1051 objectName = prop->elementCstring();
1052 continue;
1053 }
1054
1055 if (className == QLatin1String("Line")
1056 && prop->attributeName() == QLatin1String("orientation")) {
1057 delete prop;
1058 continue;
1059 }
1060
1061 if (className.mid(1) == QLatin1String("LineEdit")) {
1062 if (name == QLatin1String("hasMarkedText")) {
1063 prop->setAttributeName(QLatin1String("hasSelectedText"));
1064 } else if (name == QLatin1String("edited")) {
1065 prop->setAttributeName(QLatin1String("modified"));
1066 } else if (name == QLatin1String("markedText")) {
1067 prop->setAttributeName(QLatin1String("selectedText"));
1068 }
1069 }
1070
1071 if (className.endsWith(QLatin1String("ComboBox"))) {
1072 CONVERT_PROPERTY(QLatin1String("currentItem"), QLatin1String("currentIndex"));
1073 CONVERT_PROPERTY(QLatin1String("insertionPolicy"), QLatin1String("insertPolicy"));
1074 }
1075
1076 if (className == QLatin1String("QToolBar")) {
1077 if (name == QLatin1String("label")) {
1078 prop->setAttributeName(QLatin1String("windowTitle"));
1079 }
1080 }
1081
1082 CONVERT_PROPERTY(QLatin1String("customWhatsThis"), QLatin1String("whatsThis"));
1083 CONVERT_PROPERTY(QLatin1String("icon"), QLatin1String("windowIcon"));
1084 CONVERT_PROPERTY(QLatin1String("iconText"), QLatin1String("windowIconText"));
1085 CONVERT_PROPERTY(QLatin1String("caption"), QLatin1String("windowTitle"));
1086
1087 if (name == QLatin1String("name")) {
1088 continue; // skip the property name
1089 }
1090
1091 if (name == QLatin1String("accel")) {
1092 prop->setAttributeName(QLatin1String("shortcut"));
1093 }
1094
1095 CONVERT_PROPERTY(QLatin1String("pixmap"), QLatin1String("icon"));
1096 CONVERT_PROPERTY(QLatin1String("iconSet"), QLatin1String("icon"));
1097 CONVERT_PROPERTY(QLatin1String("textLabel"), QLatin1String("text"));
1098
1099 CONVERT_PROPERTY(QLatin1String("toggleButton"), QLatin1String("checkable"));
1100 CONVERT_PROPERTY(QLatin1String("on"), QLatin1String("checked"));
1101
1102 CONVERT_PROPERTY(QLatin1String("maxValue"), QLatin1String("maximum"));
1103 CONVERT_PROPERTY(QLatin1String("minValue"), QLatin1String("minimum"));
1104 CONVERT_PROPERTY(QLatin1String("lineStep"), QLatin1String("singleStep"));
1105
1106 // QSlider
1107 CONVERT_PROPERTY(QLatin1String("tickmarks"), QLatin1String("tickPosition"));
1108
1109 name = prop->attributeName(); // sync the name
1110
1111 if (className == QLatin1String("QLabel")) {
1112 if (name == QLatin1String("alignment")) {
1113 const QString v = prop->elementSet();
1114 if (v.contains(QRegExp(QLatin1String("\\bWordBreak\\b"))))
1115 wordWrapFound = true;
1116 } else if (name == QLatin1String("wordWrap")) {
1117 wordWrapPropertyFound = true;
1118 }
1119 }
1120
1121 // resolve the flags and enumerator
1122 if (prop->kind() == DomProperty::Set) {
1123 QStringList flags = prop->elementSet().split(QLatin1Char('|'));
1124 QStringList v;
1125 foreach (QString fl, flags) {
1126 QString e = WidgetInfo::resolveEnumerator(className, fl);
1127 if (e.isEmpty()) {
1128 e = m_porting->renameEnumerator(className + QLatin1String("::") + fl);
1129 }
1130
1131 if (e.isEmpty()) {
1132 fprintf(stderr, "uic3: flag '%s' for widget '%s' is not supported\n", fl.latin1(), className.latin1());
1133 continue;
1134 }
1135
1136 v.append(e);
1137 }
1138
1139 if (v.isEmpty()) {
1140 delete prop;
1141 continue;
1142 }
1143
1144 prop->setElementSet(v.join(QLatin1String("|")));
1145 } else if (prop->kind() == DomProperty::Enum) {
1146 QString e = WidgetInfo::resolveEnumerator(className, prop->elementEnum());
1147 if (e.isEmpty()) {
1148 e = m_porting->renameEnumerator(className + QLatin1String("::") + prop->elementEnum());
1149 }
1150
1151 if (e.isEmpty()) {
1152 fprintf(stderr, "uic3: enumerator '%s' for widget '%s' is not supported\n",
1153 prop->elementEnum().latin1(), className.latin1());
1154
1155 delete prop;
1156 continue;
1157 }
1158 prop->setElementEnum(e);
1159 }
1160
1161
1162 if (className.size()
1163 && !(className == QLatin1String("QLabel") && name == QLatin1String("buddy"))
1164 && !(name == QLatin1String("buttonGroupId"))
1165 && !(name == QLatin1String("frameworkCode"))
1166 && !(name == QLatin1String("database"))) {
1167 if (!WidgetInfo::isValidProperty(className, name)) {
1168 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
1169 delete prop;
1170 } else {
1171 properties->append(prop);
1172 }
1173 } else {
1174 properties->append(prop);
1175 }
1176 }
1177 }
1178 if (className == QLatin1String("QLabel") && !wordWrapPropertyFound) {
1179 DomProperty *wordWrap = new DomProperty();
1180 wordWrap->setAttributeName(QLatin1String("wordWrap"));
1181 if (wordWrapFound)
1182 wordWrap->setElementBool(QLatin1String("true"));
1183 else
1184 wordWrap->setElementBool(QLatin1String("false"));
1185 properties->append(wordWrap);
1186 }
1187}
1188
1189static int toQt4SizePolicy(int qt3SizePolicy)
1190{
1191 if (qt3SizePolicy == 2) // qt 3 Ignored value
1192 return QSizePolicy::Ignored;
1193 return qt3SizePolicy;
1194}
1195
1196DomProperty *Ui3Reader::readProperty(const QDomElement &e)
1197{
1198 QString name = e.firstChild().toElement().tagName().toLower();
1199
1200 if (name == QLatin1String("class")) // skip class
1201 name = e.firstChild().nextSibling().toElement().tagName().toLower();
1202
1203 DomProperty *p = new DomProperty;
1204 p->read(e);
1205
1206 if (p->kind() == DomProperty::Number) {
1207 QString value = e.firstChild().toElement().firstChild().nodeValue();
1208
1209 if (value.contains(QLatin1Char('.'))) {
1210 p->setElementDouble(value.toDouble());
1211 }
1212 } else if (p->kind() == DomProperty::Pixmap) {
1213 DomResourcePixmap *domPix = p->elementPixmap();
1214 if (m_extractImages) {
1215 QString imageFile = domPix->text() + QLatin1String(".xpm");
1216 if (m_imageMap.contains(domPix->text()))
1217 imageFile = m_imageMap.value(domPix->text());
1218 domPix->setAttributeResource(m_qrcOutputFile);
1219 domPix->setText(QLatin1String(":/") + nameOfClass + QLatin1String("/images/") + imageFile);
1220 }
1221 } else if (p->kind() == DomProperty::SizePolicy) {
1222 DomSizePolicy *sp = p->elementSizePolicy();
1223 if (sp) {
1224 if (sp->hasElementHSizeType())
1225 sp->setElementHSizeType(toQt4SizePolicy(sp->elementHSizeType()));
1226 if (sp->hasElementVSizeType())
1227 sp->setElementVSizeType(toQt4SizePolicy(sp->elementVSizeType()));
1228 }
1229 } else if (p->kind() == DomProperty::Unknown) {
1230 delete p;
1231 p = 0;
1232 }
1233
1234 return p;
1235}
1236
1237void Ui3Reader::createAttributes(const QDomElement &n, QList<DomProperty*> *properties,
1238 const QString &className)
1239{
1240 Q_UNUSED(className);
1241
1242 for (QDomElement e=n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
1243 if (e.tagName().toLower() == QLatin1String("attribute")) {
1244 QString name = e.attribute(QLatin1String("name"));
1245
1246 DomProperty *prop = readProperty(e);
1247 if (!prop)
1248 continue;
1249
1250 properties->append(prop);
1251 }
1252 }
1253}
1254
1255QString Ui3Reader::fixDeclaration(const QString &d) const
1256{
1257 QString text;
1258
1259 int i = 0;
1260 while (i < d.size()) {
1261 QChar ch = d.at(i);
1262
1263 if (ch.isLetter() || ch == QLatin1Char('_')) {
1264 int start = i;
1265 while (i < d.size() && (d.at(i).isLetterOrNumber() || d.at(i) == QLatin1Char('_')))
1266 ++i;
1267
1268 text += fixClassName(d.mid(start, i-start));
1269 } else {
1270 text += ch;
1271 ++i;
1272 }
1273 }
1274
1275 return text;
1276}
1277
1278/*
1279 fixes a (possible composite) type name
1280*/
1281QString Ui3Reader::fixType(const QString &t) const
1282{
1283 QString newText = t;
1284 //split type name on <>*& and whitespace
1285 QStringList typeNames = t.split(QRegExp(QLatin1String("<|>|\\*|&| ")), QString::SkipEmptyParts);
1286 foreach(QString typeName , typeNames) {
1287 QString newName = fixClassName(typeName);
1288 if( newName != typeName ) {
1289 newText.replace(typeName, newName);
1290 }
1291 }
1292 return newText;
1293}
1294
1295QString Ui3Reader::fixMethod(const QString &method) const
1296{
1297 const QByteArray normalized = QMetaObject::normalizedSignature(method.toLatin1());
1298 QByteArray result;
1299 int index = normalized.indexOf('(');
1300 if (index == -1)
1301 return QLatin1String(normalized);
1302 result.append(normalized.left(++index));
1303 int limit = normalized.length()-1;
1304 while (index < limit) {
1305 QByteArray type;
1306 while ((index < limit) && (normalized.at(index) != ','))
1307 type.append(normalized.at(index++));
1308 result.append(fixType(QLatin1String(type)).toLatin1());
1309 if ((index < limit) && (normalized.at(index) == ','))
1310 result.append(normalized.at(index++));
1311 }
1312 result.append(normalized.mid(index));
1313 return QLatin1String(result);
1314}
1315
1316QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.