tools/designer/src/lib/uilib/formbuilderextra.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the Qt Designer of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "formbuilderextra_p.h"
       
    43 #include "abstractformbuilder.h"
       
    44 #include "resourcebuilder_p.h"
       
    45 #include "textbuilder_p.h"
       
    46 #include "ui4_p.h"
       
    47 
       
    48 #include <QtGui/QLabel>
       
    49 #include <QtGui/QBoxLayout>
       
    50 #include <QtGui/QGridLayout>
       
    51 
       
    52 #include <QtCore/QVariant>
       
    53 #include <QtCore/qdebug.h>
       
    54 #include <QtCore/QTextStream>
       
    55 #include <QtCore/QStringList>
       
    56 #include <QtCore/QCoreApplication>
       
    57 
       
    58 QT_BEGIN_NAMESPACE
       
    59 
       
    60 #ifdef QFORMINTERNAL_NAMESPACE
       
    61 namespace QFormInternal {
       
    62 #endif
       
    63 
       
    64 void uiLibWarning(const QString &message) {
       
    65     qWarning("Designer: %s", qPrintable(message));
       
    66 }
       
    67 
       
    68 QFormBuilderExtra::QFormBuilderExtra() :
       
    69     m_layoutWidget(false),
       
    70     m_resourceBuilder(0),
       
    71     m_textBuilder(0)
       
    72 {
       
    73 }
       
    74 
       
    75 QFormBuilderExtra::~QFormBuilderExtra()
       
    76 {
       
    77     clearResourceBuilder();
       
    78     clearTextBuilder();
       
    79 }
       
    80 
       
    81 void QFormBuilderExtra::clear()
       
    82 {
       
    83     m_buddies.clear();
       
    84     m_parentWidget = 0;
       
    85     m_parentWidgetIsSet = false;
       
    86 #ifndef QT_FORMBUILDER_NO_SCRIPT
       
    87     m_FormScriptRunner.clearErrors();
       
    88     m_customWidgetScriptHash.clear();
       
    89 #endif
       
    90     m_buttonGroups.clear();
       
    91 }
       
    92 
       
    93 
       
    94 bool QFormBuilderExtra::applyPropertyInternally(QObject *o, const QString &propertyName, const QVariant &value)
       
    95 {
       
    96     // Store buddies and apply them later on as the widgets might not exist yet.
       
    97     QLabel *label = qobject_cast<QLabel*>(o);
       
    98     if (!label || propertyName != QFormBuilderStrings::instance().buddyProperty)
       
    99         return false;
       
   100 
       
   101     m_buddies.insert(label, value.toString());
       
   102     return true;
       
   103 }
       
   104 
       
   105 void QFormBuilderExtra::applyInternalProperties() const
       
   106 {
       
   107     if (m_buddies.empty())
       
   108         return;
       
   109 
       
   110     const BuddyHash::const_iterator cend = m_buddies.constEnd();
       
   111     for (BuddyHash::const_iterator it = m_buddies.constBegin(); it != cend; ++it )
       
   112         applyBuddy(it.value(), BuddyApplyAll, it.key());
       
   113 }
       
   114 
       
   115 bool QFormBuilderExtra::applyBuddy(const QString &buddyName, BuddyMode applyMode, QLabel *label)
       
   116 {
       
   117     if (buddyName.isEmpty()) {
       
   118         label->setBuddy(0);
       
   119         return false;
       
   120     }
       
   121 
       
   122     const QWidgetList widgets = qFindChildren<QWidget*>(label->topLevelWidget(), buddyName);
       
   123     if (widgets.empty()) {
       
   124         label->setBuddy(0);
       
   125         return false;
       
   126     }
       
   127 
       
   128     const QWidgetList::const_iterator cend = widgets.constEnd();
       
   129     for ( QWidgetList::const_iterator it =  widgets.constBegin(); it !=  cend; ++it) {
       
   130         if (applyMode == BuddyApplyAll || !(*it)->isHidden()) {
       
   131             label->setBuddy(*it);
       
   132             return true;
       
   133         }
       
   134     }
       
   135 
       
   136     label->setBuddy(0);
       
   137     return false;
       
   138 }
       
   139 
       
   140 const QPointer<QWidget> &QFormBuilderExtra::parentWidget() const
       
   141 {
       
   142     return m_parentWidget;
       
   143 }
       
   144 
       
   145 bool QFormBuilderExtra::parentWidgetIsSet() const
       
   146 {
       
   147     return m_parentWidgetIsSet;
       
   148 }
       
   149 
       
   150 void QFormBuilderExtra::setParentWidget(const QPointer<QWidget> &w)
       
   151 {
       
   152     // Parent widget requires special handling of the geometry property.
       
   153     m_parentWidget = w;
       
   154     m_parentWidgetIsSet = true;
       
   155 }
       
   156 
       
   157 #ifndef QT_FORMBUILDER_NO_SCRIPT
       
   158 QFormScriptRunner &QFormBuilderExtra::formScriptRunner()
       
   159 {
       
   160     return m_FormScriptRunner;
       
   161 }
       
   162 
       
   163 void QFormBuilderExtra::storeCustomWidgetScript(const QString &className, const QString &script)
       
   164 {
       
   165     m_customWidgetScriptHash.insert(className, script);
       
   166 }
       
   167 
       
   168 QString QFormBuilderExtra::customWidgetScript(const QString &className) const
       
   169 {
       
   170     const CustomWidgetScriptHash::const_iterator it = m_customWidgetScriptHash.constFind(className);
       
   171     if ( it == m_customWidgetScriptHash.constEnd())
       
   172         return QString();
       
   173     return it.value();
       
   174 }
       
   175 
       
   176 #endif
       
   177 
       
   178 void QFormBuilderExtra::storeCustomWidgetBaseClass(const QString &className, const QString &baseClassName)
       
   179 {
       
   180     m_customWidgetBaseClassHash.insert(className, baseClassName);
       
   181 }
       
   182 
       
   183 QString QFormBuilderExtra::customWidgetBaseClass(const QString &className) const
       
   184 {
       
   185     const QHash<QString, QString>::const_iterator it = m_customWidgetBaseClassHash.constFind(className);
       
   186     if (it == m_customWidgetBaseClassHash.constEnd())
       
   187         return QString();
       
   188     return it.value();
       
   189 }
       
   190 
       
   191 void QFormBuilderExtra::storeCustomWidgetAddPageMethod(const QString &className, const QString &ct)
       
   192 {
       
   193     m_customWidgetAddPageMethodHash.insert(className, ct);
       
   194 }
       
   195 
       
   196 QString QFormBuilderExtra::customWidgetAddPageMethod(const QString &className) const
       
   197 {
       
   198     const QHash<QString, QString>::const_iterator it = m_customWidgetAddPageMethodHash.constFind(className);
       
   199     if (it == m_customWidgetAddPageMethodHash.constEnd())
       
   200         return QString();
       
   201     return it.value();
       
   202 }
       
   203 
       
   204 namespace {
       
   205     typedef QHash<const QAbstractFormBuilder *, QFormBuilderExtra *> FormBuilderPrivateHash;
       
   206 }
       
   207 
       
   208 Q_GLOBAL_STATIC(FormBuilderPrivateHash, g_FormBuilderPrivateHash)
       
   209 
       
   210 QFormBuilderExtra *QFormBuilderExtra::instance(const QAbstractFormBuilder *afb)
       
   211 {
       
   212     FormBuilderPrivateHash &fbHash = *g_FormBuilderPrivateHash();
       
   213 
       
   214     FormBuilderPrivateHash::iterator it = fbHash.find(afb);
       
   215     if (it == fbHash.end())
       
   216         it = fbHash.insert(afb, new QFormBuilderExtra);
       
   217     return it.value();
       
   218 }
       
   219 
       
   220 void QFormBuilderExtra::removeInstance(const QAbstractFormBuilder *afb)
       
   221 {
       
   222     FormBuilderPrivateHash &fbHash = *g_FormBuilderPrivateHash();
       
   223 
       
   224     FormBuilderPrivateHash::iterator it = fbHash.find(afb);
       
   225     if (it != fbHash.end()) {
       
   226         delete it.value();
       
   227         fbHash.erase(it);
       
   228     }
       
   229 }
       
   230 
       
   231 void QFormBuilderExtra::setProcessingLayoutWidget(bool processing)
       
   232 {
       
   233     m_layoutWidget = processing;
       
   234 }
       
   235 
       
   236  bool QFormBuilderExtra::processingLayoutWidget() const
       
   237 {
       
   238     return m_layoutWidget;
       
   239 }
       
   240 void QFormBuilderExtra::setResourceBuilder(QResourceBuilder *builder)
       
   241 {
       
   242     if (m_resourceBuilder == builder)
       
   243         return;
       
   244     clearResourceBuilder();
       
   245     m_resourceBuilder = builder;
       
   246 }
       
   247 
       
   248 QResourceBuilder *QFormBuilderExtra::resourceBuilder() const
       
   249 {
       
   250     return m_resourceBuilder;
       
   251 }
       
   252 
       
   253 void QFormBuilderExtra::clearResourceBuilder()
       
   254 {
       
   255     if (m_resourceBuilder) {
       
   256         delete m_resourceBuilder;
       
   257         m_resourceBuilder = 0;
       
   258     }
       
   259 }
       
   260 
       
   261 void QFormBuilderExtra::setTextBuilder(QTextBuilder *builder)
       
   262 {
       
   263     if (m_textBuilder == builder)
       
   264         return;
       
   265     clearTextBuilder();
       
   266     m_textBuilder = builder;
       
   267 }
       
   268 
       
   269 QTextBuilder *QFormBuilderExtra::textBuilder() const
       
   270 {
       
   271     return m_textBuilder;
       
   272 }
       
   273 
       
   274 void QFormBuilderExtra::clearTextBuilder()
       
   275 {
       
   276     if (m_textBuilder) {
       
   277         delete m_textBuilder;
       
   278         m_textBuilder = 0;
       
   279     }
       
   280 }
       
   281 
       
   282 void QFormBuilderExtra::registerButtonGroups(const DomButtonGroups *domGroups)
       
   283 {
       
   284     typedef QList<DomButtonGroup*> DomButtonGroupList;
       
   285     const DomButtonGroupList domGroupList = domGroups->elementButtonGroup();
       
   286     const DomButtonGroupList::const_iterator cend = domGroupList.constEnd();
       
   287     for (DomButtonGroupList::const_iterator it = domGroupList.constBegin(); it != cend; ++it) {
       
   288         DomButtonGroup *domGroup = *it;
       
   289         m_buttonGroups.insert(domGroup->attributeName(), ButtonGroupEntry(domGroup, 0));
       
   290     }
       
   291 }
       
   292 
       
   293 // Utilities for parsing per-cell integer properties that have setters and
       
   294 //  getters of the form 'setX(int idx, int value)' and 'x(int index)'
       
   295 // (converting them to comma-separated string lists and back).
       
   296 // Used for layout stretch and grid per-row/column properties.
       
   297 
       
   298 // Format a list of cell-properties of one dimension as a ','-separated list
       
   299 template <class Layout>
       
   300 inline QString perCellPropertyToString(const Layout *l, int count, int (Layout::*getter)(int) const)
       
   301 {
       
   302     if (count == 0)
       
   303         return QString();
       
   304     QString rc;
       
   305     {
       
   306         QTextStream str(&rc);
       
   307         for (int i = 0; i < count; i++) {
       
   308             if (i)
       
   309                 str << QLatin1Char(',');
       
   310             str << (l->*getter)(i);
       
   311         }
       
   312     }
       
   313     return rc;
       
   314 }
       
   315 
       
   316 // Clear the property, set all cells to 0
       
   317 
       
   318 template <class Layout>
       
   319 inline void clearPerCellValue(Layout *l, int count, void (Layout::*setter)(int,int), int value = 0)
       
   320 {
       
   321     for (int i = 0; i < count; i++)
       
   322         (l->*setter)(i, value);
       
   323 }
       
   324 
       
   325 // Parse and set the property from a comma-separated list
       
   326 
       
   327 template <class Layout>
       
   328 inline bool parsePerCellProperty(Layout *l, int count, void (Layout::*setter)(int,int), const QString &s, int defaultValue = 0)
       
   329 {
       
   330     if (s.isEmpty()) {
       
   331         clearPerCellValue(l, count, setter, defaultValue);
       
   332         return true;
       
   333     }
       
   334     const QStringList list = s.split(QLatin1Char(','));
       
   335     if (list.empty()) {
       
   336         clearPerCellValue(l, count, setter, defaultValue);
       
   337         return true;
       
   338     }
       
   339     // Apply all values contained in list
       
   340     const int ac = qMin(count, list.size());
       
   341     bool ok;
       
   342     int i = 0;
       
   343     for ( ; i < ac; i++) {
       
   344         const int value = list.at(i).toInt(&ok);
       
   345         if (!ok || value < 0)
       
   346             return false;
       
   347         (l->*setter)(i, value);
       
   348     }
       
   349     // Clear rest
       
   350     for ( ; i < count; i++)
       
   351         (l->*setter)(i, defaultValue);
       
   352     return true;
       
   353 }
       
   354 
       
   355 // Read and write stretch
       
   356 static QString msgInvalidStretch(const QString &objectName, const QString &stretch)
       
   357 {
       
   358     //: Parsing layout stretch values
       
   359     return QCoreApplication::translate("FormBuilder", "Invalid stretch value for '%1': '%2'").arg(objectName, stretch);
       
   360 }
       
   361 
       
   362 QString QFormBuilderExtra::boxLayoutStretch(const QBoxLayout *box)
       
   363 {
       
   364      return perCellPropertyToString(box, box->count(), &QBoxLayout::stretch);
       
   365 }
       
   366 
       
   367 bool QFormBuilderExtra::setBoxLayoutStretch(const QString &s, QBoxLayout *box)
       
   368 {
       
   369     const bool rc = parsePerCellProperty(box, box->count(), &QBoxLayout::setStretch, s);
       
   370     if (!rc)
       
   371         uiLibWarning(msgInvalidStretch(box->objectName(), s));
       
   372     return rc;
       
   373 }
       
   374 
       
   375 void QFormBuilderExtra::clearBoxLayoutStretch(QBoxLayout *box)
       
   376 {
       
   377     clearPerCellValue(box, box->count(), &QBoxLayout::setStretch);
       
   378 }
       
   379 
       
   380 QString QFormBuilderExtra::gridLayoutRowStretch(const QGridLayout *grid)
       
   381 {
       
   382     return perCellPropertyToString(grid, grid->rowCount(), &QGridLayout::rowStretch);
       
   383 }
       
   384 
       
   385 bool QFormBuilderExtra::setGridLayoutRowStretch(const QString &s, QGridLayout *grid)
       
   386 {
       
   387     const bool rc = parsePerCellProperty(grid, grid->rowCount(), &QGridLayout::setRowStretch, s);
       
   388     if (!rc)
       
   389         uiLibWarning(msgInvalidStretch(grid->objectName(), s));
       
   390     return rc;
       
   391 }
       
   392 
       
   393 void QFormBuilderExtra::clearGridLayoutRowStretch(QGridLayout *grid)
       
   394 {
       
   395     clearPerCellValue(grid, grid->rowCount(), &QGridLayout::setRowStretch);
       
   396 }
       
   397 
       
   398 QString QFormBuilderExtra::gridLayoutColumnStretch(const QGridLayout *grid)
       
   399 {
       
   400     return perCellPropertyToString(grid, grid->columnCount(), &QGridLayout::columnStretch);
       
   401 }
       
   402 
       
   403 bool QFormBuilderExtra::setGridLayoutColumnStretch(const QString &s, QGridLayout *grid)
       
   404 {
       
   405     const bool rc = parsePerCellProperty(grid, grid->columnCount(), &QGridLayout::setColumnStretch, s);
       
   406     if (!rc)
       
   407         uiLibWarning(msgInvalidStretch(grid->objectName(), s));
       
   408     return rc;
       
   409 }
       
   410 
       
   411 void QFormBuilderExtra::clearGridLayoutColumnStretch(QGridLayout *grid)
       
   412 {
       
   413     clearPerCellValue(grid, grid->columnCount(), &QGridLayout::setColumnStretch);
       
   414 }
       
   415 
       
   416 // Read and write grid layout row/column size limits
       
   417 
       
   418 static QString msgInvalidMinimumSize(const QString &objectName, const QString &ms)
       
   419 {
       
   420     //: Parsing grid layout minimum size values
       
   421     return QCoreApplication::translate("FormBuilder", "Invalid minimum size for '%1': '%2'").arg(objectName, ms);
       
   422 }
       
   423 
       
   424 QString QFormBuilderExtra::gridLayoutRowMinimumHeight(const QGridLayout *grid)
       
   425 {
       
   426     return perCellPropertyToString(grid, grid->rowCount(), &QGridLayout::rowMinimumHeight);
       
   427 }
       
   428 
       
   429 bool QFormBuilderExtra::setGridLayoutRowMinimumHeight(const QString &s, QGridLayout *grid)
       
   430 {
       
   431     const bool rc = parsePerCellProperty(grid, grid->rowCount(), &QGridLayout::setRowMinimumHeight, s);
       
   432     if (!rc)
       
   433         uiLibWarning(msgInvalidMinimumSize(grid->objectName(), s));
       
   434     return rc;
       
   435 }
       
   436 
       
   437 void QFormBuilderExtra::clearGridLayoutRowMinimumHeight(QGridLayout *grid)
       
   438 {
       
   439      clearPerCellValue(grid, grid->rowCount(), &QGridLayout::setRowMinimumHeight);
       
   440 }
       
   441 
       
   442 QString QFormBuilderExtra::gridLayoutColumnMinimumWidth(const QGridLayout *grid)
       
   443 {
       
   444     return perCellPropertyToString(grid, grid->columnCount(), &QGridLayout::columnMinimumWidth);
       
   445 }
       
   446 
       
   447 bool QFormBuilderExtra::setGridLayoutColumnMinimumWidth(const QString &s, QGridLayout *grid)
       
   448 {
       
   449     const bool rc = parsePerCellProperty(grid, grid->columnCount(), &QGridLayout::setColumnMinimumWidth, s);
       
   450     if (!rc)
       
   451         uiLibWarning(msgInvalidMinimumSize(grid->objectName(), s));
       
   452     return rc;
       
   453 }
       
   454 
       
   455 void QFormBuilderExtra::clearGridLayoutColumnMinimumWidth(QGridLayout *grid)
       
   456 {
       
   457     clearPerCellValue(grid, grid->columnCount(), &QGridLayout::setColumnMinimumWidth);
       
   458 }
       
   459 
       
   460 // ------------ QFormBuilderStrings
       
   461 
       
   462 QFormBuilderStrings::QFormBuilderStrings() :
       
   463     buddyProperty(QLatin1String("buddy")),
       
   464     cursorProperty(QLatin1String("cursor")),
       
   465     objectNameProperty(QLatin1String("objectName")),
       
   466     trueValue(QLatin1String("true")),
       
   467     falseValue(QLatin1String("false")),
       
   468     horizontalPostFix(QLatin1String("Horizontal")),
       
   469     separator(QLatin1String("separator")),
       
   470     defaultTitle(QLatin1String("Page")),
       
   471     titleAttribute(QLatin1String("title")),
       
   472     labelAttribute(QLatin1String("label")),
       
   473     toolTipAttribute(QLatin1String("toolTip")),
       
   474     whatsThisAttribute(QLatin1String("whatsThis")),
       
   475     flagsAttribute(QLatin1String("flags")),
       
   476     iconAttribute(QLatin1String("icon")),
       
   477     pixmapAttribute(QLatin1String("pixmap")),
       
   478     textAttribute(QLatin1String("text")),
       
   479     currentIndexProperty(QLatin1String("currentIndex")),
       
   480     toolBarAreaAttribute(QLatin1String("toolBarArea")),
       
   481     toolBarBreakAttribute(QLatin1String("toolBarBreak")),
       
   482     dockWidgetAreaAttribute(QLatin1String("dockWidgetArea")),
       
   483     marginProperty(QLatin1String("margin")),
       
   484     spacingProperty(QLatin1String("spacing")),
       
   485     leftMarginProperty(QLatin1String("leftMargin")),
       
   486     topMarginProperty(QLatin1String("topMargin")),
       
   487     rightMarginProperty(QLatin1String("rightMargin")),
       
   488     bottomMarginProperty(QLatin1String("bottomMargin")),
       
   489     horizontalSpacingProperty(QLatin1String("horizontalSpacing")),
       
   490     verticalSpacingProperty(QLatin1String("verticalSpacing")),
       
   491     sizeHintProperty(QLatin1String("sizeHint")),
       
   492     sizeTypeProperty(QLatin1String("sizeType")),
       
   493     orientationProperty(QLatin1String("orientation")),
       
   494     styleSheetProperty(QLatin1String("styleSheet")),
       
   495     qtHorizontal(QLatin1String("Qt::Horizontal")),
       
   496     qtVertical(QLatin1String("Qt::Vertical")),
       
   497     currentRowProperty(QLatin1String("currentRow")),
       
   498     tabSpacingProperty(QLatin1String("tabSpacing")),
       
   499     qWidgetClass(QLatin1String("QWidget")),
       
   500     lineClass(QLatin1String("Line")),
       
   501     geometryProperty(QLatin1String("geometry")),
       
   502     scriptWidgetVariable(QLatin1String("widget")),
       
   503     scriptChildWidgetsVariable(QLatin1String("childWidgets"))
       
   504 {
       
   505     itemRoles.append(qMakePair(Qt::FontRole, QString::fromLatin1("font")));
       
   506     itemRoles.append(qMakePair(Qt::TextAlignmentRole, QString::fromLatin1("textAlignment")));
       
   507     itemRoles.append(qMakePair(Qt::BackgroundRole, QString::fromLatin1("background")));
       
   508     itemRoles.append(qMakePair(Qt::ForegroundRole, QString::fromLatin1("foreground")));
       
   509     itemRoles.append(qMakePair(Qt::CheckStateRole, QString::fromLatin1("checkState")));
       
   510 
       
   511     foreach (const RoleNName &it, itemRoles)
       
   512         treeItemRoleHash.insert(it.second, it.first);
       
   513 
       
   514     itemTextRoles.append(qMakePair(qMakePair(Qt::EditRole, Qt::DisplayPropertyRole),
       
   515                                    textAttribute)); // This must be first for the loop below
       
   516     itemTextRoles.append(qMakePair(qMakePair(Qt::ToolTipRole, Qt::ToolTipPropertyRole),
       
   517                                    toolTipAttribute));
       
   518     itemTextRoles.append(qMakePair(qMakePair(Qt::StatusTipRole, Qt::StatusTipPropertyRole),
       
   519                                    QString::fromLatin1("statusTip")));
       
   520     itemTextRoles.append(qMakePair(qMakePair(Qt::WhatsThisRole, Qt::WhatsThisPropertyRole),
       
   521                                    whatsThisAttribute));
       
   522 
       
   523     // Note: this skips the first item!
       
   524     QList<TextRoleNName>::const_iterator it = itemTextRoles.constBegin(), end = itemTextRoles.constEnd();
       
   525     while (++it != end)
       
   526         treeItemTextRoleHash.insert(it->second, it->first);
       
   527 }
       
   528 
       
   529 const QFormBuilderStrings &QFormBuilderStrings::instance()
       
   530 {
       
   531     static const QFormBuilderStrings rc;
       
   532     return rc;
       
   533 }
       
   534 
       
   535 #ifdef QFORMINTERNAL_NAMESPACE
       
   536 } // namespace QFormInternal
       
   537 #endif
       
   538 
       
   539 QT_END_NAMESPACE