| 1 | /**************************************************************************** | 
|---|
| 2 | ** | 
|---|
| 3 | ** Copyright (C) 2010 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 | ** 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 qt-info@nokia.com. | 
|---|
| 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) | 
|---|
| 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 |  | 
|---|
| 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 | 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 |  | 
|---|
| 781 | DomLayout *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 |  | 
|---|
| 832 | DomLayoutItem *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 |  | 
|---|
| 918 | void Ui3Reader::fixLayoutMargin(DomLayout *ui_layout) | 
|---|
| 919 | { | 
|---|
| 920 | Q_UNUSED(ui_layout) | 
|---|
| 921 | } | 
|---|
| 922 |  | 
|---|
| 923 | static 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 |  | 
|---|
| 940 | QDomElement 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 |  | 
|---|
| 993 | void 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 |  | 
|---|
| 1189 | static int toQt4SizePolicy(int qt3SizePolicy) | 
|---|
| 1190 | { | 
|---|
| 1191 | if (qt3SizePolicy == 2) // qt 3 Ignored value | 
|---|
| 1192 | return QSizePolicy::Ignored; | 
|---|
| 1193 | return qt3SizePolicy; | 
|---|
| 1194 | } | 
|---|
| 1195 |  | 
|---|
| 1196 | DomProperty *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 |  | 
|---|
| 1237 | void 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 |  | 
|---|
| 1255 | QString 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 | */ | 
|---|
| 1281 | QString 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 |  | 
|---|
| 1295 | QString 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 |  | 
|---|
| 1316 | QT_END_NAMESPACE | 
|---|