| 1 | /********************************************************************** | 
|---|
| 2 | ** Copyright (C) 2000 Trolltech AS.  All rights reserved. | 
|---|
| 3 | ** | 
|---|
| 4 | ** This file is part of Qt Designer. | 
|---|
| 5 | ** | 
|---|
| 6 | ** This file may be distributed and/or modified under the terms of the | 
|---|
| 7 | ** GNU General Public License version 2 as published by the Free Software | 
|---|
| 8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 
|---|
| 9 | ** packaging of this file. | 
|---|
| 10 | ** | 
|---|
| 11 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition | 
|---|
| 12 | ** licenses may use this file in accordance with the Qt Commercial License | 
|---|
| 13 | ** Agreement provided with the Software. | 
|---|
| 14 | ** | 
|---|
| 15 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 
|---|
| 16 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 
|---|
| 17 | ** | 
|---|
| 18 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 
|---|
| 19 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for | 
|---|
| 20 | **   information about Qt Commercial License Agreements. | 
|---|
| 21 | ** | 
|---|
| 22 | ** Contact info@trolltech.com if any conditions of this licensing are | 
|---|
| 23 | ** not clear to you. | 
|---|
| 24 | ** | 
|---|
| 25 | **********************************************************************/ | 
|---|
| 26 |  | 
|---|
| 27 | #include "uic.h" | 
|---|
| 28 | #include "parser.h" | 
|---|
| 29 | #include "widgetdatabase.h" | 
|---|
| 30 | #include "domtool.h" | 
|---|
| 31 | #include <qfile.h> | 
|---|
| 32 | #include <qstringlist.h> | 
|---|
| 33 | #include <qdatetime.h> | 
|---|
| 34 | #define NO_STATIC_COLORS | 
|---|
| 35 | #include <globaldefs.h> | 
|---|
| 36 | #include <qregexp.h> | 
|---|
| 37 | #include <stdio.h> | 
|---|
| 38 | #include <stdlib.h> | 
|---|
| 39 |  | 
|---|
| 40 | bool Uic::isMainWindow = FALSE; | 
|---|
| 41 |  | 
|---|
| 42 | QString Uic::getComment( const QDomNode& n ) | 
|---|
| 43 | { | 
|---|
| 44 | QDomNode child = n.firstChild(); | 
|---|
| 45 | while ( !child.isNull() ) { | 
|---|
| 46 | if ( child.toElement().tagName() == "comment" ) | 
|---|
| 47 | return child.toElement().firstChild().toText().data(); | 
|---|
| 48 | child = child.nextSibling(); | 
|---|
| 49 | } | 
|---|
| 50 | return QString::null; | 
|---|
| 51 | } | 
|---|
| 52 |  | 
|---|
| 53 | QString Uic::mkBool( bool b ) | 
|---|
| 54 | { | 
|---|
| 55 | return b? "TRUE" : "FALSE"; | 
|---|
| 56 | } | 
|---|
| 57 |  | 
|---|
| 58 | QString Uic::mkBool( const QString& s ) | 
|---|
| 59 | { | 
|---|
| 60 | return mkBool( s == "true" || s == "1" ); | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | bool Uic::toBool( const QString& s ) | 
|---|
| 64 | { | 
|---|
| 65 | return s == "true" || s.toInt() != 0; | 
|---|
| 66 | } | 
|---|
| 67 |  | 
|---|
| 68 | QString Uic::fixString( const QString &str, bool encode ) | 
|---|
| 69 | { | 
|---|
| 70 | QString s; | 
|---|
| 71 | if ( !encode ) { | 
|---|
| 72 | s = str; | 
|---|
| 73 | s.replace( "\\", "\\\\" ); | 
|---|
| 74 | s.replace( "\"", "\\\"" ); | 
|---|
| 75 | s.replace( "\r", "" ); | 
|---|
| 76 | s.replace( "\n", "\\n\"\n\"" ); | 
|---|
| 77 | } else { | 
|---|
| 78 | QCString utf8 = str.utf8(); | 
|---|
| 79 | const int l = utf8.length(); | 
|---|
| 80 | for ( int i = 0; i < l; ++i ) | 
|---|
| 81 | s += "\\x" + QString::number( (uchar)utf8[i], 16 ); | 
|---|
| 82 | } | 
|---|
| 83 |  | 
|---|
| 84 | return "\"" + s + "\""; | 
|---|
| 85 | } | 
|---|
| 86 |  | 
|---|
| 87 | QString Uic::trcall( const QString& sourceText, const QString& comment ) | 
|---|
| 88 | { | 
|---|
| 89 | if ( sourceText.isEmpty() && comment.isEmpty() ) | 
|---|
| 90 | return "QString::null"; | 
|---|
| 91 |  | 
|---|
| 92 | QString t = trmacro; | 
|---|
| 93 | bool encode = FALSE; | 
|---|
| 94 | if ( t.isNull() ) { | 
|---|
| 95 | t = "tr"; | 
|---|
| 96 | for ( int i = 0; i < (int) sourceText.length(); i++ ) { | 
|---|
| 97 | if ( sourceText[i].unicode() >= 0x80 ) { | 
|---|
| 98 | t = "trUtf8"; | 
|---|
| 99 | encode = TRUE; | 
|---|
| 100 | break; | 
|---|
| 101 | } | 
|---|
| 102 | } | 
|---|
| 103 | } | 
|---|
| 104 |  | 
|---|
| 105 | if ( comment.isEmpty() ) { | 
|---|
| 106 | return t + "( " + fixString( sourceText, encode ) + " )"; | 
|---|
| 107 | } else { | 
|---|
| 108 | return t + "( " + fixString( sourceText, encode ) + ", " + | 
|---|
| 109 | fixString( comment, encode ) + " )"; | 
|---|
| 110 | } | 
|---|
| 111 | } | 
|---|
| 112 |  | 
|---|
| 113 | QString Uic::mkStdSet( const QString& prop ) | 
|---|
| 114 | { | 
|---|
| 115 | return QString( "set" ) + prop[0].upper() + prop.mid(1); | 
|---|
| 116 | } | 
|---|
| 117 |  | 
|---|
| 118 |  | 
|---|
| 119 |  | 
|---|
| 120 | /*! | 
|---|
| 121 | \class Uic uic.h | 
|---|
| 122 | \brief User Interface Compiler | 
|---|
| 123 |  | 
|---|
| 124 | The class Uic encapsulates the user interface compiler (uic). | 
|---|
| 125 | */ | 
|---|
| 126 | Uic::Uic( const QString &fn, const char *outputFn, QTextStream &outStream, | 
|---|
| 127 | QDomDocument doc, bool decl, bool subcl, const QString &trm, | 
|---|
| 128 | const QString& subClass, bool omitForwardDecls ) | 
|---|
| 129 | : out( outStream ), trout( &languageChangeBody ), | 
|---|
| 130 | outputFileName( outputFn ), trmacro( trm ), nofwd( omitForwardDecls ) | 
|---|
| 131 | { | 
|---|
| 132 | fileName = fn; | 
|---|
| 133 | writeFunctImpl = TRUE; | 
|---|
| 134 | defMargin = BOXLAYOUT_DEFAULT_MARGIN; | 
|---|
| 135 | defSpacing = BOXLAYOUT_DEFAULT_SPACING; | 
|---|
| 136 | externPixmaps = FALSE; | 
|---|
| 137 | indent = "    "; // default indent | 
|---|
| 138 |  | 
|---|
| 139 | item_used = cg_used = pal_used = 0; | 
|---|
| 140 |  | 
|---|
| 141 | layouts << "hbox" << "vbox" << "grid"; | 
|---|
| 142 | tags = layouts; | 
|---|
| 143 | tags << "widget"; | 
|---|
| 144 |  | 
|---|
| 145 | pixmapLoaderFunction = getPixmapLoaderFunction( doc.firstChild().toElement() ); | 
|---|
| 146 | nameOfClass = getFormClassName( doc.firstChild().toElement() ); | 
|---|
| 147 |  | 
|---|
| 148 | uiFileVersion = doc.firstChild().toElement().attribute("version"); | 
|---|
| 149 | stdsetdef = toBool( doc.firstChild().toElement().attribute("stdsetdef") ); | 
|---|
| 150 |  | 
|---|
| 151 | if ( doc.firstChild().isNull() || doc.firstChild().firstChild().isNull() ) | 
|---|
| 152 | return; | 
|---|
| 153 | QDomElement e = doc.firstChild().firstChild().toElement(); | 
|---|
| 154 | QDomElement widget; | 
|---|
| 155 | while ( !e.isNull() ) { | 
|---|
| 156 | if ( e.tagName() == "widget" ) { | 
|---|
| 157 | widget = e; | 
|---|
| 158 | } else if ( e.tagName() == "pixmapinproject" ) { | 
|---|
| 159 | externPixmaps = TRUE; | 
|---|
| 160 | } else if ( e.tagName() == "layoutdefaults" ) { | 
|---|
| 161 | defSpacing = e.attribute( "spacing", defSpacing.toString() ); | 
|---|
| 162 | defMargin = e.attribute( "margin", defMargin.toString() ); | 
|---|
| 163 | } else if ( e.tagName() == "layoutfunctions" ) { | 
|---|
| 164 | defSpacing = e.attribute( "spacing", defSpacing.toString() ); | 
|---|
| 165 | bool ok; | 
|---|
| 166 | defSpacing.toInt( &ok ); | 
|---|
| 167 | if ( !ok ) { | 
|---|
| 168 | QString buf = defSpacing.toString(); | 
|---|
| 169 | defSpacing = buf.append( "()" ); | 
|---|
| 170 | } | 
|---|
| 171 | defMargin = e.attribute( "margin", defMargin.toString() ); | 
|---|
| 172 | defMargin.toInt( &ok ); | 
|---|
| 173 | if ( !ok ) { | 
|---|
| 174 | QString buf = defMargin.toString(); | 
|---|
| 175 | defMargin = buf.append( "()" ); | 
|---|
| 176 | } | 
|---|
| 177 | } | 
|---|
| 178 | e = e.nextSibling().toElement(); | 
|---|
| 179 | } | 
|---|
| 180 | e = widget; | 
|---|
| 181 |  | 
|---|
| 182 | if ( nameOfClass.isEmpty() ) | 
|---|
| 183 | nameOfClass = getObjectName( e ); | 
|---|
| 184 | namespaces = QStringList::split( "::", nameOfClass ); | 
|---|
| 185 | bareNameOfClass = namespaces.last(); | 
|---|
| 186 | namespaces.remove( namespaces.fromLast() ); | 
|---|
| 187 |  | 
|---|
| 188 | if ( subcl ) { | 
|---|
| 189 | if ( decl ) | 
|---|
| 190 | createSubDecl( e, subClass ); | 
|---|
| 191 | else | 
|---|
| 192 | createSubImpl( e, subClass ); | 
|---|
| 193 | } else { | 
|---|
| 194 | if ( decl ) | 
|---|
| 195 | createFormDecl( e ); | 
|---|
| 196 | else | 
|---|
| 197 | createFormImpl( e ); | 
|---|
| 198 | } | 
|---|
| 199 |  | 
|---|
| 200 | } | 
|---|
| 201 |  | 
|---|
| 202 | /*! Extracts a pixmap loader function from \a e | 
|---|
| 203 | */ | 
|---|
| 204 | QString Uic::getPixmapLoaderFunction( const QDomElement& e ) | 
|---|
| 205 | { | 
|---|
| 206 | QDomElement n; | 
|---|
| 207 | for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 208 | if ( n.tagName() == "pixmapfunction" ) | 
|---|
| 209 | return n.firstChild().toText().data(); | 
|---|
| 210 | } | 
|---|
| 211 | return QString::null; | 
|---|
| 212 | } | 
|---|
| 213 |  | 
|---|
| 214 |  | 
|---|
| 215 | /*! Extracts the forms class name from \a e | 
|---|
| 216 | */ | 
|---|
| 217 | QString Uic::getFormClassName( const QDomElement& e ) | 
|---|
| 218 | { | 
|---|
| 219 | QDomElement n; | 
|---|
| 220 | QString cn; | 
|---|
| 221 | for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 222 | if ( n.tagName() == "class" ) { | 
|---|
| 223 | QString s = n.firstChild().toText().data(); | 
|---|
| 224 | int i; | 
|---|
| 225 | while ( ( i = s.find(' ' )) != -1 ) | 
|---|
| 226 | s[i] = '_'; | 
|---|
| 227 | cn = s; | 
|---|
| 228 | } | 
|---|
| 229 | } | 
|---|
| 230 | return cn; | 
|---|
| 231 | } | 
|---|
| 232 |  | 
|---|
| 233 | /*! Extracts a class name from \a e. | 
|---|
| 234 | */ | 
|---|
| 235 | QString Uic::getClassName( const QDomElement& e ) | 
|---|
| 236 | { | 
|---|
| 237 | QString s = e.attribute( "class" ); | 
|---|
| 238 | if ( s.isEmpty() && e.tagName() == "toolbar" ) | 
|---|
| 239 | s = "QToolBar"; | 
|---|
| 240 | else if ( s.isEmpty() && e.tagName() == "menubar" ) | 
|---|
| 241 | s = "QMenuBar"; | 
|---|
| 242 | return s; | 
|---|
| 243 | } | 
|---|
| 244 |  | 
|---|
| 245 | /*! Returns TRUE if database framework code is generated, else FALSE. | 
|---|
| 246 | */ | 
|---|
| 247 |  | 
|---|
| 248 | bool Uic::isFrameworkCodeGenerated( const QDomElement& e ) | 
|---|
| 249 | { | 
|---|
| 250 | QDomElement n = getObjectProperty( e, "frameworkCode" ); | 
|---|
| 251 | if ( n.attribute("name") == "frameworkCode" && | 
|---|
| 252 | !DomTool::elementToVariant( n.firstChild().toElement(), QVariant( TRUE, 0 ) ).toBool() ) | 
|---|
| 253 | return FALSE; | 
|---|
| 254 | return TRUE; | 
|---|
| 255 | } | 
|---|
| 256 |  | 
|---|
| 257 | /*! Extracts an object name from \a e. It's stored in the 'name' | 
|---|
| 258 | property. | 
|---|
| 259 | */ | 
|---|
| 260 | QString Uic::getObjectName( const QDomElement& e ) | 
|---|
| 261 | { | 
|---|
| 262 | QDomElement n = getObjectProperty( e, "name" ); | 
|---|
| 263 | if ( n.firstChild().toElement().tagName() == "cstring" ) | 
|---|
| 264 | return n.firstChild().toElement().firstChild().toText().data(); | 
|---|
| 265 | return QString::null; | 
|---|
| 266 | } | 
|---|
| 267 |  | 
|---|
| 268 | /*! Extracts an layout name from \a e. It's stored in the 'name' | 
|---|
| 269 | property of the preceeding sibling (the first child of a QLayoutWidget). | 
|---|
| 270 | */ | 
|---|
| 271 | QString Uic::getLayoutName( const QDomElement& e ) | 
|---|
| 272 | { | 
|---|
| 273 | QDomElement p = e.parentNode().toElement(); | 
|---|
| 274 | QString name; | 
|---|
| 275 |  | 
|---|
| 276 | if ( getClassName(p) != "QLayoutWidget" ) | 
|---|
| 277 | name = "Layout"; | 
|---|
| 278 |  | 
|---|
| 279 | QDomElement n = getObjectProperty( p, "name" ); | 
|---|
| 280 | if ( n.firstChild().toElement().tagName() == "cstring" ) { | 
|---|
| 281 | name.prepend( n.firstChild().toElement().firstChild().toText().data() ); | 
|---|
| 282 | return QStringList::split( "::", name ).last(); | 
|---|
| 283 | } | 
|---|
| 284 | return e.tagName(); | 
|---|
| 285 | } | 
|---|
| 286 |  | 
|---|
| 287 |  | 
|---|
| 288 | QString Uic::getDatabaseInfo( const QDomElement& e, const QString& tag ) | 
|---|
| 289 | { | 
|---|
| 290 | QDomElement n; | 
|---|
| 291 | QDomElement n1; | 
|---|
| 292 | int child = 0; | 
|---|
| 293 | // database info is a stringlist stored in this order | 
|---|
| 294 | if ( tag == "connection" ) | 
|---|
| 295 | child = 0; | 
|---|
| 296 | else if ( tag == "table" ) | 
|---|
| 297 | child = 1; | 
|---|
| 298 | else if ( tag == "field" ) | 
|---|
| 299 | child = 2; | 
|---|
| 300 | else | 
|---|
| 301 | return QString::null; | 
|---|
| 302 | n = getObjectProperty( e, "database" ); | 
|---|
| 303 | if ( n.firstChild().toElement().tagName() == "stringlist" ) { | 
|---|
| 304 | // find correct stringlist entry | 
|---|
| 305 | QDomElement n1 = n.firstChild().firstChild().toElement(); | 
|---|
| 306 | for ( int i = 0; i < child && !n1.isNull(); ++i ) | 
|---|
| 307 | n1 = n1.nextSibling().toElement(); | 
|---|
| 308 | if ( n1.isNull() ) | 
|---|
| 309 | return QString::null; | 
|---|
| 310 | return n1.firstChild().toText().data(); | 
|---|
| 311 | } | 
|---|
| 312 | return QString::null; | 
|---|
| 313 | } | 
|---|
| 314 |  | 
|---|
| 315 |  | 
|---|
| 316 | void Uic::registerLayouts( const QDomElement &e ) | 
|---|
| 317 | { | 
|---|
| 318 | if ( layouts.contains(e.tagName())) { | 
|---|
| 319 | createObjectDecl(e); | 
|---|
| 320 | QString t = e.tagName(); | 
|---|
| 321 | if ( t == "vbox" || t == "hbox" || t == "grid" ) | 
|---|
| 322 | createSpacerDecl( e ); | 
|---|
| 323 | } | 
|---|
| 324 |  | 
|---|
| 325 | QDomNodeList nl = e.childNodes(); | 
|---|
| 326 | for ( int i = 0; i < (int) nl.length(); ++i ) | 
|---|
| 327 | registerLayouts( nl.item(i).toElement() ); | 
|---|
| 328 | } | 
|---|
| 329 |  | 
|---|
| 330 |  | 
|---|
| 331 | /*! | 
|---|
| 332 | Returns include file for class \a className or a null string. | 
|---|
| 333 | */ | 
|---|
| 334 | QString Uic::getInclude( const QString& className ) | 
|---|
| 335 | { | 
|---|
| 336 | int wid = WidgetDatabase::idFromClassName( className ); | 
|---|
| 337 | if ( wid != -1 ) | 
|---|
| 338 | return WidgetDatabase::includeFile( wid ); | 
|---|
| 339 | return QString::null; | 
|---|
| 340 | } | 
|---|
| 341 |  | 
|---|
| 342 |  | 
|---|
| 343 | void Uic::createActionDecl( const QDomElement& e ) | 
|---|
| 344 | { | 
|---|
| 345 | QString objClass = e.tagName() == "action" ? "QAction" : "QActionGroup"; | 
|---|
| 346 | QString objName = getObjectName( e ); | 
|---|
| 347 | if ( objName.isEmpty() ) | 
|---|
| 348 | return; | 
|---|
| 349 | out << "    " << objClass << "* " << objName << ";" << endl; | 
|---|
| 350 | if ( e.tagName() == "actiongroup" ) { | 
|---|
| 351 | for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 352 | if ( n.tagName() == "action" || n.tagName() == "actiongroup" ) | 
|---|
| 353 | createActionDecl( n ); | 
|---|
| 354 | } | 
|---|
| 355 | } | 
|---|
| 356 | } | 
|---|
| 357 |  | 
|---|
| 358 | void Uic::createToolbarDecl( const QDomElement &e ) | 
|---|
| 359 | { | 
|---|
| 360 | if ( e.tagName() == "toolbar" ) | 
|---|
| 361 | out << "    " << "QToolBar *" << getObjectName( e ) << ";" << endl; | 
|---|
| 362 | } | 
|---|
| 363 |  | 
|---|
| 364 | void Uic::createMenuBarDecl( const QDomElement &e ) | 
|---|
| 365 | { | 
|---|
| 366 | if ( e.tagName() == "item" ) { | 
|---|
| 367 | out << "    " << "QPopupMenu *" << e.attribute( "name" ) << ";" << endl; | 
|---|
| 368 | createPopupMenuDecl( e ); | 
|---|
| 369 | } | 
|---|
| 370 | } | 
|---|
| 371 |  | 
|---|
| 372 | void Uic::createPopupMenuDecl( const QDomElement &e ) | 
|---|
| 373 | { | 
|---|
| 374 | for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 375 | if ( n.tagName() == "action" ) { | 
|---|
| 376 | QDomElement n2 = n.nextSibling().toElement(); | 
|---|
| 377 | if ( n2.tagName() == "item" ) { // the action has a sub menu | 
|---|
| 378 | out << "    " << "QPopupMenu *" << n2.attribute( "name" ) << ";" << endl; | 
|---|
| 379 | createPopupMenuDecl( n2 ); | 
|---|
| 380 | n = n2; | 
|---|
| 381 | } | 
|---|
| 382 | } | 
|---|
| 383 | } | 
|---|
| 384 | } | 
|---|
| 385 |  | 
|---|
| 386 | void Uic::createActionImpl( const QDomElement &n, const QString &parent ) | 
|---|
| 387 | { | 
|---|
| 388 | for ( QDomElement ae = n; !ae.isNull(); ae = ae.nextSibling().toElement() ) { | 
|---|
| 389 | QString objName = registerObject( getObjectName( ae ) ); | 
|---|
| 390 | if ( ae.tagName() == "action" ) | 
|---|
| 391 | out << indent << objName << " = new QAction( " << parent << ", \"" << objName << "\" );" << endl; | 
|---|
| 392 | else if ( ae.tagName() == "actiongroup" ) | 
|---|
| 393 | out << indent << objName << " = new QActionGroup( " << parent << ", \"" << objName << "\" );" << endl; | 
|---|
| 394 | else | 
|---|
| 395 | continue; | 
|---|
| 396 | bool subActionsDone = FALSE; | 
|---|
| 397 | bool hasMenuText = FALSE; | 
|---|
| 398 | QString actionText; | 
|---|
| 399 | for ( QDomElement n2 = ae.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) { | 
|---|
| 400 | if ( n2.tagName() == "property" ) { | 
|---|
| 401 | bool stdset = stdsetdef; | 
|---|
| 402 | if ( n2.hasAttribute( "stdset" ) ) | 
|---|
| 403 | stdset = toBool( n2.attribute( "stdset" ) ); | 
|---|
| 404 | QString prop = n2.attribute("name"); | 
|---|
| 405 | if ( prop == "name" ) | 
|---|
| 406 | continue; | 
|---|
| 407 | QString value = setObjectProperty( "QAction", objName, prop, n2.firstChild().toElement(), stdset ); | 
|---|
| 408 | if ( value.isEmpty() ) | 
|---|
| 409 | continue; | 
|---|
| 410 |  | 
|---|
| 411 | QString call = objName + "->"; | 
|---|
| 412 | if ( stdset ) { | 
|---|
| 413 | call += mkStdSet( prop ) + "( "; | 
|---|
| 414 | } else { | 
|---|
| 415 | call += "setProperty( \"" + prop + "\", "; | 
|---|
| 416 | } | 
|---|
| 417 | call += value + " );"; | 
|---|
| 418 |  | 
|---|
| 419 | if (prop == "menuText") | 
|---|
| 420 | hasMenuText = TRUE; | 
|---|
| 421 | else if (prop == "text") | 
|---|
| 422 | actionText = value; | 
|---|
| 423 |  | 
|---|
| 424 | if ( n2.firstChild().toElement().tagName() == "string" ) { | 
|---|
| 425 | trout << indent << call << endl; | 
|---|
| 426 | } else { | 
|---|
| 427 | out << indent << call << endl; | 
|---|
| 428 | } | 
|---|
| 429 | } else if ( !subActionsDone && ( n2.tagName() == "actiongroup" || n2.tagName() == "action" ) ) { | 
|---|
| 430 | createActionImpl( n2, objName ); | 
|---|
| 431 | subActionsDone = TRUE; | 
|---|
| 432 | } | 
|---|
| 433 | } | 
|---|
| 434 | // workaround for loading pre-3.3 files expecting bogus QAction behavior | 
|---|
| 435 | if (!hasMenuText && !actionText.isEmpty() && uiFileVersion < "3.3") | 
|---|
| 436 | trout << indent << objName << "->setMenuText(" << actionText << ");" << endl; | 
|---|
| 437 | } | 
|---|
| 438 | } | 
|---|
| 439 |  | 
|---|
| 440 | QString get_dock( const QString &d ) | 
|---|
| 441 | { | 
|---|
| 442 | if ( d == "0" ) | 
|---|
| 443 | return "DockUnmanaged"; | 
|---|
| 444 | if ( d == "1" ) | 
|---|
| 445 | return "DockTornOff"; | 
|---|
| 446 | if ( d == "2" ) | 
|---|
| 447 | return "DockTop"; | 
|---|
| 448 | if ( d == "3" ) | 
|---|
| 449 | return "DockBottom"; | 
|---|
| 450 | if ( d == "4" ) | 
|---|
| 451 | return "DockRight"; | 
|---|
| 452 | if ( d == "5" ) | 
|---|
| 453 | return "DockLeft"; | 
|---|
| 454 | if ( d == "6" ) | 
|---|
| 455 | return "DockMinimized"; | 
|---|
| 456 | return ""; | 
|---|
| 457 | } | 
|---|
| 458 |  | 
|---|
| 459 | void Uic::createToolbarImpl( const QDomElement &n, const QString &parentClass, const QString &parent ) | 
|---|
| 460 | { | 
|---|
| 461 | QDomNodeList nl = n.elementsByTagName( "toolbar" ); | 
|---|
| 462 | for ( int i = 0; i < (int) nl.length(); i++ ) { | 
|---|
| 463 | QDomElement ae = nl.item( i ).toElement(); | 
|---|
| 464 | QString dock = get_dock( ae.attribute( "dock" ) ); | 
|---|
| 465 | QString objName = getObjectName( ae ); | 
|---|
| 466 | out << indent << objName << " = new QToolBar( QString(\"\"), this, " << dock << " ); " << endl; | 
|---|
| 467 | createObjectImpl( ae, parentClass, parent ); | 
|---|
| 468 | for ( QDomElement n2 = ae.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) { | 
|---|
| 469 | if ( n2.tagName() == "action" ) { | 
|---|
| 470 | out << indent << n2.attribute( "name" ) << "->addTo( " << objName << " );" << endl; | 
|---|
| 471 | } else if ( n2.tagName() == "separator" ) { | 
|---|
| 472 | out << indent << objName << "->addSeparator();" << endl; | 
|---|
| 473 | } else if ( n2.tagName() == "widget" ) { | 
|---|
| 474 | if ( n2.attribute( "class" ) != "Spacer" ) { | 
|---|
| 475 | createObjectImpl( n2, "QToolBar", objName ); | 
|---|
| 476 | } else { | 
|---|
| 477 | QString child = createSpacerImpl( n2, parentClass, parent, objName ); | 
|---|
| 478 | out << indent << "QApplication::sendPostedEvents( " << objName | 
|---|
| 479 | << ", QEvent::ChildInserted );" << endl; | 
|---|
| 480 | out << indent << objName << "->boxLayout()->addItem( " << child << " );" << endl; | 
|---|
| 481 | } | 
|---|
| 482 | } | 
|---|
| 483 | } | 
|---|
| 484 | } | 
|---|
| 485 | } | 
|---|
| 486 |  | 
|---|
| 487 | void Uic::createMenuBarImpl( const QDomElement &n, const QString &parentClass, const QString &parent ) | 
|---|
| 488 | { | 
|---|
| 489 | QString objName = getObjectName( n ); | 
|---|
| 490 | out << indent << objName << " = new QMenuBar( this, \"" << objName << "\" );" << endl; | 
|---|
| 491 | createObjectImpl( n, parentClass, parent ); | 
|---|
| 492 | int i = 0; | 
|---|
| 493 | QDomElement c = n.firstChild().toElement(); | 
|---|
| 494 | while ( !c.isNull() ) { | 
|---|
| 495 | if ( c.tagName() == "item" ) { | 
|---|
| 496 | QString itemName = c.attribute( "name" ); | 
|---|
| 497 | out << endl; | 
|---|
| 498 | out << indent << itemName << " = new QPopupMenu( this );" << endl; | 
|---|
| 499 | createPopupMenuImpl( c, parentClass, itemName ); | 
|---|
| 500 | out << indent << objName << "->insertItem( QString(\"\"), " << itemName << ", " << i << " );" << endl; | 
|---|
| 501 | QString findItem(objName + "->findItem(%1)"); | 
|---|
| 502 | findItem = findItem.arg(i); | 
|---|
| 503 | trout << indent << "if (" << findItem << ")" << endl; | 
|---|
| 504 | trout << indent << indent << findItem << "->setText( " << trcall( c.attribute( "text" ) ) << " );" << endl; | 
|---|
| 505 | } else if ( c.tagName() == "separator" ) { | 
|---|
| 506 | out << endl; | 
|---|
| 507 | out << indent << objName << "->insertSeparator( " << i << " );" << endl; | 
|---|
| 508 | } | 
|---|
| 509 | c = c.nextSibling().toElement(); | 
|---|
| 510 | i++; | 
|---|
| 511 | } | 
|---|
| 512 | } | 
|---|
| 513 |  | 
|---|
| 514 | void Uic::createPopupMenuImpl( const QDomElement &e, const QString &parentClass, const QString &parent ) | 
|---|
| 515 | { | 
|---|
| 516 | int i = 0; | 
|---|
| 517 | for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 518 | if ( n.tagName() == "action" ) { | 
|---|
| 519 | QDomElement n2 = n.nextSibling().toElement(); | 
|---|
| 520 | if ( n2.tagName() == "item" ) { // the action has a sub menu | 
|---|
| 521 | QString itemName = n2.attribute( "name" ); | 
|---|
| 522 | QString itemText = n2.attribute( "text" ); | 
|---|
| 523 | out << indent << itemName << " = new QPopupMenu( this );" << endl; | 
|---|
| 524 | out << indent << parent << "->setAccel( tr( \"" << n2.attribute( "accel" ) << "\" ), " << endl; | 
|---|
| 525 | out << indent << indent << parent << "->insertItem( " << n.attribute( "name" ) << "->iconSet(), "; | 
|---|
| 526 | out << trcall( itemText ) << ", " << itemName << " ) );" << endl; | 
|---|
| 527 | trout << indent << parent << "->changeItem( " << parent << "->idAt( " << i << " ), "; | 
|---|
| 528 | trout << trcall( itemText ) << " );" << endl; | 
|---|
| 529 | createPopupMenuImpl( n2, parentClass, itemName ); | 
|---|
| 530 | n = n2; | 
|---|
| 531 | } else { | 
|---|
| 532 | out << indent << n.attribute( "name" ) << "->addTo( " << parent << " );" << endl; | 
|---|
| 533 | } | 
|---|
| 534 | } else if ( n.tagName() == "separator" ) { | 
|---|
| 535 | out << indent << parent << "->insertSeparator();" << endl; | 
|---|
| 536 | } | 
|---|
| 537 | ++i; | 
|---|
| 538 | } | 
|---|
| 539 | } | 
|---|
| 540 |  | 
|---|
| 541 | /*! | 
|---|
| 542 | Creates implementation of an listbox item tag. | 
|---|
| 543 | */ | 
|---|
| 544 |  | 
|---|
| 545 | QString Uic::createListBoxItemImpl( const QDomElement &e, const QString &parent, | 
|---|
| 546 | QString *value ) | 
|---|
| 547 | { | 
|---|
| 548 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 549 | QString txt; | 
|---|
| 550 | QString com; | 
|---|
| 551 | QString pix; | 
|---|
| 552 | while ( !n.isNull() ) { | 
|---|
| 553 | if ( n.tagName() == "property" ) { | 
|---|
| 554 | QString attrib = n.attribute( "name" ); | 
|---|
| 555 | QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() ); | 
|---|
| 556 | if ( attrib == "text" ) { | 
|---|
| 557 | txt = v.toString(); | 
|---|
| 558 | com = getComment( n ); | 
|---|
| 559 | } else if ( attrib == "pixmap" ) { | 
|---|
| 560 | pix = v.toString(); | 
|---|
| 561 | if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 562 | pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 563 | pix.append(  QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 564 | } | 
|---|
| 565 | } | 
|---|
| 566 | } | 
|---|
| 567 | n = n.nextSibling().toElement(); | 
|---|
| 568 | } | 
|---|
| 569 |  | 
|---|
| 570 | if ( value ) | 
|---|
| 571 | *value = trcall( txt, com ); | 
|---|
| 572 |  | 
|---|
| 573 | if ( pix.isEmpty() ) { | 
|---|
| 574 | return parent + "->insertItem( " + trcall( txt, com ) + " );"; | 
|---|
| 575 | } else { | 
|---|
| 576 | return parent + "->insertItem( " + pix + ", " + trcall( txt, com ) + " );"; | 
|---|
| 577 | } | 
|---|
| 578 | } | 
|---|
| 579 |  | 
|---|
| 580 | /*! | 
|---|
| 581 | Creates implementation of an iconview item tag. | 
|---|
| 582 | */ | 
|---|
| 583 |  | 
|---|
| 584 | QString Uic::createIconViewItemImpl( const QDomElement &e, const QString &parent ) | 
|---|
| 585 | { | 
|---|
| 586 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 587 | QString txt; | 
|---|
| 588 | QString com; | 
|---|
| 589 | QString pix; | 
|---|
| 590 | while ( !n.isNull() ) { | 
|---|
| 591 | if ( n.tagName() == "property" ) { | 
|---|
| 592 | QString attrib = n.attribute( "name" ); | 
|---|
| 593 | QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() ); | 
|---|
| 594 | if ( attrib == "text" ) { | 
|---|
| 595 | txt = v.toString(); | 
|---|
| 596 | com = getComment( n ); | 
|---|
| 597 | } else if ( attrib == "pixmap" ) { | 
|---|
| 598 | pix = v.toString(); | 
|---|
| 599 | if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 600 | pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 601 | pix.append( QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 602 | } | 
|---|
| 603 | } | 
|---|
| 604 | } | 
|---|
| 605 | n = n.nextSibling().toElement(); | 
|---|
| 606 | } | 
|---|
| 607 |  | 
|---|
| 608 | if ( pix.isEmpty() ) | 
|---|
| 609 | return "(void) new QIconViewItem( " + parent + ", " + trcall( txt, com ) + " );"; | 
|---|
| 610 | else | 
|---|
| 611 | return "(void) new QIconViewItem( " + parent + ", " + trcall( txt, com ) + ", " + pix + " );"; | 
|---|
| 612 | } | 
|---|
| 613 |  | 
|---|
| 614 | /*! | 
|---|
| 615 | Creates implementation of an listview item tag. | 
|---|
| 616 | */ | 
|---|
| 617 |  | 
|---|
| 618 | QString Uic::createListViewItemImpl( const QDomElement &e, const QString &parent, | 
|---|
| 619 | const QString &parentItem ) | 
|---|
| 620 | { | 
|---|
| 621 | QString s; | 
|---|
| 622 |  | 
|---|
| 623 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 624 |  | 
|---|
| 625 | bool hasChildren = e.elementsByTagName( "item" ).count() > 0; | 
|---|
| 626 | QString item; | 
|---|
| 627 |  | 
|---|
| 628 | if ( hasChildren ) { | 
|---|
| 629 | item = registerObject( "item" ); | 
|---|
| 630 | s = indent + "QListViewItem * " + item + " = "; | 
|---|
| 631 | } else { | 
|---|
| 632 | item = "item"; | 
|---|
| 633 | if ( item_used ) | 
|---|
| 634 | s = indent + item + " = "; | 
|---|
| 635 | else | 
|---|
| 636 | s = indent + "QListViewItem * " + item + " = "; | 
|---|
| 637 | item_used = TRUE; | 
|---|
| 638 | } | 
|---|
| 639 |  | 
|---|
| 640 | if ( !parentItem.isEmpty() ) | 
|---|
| 641 | s += "new QListViewItem( " + parentItem + ", " + lastItem + " );\n"; | 
|---|
| 642 | else | 
|---|
| 643 | s += "new QListViewItem( " + parent + ", " + lastItem + " );\n"; | 
|---|
| 644 |  | 
|---|
| 645 | QStringList texts; | 
|---|
| 646 | QStringList pixmaps; | 
|---|
| 647 | while ( !n.isNull() ) { | 
|---|
| 648 | if ( n.tagName() == "property" ) { | 
|---|
| 649 | QString attrib = n.attribute("name"); | 
|---|
| 650 | QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() ); | 
|---|
| 651 | if ( attrib == "text" ) | 
|---|
| 652 | texts << v.toString(); | 
|---|
| 653 | else if ( attrib == "pixmap" ) { | 
|---|
| 654 | QString pix = v.toString(); | 
|---|
| 655 | if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 656 | pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 657 | pix.append( QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 658 | } | 
|---|
| 659 | pixmaps << pix; | 
|---|
| 660 | } | 
|---|
| 661 | } else if ( n.tagName() == "item" ) { | 
|---|
| 662 | s += indent + item + "->setOpen( TRUE );\n"; | 
|---|
| 663 | s += createListViewItemImpl( n, parent, item ); | 
|---|
| 664 | } | 
|---|
| 665 | n = n.nextSibling().toElement(); | 
|---|
| 666 | } | 
|---|
| 667 |  | 
|---|
| 668 | for ( int i = 0; i < (int)texts.count(); ++i ) { | 
|---|
| 669 | if ( !texts[ i ].isEmpty() ) | 
|---|
| 670 | s += indent + item + "->setText( " + QString::number( i ) + ", " + trcall( texts[ i ] ) + " );\n"; | 
|---|
| 671 | if ( !pixmaps[ i ].isEmpty() ) | 
|---|
| 672 | s += indent + item + "->setPixmap( " + QString::number( i ) + ", " + pixmaps[ i ] + " );\n"; | 
|---|
| 673 | } | 
|---|
| 674 |  | 
|---|
| 675 | lastItem = item; | 
|---|
| 676 | return s; | 
|---|
| 677 | } | 
|---|
| 678 |  | 
|---|
| 679 | /*! | 
|---|
| 680 | Creates implementation of an listview column tag. | 
|---|
| 681 | */ | 
|---|
| 682 |  | 
|---|
| 683 | QString Uic::createListViewColumnImpl( const QDomElement &e, const QString &parent, | 
|---|
| 684 | QString *value ) | 
|---|
| 685 | { | 
|---|
| 686 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 687 | QString txt; | 
|---|
| 688 | QString com; | 
|---|
| 689 | QString pix; | 
|---|
| 690 | bool clickable = FALSE, resizable = FALSE; | 
|---|
| 691 | while ( !n.isNull() ) { | 
|---|
| 692 | if ( n.tagName() == "property" ) { | 
|---|
| 693 | QString attrib = n.attribute("name"); | 
|---|
| 694 | QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() ); | 
|---|
| 695 | if ( attrib == "text" ) { | 
|---|
| 696 | txt = v.toString(); | 
|---|
| 697 | com = getComment( n ); | 
|---|
| 698 | } else if ( attrib == "pixmap" ) { | 
|---|
| 699 | pix = v.toString(); | 
|---|
| 700 | if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 701 | pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 702 | pix.append( QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 703 | } | 
|---|
| 704 | } else if ( attrib == "clickable" ) | 
|---|
| 705 | clickable = v.toBool(); | 
|---|
| 706 | else if ( attrib == "resizable" || attrib == "resizeable" ) | 
|---|
| 707 | resizable = v.toBool(); | 
|---|
| 708 | } | 
|---|
| 709 | n = n.nextSibling().toElement(); | 
|---|
| 710 | } | 
|---|
| 711 |  | 
|---|
| 712 | if ( value ) | 
|---|
| 713 | *value = trcall( txt, com ); | 
|---|
| 714 |  | 
|---|
| 715 | QString s; | 
|---|
| 716 | s = indent + parent + "->addColumn( " + trcall( txt, com ) + " );\n"; | 
|---|
| 717 | if ( !pix.isEmpty() ) | 
|---|
| 718 | s += indent + parent + "->header()->setLabel( " + parent + "->header()->count() - 1, " + pix + ", " + trcall( txt, com ) + " );\n"; | 
|---|
| 719 | if ( !clickable ) | 
|---|
| 720 | s += indent + parent + "->header()->setClickEnabled( FALSE, " + parent + "->header()->count() - 1 );\n"; | 
|---|
| 721 | if ( !resizable ) | 
|---|
| 722 | s += indent + parent + "->header()->setResizeEnabled( FALSE, " + parent + "->header()->count() - 1 );\n"; | 
|---|
| 723 | return s; | 
|---|
| 724 | } | 
|---|
| 725 |  | 
|---|
| 726 | QString Uic::createTableRowColumnImpl( const QDomElement &e, const QString &parent, | 
|---|
| 727 | QString *value ) | 
|---|
| 728 | { | 
|---|
| 729 | QString objClass = getClassName( e.parentNode().toElement() ); | 
|---|
| 730 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 731 | QString txt; | 
|---|
| 732 | QString com; | 
|---|
| 733 | QString pix; | 
|---|
| 734 | QString field; | 
|---|
| 735 | bool isRow = e.tagName() == "row"; | 
|---|
| 736 | while ( !n.isNull() ) { | 
|---|
| 737 | if ( n.tagName() == "property" ) { | 
|---|
| 738 | QString attrib = n.attribute("name"); | 
|---|
| 739 | QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() ); | 
|---|
| 740 | if ( attrib == "text" ) { | 
|---|
| 741 | txt = v.toString(); | 
|---|
| 742 | com = getComment( n ); | 
|---|
| 743 | } else if ( attrib == "pixmap" ) { | 
|---|
| 744 | pix = v.toString(); | 
|---|
| 745 | if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 746 | pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 747 | pix.append( QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 748 | } | 
|---|
| 749 | } else if ( attrib == "field" ) | 
|---|
| 750 | field = v.toString(); | 
|---|
| 751 | } | 
|---|
| 752 | n = n.nextSibling().toElement(); | 
|---|
| 753 | } | 
|---|
| 754 |  | 
|---|
| 755 | if ( value ) | 
|---|
| 756 | *value = trcall( txt, com ); | 
|---|
| 757 |  | 
|---|
| 758 | // ### This generated code sucks! We have to set the number of | 
|---|
| 759 | // rows/cols before and then only do setLabel/() | 
|---|
| 760 | // ### careful, though, since QDataTable has an API which makes this code pretty good | 
|---|
| 761 |  | 
|---|
| 762 | QString s; | 
|---|
| 763 | if ( isRow ) { | 
|---|
| 764 | s = indent + parent + "->setNumRows( " + parent + "->numRows() + 1 );\n"; | 
|---|
| 765 | if ( pix.isEmpty() ) | 
|---|
| 766 | s += indent + parent + "->verticalHeader()->setLabel( " + parent + "->numRows() - 1, " | 
|---|
| 767 | + trcall( txt, com ) + " );\n"; | 
|---|
| 768 | else | 
|---|
| 769 | s += indent + parent + "->verticalHeader()->setLabel( " + parent + "->numRows() - 1, " | 
|---|
| 770 | + pix + ", " + trcall( txt, com ) + " );\n"; | 
|---|
| 771 | } else { | 
|---|
| 772 | if ( objClass == "QTable" ) { | 
|---|
| 773 | s = indent + parent + "->setNumCols( " + parent + "->numCols() + 1 );\n"; | 
|---|
| 774 | if ( pix.isEmpty() ) | 
|---|
| 775 | s += indent + parent + "->horizontalHeader()->setLabel( " + parent + "->numCols() - 1, " | 
|---|
| 776 | + trcall( txt, com ) + " );\n"; | 
|---|
| 777 | else | 
|---|
| 778 | s += indent + parent + "->horizontalHeader()->setLabel( " + parent + "->numCols() - 1, " | 
|---|
| 779 | + pix + ", " + trcall( txt, com ) + " );\n"; | 
|---|
| 780 | } else if ( objClass == "QDataTable" ) { | 
|---|
| 781 | if ( !txt.isEmpty() && !field.isEmpty() ) { | 
|---|
| 782 | if ( pix.isEmpty() ) | 
|---|
| 783 | out << indent << parent << "->addColumn( " << fixString( field ) << ", " << trcall( txt, com ) << " );" << endl; | 
|---|
| 784 | else | 
|---|
| 785 | out << indent << parent << "->addColumn( " << fixString( field ) << ", " << trcall( txt, com ) << ", " << pix << " );" << endl; | 
|---|
| 786 | } | 
|---|
| 787 | } | 
|---|
| 788 | } | 
|---|
| 789 | return s; | 
|---|
| 790 | } | 
|---|
| 791 |  | 
|---|
| 792 | /*! | 
|---|
| 793 | Creates the implementation of a layout tag. Called from createObjectImpl(). | 
|---|
| 794 | */ | 
|---|
| 795 | QString Uic::createLayoutImpl( const QDomElement &e, const QString& parentClass, const QString& parent, const QString& layout ) | 
|---|
| 796 | { | 
|---|
| 797 | QDomElement n; | 
|---|
| 798 | QString objClass, objName; | 
|---|
| 799 | objClass = e.tagName(); | 
|---|
| 800 |  | 
|---|
| 801 | QString qlayout = "QVBoxLayout"; | 
|---|
| 802 | if ( objClass == "hbox" ) | 
|---|
| 803 | qlayout = "QHBoxLayout"; | 
|---|
| 804 | else if ( objClass == "grid" ) | 
|---|
| 805 | qlayout = "QGridLayout"; | 
|---|
| 806 |  | 
|---|
| 807 | bool isGrid = e.tagName() == "grid" ; | 
|---|
| 808 | objName = registerObject( getLayoutName( e ) ); | 
|---|
| 809 | layoutObjects += objName; | 
|---|
| 810 |  | 
|---|
| 811 | QString margin = DomTool::readProperty( e, "margin", defMargin ).toString(); | 
|---|
| 812 | QString spacing = DomTool::readProperty( e, "spacing", defSpacing ).toString(); | 
|---|
| 813 | QString resizeMode = DomTool::readProperty( e, "resizeMode", QString::null ).toString(); | 
|---|
| 814 |  | 
|---|
| 815 | QString optcells; | 
|---|
| 816 | if ( isGrid ) | 
|---|
| 817 | optcells = "1, 1, "; | 
|---|
| 818 | if ( (parentClass == "QGroupBox" || parentClass == "QButtonGroup") && layout.isEmpty() ) { | 
|---|
| 819 | // special case for group box | 
|---|
| 820 | out << indent << parent << "->setColumnLayout(0, Qt::Vertical );" << endl; | 
|---|
| 821 | out << indent << parent << "->layout()->setSpacing( " << spacing << " );" << endl; | 
|---|
| 822 | out << indent << parent << "->layout()->setMargin( " << margin << " );" << endl; | 
|---|
| 823 | out << indent << objName << " = new " << qlayout << "( " << parent << "->layout() );" << endl; | 
|---|
| 824 | out << indent << objName << "->setAlignment( Qt::AlignTop );" << endl; | 
|---|
| 825 | } else { | 
|---|
| 826 | out << indent << objName << " = new " << qlayout << "( "; | 
|---|
| 827 | if ( layout.isEmpty() ) | 
|---|
| 828 | out << parent; | 
|---|
| 829 | else { | 
|---|
| 830 | out << "0"; | 
|---|
| 831 | if ( !DomTool::hasProperty( e, "margin" ) ) | 
|---|
| 832 | margin = "0"; | 
|---|
| 833 | } | 
|---|
| 834 | out << ", " << optcells << margin << ", " << spacing << ", \"" << objName << "\"); " << endl; | 
|---|
| 835 | } | 
|---|
| 836 | if ( !resizeMode.isEmpty() ) | 
|---|
| 837 | out << indent << objName << "->setResizeMode( QLayout::" << resizeMode << " );" << endl; | 
|---|
| 838 |  | 
|---|
| 839 | if ( !isGrid ) { | 
|---|
| 840 | for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 841 | if ( n.tagName() == "spacer" ) { | 
|---|
| 842 | QString child = createSpacerImpl( n, parentClass, parent, objName ); | 
|---|
| 843 | out << indent << objName << "->addItem( " << child << " );" << endl; | 
|---|
| 844 | } else if ( tags.contains( n.tagName() ) ) { | 
|---|
| 845 | QString child = createObjectImpl( n, parentClass, parent, objName ); | 
|---|
| 846 | if ( isLayout( child ) ) | 
|---|
| 847 | out << indent << objName << "->addLayout( " << child << " );" << endl; | 
|---|
| 848 | else | 
|---|
| 849 | out << indent << objName << "->addWidget( " << child << " );" << endl; | 
|---|
| 850 | } | 
|---|
| 851 | } | 
|---|
| 852 | } else { | 
|---|
| 853 | for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { | 
|---|
| 854 | QDomElement ae = n; | 
|---|
| 855 | int row = ae.attribute( "row" ).toInt(); | 
|---|
| 856 | int col = ae.attribute( "column" ).toInt(); | 
|---|
| 857 | int rowspan = ae.attribute( "rowspan" ).toInt(); | 
|---|
| 858 | int colspan = ae.attribute( "colspan" ).toInt(); | 
|---|
| 859 | if ( rowspan < 1 ) | 
|---|
| 860 | rowspan = 1; | 
|---|
| 861 | if ( colspan < 1 ) | 
|---|
| 862 | colspan = 1; | 
|---|
| 863 | if ( n.tagName() == "spacer" ) { | 
|---|
| 864 | QString child = createSpacerImpl( n, parentClass, parent, objName ); | 
|---|
| 865 | if ( rowspan * colspan != 1 ) | 
|---|
| 866 | out << indent << objName << "->addMultiCell( " << child << ", " | 
|---|
| 867 | << row << ", " << ( row + rowspan - 1 ) << ", " << col << ", " << ( col  + colspan - 1 ) << " );" << endl; | 
|---|
| 868 | else | 
|---|
| 869 | out << indent << objName << "->addItem( " << child << ", " | 
|---|
| 870 | << row << ", " << col << " );" << endl; | 
|---|
| 871 | } else if ( tags.contains( n.tagName() ) ) { | 
|---|
| 872 | QString child = createObjectImpl( n, parentClass, parent, objName ); | 
|---|
| 873 | out << endl; | 
|---|
| 874 | QString o = "Widget"; | 
|---|
| 875 | if ( isLayout( child ) ) | 
|---|
| 876 | o = "Layout"; | 
|---|
| 877 | if ( rowspan * colspan != 1 ) | 
|---|
| 878 | out << indent << objName << "->addMultiCell" << o << "( " << child << ", " | 
|---|
| 879 | << row << ", " << ( row + rowspan - 1 ) << ", " << col << ", " << ( col  + colspan - 1 ) << " );" << endl; | 
|---|
| 880 | else | 
|---|
| 881 | out << indent << objName << "->add" << o << "( " << child << ", " | 
|---|
| 882 | << row << ", " << col << " );" << endl; | 
|---|
| 883 | } | 
|---|
| 884 | } | 
|---|
| 885 | } | 
|---|
| 886 |  | 
|---|
| 887 | return objName; | 
|---|
| 888 | } | 
|---|
| 889 |  | 
|---|
| 890 |  | 
|---|
| 891 |  | 
|---|
| 892 | QString Uic::createSpacerImpl( const QDomElement &e, const QString& /*parentClass*/, const QString& /*parent*/, const QString& /*layout*/) | 
|---|
| 893 | { | 
|---|
| 894 | QDomElement n; | 
|---|
| 895 | QString objClass, objName; | 
|---|
| 896 | objClass = e.tagName(); | 
|---|
| 897 | objName = registerObject( getObjectName( e ) ); | 
|---|
| 898 |  | 
|---|
| 899 | QSize size = DomTool::readProperty( e, "sizeHint", QSize( 0, 0 ) ).toSize(); | 
|---|
| 900 | QString sizeType = DomTool::readProperty( e, "sizeType", "Expanding" ).toString(); | 
|---|
| 901 | bool isVspacer = DomTool::readProperty( e, "orientation", "Horizontal" ) == "Vertical"; | 
|---|
| 902 |  | 
|---|
| 903 | if ( sizeType != "Expanding" && sizeType != "MinimumExpanding" && | 
|---|
| 904 | DomTool::hasProperty( e, "geometry" ) ) { // compatibility Qt 2.2 | 
|---|
| 905 | QRect geom = DomTool::readProperty( e, "geometry", QRect(0,0,0,0) ).toRect(); | 
|---|
| 906 | size = geom.size(); | 
|---|
| 907 | } | 
|---|
| 908 |  | 
|---|
| 909 | if ( isVspacer ) | 
|---|
| 910 | out << "    " << objName << " = new QSpacerItem( " | 
|---|
| 911 | << size.width() << ", " << size.height() | 
|---|
| 912 | << ", QSizePolicy::Minimum, QSizePolicy::" << sizeType << " );" << endl; | 
|---|
| 913 | else | 
|---|
| 914 | out << "    " << objName << " = new QSpacerItem( " | 
|---|
| 915 | << size.width() << ", " << size.height() | 
|---|
| 916 | << ", QSizePolicy::" << sizeType << ", QSizePolicy::Minimum );" << endl; | 
|---|
| 917 |  | 
|---|
| 918 | return objName; | 
|---|
| 919 | } | 
|---|
| 920 |  | 
|---|
| 921 | static const char* const ColorRole[] = { | 
|---|
| 922 | "Foreground", "Button", "Light", "Midlight", "Dark", "Mid", | 
|---|
| 923 | "Text", "BrightText", "ButtonText", "Base", "Background", "Shadow", | 
|---|
| 924 | "Highlight", "HighlightedText", "Link", "LinkVisited", 0 | 
|---|
| 925 | }; | 
|---|
| 926 |  | 
|---|
| 927 |  | 
|---|
| 928 | /*! | 
|---|
| 929 | Creates a colorgroup with name \a name from the color group \a cg | 
|---|
| 930 | */ | 
|---|
| 931 | void Uic::createColorGroupImpl( const QString& name, const QDomElement& e ) | 
|---|
| 932 | { | 
|---|
| 933 | QColorGroup cg; | 
|---|
| 934 | int r = -1; | 
|---|
| 935 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 936 | QString color; | 
|---|
| 937 | while ( !n.isNull() ) { | 
|---|
| 938 | if ( n.tagName() == "color" ) { | 
|---|
| 939 | r++; | 
|---|
| 940 | QColor col = DomTool::readColor( n ); | 
|---|
| 941 | color = "QColor( %1, %2, %3)"; | 
|---|
| 942 | color = color.arg( col.red() ).arg( col.green() ).arg( col.blue() ); | 
|---|
| 943 | if ( col == white ) | 
|---|
| 944 | color = "white"; | 
|---|
| 945 | else if ( col == black ) | 
|---|
| 946 | color = "black"; | 
|---|
| 947 | if ( n.nextSibling().toElement().tagName() != "pixmap" ) { | 
|---|
| 948 | out << indent << name << ".setColor( QColorGroup::" << ColorRole[r] << ", " << color << " );" << endl; | 
|---|
| 949 | } | 
|---|
| 950 | } else if ( n.tagName() == "pixmap" ) { | 
|---|
| 951 | QString pixmap = n.firstChild().toText().data(); | 
|---|
| 952 | if ( !pixmapLoaderFunction.isEmpty() ) { | 
|---|
| 953 | pixmap.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) ); | 
|---|
| 954 | pixmap.append( QString( externPixmaps ? "\"" : "" ) + " )" ); | 
|---|
| 955 | } | 
|---|
| 956 | out << indent << name << ".setBrush( QColorGroup::" | 
|---|
| 957 | << ColorRole[r] << ", QBrush( " << color << ", " << pixmap << " ) );" << endl; | 
|---|
| 958 | } | 
|---|
| 959 | n = n.nextSibling().toElement(); | 
|---|
| 960 | } | 
|---|
| 961 | } | 
|---|
| 962 |  | 
|---|
| 963 | /*! | 
|---|
| 964 | Auxiliary function to load a color group. The colorgroup must not | 
|---|
| 965 | contain pixmaps. | 
|---|
| 966 | */ | 
|---|
| 967 | QColorGroup Uic::loadColorGroup( const QDomElement &e ) | 
|---|
| 968 | { | 
|---|
| 969 | QColorGroup cg; | 
|---|
| 970 | int r = -1; | 
|---|
| 971 | QDomElement n = e.firstChild().toElement(); | 
|---|
| 972 | QColor col; | 
|---|
| 973 | while ( !n.isNull() ) { | 
|---|
| 974 | if ( n.tagName() == "color" ) { | 
|---|
| 975 | r++; | 
|---|
| 976 | cg.setColor( (QColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) ); | 
|---|
| 977 | } | 
|---|
| 978 | n = n.nextSibling().toElement(); | 
|---|
| 979 | } | 
|---|
| 980 | return cg; | 
|---|
| 981 | } | 
|---|
| 982 |  | 
|---|
| 983 | /*!  Returns TRUE if the widget properties specify that it belongs to | 
|---|
| 984 | the database \a connection and \a table. | 
|---|
| 985 | */ | 
|---|
| 986 |  | 
|---|
| 987 | bool Uic::isWidgetInTable( const QDomElement& e, const QString& connection, const QString& table ) | 
|---|
| 988 | { | 
|---|
| 989 | QString conn = getDatabaseInfo( e, "connection" ); | 
|---|
| 990 | QString tab = getDatabaseInfo( e, "table" ); | 
|---|
| 991 | if ( conn == connection && tab == table ) | 
|---|
| 992 | return TRUE; | 
|---|
| 993 | return FALSE; | 
|---|
| 994 | } | 
|---|
| 995 |  | 
|---|
| 996 | /*! | 
|---|
| 997 | Registers all database connections, cursors and forms. | 
|---|
| 998 | */ | 
|---|
| 999 |  | 
|---|
| 1000 | void Uic::registerDatabases( const QDomElement& e ) | 
|---|
| 1001 | { | 
|---|
| 1002 | QDomElement n; | 
|---|
| 1003 | QDomNodeList nl; | 
|---|
| 1004 | int i; | 
|---|
| 1005 | nl = e.parentNode().toElement().elementsByTagName( "widget" ); | 
|---|
| 1006 | for ( i = 0; i < (int) nl.length(); ++i ) { | 
|---|
| 1007 | n = nl.item(i).toElement(); | 
|---|
| 1008 | QString conn = getDatabaseInfo( n, "connection"  ); | 
|---|
| 1009 | QString tab = getDatabaseInfo( n, "table"  ); | 
|---|
| 1010 | QString fld = getDatabaseInfo( n, "field"  ); | 
|---|
| 1011 | if ( !conn.isNull() ) { | 
|---|
| 1012 | dbConnections += conn; | 
|---|
| 1013 | if ( !tab.isNull() ) { | 
|---|
| 1014 | dbCursors[conn] += tab; | 
|---|
| 1015 | if ( !fld.isNull() ) | 
|---|
| 1016 | dbForms[conn] += tab; | 
|---|
| 1017 | } | 
|---|
| 1018 | } | 
|---|
| 1019 | } | 
|---|
| 1020 | } | 
|---|
| 1021 |  | 
|---|
| 1022 | /*! | 
|---|
| 1023 | Registers an object with name \a name. | 
|---|
| 1024 |  | 
|---|
| 1025 | The returned name is a valid variable identifier, as similar to \a | 
|---|
| 1026 | name as possible and guaranteed to be unique within the form. | 
|---|
| 1027 |  | 
|---|
| 1028 | \sa registeredName(), isObjectRegistered() | 
|---|
| 1029 | */ | 
|---|
| 1030 | QString Uic::registerObject( const QString& name ) | 
|---|
| 1031 | { | 
|---|
| 1032 | if ( objectNames.isEmpty() ) { | 
|---|
| 1033 | // some temporary variables we need | 
|---|
| 1034 | objectNames += "img"; | 
|---|
| 1035 | objectNames += "item"; | 
|---|
| 1036 | objectNames += "cg"; | 
|---|
| 1037 | objectNames += "pal"; | 
|---|
| 1038 | } | 
|---|
| 1039 |  | 
|---|
| 1040 | QString result = name; | 
|---|
| 1041 | int i; | 
|---|
| 1042 | while ( ( i = result.find(' ' )) != -1  ) { | 
|---|
| 1043 | result[i] = '_'; | 
|---|
| 1044 | } | 
|---|
| 1045 |  | 
|---|
| 1046 | if ( objectNames.contains( result ) ) { | 
|---|
| 1047 | int i = 2; | 
|---|
| 1048 | while ( objectNames.contains( result + "_" + QString::number(i) ) ) | 
|---|
| 1049 | i++; | 
|---|
| 1050 | result += "_"; | 
|---|
| 1051 | result += QString::number(i); | 
|---|
| 1052 | } | 
|---|
| 1053 | objectNames += result; | 
|---|
| 1054 | objectMapper.insert( name, result ); | 
|---|
| 1055 | return result; | 
|---|
| 1056 | } | 
|---|
| 1057 |  | 
|---|
| 1058 | /*! | 
|---|
| 1059 | Returns the registered name for the original name \a name | 
|---|
| 1060 | or \a name if \a name  wasn't registered. | 
|---|
| 1061 |  | 
|---|
| 1062 | \sa registerObject(), isObjectRegistered() | 
|---|
| 1063 | */ | 
|---|
| 1064 | QString Uic::registeredName( const QString& name ) | 
|---|
| 1065 | { | 
|---|
| 1066 | if ( !objectMapper.contains( name ) ) | 
|---|
| 1067 | return name; | 
|---|
| 1068 | return objectMapper[name]; | 
|---|
| 1069 | } | 
|---|
| 1070 |  | 
|---|
| 1071 | /*! | 
|---|
| 1072 | Returns whether the object \a name was registered yet or not. | 
|---|
| 1073 | */ | 
|---|
| 1074 | bool Uic::isObjectRegistered( const QString& name ) | 
|---|
| 1075 | { | 
|---|
| 1076 | return objectMapper.contains( name ); | 
|---|
| 1077 | } | 
|---|
| 1078 |  | 
|---|
| 1079 |  | 
|---|
| 1080 | /*! | 
|---|
| 1081 | Unifies the entries in stringlist \a list. Should really be a QStringList feature. | 
|---|
| 1082 | */ | 
|---|
| 1083 | QStringList Uic::unique( const QStringList& list ) | 
|---|
| 1084 | { | 
|---|
| 1085 | if ( list.isEmpty() ) | 
|---|
| 1086 | return list; | 
|---|
| 1087 |  | 
|---|
| 1088 | QStringList result; | 
|---|
| 1089 | for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) { | 
|---|
| 1090 | if ( !result.contains(*it) ) | 
|---|
| 1091 | result += *it; | 
|---|
| 1092 | } | 
|---|
| 1093 | return result; | 
|---|
| 1094 | } | 
|---|
| 1095 |  | 
|---|
| 1096 |  | 
|---|
| 1097 |  | 
|---|
| 1098 | /*! | 
|---|
| 1099 | Creates an instance of class \a objClass, with parent \a parent and name \a objName | 
|---|
| 1100 | */ | 
|---|
| 1101 | QString Uic::createObjectInstance( const QString& objClass, const QString& parent, const QString& objName ) | 
|---|
| 1102 | { | 
|---|
| 1103 |  | 
|---|
| 1104 | if ( objClass.mid( 1 ) == "ComboBox" ) { | 
|---|
| 1105 | return objClass + "( FALSE, " + parent + ", \"" + objName + "\" )"; | 
|---|
| 1106 | } | 
|---|
| 1107 | return objClass + "( " + parent + ", \"" + objName + "\" )"; | 
|---|
| 1108 | } | 
|---|
| 1109 |  | 
|---|
| 1110 | bool Uic::isLayout( const QString& name ) const | 
|---|
| 1111 | { | 
|---|
| 1112 | return layoutObjects.contains( name ); | 
|---|
| 1113 | } | 
|---|
| 1114 |  | 
|---|
| 1115 |  | 
|---|
| 1116 |  | 
|---|