src/tools/uic3/converter.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the tools applications of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    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 ** 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 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    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 
       
    65 QT_BEGIN_NAMESPACE
       
    66 
       
    67 enum { 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 
       
    78 static 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
       
   107 static 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 
       
   124 DomUI *Ui3Reader::generateUi4(const QDomElement &widget, bool implicitIncludes)
       
   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 (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 
       
   544 QString 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 
       
   584 void 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 
       
   611 QString Ui3Reader::fixClassName(const QString &className) const
       
   612 {
       
   613     return m_porting->renameClass(className);
       
   614 }
       
   615 
       
   616 QString Ui3Reader::fixHeaderName(const QString &headerName) const
       
   617 {
       
   618     return m_porting->renameHeader(headerName);
       
   619 }
       
   620 
       
   621 DomWidget *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 
       
   714             QString name = e.attribute(QLatin1String("name"));  // change the varname this widget
       
   715             if (name == QLatin1String("name"))
       
   716                 ui_widget->setAttributeName(DomTool::readProperty(w, QLatin1String("name"), QVariant()).toString());
       
   717         } else if (t == QLatin1String("row")) {
       
   718             DomRow *row = new DomRow();
       
   719             row->read(e);
       
   720             ui_row_list.append(row);
       
   721         } else if (t == QLatin1String("column")) {
       
   722             DomColumn *column = new DomColumn();
       
   723             column->read(e);
       
   724             ui_column_list.append(column);
       
   725         } else if (isMenu && t == QLatin1String("item")) {
       
   726             QString text = e.attribute(QLatin1String("text"));
       
   727             QString name = e.attribute(QLatin1String("name"));
       
   728             QString accel = e.attribute(QLatin1String("accel"));
       
   729 
       
   730             QList<DomProperty*> properties;
       
   731 
       
   732             DomProperty *atitle = new DomProperty();
       
   733             atitle->setAttributeName(QLatin1String("title"));
       
   734             DomString *str = new DomString();
       
   735             str->setText(text);
       
   736             atitle->setElementString(str);
       
   737             properties.append(atitle);
       
   738 
       
   739             DomWidget *menu = createWidget(e, QLatin1String("QMenu"));
       
   740             menu->setAttributeName(name);
       
   741             menu->setElementProperty(properties);
       
   742             ui_child_list.append(menu);
       
   743 
       
   744             DomActionRef *a = new DomActionRef();
       
   745             a->setAttributeName(name);
       
   746             ui_action_list.append(a);
       
   747 
       
   748         } else if (t == QLatin1String("item")) {
       
   749             DomItem *item = new DomItem();
       
   750             item->read(e);
       
   751             ui_item_list.append(item);
       
   752         }
       
   753 
       
   754         e = e.nextSibling().toElement();
       
   755     }
       
   756 
       
   757     ui_widget->setElementProperty(ui_property_list);
       
   758     ui_widget->setElementAttribute(ui_attribute_list);
       
   759 
       
   760     if (ui_centralWidget != 0) {
       
   761         Q_ASSERT(ui_mainWindow != 0);
       
   762         ui_mainWindow->setElementWidget(ui_mainwindow_child_list);
       
   763         ui_widget = ui_centralWidget;
       
   764     }
       
   765 
       
   766     ui_widget->setElementWidget(ui_child_list);
       
   767     ui_widget->setElementAddAction(ui_action_list);
       
   768     ui_widget->setElementRow(ui_row_list);
       
   769     ui_widget->setElementColumn(ui_column_list);
       
   770     ui_widget->setElementItem(ui_item_list);
       
   771     ui_widget->setElementLayout(ui_layout_list);
       
   772 
       
   773     //ui_widget->setAttributeName(p->elementCstring());
       
   774 
       
   775     return ui_mainWindow ? ui_mainWindow : ui_widget;
       
   776 }
       
   777 
       
   778 DomLayout *Ui3Reader::createLayout(const QDomElement &w)
       
   779 {
       
   780     DomLayout *lay = new DomLayout();
       
   781 
       
   782     QList<DomLayoutItem*> ui_item_list;
       
   783     QList<DomProperty*> ui_property_list;
       
   784     QList<DomProperty*> ui_attribute_list;
       
   785 
       
   786     QString tagName = w.tagName().toLower();
       
   787 
       
   788     QString className;
       
   789     if (tagName == QLatin1String("vbox"))
       
   790         className = QLatin1String("QVBoxLayout");
       
   791     else if (tagName == QLatin1String("hbox"))
       
   792         className = QLatin1String("QHBoxLayout");
       
   793     else
       
   794         className = QLatin1String("QGridLayout");
       
   795 
       
   796     lay->setAttributeClass(className);
       
   797 
       
   798     createProperties(w, &ui_property_list, className);
       
   799     createAttributes(w, &ui_attribute_list, className);
       
   800 
       
   801     QDomElement e = w.firstChild().toElement();
       
   802     while (!e.isNull()) {
       
   803         QString t = e.tagName().toLower();
       
   804         if (t == QLatin1String("vbox")
       
   805                  || t == QLatin1String("hbox")
       
   806                  || t == QLatin1String("grid")
       
   807                  || t == QLatin1String("spacer")
       
   808                  || t == QLatin1String("widget")) {
       
   809             DomLayoutItem *lay_item = createLayoutItem(e);
       
   810             Q_ASSERT(lay_item != 0);
       
   811             ui_item_list.append(lay_item);
       
   812         }
       
   813 
       
   814         e = e.nextSibling().toElement();
       
   815     }
       
   816 
       
   817     lay->setElementItem(ui_item_list);
       
   818     lay->setElementProperty(ui_property_list);
       
   819     lay->setElementAttribute(ui_attribute_list);
       
   820 
       
   821     return lay;
       
   822 }
       
   823 
       
   824 DomLayoutItem *Ui3Reader::createLayoutItem(const QDomElement &e)
       
   825 {
       
   826     DomLayoutItem *lay_item = new DomLayoutItem;
       
   827 
       
   828     QString tagName = e.tagName().toLower();
       
   829     if (tagName == QLatin1String("widget")) {
       
   830         DomWidget *ui_widget = createWidget(e);
       
   831         Q_ASSERT(ui_widget != 0);
       
   832 
       
   833         if (ui_widget->attributeClass() == QLatin1String("QLayoutWidget")
       
   834                     && ui_widget->elementLayout().size() == 1) {
       
   835             QList<DomLayout*> layouts = ui_widget->elementLayout();
       
   836 
       
   837             ui_widget->setElementLayout(QList<DomLayout*>());
       
   838             delete ui_widget;
       
   839 
       
   840             DomLayout *layout = layouts.first();
       
   841             fixLayoutMargin(layout);
       
   842             lay_item->setElementLayout(layout);
       
   843         } else {
       
   844             if (ui_widget->attributeClass() == QLatin1String("QLayoutWidget"))
       
   845                 ui_widget->setAttributeClass(QLatin1String("QWidget"));
       
   846 
       
   847             lay_item->setElementWidget(ui_widget);
       
   848         }
       
   849     } else if (tagName == QLatin1String("spacer")) {
       
   850         DomSpacer *ui_spacer = new DomSpacer();
       
   851         QList<DomProperty*> properties;
       
   852 
       
   853         QByteArray name = DomTool::readProperty(e, QLatin1String("name"), QLatin1String("spacer")).toByteArray();
       
   854 
       
   855         Variant var;
       
   856         var.createSize(0, 0);
       
   857 
       
   858         QVariant def = qVariantFromValue(var);
       
   859 
       
   860         Size size = asVariant(DomTool::readProperty(e, QLatin1String("sizeHint"), def)).size;
       
   861         QString sizeType = QLatin1String("QSizePolicy::") + DomTool::readProperty(e, QLatin1String("sizeType"), QLatin1String("Expanding")).toString();
       
   862         QString orientation = QLatin1String("Qt::") + DomTool::readProperty(e, QLatin1String("orientation"), QLatin1String("Horizontal")).toString();
       
   863 
       
   864         ui_spacer->setAttributeName(QLatin1String(name));
       
   865 
       
   866         DomProperty *prop = 0;
       
   867 
       
   868         // sizeHint
       
   869         prop = new DomProperty();
       
   870         prop->setAttributeName(QLatin1String("sizeHint"));
       
   871         prop->setElementSize(new DomSize());
       
   872         prop->elementSize()->setElementWidth(size.width);
       
   873         prop->elementSize()->setElementHeight(size.height);
       
   874         properties.append(prop);
       
   875 
       
   876         // sizeType
       
   877         prop = new DomProperty();
       
   878         prop->setAttributeName(QLatin1String("sizeType"));
       
   879         prop->setElementEnum(sizeType);
       
   880         properties.append(prop);
       
   881 
       
   882         // orientation
       
   883         prop = new DomProperty();
       
   884         prop->setAttributeName(QLatin1String("orientation"));
       
   885         prop->setElementEnum(orientation);
       
   886         properties.append(prop);
       
   887 
       
   888         ui_spacer->setElementProperty(properties);
       
   889         lay_item->setElementSpacer(ui_spacer);
       
   890     } else {
       
   891         DomLayout *ui_layout = createLayout(e);
       
   892         Q_ASSERT(ui_layout != 0);
       
   893 
       
   894         fixLayoutMargin(ui_layout);
       
   895         lay_item->setElementLayout(ui_layout);
       
   896     }
       
   897 
       
   898     if (e.hasAttribute(QLatin1String("row")))
       
   899         lay_item->setAttributeRow(e.attribute(QLatin1String("row")).toInt());
       
   900     if (e.hasAttribute(QLatin1String("column")))
       
   901         lay_item->setAttributeColumn(e.attribute(QLatin1String("column")).toInt());
       
   902     if (e.hasAttribute(QLatin1String("rowspan")))
       
   903         lay_item->setAttributeRowSpan(e.attribute(QLatin1String("rowspan")).toInt());
       
   904     if (e.hasAttribute(QLatin1String("colspan")))
       
   905         lay_item->setAttributeColSpan(e.attribute(QLatin1String("colspan")).toInt());
       
   906 
       
   907     return lay_item;
       
   908 }
       
   909 
       
   910 void Ui3Reader::fixLayoutMargin(DomLayout *ui_layout)
       
   911 {
       
   912     Q_UNUSED(ui_layout)
       
   913 }
       
   914 
       
   915 static void addBooleanFontSubProperty(QDomDocument &doc,
       
   916                                       const QString &name, const QString &value,
       
   917                                       QDomElement &fontElement)
       
   918 {
       
   919     if (value == QLatin1String("true") || value == QLatin1String("1")) {
       
   920         QDomElement child = doc.createElement(name);
       
   921         child.appendChild(doc.createTextNode(QLatin1String("true")));
       
   922         fontElement.appendChild(child);
       
   923     } else {
       
   924         if (value == QLatin1String("false") || value == QLatin1String("0")) {
       
   925             QDomElement child = doc.createElement(name);
       
   926             child.appendChild(doc.createTextNode(QLatin1String("false")));
       
   927             fontElement.appendChild(child);
       
   928         }
       
   929     }
       
   930 }
       
   931 
       
   932 QDomElement Ui3Reader::findDerivedFontProperties(const QDomElement &n) const
       
   933 {
       
   934     bool italic = false;
       
   935     bool bold = false;
       
   936     bool underline = false;
       
   937     bool strikeout = false;
       
   938     bool family = false;
       
   939     bool pointsize = false;
       
   940 
       
   941     QDomDocument doc = n.ownerDocument();
       
   942     QDomElement result = doc.createElement(QLatin1String("font"));
       
   943 
       
   944     QDomNode pn = n.parentNode();
       
   945     while (!pn.isNull()) {
       
   946         for (QDomElement e = pn.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
       
   947             if (e.tagName().toLower() == QLatin1String("property") &&
       
   948                 e.attribute(QLatin1String("name")) == QLatin1String("font")) {
       
   949                 QDomElement f = e.firstChild().toElement();
       
   950                 for (QDomElement fp = f.firstChild().toElement(); !fp.isNull(); fp = fp.nextSibling().toElement()) {
       
   951                     QString name = fp.tagName().toLower();
       
   952                     QString text = fp.text();
       
   953                     if (!italic && name == QLatin1String("italic")) {
       
   954                         italic = true;
       
   955                         addBooleanFontSubProperty(doc, name, text, result);
       
   956                     } else if (!bold && name == QLatin1String("bold")) {
       
   957                         bold = true;
       
   958                         addBooleanFontSubProperty(doc, name, text, result);
       
   959                     } else if (!underline && name == QLatin1String("underline")) {
       
   960                         underline = true;
       
   961                         addBooleanFontSubProperty(doc, name, text, result);
       
   962                     } else if (!strikeout && name == QLatin1String("strikeout")) {
       
   963                         strikeout = true;
       
   964                         addBooleanFontSubProperty(doc, name, text, result);
       
   965                     } else if (!family && name == QLatin1String("family")) {
       
   966                         family = true;
       
   967                         QDomElement child = doc.createElement(name);
       
   968                         child.appendChild(doc.createTextNode(text));
       
   969                         result.appendChild(child);
       
   970                     } else if (!pointsize && name == QLatin1String("pointsize")) {
       
   971                         pointsize = true;
       
   972                         QDomElement child = doc.createElement(name);
       
   973                         child.appendChild(doc.createTextNode(text));
       
   974                         result.appendChild(child);
       
   975                     }
       
   976                 }
       
   977             }
       
   978         }
       
   979         pn = pn.parentNode();
       
   980     }
       
   981 
       
   982     return result;
       
   983 }
       
   984 
       
   985 void Ui3Reader::createProperties(const QDomElement &n, QList<DomProperty*> *properties,
       
   986                                  const QString &className)
       
   987 {
       
   988     QString objectName;
       
   989 
       
   990     bool wordWrapFound = false;
       
   991     bool wordWrapPropertyFound = false;
       
   992 
       
   993     for (QDomElement e=n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
       
   994         if (e.tagName().toLower() == QLatin1String("property")) {
       
   995             QString name = e.attribute(QLatin1String("name"));
       
   996 
       
   997             // changes in QPalette
       
   998             if (name == QLatin1String("colorGroup")
       
   999                 || name == QLatin1String("paletteForegroundColor")
       
  1000                 || name == QLatin1String("paletteBackgroundColor")
       
  1001                 || name == QLatin1String("backgroundMode")
       
  1002                 || name == QLatin1String("backgroundOrigin")
       
  1003                 || name == QLatin1String("paletteBackgroundPixmap")
       
  1004                 || name == QLatin1String("backgroundBrush")) {
       
  1005                 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
       
  1006                 continue;
       
  1007             }
       
  1008 
       
  1009             // changes in QFrame
       
  1010             if (name == QLatin1String("contentsRect")) {
       
  1011                 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
       
  1012                 continue;
       
  1013             }
       
  1014 
       
  1015             // changes in QWidget
       
  1016             if (name == QLatin1String("underMouse")
       
  1017                 || name == QLatin1String("ownFont")) {
       
  1018                 errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
       
  1019                 continue;
       
  1020             }
       
  1021 
       
  1022             if (name == QLatin1String("font")) {
       
  1023                 QDomElement f = e.firstChild().toElement();
       
  1024                 e.appendChild(findDerivedFontProperties(f));
       
  1025                 e.removeChild(f);
       
  1026             }
       
  1027 
       
  1028             DomProperty *prop = readProperty(e);
       
  1029             if (!prop)
       
  1030                 continue;
       
  1031 
       
  1032             if (prop->kind() == DomProperty::String) {
       
  1033                 QDomNodeList comments = e.elementsByTagName(QLatin1String("comment"));
       
  1034                 if (comments.length()) {
       
  1035                     QString comment = comments.item(0).firstChild().toText().data();
       
  1036                     if (!comment.isEmpty())
       
  1037                         prop->elementString()->setAttributeComment(comment);
       
  1038                 }
       
  1039             }
       
  1040 
       
  1041             // objectName
       
  1042             if (name == QLatin1String("name")) {
       
  1043                 objectName = prop->elementCstring();
       
  1044                 continue;
       
  1045             }
       
  1046 
       
  1047             if (className == QLatin1String("Line")
       
  1048                 && prop->attributeName() == QLatin1String("orientation")) {
       
  1049                 delete prop;
       
  1050                 continue;
       
  1051             }
       
  1052 
       
  1053             if (className.mid(1) == QLatin1String("LineEdit")) {
       
  1054                 if (name == QLatin1String("hasMarkedText")) {
       
  1055                     prop->setAttributeName(QLatin1String("hasSelectedText"));
       
  1056                 } else if (name == QLatin1String("edited")) {
       
  1057                     prop->setAttributeName(QLatin1String("modified"));
       
  1058                 } else if (name == QLatin1String("markedText")) {
       
  1059                     prop->setAttributeName(QLatin1String("selectedText"));
       
  1060                 }
       
  1061             }
       
  1062 
       
  1063             if (className.endsWith(QLatin1String("ComboBox"))) {
       
  1064                 CONVERT_PROPERTY(QLatin1String("currentItem"), QLatin1String("currentIndex"));
       
  1065                 CONVERT_PROPERTY(QLatin1String("insertionPolicy"), QLatin1String("insertPolicy"));
       
  1066             }
       
  1067 
       
  1068             if (className == QLatin1String("QToolBar")) {
       
  1069                 if (name == QLatin1String("label")) {
       
  1070                     prop->setAttributeName(QLatin1String("windowTitle"));
       
  1071                 }
       
  1072             }
       
  1073 
       
  1074             CONVERT_PROPERTY(QLatin1String("customWhatsThis"), QLatin1String("whatsThis"));
       
  1075             CONVERT_PROPERTY(QLatin1String("icon"), QLatin1String("windowIcon"));
       
  1076             CONVERT_PROPERTY(QLatin1String("iconText"), QLatin1String("windowIconText"));
       
  1077             CONVERT_PROPERTY(QLatin1String("caption"), QLatin1String("windowTitle"));
       
  1078 
       
  1079             if (name == QLatin1String("name")) {
       
  1080                 continue; // skip the property name
       
  1081             }
       
  1082 
       
  1083             if (name == QLatin1String("accel")) {
       
  1084                 prop->setAttributeName(QLatin1String("shortcut"));
       
  1085             }
       
  1086 
       
  1087             CONVERT_PROPERTY(QLatin1String("pixmap"), QLatin1String("icon"));
       
  1088             CONVERT_PROPERTY(QLatin1String("iconSet"), QLatin1String("icon"));
       
  1089             CONVERT_PROPERTY(QLatin1String("textLabel"), QLatin1String("text"));
       
  1090 
       
  1091             CONVERT_PROPERTY(QLatin1String("toggleButton"), QLatin1String("checkable"));
       
  1092             CONVERT_PROPERTY(QLatin1String("on"), QLatin1String("checked"));
       
  1093 
       
  1094             CONVERT_PROPERTY(QLatin1String("maxValue"), QLatin1String("maximum"));
       
  1095             CONVERT_PROPERTY(QLatin1String("minValue"), QLatin1String("minimum"));
       
  1096             CONVERT_PROPERTY(QLatin1String("lineStep"), QLatin1String("singleStep"));
       
  1097 
       
  1098             // QSlider
       
  1099             CONVERT_PROPERTY(QLatin1String("tickmarks"), QLatin1String("tickPosition"));
       
  1100 
       
  1101             name = prop->attributeName(); // sync the name
       
  1102 
       
  1103             if (className == QLatin1String("QLabel")) {
       
  1104                 if (name == QLatin1String("alignment")) {
       
  1105                     const QString v = prop->elementSet();
       
  1106                     if (v.contains(QRegExp(QLatin1String("\\bWordBreak\\b"))))
       
  1107                         wordWrapFound = true;
       
  1108                 } else if (name == QLatin1String("wordWrap")) {
       
  1109                     wordWrapPropertyFound = true;
       
  1110                 }
       
  1111             }
       
  1112 
       
  1113             // resolve the flags and enumerator
       
  1114             if (prop->kind() == DomProperty::Set) {
       
  1115                 QStringList flags = prop->elementSet().split(QLatin1Char('|'));
       
  1116                 QStringList v;
       
  1117                 foreach (QString fl, flags) {
       
  1118                     QString e = WidgetInfo::resolveEnumerator(className, fl);
       
  1119                     if (e.isEmpty()) {
       
  1120                         e = m_porting->renameEnumerator(className + QLatin1String("::") + fl);
       
  1121                     }
       
  1122 
       
  1123                     if (e.isEmpty()) {
       
  1124                         fprintf(stderr, "uic3: flag '%s' for widget '%s' is not supported\n", fl.latin1(), className.latin1());
       
  1125                         continue;
       
  1126                     }
       
  1127 
       
  1128                     v.append(e);
       
  1129                 }
       
  1130 
       
  1131                 if (v.isEmpty()) {
       
  1132                     delete prop;
       
  1133                     continue;
       
  1134                 }
       
  1135 
       
  1136                 prop->setElementSet(v.join(QLatin1String("|")));
       
  1137             } else if (prop->kind() == DomProperty::Enum) {
       
  1138                 QString e = WidgetInfo::resolveEnumerator(className, prop->elementEnum());
       
  1139                 if (e.isEmpty()) {
       
  1140                     e = m_porting->renameEnumerator(className + QLatin1String("::") + prop->elementEnum());
       
  1141                 }
       
  1142 
       
  1143                 if (e.isEmpty()) {
       
  1144                     fprintf(stderr, "uic3: enumerator '%s' for widget '%s' is not supported\n",
       
  1145                             prop->elementEnum().latin1(), className.latin1());
       
  1146 
       
  1147                     delete prop;
       
  1148                     continue;
       
  1149                 }
       
  1150                 prop->setElementEnum(e);
       
  1151             }
       
  1152 
       
  1153 
       
  1154             if (className.size()
       
  1155                 && !(className == QLatin1String("QLabel") && name == QLatin1String("buddy"))
       
  1156                 && !(name == QLatin1String("buttonGroupId"))
       
  1157                 && !(name == QLatin1String("frameworkCode"))
       
  1158                 && !(name == QLatin1String("database"))) {
       
  1159                 if (!WidgetInfo::isValidProperty(className, name)) {
       
  1160                     errorInvalidProperty(name, objectName, className, n.lineNumber(), n.columnNumber());
       
  1161                     delete prop;
       
  1162                 } else {
       
  1163                     properties->append(prop);
       
  1164                 }
       
  1165             } else {
       
  1166                 properties->append(prop);
       
  1167             }
       
  1168         }
       
  1169     }
       
  1170     if (className == QLatin1String("QLabel") && !wordWrapPropertyFound) {
       
  1171         DomProperty *wordWrap = new DomProperty();
       
  1172         wordWrap->setAttributeName(QLatin1String("wordWrap"));
       
  1173         if (wordWrapFound)
       
  1174             wordWrap->setElementBool(QLatin1String("true"));
       
  1175         else
       
  1176             wordWrap->setElementBool(QLatin1String("false"));
       
  1177         properties->append(wordWrap);
       
  1178     }
       
  1179 }
       
  1180 
       
  1181 static int toQt4SizePolicy(int qt3SizePolicy)
       
  1182 {
       
  1183     if (qt3SizePolicy == 2) // qt 3 Ignored value
       
  1184         return QSizePolicy::Ignored;
       
  1185     return qt3SizePolicy;
       
  1186 }
       
  1187 
       
  1188 DomProperty *Ui3Reader::readProperty(const QDomElement &e)
       
  1189 {
       
  1190     QString name = e.firstChild().toElement().tagName().toLower();
       
  1191 
       
  1192     if (name == QLatin1String("class")) // skip class
       
  1193         name = e.firstChild().nextSibling().toElement().tagName().toLower();
       
  1194 
       
  1195     DomProperty *p = new DomProperty;
       
  1196     p->read(e);
       
  1197 
       
  1198     if (p->kind() == DomProperty::Number) {
       
  1199         QString value = e.firstChild().toElement().firstChild().nodeValue();
       
  1200 
       
  1201         if (value.contains(QLatin1Char('.'))) {
       
  1202             p->setElementDouble(value.toDouble());
       
  1203         }
       
  1204     } else if (p->kind() == DomProperty::Pixmap) {
       
  1205         DomResourcePixmap *domPix = p->elementPixmap();
       
  1206         if (m_extractImages) {
       
  1207             QString imageFile = domPix->text() + QLatin1String(".xpm");
       
  1208             if (m_imageMap.contains(domPix->text()))
       
  1209                 imageFile = m_imageMap.value(domPix->text());
       
  1210             domPix->setAttributeResource(m_qrcOutputFile);
       
  1211             domPix->setText(QLatin1String(":/") + nameOfClass + QLatin1String("/images/") + imageFile);
       
  1212         }
       
  1213     } else if (p->kind() == DomProperty::SizePolicy) {
       
  1214         DomSizePolicy *sp = p->elementSizePolicy();
       
  1215         if (sp) {
       
  1216             if (sp->hasElementHSizeType())
       
  1217                 sp->setElementHSizeType(toQt4SizePolicy(sp->elementHSizeType()));
       
  1218             if (sp->hasElementVSizeType())
       
  1219                 sp->setElementVSizeType(toQt4SizePolicy(sp->elementVSizeType()));
       
  1220         }
       
  1221     } else if (p->kind() == DomProperty::Unknown) {
       
  1222         delete p;
       
  1223         p = 0;
       
  1224     }
       
  1225 
       
  1226     return p;
       
  1227 }
       
  1228 
       
  1229 void Ui3Reader::createAttributes(const QDomElement &n, QList<DomProperty*> *properties,
       
  1230                                  const QString &className)
       
  1231 {
       
  1232     Q_UNUSED(className);
       
  1233 
       
  1234     for (QDomElement e=n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement()) {
       
  1235         if (e.tagName().toLower() == QLatin1String("attribute")) {
       
  1236             QString name = e.attribute(QLatin1String("name"));
       
  1237 
       
  1238             DomProperty *prop = readProperty(e);
       
  1239             if (!prop)
       
  1240                 continue;
       
  1241 
       
  1242             properties->append(prop);
       
  1243         }
       
  1244     }
       
  1245 }
       
  1246 
       
  1247 QString Ui3Reader::fixDeclaration(const QString &d) const
       
  1248 {
       
  1249     QString text;
       
  1250 
       
  1251     int i = 0;
       
  1252     while (i < d.size()) {
       
  1253         QChar ch = d.at(i);
       
  1254 
       
  1255         if (ch.isLetter() || ch == QLatin1Char('_')) {
       
  1256             int start = i;
       
  1257             while (i < d.size() && (d.at(i).isLetterOrNumber() || d.at(i) == QLatin1Char('_')))
       
  1258                 ++i;
       
  1259 
       
  1260             text += fixClassName(d.mid(start, i-start));
       
  1261         } else {
       
  1262             text += ch;
       
  1263             ++i;
       
  1264         }
       
  1265     }
       
  1266 
       
  1267     return text;
       
  1268 }
       
  1269 
       
  1270 /*
       
  1271     fixes a (possible composite) type name
       
  1272 */
       
  1273 QString Ui3Reader::fixType(const QString &t) const
       
  1274 {
       
  1275     QString newText = t;
       
  1276     //split type name on <>*& and whitespace
       
  1277     QStringList typeNames = t.split(QRegExp(QLatin1String("<|>|\\*|&| ")), QString::SkipEmptyParts);
       
  1278     foreach(QString typeName , typeNames) {
       
  1279         QString newName = fixClassName(typeName);
       
  1280         if( newName != typeName ) {
       
  1281             newText.replace(typeName, newName);
       
  1282         }
       
  1283     }
       
  1284     return newText;
       
  1285 }
       
  1286 
       
  1287 QString Ui3Reader::fixMethod(const QString &method) const
       
  1288 {
       
  1289     const QByteArray normalized = QMetaObject::normalizedSignature(method.toLatin1());
       
  1290     QByteArray result;
       
  1291     int index = normalized.indexOf('(');
       
  1292     if (index == -1)
       
  1293         return QLatin1String(normalized);
       
  1294     result.append(normalized.left(++index));
       
  1295     int limit = normalized.length()-1;
       
  1296     while (index < limit) {
       
  1297         QByteArray type;
       
  1298         while ((index < limit) && (normalized.at(index) != ','))
       
  1299             type.append(normalized.at(index++));
       
  1300         result.append(fixType(QLatin1String(type)).toLatin1());
       
  1301         if ((index < limit) && (normalized.at(index) == ','))
       
  1302             result.append(normalized.at(index++));
       
  1303     }
       
  1304     result.append(normalized.mid(index));
       
  1305     return QLatin1String(result);
       
  1306 }
       
  1307 
       
  1308 QT_END_NAMESPACE