tools/shared/qtpropertybrowser/qtvariantproperty.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 tools applications of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qtvariantproperty.h"
       
    43 #include "qtpropertymanager.h"
       
    44 #include "qteditorfactory.h"
       
    45 #include <QtCore/QVariant>
       
    46 #include <QtGui/QIcon>
       
    47 #include <QtCore/QDate>
       
    48 #include <QtCore/QLocale>
       
    49 
       
    50 #if defined(Q_CC_MSVC)
       
    51 #    pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
       
    52 #endif
       
    53 
       
    54 QT_BEGIN_NAMESPACE
       
    55 
       
    56 class QtEnumPropertyType
       
    57 {
       
    58 };
       
    59 
       
    60 
       
    61 class QtFlagPropertyType
       
    62 {
       
    63 };
       
    64 
       
    65 
       
    66 class QtGroupPropertyType
       
    67 {
       
    68 };
       
    69 
       
    70 QT_END_NAMESPACE
       
    71 
       
    72 Q_DECLARE_METATYPE(QtEnumPropertyType)
       
    73 Q_DECLARE_METATYPE(QtFlagPropertyType)
       
    74 Q_DECLARE_METATYPE(QtGroupPropertyType)
       
    75 
       
    76 QT_BEGIN_NAMESPACE
       
    77 
       
    78 /*!
       
    79     Returns the type id for an enum property.
       
    80 
       
    81     Note that the property's value type can be retrieved using the
       
    82     valueType() function (which is QVariant::Int for the enum property
       
    83     type).
       
    84 
       
    85     \sa propertyType(), valueType()
       
    86 */
       
    87 int QtVariantPropertyManager::enumTypeId()
       
    88 {
       
    89     return qMetaTypeId<QtEnumPropertyType>();
       
    90 }
       
    91 
       
    92 /*!
       
    93     Returns the type id for a flag property.
       
    94 
       
    95     Note that the property's value type can be retrieved using the
       
    96     valueType() function (which is QVariant::Int for the flag property
       
    97     type).
       
    98 
       
    99     \sa propertyType(), valueType()
       
   100 */
       
   101 int QtVariantPropertyManager::flagTypeId()
       
   102 {
       
   103     return qMetaTypeId<QtFlagPropertyType>();
       
   104 }
       
   105 
       
   106 /*!
       
   107     Returns the type id for a group property.
       
   108 
       
   109     Note that the property's value type can be retrieved using the
       
   110     valueType() function (which is QVariant::Invalid for the group
       
   111     property type, since it doesn't provide any value).
       
   112 
       
   113     \sa propertyType(), valueType()
       
   114 */
       
   115 int QtVariantPropertyManager::groupTypeId()
       
   116 {
       
   117     return qMetaTypeId<QtGroupPropertyType>();
       
   118 }
       
   119 
       
   120 /*!
       
   121     Returns the type id for a icon map attribute.
       
   122 
       
   123     Note that the property's attribute type can be retrieved using the
       
   124     attributeType() function.
       
   125 
       
   126     \sa attributeType(), QtEnumPropertyManager::enumIcons()
       
   127 */
       
   128 int QtVariantPropertyManager::iconMapTypeId()
       
   129 {
       
   130     return qMetaTypeId<QtIconMap>();
       
   131 }
       
   132 
       
   133 typedef QMap<const QtProperty *, QtProperty *> PropertyMap;
       
   134 Q_GLOBAL_STATIC(PropertyMap, propertyToWrappedProperty)
       
   135 
       
   136 static QtProperty *wrappedProperty(QtProperty *property)
       
   137 {
       
   138     return propertyToWrappedProperty()->value(property, 0);
       
   139 }
       
   140 
       
   141 class QtVariantPropertyPrivate
       
   142 {
       
   143     QtVariantProperty *q_ptr;
       
   144 public:
       
   145     QtVariantPropertyPrivate(QtVariantPropertyManager *m) : manager(m) {}
       
   146 
       
   147     QtVariantPropertyManager *manager;
       
   148 };
       
   149 
       
   150 /*!
       
   151     \class QtVariantProperty
       
   152     \internal
       
   153     \inmodule QtDesigner
       
   154     \since 4.4
       
   155 
       
   156     \brief The QtVariantProperty class is a convenience class handling
       
   157     QVariant based properties.
       
   158 
       
   159     QtVariantProperty provides additional API: A property's type,
       
   160     value type, attribute values and current value can easily be
       
   161     retrieved using the propertyType(), valueType(), attributeValue()
       
   162     and value() functions respectively. In addition, the attribute
       
   163     values and the current value can be set using the corresponding
       
   164     setValue() and setAttribute() functions.
       
   165 
       
   166     For example, instead of writing:
       
   167 
       
   168     \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtvariantproperty.cpp 0
       
   169 
       
   170     you can write:
       
   171 
       
   172     \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtvariantproperty.cpp 1
       
   173 
       
   174     QtVariantProperty instances can only be created by the
       
   175     QtVariantPropertyManager class.
       
   176 
       
   177     \sa QtProperty, QtVariantPropertyManager, QtVariantEditorFactory
       
   178 */
       
   179 
       
   180 /*!
       
   181     Creates a variant property using the given \a manager.
       
   182 
       
   183     Do not use this constructor to create variant property instances;
       
   184     use the QtVariantPropertyManager::addProperty() function
       
   185     instead.  This constructor is used internally by the
       
   186     QtVariantPropertyManager::createProperty() function.
       
   187 
       
   188     \sa QtVariantPropertyManager
       
   189 */
       
   190 QtVariantProperty::QtVariantProperty(QtVariantPropertyManager *manager)
       
   191     : QtProperty(manager), d_ptr(new QtVariantPropertyPrivate(manager))
       
   192 {
       
   193 }
       
   194 
       
   195 /*!
       
   196     Destroys this property.
       
   197 
       
   198     \sa QtProperty::~QtProperty()
       
   199 */
       
   200 QtVariantProperty::~QtVariantProperty()
       
   201 {
       
   202 }
       
   203 
       
   204 /*!
       
   205     Returns the property's current value.
       
   206 
       
   207     \sa valueType(), setValue()
       
   208 */
       
   209 QVariant QtVariantProperty::value() const
       
   210 {
       
   211     return d_ptr->manager->value(this);
       
   212 }
       
   213 
       
   214 /*!
       
   215     Returns this property's value for the specified \a attribute.
       
   216 
       
   217     QtVariantPropertyManager provides a couple of related functions:
       
   218     \l{QtVariantPropertyManager::attributes()}{attributes()} and
       
   219     \l{QtVariantPropertyManager::attributeType()}{attributeType()}.
       
   220 
       
   221     \sa setAttribute()
       
   222 */
       
   223 QVariant QtVariantProperty::attributeValue(const QString &attribute) const
       
   224 {
       
   225     return d_ptr->manager->attributeValue(this, attribute);
       
   226 }
       
   227 
       
   228 /*!
       
   229     Returns the type of this property's value.
       
   230 
       
   231     \sa propertyType()
       
   232 */
       
   233 int QtVariantProperty::valueType() const
       
   234 {
       
   235     return d_ptr->manager->valueType(this);
       
   236 }
       
   237 
       
   238 /*!
       
   239     Returns this property's type.
       
   240 
       
   241     QtVariantPropertyManager provides several related functions:
       
   242     \l{QtVariantPropertyManager::enumTypeId()}{enumTypeId()},
       
   243     \l{QtVariantPropertyManager::flagTypeId()}{flagTypeId()} and
       
   244     \l{QtVariantPropertyManager::groupTypeId()}{groupTypeId()}.
       
   245 
       
   246     \sa valueType()
       
   247 */
       
   248 int QtVariantProperty::propertyType() const
       
   249 {
       
   250     return d_ptr->manager->propertyType(this);
       
   251 }
       
   252 
       
   253 /*!
       
   254     Sets the value of this property to \a value.
       
   255 
       
   256     The specified \a value must be of the type returned by
       
   257     valueType(), or of a type that can be converted to valueType()
       
   258     using the QVariant::canConvert() function; otherwise this function
       
   259     does nothing.
       
   260 
       
   261     \sa value()
       
   262 */
       
   263 void QtVariantProperty::setValue(const QVariant &value)
       
   264 {
       
   265     d_ptr->manager->setValue(this, value);
       
   266 }
       
   267 
       
   268 /*!
       
   269     Sets the \a attribute of property to \a value.
       
   270 
       
   271     QtVariantPropertyManager provides the related
       
   272     \l{QtVariantPropertyManager::setAttribute()}{setAttribute()}
       
   273     function.
       
   274 
       
   275     \sa attributeValue()
       
   276 */
       
   277 void QtVariantProperty::setAttribute(const QString &attribute, const QVariant &value)
       
   278 {
       
   279     d_ptr->manager->setAttribute(this, attribute, value);
       
   280 }
       
   281 
       
   282 class QtVariantPropertyManagerPrivate
       
   283 {
       
   284     QtVariantPropertyManager *q_ptr;
       
   285     Q_DECLARE_PUBLIC(QtVariantPropertyManager)
       
   286 public:
       
   287     QtVariantPropertyManagerPrivate();
       
   288 
       
   289     bool m_creatingProperty;
       
   290     bool m_creatingSubProperties;
       
   291     bool m_destroyingSubProperties;
       
   292     int m_propertyType;
       
   293 
       
   294     void slotValueChanged(QtProperty *property, int val);
       
   295     void slotRangeChanged(QtProperty *property, int min, int max);
       
   296     void slotSingleStepChanged(QtProperty *property, int step);
       
   297     void slotValueChanged(QtProperty *property, double val);
       
   298     void slotRangeChanged(QtProperty *property, double min, double max);
       
   299     void slotSingleStepChanged(QtProperty *property, double step);
       
   300     void slotDecimalsChanged(QtProperty *property, int prec);
       
   301     void slotValueChanged(QtProperty *property, bool val);
       
   302     void slotValueChanged(QtProperty *property, const QString &val);
       
   303     void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);
       
   304     void slotValueChanged(QtProperty *property, const QDate &val);
       
   305     void slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max);
       
   306     void slotValueChanged(QtProperty *property, const QTime &val);
       
   307     void slotValueChanged(QtProperty *property, const QDateTime &val);
       
   308     void slotValueChanged(QtProperty *property, const QKeySequence &val);
       
   309     void slotValueChanged(QtProperty *property, const QChar &val);
       
   310     void slotValueChanged(QtProperty *property, const QLocale &val);
       
   311     void slotValueChanged(QtProperty *property, const QPoint &val);
       
   312     void slotValueChanged(QtProperty *property, const QPointF &val);
       
   313     void slotValueChanged(QtProperty *property, const QSize &val);
       
   314     void slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max);
       
   315     void slotValueChanged(QtProperty *property, const QSizeF &val);
       
   316     void slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max);
       
   317     void slotValueChanged(QtProperty *property, const QRect &val);
       
   318     void slotConstraintChanged(QtProperty *property, const QRect &val);
       
   319     void slotValueChanged(QtProperty *property, const QRectF &val);
       
   320     void slotConstraintChanged(QtProperty *property, const QRectF &val);
       
   321     void slotValueChanged(QtProperty *property, const QColor &val);
       
   322     void slotEnumChanged(QtProperty *property, int val);
       
   323     void slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames);
       
   324     void slotEnumIconsChanged(QtProperty *property, const QMap<int, QIcon> &enumIcons);
       
   325     void slotValueChanged(QtProperty *property, const QSizePolicy &val);
       
   326     void slotValueChanged(QtProperty *property, const QFont &val);
       
   327     void slotValueChanged(QtProperty *property, const QCursor &val);
       
   328     void slotFlagChanged(QtProperty *property, int val);
       
   329     void slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames);
       
   330     void slotPropertyInserted(QtProperty *property, QtProperty *parent, QtProperty *after);
       
   331     void slotPropertyRemoved(QtProperty *property, QtProperty *parent);
       
   332 
       
   333     void valueChanged(QtProperty *property, const QVariant &val);
       
   334 
       
   335     int internalPropertyToType(QtProperty *property) const;
       
   336     QtVariantProperty *createSubProperty(QtVariantProperty *parent, QtVariantProperty *after,
       
   337             QtProperty *internal);
       
   338     void removeSubProperty(QtVariantProperty *property);
       
   339 
       
   340     QMap<int, QtAbstractPropertyManager *> m_typeToPropertyManager;
       
   341     QMap<int, QMap<QString, int> > m_typeToAttributeToAttributeType;
       
   342 
       
   343     QMap<const QtProperty *, QPair<QtVariantProperty *, int> > m_propertyToType;
       
   344 
       
   345     QMap<int, int> m_typeToValueType;
       
   346 
       
   347 
       
   348     QMap<QtProperty *, QtVariantProperty *> m_internalToProperty;
       
   349 
       
   350     const QString m_constraintAttribute;
       
   351     const QString m_singleStepAttribute;
       
   352     const QString m_decimalsAttribute;
       
   353     const QString m_enumIconsAttribute;
       
   354     const QString m_enumNamesAttribute;
       
   355     const QString m_flagNamesAttribute;
       
   356     const QString m_maximumAttribute;
       
   357     const QString m_minimumAttribute;
       
   358     const QString m_regExpAttribute;
       
   359 };
       
   360 
       
   361 QtVariantPropertyManagerPrivate::QtVariantPropertyManagerPrivate() :
       
   362     m_constraintAttribute(QLatin1String("constraint")),
       
   363     m_singleStepAttribute(QLatin1String("singleStep")),
       
   364     m_decimalsAttribute(QLatin1String("decimals")),
       
   365     m_enumIconsAttribute(QLatin1String("enumIcons")),
       
   366     m_enumNamesAttribute(QLatin1String("enumNames")),
       
   367     m_flagNamesAttribute(QLatin1String("flagNames")),
       
   368     m_maximumAttribute(QLatin1String("maximum")),
       
   369     m_minimumAttribute(QLatin1String("minimum")),
       
   370     m_regExpAttribute(QLatin1String("regExp"))
       
   371 {
       
   372 }
       
   373 
       
   374 int QtVariantPropertyManagerPrivate::internalPropertyToType(QtProperty *property) const
       
   375 {
       
   376     int type = 0;
       
   377     QtAbstractPropertyManager *internPropertyManager = property->propertyManager();
       
   378     if (qobject_cast<QtIntPropertyManager *>(internPropertyManager))
       
   379         type = QVariant::Int;
       
   380     else if (qobject_cast<QtEnumPropertyManager *>(internPropertyManager))
       
   381         type = QtVariantPropertyManager::enumTypeId();
       
   382     else if (qobject_cast<QtBoolPropertyManager *>(internPropertyManager))
       
   383         type = QVariant::Bool;
       
   384     else if (qobject_cast<QtDoublePropertyManager *>(internPropertyManager))
       
   385         type = QVariant::Double;
       
   386     return type;
       
   387 }
       
   388 
       
   389 QtVariantProperty *QtVariantPropertyManagerPrivate::createSubProperty(QtVariantProperty *parent,
       
   390             QtVariantProperty *after, QtProperty *internal)
       
   391 {
       
   392     int type = internalPropertyToType(internal);
       
   393     if (!type)
       
   394         return 0;
       
   395 
       
   396     bool wasCreatingSubProperties = m_creatingSubProperties;
       
   397     m_creatingSubProperties = true;
       
   398 
       
   399     QtVariantProperty *varChild = q_ptr->addProperty(type, internal->propertyName());
       
   400 
       
   401     m_creatingSubProperties = wasCreatingSubProperties;
       
   402 
       
   403     varChild->setPropertyName(internal->propertyName());
       
   404     varChild->setToolTip(internal->toolTip());
       
   405     varChild->setStatusTip(internal->statusTip());
       
   406     varChild->setWhatsThis(internal->whatsThis());
       
   407 
       
   408     parent->insertSubProperty(varChild, after);
       
   409 
       
   410     m_internalToProperty[internal] = varChild;
       
   411     propertyToWrappedProperty()->insert(varChild, internal);
       
   412     return varChild;
       
   413 }
       
   414 
       
   415 void QtVariantPropertyManagerPrivate::removeSubProperty(QtVariantProperty *property)
       
   416 {
       
   417     QtProperty *internChild = wrappedProperty(property);
       
   418     bool wasDestroyingSubProperties = m_destroyingSubProperties;
       
   419     m_destroyingSubProperties = true;
       
   420     delete property;
       
   421     m_destroyingSubProperties = wasDestroyingSubProperties;
       
   422     m_internalToProperty.remove(internChild);
       
   423     propertyToWrappedProperty()->remove(property);
       
   424 }
       
   425 
       
   426 void QtVariantPropertyManagerPrivate::slotPropertyInserted(QtProperty *property,
       
   427             QtProperty *parent, QtProperty *after)
       
   428 {
       
   429     if (m_creatingProperty)
       
   430         return;
       
   431 
       
   432     QtVariantProperty *varParent = m_internalToProperty.value(parent, 0);
       
   433     if (!varParent)
       
   434         return;
       
   435 
       
   436     QtVariantProperty *varAfter = 0;
       
   437     if (after) {
       
   438         varAfter = m_internalToProperty.value(after, 0);
       
   439         if (!varAfter)
       
   440             return;
       
   441     }
       
   442 
       
   443     createSubProperty(varParent, varAfter, property);
       
   444 }
       
   445 
       
   446 void QtVariantPropertyManagerPrivate::slotPropertyRemoved(QtProperty *property, QtProperty *parent)
       
   447 {
       
   448     Q_UNUSED(parent)
       
   449 
       
   450     QtVariantProperty *varProperty = m_internalToProperty.value(property, 0);
       
   451     if (!varProperty)
       
   452         return;
       
   453 
       
   454     removeSubProperty(varProperty);
       
   455 }
       
   456 
       
   457 void QtVariantPropertyManagerPrivate::valueChanged(QtProperty *property, const QVariant &val)
       
   458 {
       
   459     QtVariantProperty *varProp = m_internalToProperty.value(property, 0);
       
   460     if (!varProp)
       
   461         return;
       
   462     emit q_ptr->valueChanged(varProp, val);
       
   463     emit q_ptr->propertyChanged(varProp);
       
   464 }
       
   465 
       
   466 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, int val)
       
   467 {
       
   468     valueChanged(property, QVariant(val));
       
   469 }
       
   470 
       
   471 void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, int min, int max)
       
   472 {
       
   473     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   474         emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
       
   475         emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
       
   476     }
       
   477 }
       
   478 
       
   479 void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, int step)
       
   480 {
       
   481     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   482         emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step));
       
   483 }
       
   484 
       
   485 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, double val)
       
   486 {
       
   487     valueChanged(property, QVariant(val));
       
   488 }
       
   489 
       
   490 void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, double min, double max)
       
   491 {
       
   492     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   493         emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
       
   494         emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
       
   495     }
       
   496 }
       
   497 
       
   498 void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, double step)
       
   499 {
       
   500     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   501         emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step));
       
   502 }
       
   503 
       
   504 void QtVariantPropertyManagerPrivate::slotDecimalsChanged(QtProperty *property, int prec)
       
   505 {
       
   506     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   507         emit q_ptr->attributeChanged(varProp, m_decimalsAttribute, QVariant(prec));
       
   508 }
       
   509 
       
   510 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, bool val)
       
   511 {
       
   512     valueChanged(property, QVariant(val));
       
   513 }
       
   514 
       
   515 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QString &val)
       
   516 {
       
   517     valueChanged(property, QVariant(val));
       
   518 }
       
   519 
       
   520 void QtVariantPropertyManagerPrivate::slotRegExpChanged(QtProperty *property, const QRegExp &regExp)
       
   521 {
       
   522     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   523         emit q_ptr->attributeChanged(varProp, m_regExpAttribute, QVariant(regExp));
       
   524 }
       
   525 
       
   526 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDate &val)
       
   527 {
       
   528     valueChanged(property, QVariant(val));
       
   529 }
       
   530 
       
   531 void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max)
       
   532 {
       
   533     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   534         emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
       
   535         emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
       
   536     }
       
   537 }
       
   538 
       
   539 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QTime &val)
       
   540 {
       
   541     valueChanged(property, QVariant(val));
       
   542 }
       
   543 
       
   544 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDateTime &val)
       
   545 {
       
   546     valueChanged(property, QVariant(val));
       
   547 }
       
   548 
       
   549 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QKeySequence &val)
       
   550 {
       
   551     QVariant v;
       
   552     qVariantSetValue(v, val);
       
   553     valueChanged(property, v);
       
   554 }
       
   555 
       
   556 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QChar &val)
       
   557 {
       
   558     valueChanged(property, QVariant(val));
       
   559 }
       
   560 
       
   561 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QLocale &val)
       
   562 {
       
   563     valueChanged(property, QVariant(val));
       
   564 }
       
   565 
       
   566 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPoint &val)
       
   567 {
       
   568     valueChanged(property, QVariant(val));
       
   569 }
       
   570 
       
   571 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPointF &val)
       
   572 {
       
   573     valueChanged(property, QVariant(val));
       
   574 }
       
   575 
       
   576 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSize &val)
       
   577 {
       
   578     valueChanged(property, QVariant(val));
       
   579 }
       
   580 
       
   581 void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max)
       
   582 {
       
   583     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   584         emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
       
   585         emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
       
   586     }
       
   587 }
       
   588 
       
   589 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizeF &val)
       
   590 {
       
   591     valueChanged(property, QVariant(val));
       
   592 }
       
   593 
       
   594 void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max)
       
   595 {
       
   596     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   597         emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
       
   598         emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
       
   599     }
       
   600 }
       
   601 
       
   602 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRect &val)
       
   603 {
       
   604     valueChanged(property, QVariant(val));
       
   605 }
       
   606 
       
   607 void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRect &constraint)
       
   608 {
       
   609     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   610         emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint));
       
   611 }
       
   612 
       
   613 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRectF &val)
       
   614 {
       
   615     valueChanged(property, QVariant(val));
       
   616 }
       
   617 
       
   618 void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRectF &constraint)
       
   619 {
       
   620     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   621         emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint));
       
   622 }
       
   623 
       
   624 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QColor &val)
       
   625 {
       
   626     valueChanged(property, QVariant(val));
       
   627 }
       
   628 
       
   629 void QtVariantPropertyManagerPrivate::slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames)
       
   630 {
       
   631     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   632         emit q_ptr->attributeChanged(varProp, m_enumNamesAttribute, QVariant(enumNames));
       
   633 }
       
   634 
       
   635 void QtVariantPropertyManagerPrivate::slotEnumIconsChanged(QtProperty *property, const QMap<int, QIcon> &enumIcons)
       
   636 {
       
   637     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
       
   638         QVariant v;
       
   639         qVariantSetValue(v, enumIcons);
       
   640         emit q_ptr->attributeChanged(varProp, m_enumIconsAttribute, v);
       
   641     }
       
   642 }
       
   643 
       
   644 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizePolicy &val)
       
   645 {
       
   646     valueChanged(property, QVariant(val));
       
   647 }
       
   648 
       
   649 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QFont &val)
       
   650 {
       
   651     valueChanged(property, QVariant(val));
       
   652 }
       
   653 
       
   654 void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QCursor &val)
       
   655 {
       
   656 #ifndef QT_NO_CURSOR
       
   657     valueChanged(property, QVariant(val));
       
   658 #endif
       
   659 }
       
   660 
       
   661 void QtVariantPropertyManagerPrivate::slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames)
       
   662 {
       
   663     if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
       
   664         emit q_ptr->attributeChanged(varProp, m_flagNamesAttribute, QVariant(flagNames));
       
   665 }
       
   666 
       
   667 /*!
       
   668     \class QtVariantPropertyManager
       
   669     \internal
       
   670     \inmodule QtDesigner
       
   671     \since 4.4
       
   672 
       
   673     \brief The QtVariantPropertyManager class provides and manages QVariant based properties.
       
   674 
       
   675     QtVariantPropertyManager provides the addProperty() function which
       
   676     creates QtVariantProperty objects. The QtVariantProperty class is
       
   677     a convenience class handling QVariant based properties inheriting
       
   678     QtProperty. A QtProperty object created by a
       
   679     QtVariantPropertyManager instance can be converted into a
       
   680     QtVariantProperty object using the variantProperty() function.
       
   681 
       
   682     The property's value can be retrieved using the value(), and set
       
   683     using the setValue() slot. In addition the property's type, and
       
   684     the type of its value, can be retrieved using the propertyType()
       
   685     and valueType() functions respectively.
       
   686 
       
   687     A property's type is a QVariant::Type enumerator value, and
       
   688     usually a property's type is the same as its value type. But for
       
   689     some properties the types differ, for example for enums, flags and
       
   690     group types in which case QtVariantPropertyManager provides the
       
   691     enumTypeId(), flagTypeId() and groupTypeId() functions,
       
   692     respectively, to identify their property type (the value types are
       
   693     QVariant::Int for the enum and flag types, and QVariant::Invalid
       
   694     for the group type).
       
   695 
       
   696     Use the isPropertyTypeSupported() function to check if a particular
       
   697     property type is supported. The currently supported property types
       
   698     are:
       
   699 
       
   700     \table
       
   701     \header
       
   702         \o Property Type
       
   703         \o Property Type Id
       
   704     \row
       
   705         \o int
       
   706         \o QVariant::Int
       
   707     \row
       
   708         \o double
       
   709         \o QVariant::Double
       
   710     \row
       
   711         \o bool
       
   712         \o QVariant::Bool
       
   713     \row
       
   714         \o QString
       
   715         \o QVariant::String
       
   716     \row
       
   717         \o QDate
       
   718         \o QVariant::Date
       
   719     \row
       
   720         \o QTime
       
   721         \o QVariant::Time
       
   722     \row
       
   723         \o QDateTime
       
   724         \o QVariant::DateTime
       
   725     \row
       
   726         \o QKeySequence
       
   727         \o QVariant::KeySequence
       
   728     \row
       
   729         \o QChar
       
   730         \o QVariant::Char
       
   731     \row
       
   732         \o QLocale
       
   733         \o QVariant::Locale
       
   734     \row
       
   735         \o QPoint
       
   736         \o QVariant::Point
       
   737     \row
       
   738         \o QPointF
       
   739         \o QVariant::PointF
       
   740     \row
       
   741         \o QSize
       
   742         \o QVariant::Size
       
   743     \row
       
   744         \o QSizeF
       
   745         \o QVariant::SizeF
       
   746     \row
       
   747         \o QRect
       
   748         \o QVariant::Rect
       
   749     \row
       
   750         \o QRectF
       
   751         \o QVariant::RectF
       
   752     \row
       
   753         \o QColor
       
   754         \o QVariant::Color
       
   755     \row
       
   756         \o QSizePolicy
       
   757         \o QVariant::SizePolicy
       
   758     \row
       
   759         \o QFont
       
   760         \o QVariant::Font
       
   761     \row
       
   762         \o QCursor
       
   763         \o QVariant::Cursor
       
   764     \row
       
   765         \o enum
       
   766         \o enumTypeId()
       
   767     \row
       
   768         \o flag
       
   769         \o flagTypeId()
       
   770     \row
       
   771         \o group
       
   772         \o groupTypeId()
       
   773     \endtable
       
   774 
       
   775     Each property type can provide additional attributes,
       
   776     e.g. QVariant::Int and QVariant::Double provides minimum and
       
   777     maximum values. The currently supported attributes are:
       
   778 
       
   779     \table
       
   780     \header
       
   781         \o Property Type
       
   782         \o Attribute Name
       
   783         \o Attribute Type
       
   784     \row
       
   785         \o \c int
       
   786         \o minimum
       
   787         \o QVariant::Int
       
   788     \row
       
   789         \o
       
   790         \o maximum
       
   791         \o QVariant::Int
       
   792     \row
       
   793         \o
       
   794         \o singleStep
       
   795         \o QVariant::Int
       
   796     \row
       
   797         \o \c double
       
   798         \o minimum
       
   799         \o QVariant::Double
       
   800     \row
       
   801         \o
       
   802         \o maximum
       
   803         \o QVariant::Double
       
   804     \row
       
   805         \o
       
   806         \o singleStep
       
   807         \o QVariant::Double
       
   808     \row
       
   809         \o
       
   810         \o decimals
       
   811         \o QVariant::Int
       
   812     \row
       
   813         \o QString
       
   814         \o regExp
       
   815         \o QVariant::RegExp
       
   816     \row
       
   817         \o QDate
       
   818         \o minimum
       
   819         \o QVariant::Date
       
   820     \row
       
   821         \o
       
   822         \o maximum
       
   823         \o QVariant::Date
       
   824     \row
       
   825         \o QPointF
       
   826         \o decimals
       
   827         \o QVariant::Int
       
   828     \row
       
   829         \o QSize
       
   830         \o minimum
       
   831         \o QVariant::Size
       
   832     \row
       
   833         \o
       
   834         \o maximum
       
   835         \o QVariant::Size
       
   836     \row
       
   837         \o QSizeF
       
   838         \o minimum
       
   839         \o QVariant::SizeF
       
   840     \row
       
   841         \o
       
   842         \o maximum
       
   843         \o QVariant::SizeF
       
   844     \row
       
   845         \o
       
   846         \o decimals
       
   847         \o QVariant::Int
       
   848     \row
       
   849         \o QRect
       
   850         \o constraint
       
   851         \o QVariant::Rect
       
   852     \row
       
   853         \o QRectF
       
   854         \o constraint
       
   855         \o QVariant::RectF
       
   856     \row
       
   857         \o
       
   858         \o decimals
       
   859         \o QVariant::Int
       
   860     \row
       
   861         \o \c enum
       
   862         \o enumNames
       
   863         \o QVariant::StringList
       
   864     \row
       
   865         \o
       
   866         \o enumIcons
       
   867         \o iconMapTypeId()
       
   868     \row
       
   869         \o \c flag
       
   870         \o flagNames
       
   871         \o QVariant::StringList
       
   872     \endtable
       
   873 
       
   874     The attributes for a given property type can be retrieved using
       
   875     the attributes() function. Each attribute has a value type which
       
   876     can be retrieved using the attributeType() function, and a value
       
   877     accessible through the attributeValue() function. In addition, the
       
   878     value can be set using the setAttribute() slot.
       
   879 
       
   880     QtVariantManager also provides the valueChanged() signal which is
       
   881     emitted whenever a property created by this manager change, and
       
   882     the attributeChanged() signal which is emitted whenever an
       
   883     attribute of such a property changes.
       
   884 
       
   885     \sa QtVariantProperty, QtVariantEditorFactory
       
   886 */
       
   887 
       
   888 /*!
       
   889     \fn void QtVariantPropertyManager::valueChanged(QtProperty *property, const QVariant &value)
       
   890 
       
   891     This signal is emitted whenever a property created by this manager
       
   892     changes its value, passing a pointer to the \a property and the
       
   893     new \a value as parameters.
       
   894 
       
   895     \sa setValue()
       
   896 */
       
   897 
       
   898 /*!
       
   899     \fn void QtVariantPropertyManager::attributeChanged(QtProperty *property,
       
   900                 const QString &attribute, const QVariant &value)
       
   901 
       
   902     This signal is emitted whenever an attribute of a property created
       
   903     by this manager changes its value, passing a pointer to the \a
       
   904     property, the \a attribute and the new \a value as parameters.
       
   905 
       
   906     \sa setAttribute()
       
   907 */
       
   908 
       
   909 /*!
       
   910     Creates a manager with the given \a parent.
       
   911 */
       
   912 QtVariantPropertyManager::QtVariantPropertyManager(QObject *parent)
       
   913     : QtAbstractPropertyManager(parent), d_ptr(new QtVariantPropertyManagerPrivate)
       
   914 {
       
   915     d_ptr->q_ptr = this;
       
   916 
       
   917     d_ptr->m_creatingProperty = false;
       
   918     d_ptr->m_creatingSubProperties = false;
       
   919     d_ptr->m_destroyingSubProperties = false;
       
   920     d_ptr->m_propertyType = 0;
       
   921 
       
   922     // IntPropertyManager
       
   923     QtIntPropertyManager *intPropertyManager = new QtIntPropertyManager(this);
       
   924     d_ptr->m_typeToPropertyManager[QVariant::Int] = intPropertyManager;
       
   925     d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_minimumAttribute] = QVariant::Int;
       
   926     d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_maximumAttribute] = QVariant::Int;
       
   927     d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_singleStepAttribute] = QVariant::Int;
       
   928     d_ptr->m_typeToValueType[QVariant::Int] = QVariant::Int;
       
   929     connect(intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)),
       
   930                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
   931     connect(intPropertyManager, SIGNAL(rangeChanged(QtProperty *, int, int)),
       
   932                 this, SLOT(slotRangeChanged(QtProperty *, int, int)));
       
   933     connect(intPropertyManager, SIGNAL(singleStepChanged(QtProperty *, int)),
       
   934                 this, SLOT(slotSingleStepChanged(QtProperty *, int)));
       
   935     // DoublePropertyManager
       
   936     QtDoublePropertyManager *doublePropertyManager = new QtDoublePropertyManager(this);
       
   937     d_ptr->m_typeToPropertyManager[QVariant::Double] = doublePropertyManager;
       
   938     d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_minimumAttribute] =
       
   939             QVariant::Double;
       
   940     d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_maximumAttribute] =
       
   941             QVariant::Double;
       
   942     d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_singleStepAttribute] =
       
   943             QVariant::Double;
       
   944     d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_decimalsAttribute] =
       
   945             QVariant::Int;
       
   946     d_ptr->m_typeToValueType[QVariant::Double] = QVariant::Double;
       
   947     connect(doublePropertyManager, SIGNAL(valueChanged(QtProperty *, double)),
       
   948                 this, SLOT(slotValueChanged(QtProperty *, double)));
       
   949     connect(doublePropertyManager, SIGNAL(rangeChanged(QtProperty *, double, double)),
       
   950                 this, SLOT(slotRangeChanged(QtProperty *, double, double)));
       
   951     connect(doublePropertyManager, SIGNAL(singleStepChanged(QtProperty *, double)),
       
   952                 this, SLOT(slotSingleStepChanged(QtProperty *, double)));
       
   953     connect(doublePropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)),
       
   954                 this, SLOT(slotDecimalsChanged(QtProperty *, int)));
       
   955     // BoolPropertyManager
       
   956     QtBoolPropertyManager *boolPropertyManager = new QtBoolPropertyManager(this);
       
   957     d_ptr->m_typeToPropertyManager[QVariant::Bool] = boolPropertyManager;
       
   958     d_ptr->m_typeToValueType[QVariant::Bool] = QVariant::Bool;
       
   959     connect(boolPropertyManager, SIGNAL(valueChanged(QtProperty *, bool)),
       
   960                 this, SLOT(slotValueChanged(QtProperty *, bool)));
       
   961     // StringPropertyManager
       
   962     QtStringPropertyManager *stringPropertyManager = new QtStringPropertyManager(this);
       
   963     d_ptr->m_typeToPropertyManager[QVariant::String] = stringPropertyManager;
       
   964     d_ptr->m_typeToValueType[QVariant::String] = QVariant::String;
       
   965     d_ptr->m_typeToAttributeToAttributeType[QVariant::String][d_ptr->m_regExpAttribute] =
       
   966             QVariant::RegExp;
       
   967     connect(stringPropertyManager, SIGNAL(valueChanged(QtProperty *, const QString &)),
       
   968                 this, SLOT(slotValueChanged(QtProperty *, const QString &)));
       
   969     connect(stringPropertyManager, SIGNAL(regExpChanged(QtProperty *, const QRegExp &)),
       
   970                 this, SLOT(slotRegExpChanged(QtProperty *, const QRegExp &)));
       
   971     // DatePropertyManager
       
   972     QtDatePropertyManager *datePropertyManager = new QtDatePropertyManager(this);
       
   973     d_ptr->m_typeToPropertyManager[QVariant::Date] = datePropertyManager;
       
   974     d_ptr->m_typeToValueType[QVariant::Date] = QVariant::Date;
       
   975     d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_minimumAttribute] =
       
   976             QVariant::Date;
       
   977     d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_maximumAttribute] =
       
   978             QVariant::Date;
       
   979     connect(datePropertyManager, SIGNAL(valueChanged(QtProperty *, const QDate &)),
       
   980                 this, SLOT(slotValueChanged(QtProperty *, const QDate &)));
       
   981     connect(datePropertyManager, SIGNAL(rangeChanged(QtProperty *, const QDate &, const QDate &)),
       
   982                 this, SLOT(slotRangeChanged(QtProperty *, const QDate &, const QDate &)));
       
   983     // TimePropertyManager
       
   984     QtTimePropertyManager *timePropertyManager = new QtTimePropertyManager(this);
       
   985     d_ptr->m_typeToPropertyManager[QVariant::Time] = timePropertyManager;
       
   986     d_ptr->m_typeToValueType[QVariant::Time] = QVariant::Time;
       
   987     connect(timePropertyManager, SIGNAL(valueChanged(QtProperty *, const QTime &)),
       
   988                 this, SLOT(slotValueChanged(QtProperty *, const QTime &)));
       
   989     // DateTimePropertyManager
       
   990     QtDateTimePropertyManager *dateTimePropertyManager = new QtDateTimePropertyManager(this);
       
   991     d_ptr->m_typeToPropertyManager[QVariant::DateTime] = dateTimePropertyManager;
       
   992     d_ptr->m_typeToValueType[QVariant::DateTime] = QVariant::DateTime;
       
   993     connect(dateTimePropertyManager, SIGNAL(valueChanged(QtProperty *, const QDateTime &)),
       
   994                 this, SLOT(slotValueChanged(QtProperty *, const QDateTime &)));
       
   995     // KeySequencePropertyManager
       
   996     QtKeySequencePropertyManager *keySequencePropertyManager = new QtKeySequencePropertyManager(this);
       
   997     d_ptr->m_typeToPropertyManager[QVariant::KeySequence] = keySequencePropertyManager;
       
   998     d_ptr->m_typeToValueType[QVariant::KeySequence] = QVariant::KeySequence;
       
   999     connect(keySequencePropertyManager, SIGNAL(valueChanged(QtProperty *, const QKeySequence &)),
       
  1000                 this, SLOT(slotValueChanged(QtProperty *, const QKeySequence &)));
       
  1001     // CharPropertyManager
       
  1002     QtCharPropertyManager *charPropertyManager = new QtCharPropertyManager(this);
       
  1003     d_ptr->m_typeToPropertyManager[QVariant::Char] = charPropertyManager;
       
  1004     d_ptr->m_typeToValueType[QVariant::Char] = QVariant::Char;
       
  1005     connect(charPropertyManager, SIGNAL(valueChanged(QtProperty *, const QChar &)),
       
  1006                 this, SLOT(slotValueChanged(QtProperty *, const QChar &)));
       
  1007     // LocalePropertyManager
       
  1008     QtLocalePropertyManager *localePropertyManager = new QtLocalePropertyManager(this);
       
  1009     d_ptr->m_typeToPropertyManager[QVariant::Locale] = localePropertyManager;
       
  1010     d_ptr->m_typeToValueType[QVariant::Locale] = QVariant::Locale;
       
  1011     connect(localePropertyManager, SIGNAL(valueChanged(QtProperty *, const QLocale &)),
       
  1012                 this, SLOT(slotValueChanged(QtProperty *, const QLocale &)));
       
  1013     connect(localePropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1014                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1015     connect(localePropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1016                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1017     connect(localePropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1018                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1019     // PointPropertyManager
       
  1020     QtPointPropertyManager *pointPropertyManager = new QtPointPropertyManager(this);
       
  1021     d_ptr->m_typeToPropertyManager[QVariant::Point] = pointPropertyManager;
       
  1022     d_ptr->m_typeToValueType[QVariant::Point] = QVariant::Point;
       
  1023     connect(pointPropertyManager, SIGNAL(valueChanged(QtProperty *, const QPoint &)),
       
  1024                 this, SLOT(slotValueChanged(QtProperty *, const QPoint &)));
       
  1025     connect(pointPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1026                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1027     connect(pointPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1028                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1029     connect(pointPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1030                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1031     // PointFPropertyManager
       
  1032     QtPointFPropertyManager *pointFPropertyManager = new QtPointFPropertyManager(this);
       
  1033     d_ptr->m_typeToPropertyManager[QVariant::PointF] = pointFPropertyManager;
       
  1034     d_ptr->m_typeToValueType[QVariant::PointF] = QVariant::PointF;
       
  1035     d_ptr->m_typeToAttributeToAttributeType[QVariant::PointF][d_ptr->m_decimalsAttribute] =
       
  1036             QVariant::Int;
       
  1037     connect(pointFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QPointF &)),
       
  1038                 this, SLOT(slotValueChanged(QtProperty *, const QPointF &)));
       
  1039     connect(pointFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)),
       
  1040                 this, SLOT(slotDecimalsChanged(QtProperty *, int)));
       
  1041     connect(pointFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)),
       
  1042                 this, SLOT(slotValueChanged(QtProperty *, double)));
       
  1043     connect(pointFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1044                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1045     connect(pointFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1046                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1047     // SizePropertyManager
       
  1048     QtSizePropertyManager *sizePropertyManager = new QtSizePropertyManager(this);
       
  1049     d_ptr->m_typeToPropertyManager[QVariant::Size] = sizePropertyManager;
       
  1050     d_ptr->m_typeToValueType[QVariant::Size] = QVariant::Size;
       
  1051     d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_minimumAttribute] =
       
  1052             QVariant::Size;
       
  1053     d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_maximumAttribute] =
       
  1054             QVariant::Size;
       
  1055     connect(sizePropertyManager, SIGNAL(valueChanged(QtProperty *, const QSize &)),
       
  1056                 this, SLOT(slotValueChanged(QtProperty *, const QSize &)));
       
  1057     connect(sizePropertyManager, SIGNAL(rangeChanged(QtProperty *, const QSize &, const QSize &)),
       
  1058                 this, SLOT(slotRangeChanged(QtProperty *, const QSize &, const QSize &)));
       
  1059     connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1060                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1061     connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)),
       
  1062                 this, SLOT(slotRangeChanged(QtProperty *, int, int)));
       
  1063     connect(sizePropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1064                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1065     connect(sizePropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1066                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1067     // SizeFPropertyManager
       
  1068     QtSizeFPropertyManager *sizeFPropertyManager = new QtSizeFPropertyManager(this);
       
  1069     d_ptr->m_typeToPropertyManager[QVariant::SizeF] = sizeFPropertyManager;
       
  1070     d_ptr->m_typeToValueType[QVariant::SizeF] = QVariant::SizeF;
       
  1071     d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_minimumAttribute] =
       
  1072             QVariant::SizeF;
       
  1073     d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_maximumAttribute] =
       
  1074             QVariant::SizeF;
       
  1075     d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_decimalsAttribute] =
       
  1076             QVariant::Int;
       
  1077     connect(sizeFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QSizeF &)),
       
  1078                 this, SLOT(slotValueChanged(QtProperty *, const QSizeF &)));
       
  1079     connect(sizeFPropertyManager, SIGNAL(rangeChanged(QtProperty *, const QSizeF &, const QSizeF &)),
       
  1080                 this, SLOT(slotRangeChanged(QtProperty *, const QSizeF &, const QSizeF &)));
       
  1081     connect(sizeFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)),
       
  1082                 this, SLOT(slotDecimalsChanged(QtProperty *, int)));
       
  1083     connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)),
       
  1084                 this, SLOT(slotValueChanged(QtProperty *, double)));
       
  1085     connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty *, double, double)),
       
  1086                 this, SLOT(slotRangeChanged(QtProperty *, double, double)));
       
  1087     connect(sizeFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1088                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1089     connect(sizeFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1090                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1091     // RectPropertyManager
       
  1092     QtRectPropertyManager *rectPropertyManager = new QtRectPropertyManager(this);
       
  1093     d_ptr->m_typeToPropertyManager[QVariant::Rect] = rectPropertyManager;
       
  1094     d_ptr->m_typeToValueType[QVariant::Rect] = QVariant::Rect;
       
  1095     d_ptr->m_typeToAttributeToAttributeType[QVariant::Rect][d_ptr->m_constraintAttribute] =
       
  1096             QVariant::Rect;
       
  1097     connect(rectPropertyManager, SIGNAL(valueChanged(QtProperty *, const QRect &)),
       
  1098                 this, SLOT(slotValueChanged(QtProperty *, const QRect &)));
       
  1099     connect(rectPropertyManager, SIGNAL(constraintChanged(QtProperty *, const QRect &)),
       
  1100                 this, SLOT(slotConstraintChanged(QtProperty *, const QRect &)));
       
  1101     connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1102                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1103     connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)),
       
  1104                 this, SLOT(slotRangeChanged(QtProperty *, int, int)));
       
  1105     connect(rectPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1106                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1107     connect(rectPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1108                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1109     // RectFPropertyManager
       
  1110     QtRectFPropertyManager *rectFPropertyManager = new QtRectFPropertyManager(this);
       
  1111     d_ptr->m_typeToPropertyManager[QVariant::RectF] = rectFPropertyManager;
       
  1112     d_ptr->m_typeToValueType[QVariant::RectF] = QVariant::RectF;
       
  1113     d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_constraintAttribute] =
       
  1114             QVariant::RectF;
       
  1115     d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_decimalsAttribute] =
       
  1116             QVariant::Int;
       
  1117     connect(rectFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QRectF &)),
       
  1118                 this, SLOT(slotValueChanged(QtProperty *, const QRectF &)));
       
  1119     connect(rectFPropertyManager, SIGNAL(constraintChanged(QtProperty *, const QRectF &)),
       
  1120                 this, SLOT(slotConstraintChanged(QtProperty *, const QRectF &)));
       
  1121     connect(rectFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)),
       
  1122                 this, SLOT(slotDecimalsChanged(QtProperty *, int)));
       
  1123     connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)),
       
  1124                 this, SLOT(slotValueChanged(QtProperty *, double)));
       
  1125     connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty *, double, double)),
       
  1126                 this, SLOT(slotRangeChanged(QtProperty *, double, double)));
       
  1127     connect(rectFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1128                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1129     connect(rectFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1130                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1131     // ColorPropertyManager
       
  1132     QtColorPropertyManager *colorPropertyManager = new QtColorPropertyManager(this);
       
  1133     d_ptr->m_typeToPropertyManager[QVariant::Color] = colorPropertyManager;
       
  1134     d_ptr->m_typeToValueType[QVariant::Color] = QVariant::Color;
       
  1135     connect(colorPropertyManager, SIGNAL(valueChanged(QtProperty *, const QColor &)),
       
  1136                 this, SLOT(slotValueChanged(QtProperty *, const QColor &)));
       
  1137     connect(colorPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1138                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1139     connect(colorPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1140                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1141     connect(colorPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1142                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1143     // EnumPropertyManager
       
  1144     int enumId = enumTypeId();
       
  1145     QtEnumPropertyManager *enumPropertyManager = new QtEnumPropertyManager(this);
       
  1146     d_ptr->m_typeToPropertyManager[enumId] = enumPropertyManager;
       
  1147     d_ptr->m_typeToValueType[enumId] = QVariant::Int;
       
  1148     d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumNamesAttribute] =
       
  1149             QVariant::StringList;
       
  1150     d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumIconsAttribute] =
       
  1151             iconMapTypeId();
       
  1152     connect(enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)),
       
  1153                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1154     connect(enumPropertyManager, SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)),
       
  1155                 this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &)));
       
  1156     connect(enumPropertyManager, SIGNAL(enumIconsChanged(QtProperty *, const QMap<int, QIcon> &)),
       
  1157                 this, SLOT(slotEnumIconsChanged(QtProperty *, const QMap<int, QIcon> &)));
       
  1158     // SizePolicyPropertyManager
       
  1159     QtSizePolicyPropertyManager *sizePolicyPropertyManager = new QtSizePolicyPropertyManager(this);
       
  1160     d_ptr->m_typeToPropertyManager[QVariant::SizePolicy] = sizePolicyPropertyManager;
       
  1161     d_ptr->m_typeToValueType[QVariant::SizePolicy] = QVariant::SizePolicy;
       
  1162     connect(sizePolicyPropertyManager, SIGNAL(valueChanged(QtProperty *, const QSizePolicy &)),
       
  1163                 this, SLOT(slotValueChanged(QtProperty *, const QSizePolicy &)));
       
  1164     connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1165                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1166     connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)),
       
  1167                 this, SLOT(slotRangeChanged(QtProperty *, int, int)));
       
  1168     connect(sizePolicyPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1169                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1170     connect(sizePolicyPropertyManager->subEnumPropertyManager(),
       
  1171                 SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)),
       
  1172                 this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &)));
       
  1173     connect(sizePolicyPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1174                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1175     connect(sizePolicyPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1176                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1177     // FontPropertyManager
       
  1178     QtFontPropertyManager *fontPropertyManager = new QtFontPropertyManager(this);
       
  1179     d_ptr->m_typeToPropertyManager[QVariant::Font] = fontPropertyManager;
       
  1180     d_ptr->m_typeToValueType[QVariant::Font] = QVariant::Font;
       
  1181     connect(fontPropertyManager, SIGNAL(valueChanged(QtProperty *, const QFont &)),
       
  1182                 this, SLOT(slotValueChanged(QtProperty *, const QFont &)));
       
  1183     connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1184                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1185     connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)),
       
  1186                 this, SLOT(slotRangeChanged(QtProperty *, int, int)));
       
  1187     connect(fontPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)),
       
  1188                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1189     connect(fontPropertyManager->subEnumPropertyManager(),
       
  1190                 SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)),
       
  1191                 this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &)));
       
  1192     connect(fontPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty *, bool)),
       
  1193                 this, SLOT(slotValueChanged(QtProperty *, bool)));
       
  1194     connect(fontPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1195                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1196     connect(fontPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1197                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1198     // CursorPropertyManager
       
  1199     QtCursorPropertyManager *cursorPropertyManager = new QtCursorPropertyManager(this);
       
  1200     d_ptr->m_typeToPropertyManager[QVariant::Cursor] = cursorPropertyManager;
       
  1201     d_ptr->m_typeToValueType[QVariant::Cursor] = QVariant::Cursor;
       
  1202     connect(cursorPropertyManager, SIGNAL(valueChanged(QtProperty *, const QCursor &)),
       
  1203                 this, SLOT(slotValueChanged(QtProperty *, const QCursor &)));
       
  1204     // FlagPropertyManager
       
  1205     int flagId = flagTypeId();
       
  1206     QtFlagPropertyManager *flagPropertyManager = new QtFlagPropertyManager(this);
       
  1207     d_ptr->m_typeToPropertyManager[flagId] = flagPropertyManager;
       
  1208     d_ptr->m_typeToValueType[flagId] = QVariant::Int;
       
  1209     d_ptr->m_typeToAttributeToAttributeType[flagId][d_ptr->m_flagNamesAttribute] =
       
  1210             QVariant::StringList;
       
  1211     connect(flagPropertyManager, SIGNAL(valueChanged(QtProperty *, int)),
       
  1212                 this, SLOT(slotValueChanged(QtProperty *, int)));
       
  1213     connect(flagPropertyManager, SIGNAL(flagNamesChanged(QtProperty *, const QStringList &)),
       
  1214                 this, SLOT(slotFlagNamesChanged(QtProperty *, const QStringList &)));
       
  1215     connect(flagPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty *, bool)),
       
  1216                 this, SLOT(slotValueChanged(QtProperty *, bool)));
       
  1217     connect(flagPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)),
       
  1218                 this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)));
       
  1219     connect(flagPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)),
       
  1220                 this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *)));
       
  1221     // FlagPropertyManager
       
  1222     int groupId = groupTypeId();
       
  1223     QtGroupPropertyManager *groupPropertyManager = new QtGroupPropertyManager(this);
       
  1224     d_ptr->m_typeToPropertyManager[groupId] = groupPropertyManager;
       
  1225     d_ptr->m_typeToValueType[groupId] = QVariant::Invalid;
       
  1226 }
       
  1227 
       
  1228 /*!
       
  1229     Destroys this manager, and all the properties it has created.
       
  1230 */
       
  1231 QtVariantPropertyManager::~QtVariantPropertyManager()
       
  1232 {
       
  1233     clear();
       
  1234 }
       
  1235 
       
  1236 /*!
       
  1237     Returns the given \a property converted into a QtVariantProperty.
       
  1238 
       
  1239     If the \a property was not created by this variant manager, the
       
  1240     function returns 0.
       
  1241 
       
  1242     \sa createProperty()
       
  1243 */
       
  1244 QtVariantProperty *QtVariantPropertyManager::variantProperty(const QtProperty *property) const
       
  1245 {
       
  1246     const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::const_iterator it = d_ptr->m_propertyToType.constFind(property);
       
  1247     if (it == d_ptr->m_propertyToType.constEnd())
       
  1248         return 0;
       
  1249     return it.value().first;
       
  1250 }
       
  1251 
       
  1252 /*!
       
  1253     Returns true if the given \a propertyType is supported by this
       
  1254     variant manager; otherwise false.
       
  1255 
       
  1256     \sa propertyType()
       
  1257 */
       
  1258 bool QtVariantPropertyManager::isPropertyTypeSupported(int propertyType) const
       
  1259 {
       
  1260     if (d_ptr->m_typeToValueType.contains(propertyType))
       
  1261         return true;
       
  1262     return false;
       
  1263 }
       
  1264 
       
  1265 /*!
       
  1266    Creates and returns a variant property of the given \a propertyType
       
  1267    with the given \a name.
       
  1268 
       
  1269    If the specified \a propertyType is not supported by this variant
       
  1270    manager, this function returns 0.
       
  1271 
       
  1272    Do not use the inherited
       
  1273    QtAbstractPropertyManager::addProperty() function to create a
       
  1274    variant property (that function will always return 0 since it will
       
  1275    not be clear what type the property should have).
       
  1276 
       
  1277     \sa isPropertyTypeSupported()
       
  1278 */
       
  1279 QtVariantProperty *QtVariantPropertyManager::addProperty(int propertyType, const QString &name)
       
  1280 {
       
  1281     if (!isPropertyTypeSupported(propertyType))
       
  1282         return 0;
       
  1283 
       
  1284     bool wasCreating = d_ptr->m_creatingProperty;
       
  1285     d_ptr->m_creatingProperty = true;
       
  1286     d_ptr->m_propertyType = propertyType;
       
  1287     QtProperty *property = QtAbstractPropertyManager::addProperty(name);
       
  1288     d_ptr->m_creatingProperty = wasCreating;
       
  1289     d_ptr->m_propertyType = 0;
       
  1290 
       
  1291     if (!property)
       
  1292         return 0;
       
  1293 
       
  1294     return variantProperty(property);
       
  1295 }
       
  1296 
       
  1297 /*!
       
  1298     Returns the given \a property's value.
       
  1299 
       
  1300     If the given \a property is not managed by this manager, this
       
  1301     function returns an invalid variant.
       
  1302 
       
  1303     \sa setValue()
       
  1304 */
       
  1305 QVariant QtVariantPropertyManager::value(const QtProperty *property) const
       
  1306 {
       
  1307     QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1308     if (internProp == 0)
       
  1309         return QVariant();
       
  1310 
       
  1311     QtAbstractPropertyManager *manager = internProp->propertyManager();
       
  1312     if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
       
  1313         return intManager->value(internProp);
       
  1314     } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
       
  1315         return doubleManager->value(internProp);
       
  1316     } else if (QtBoolPropertyManager *boolManager = qobject_cast<QtBoolPropertyManager *>(manager)) {
       
  1317         return boolManager->value(internProp);
       
  1318     } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
       
  1319         return stringManager->value(internProp);
       
  1320     } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
       
  1321         return dateManager->value(internProp);
       
  1322     } else if (QtTimePropertyManager *timeManager = qobject_cast<QtTimePropertyManager *>(manager)) {
       
  1323         return timeManager->value(internProp);
       
  1324     } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast<QtDateTimePropertyManager *>(manager)) {
       
  1325         return dateTimeManager->value(internProp);
       
  1326     } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast<QtKeySequencePropertyManager *>(manager)) {
       
  1327         return keySequenceManager->value(internProp);
       
  1328     } else if (QtCharPropertyManager *charManager = qobject_cast<QtCharPropertyManager *>(manager)) {
       
  1329         return charManager->value(internProp);
       
  1330     } else if (QtLocalePropertyManager *localeManager = qobject_cast<QtLocalePropertyManager *>(manager)) {
       
  1331         return localeManager->value(internProp);
       
  1332     } else if (QtPointPropertyManager *pointManager = qobject_cast<QtPointPropertyManager *>(manager)) {
       
  1333         return pointManager->value(internProp);
       
  1334     } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
       
  1335         return pointFManager->value(internProp);
       
  1336     } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
       
  1337         return sizeManager->value(internProp);
       
  1338     } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
       
  1339         return sizeFManager->value(internProp);
       
  1340     } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
       
  1341         return rectManager->value(internProp);
       
  1342     } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
       
  1343         return rectFManager->value(internProp);
       
  1344     } else if (QtColorPropertyManager *colorManager = qobject_cast<QtColorPropertyManager *>(manager)) {
       
  1345         return colorManager->value(internProp);
       
  1346     } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
       
  1347         return enumManager->value(internProp);
       
  1348     } else if (QtSizePolicyPropertyManager *sizePolicyManager =
       
  1349                qobject_cast<QtSizePolicyPropertyManager *>(manager)) {
       
  1350         return sizePolicyManager->value(internProp);
       
  1351     } else if (QtFontPropertyManager *fontManager = qobject_cast<QtFontPropertyManager *>(manager)) {
       
  1352         return fontManager->value(internProp);
       
  1353 #ifndef QT_NO_CURSOR
       
  1354     } else if (QtCursorPropertyManager *cursorManager = qobject_cast<QtCursorPropertyManager *>(manager)) {
       
  1355         return cursorManager->value(internProp);
       
  1356 #endif
       
  1357     } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
       
  1358         return flagManager->value(internProp);
       
  1359     }
       
  1360     return QVariant();
       
  1361 }
       
  1362 
       
  1363 /*!
       
  1364     Returns the given \a property's value type.
       
  1365 
       
  1366     \sa propertyType()
       
  1367 */
       
  1368 int QtVariantPropertyManager::valueType(const QtProperty *property) const
       
  1369 {
       
  1370     int propType = propertyType(property);
       
  1371     return valueType(propType);
       
  1372 }
       
  1373 
       
  1374 /*!
       
  1375     \overload
       
  1376 
       
  1377     Returns the value type associated with the given \a propertyType.
       
  1378 */
       
  1379 int QtVariantPropertyManager::valueType(int propertyType) const
       
  1380 {
       
  1381     if (d_ptr->m_typeToValueType.contains(propertyType))
       
  1382         return d_ptr->m_typeToValueType[propertyType];
       
  1383     return 0;
       
  1384 }
       
  1385 
       
  1386 /*!
       
  1387     Returns the given \a property's type.
       
  1388 
       
  1389     \sa valueType()
       
  1390 */
       
  1391 int QtVariantPropertyManager::propertyType(const QtProperty *property) const
       
  1392 {
       
  1393     const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::const_iterator it = d_ptr->m_propertyToType.constFind(property);
       
  1394     if (it == d_ptr->m_propertyToType.constEnd())
       
  1395         return 0;
       
  1396     return it.value().second;
       
  1397 }
       
  1398 
       
  1399 /*!
       
  1400     Returns the given \a property's value for the specified \a
       
  1401     attribute
       
  1402 
       
  1403     If the given \a property was not created by \e this manager, or if
       
  1404     the specified \a attribute does not exist, this function returns
       
  1405     an invalid variant.
       
  1406 
       
  1407     \sa attributes(), attributeType(), setAttribute()
       
  1408 */
       
  1409 QVariant QtVariantPropertyManager::attributeValue(const QtProperty *property, const QString &attribute) const
       
  1410 {
       
  1411     int propType = propertyType(property);
       
  1412     if (!propType)
       
  1413         return QVariant();
       
  1414 
       
  1415     QMap<int, QMap<QString, int> >::ConstIterator it =
       
  1416             d_ptr->m_typeToAttributeToAttributeType.find(propType);
       
  1417     if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
       
  1418         return QVariant();
       
  1419 
       
  1420     QMap<QString, int> attributes = it.value();
       
  1421     QMap<QString, int>::ConstIterator itAttr = attributes.find(attribute);
       
  1422     if (itAttr == attributes.constEnd())
       
  1423         return QVariant();
       
  1424 
       
  1425     QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1426     if (internProp == 0)
       
  1427         return QVariant();
       
  1428 
       
  1429     QtAbstractPropertyManager *manager = internProp->propertyManager();
       
  1430     if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
       
  1431         if (attribute == d_ptr->m_maximumAttribute)
       
  1432             return intManager->maximum(internProp);
       
  1433         if (attribute == d_ptr->m_minimumAttribute)
       
  1434             return intManager->minimum(internProp);
       
  1435         if (attribute == d_ptr->m_singleStepAttribute)
       
  1436             return intManager->singleStep(internProp);
       
  1437         return QVariant();
       
  1438     } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
       
  1439         if (attribute == d_ptr->m_maximumAttribute)
       
  1440             return doubleManager->maximum(internProp);
       
  1441         if (attribute == d_ptr->m_minimumAttribute)
       
  1442             return doubleManager->minimum(internProp);
       
  1443         if (attribute == d_ptr->m_singleStepAttribute)
       
  1444             return doubleManager->singleStep(internProp);
       
  1445         if (attribute == d_ptr->m_decimalsAttribute)
       
  1446             return doubleManager->decimals(internProp);
       
  1447         return QVariant();
       
  1448     } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
       
  1449         if (attribute == d_ptr->m_regExpAttribute)
       
  1450             return stringManager->regExp(internProp);
       
  1451         return QVariant();
       
  1452     } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
       
  1453         if (attribute == d_ptr->m_maximumAttribute)
       
  1454             return dateManager->maximum(internProp);
       
  1455         if (attribute == d_ptr->m_minimumAttribute)
       
  1456             return dateManager->minimum(internProp);
       
  1457         return QVariant();
       
  1458     } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
       
  1459         if (attribute == d_ptr->m_decimalsAttribute)
       
  1460             return pointFManager->decimals(internProp);
       
  1461         return QVariant();
       
  1462     } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
       
  1463         if (attribute == d_ptr->m_maximumAttribute)
       
  1464             return sizeManager->maximum(internProp);
       
  1465         if (attribute == d_ptr->m_minimumAttribute)
       
  1466             return sizeManager->minimum(internProp);
       
  1467         return QVariant();
       
  1468     } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
       
  1469         if (attribute == d_ptr->m_maximumAttribute)
       
  1470             return sizeFManager->maximum(internProp);
       
  1471         if (attribute == d_ptr->m_minimumAttribute)
       
  1472             return sizeFManager->minimum(internProp);
       
  1473         if (attribute == d_ptr->m_decimalsAttribute)
       
  1474             return sizeFManager->decimals(internProp);
       
  1475         return QVariant();
       
  1476     } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
       
  1477         if (attribute == d_ptr->m_constraintAttribute)
       
  1478             return rectManager->constraint(internProp);
       
  1479         return QVariant();
       
  1480     } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
       
  1481         if (attribute == d_ptr->m_constraintAttribute)
       
  1482             return rectFManager->constraint(internProp);
       
  1483         if (attribute == d_ptr->m_decimalsAttribute)
       
  1484             return rectFManager->decimals(internProp);
       
  1485         return QVariant();
       
  1486     } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
       
  1487         if (attribute == d_ptr->m_enumNamesAttribute)
       
  1488             return enumManager->enumNames(internProp);
       
  1489         if (attribute == d_ptr->m_enumIconsAttribute) {
       
  1490             QVariant v;
       
  1491             qVariantSetValue(v, enumManager->enumIcons(internProp));
       
  1492             return v;
       
  1493         }
       
  1494         return QVariant();
       
  1495     } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
       
  1496         if (attribute == d_ptr->m_flagNamesAttribute)
       
  1497             return flagManager->flagNames(internProp);
       
  1498         return QVariant();
       
  1499     }
       
  1500     return QVariant();
       
  1501 }
       
  1502 
       
  1503 /*!
       
  1504     Returns a list of the given \a propertyType 's attributes.
       
  1505 
       
  1506     \sa attributeValue(), attributeType()
       
  1507 */
       
  1508 QStringList QtVariantPropertyManager::attributes(int propertyType) const
       
  1509 {
       
  1510     QMap<int, QMap<QString, int> >::ConstIterator it =
       
  1511             d_ptr->m_typeToAttributeToAttributeType.find(propertyType);
       
  1512     if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
       
  1513         return QStringList();
       
  1514     return it.value().keys();
       
  1515 }
       
  1516 
       
  1517 /*!
       
  1518     Returns the type of the specified \a attribute of the given \a
       
  1519     propertyType.
       
  1520 
       
  1521     If the given \a propertyType is not supported by \e this manager,
       
  1522     or if the given \a propertyType does not possess the specified \a
       
  1523     attribute, this function returns QVariant::Invalid.
       
  1524 
       
  1525     \sa attributes(), valueType()
       
  1526 */
       
  1527 int QtVariantPropertyManager::attributeType(int propertyType, const QString &attribute) const
       
  1528 {
       
  1529     QMap<int, QMap<QString, int> >::ConstIterator it =
       
  1530             d_ptr->m_typeToAttributeToAttributeType.find(propertyType);
       
  1531     if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
       
  1532         return 0;
       
  1533 
       
  1534     QMap<QString, int> attributes = it.value();
       
  1535     QMap<QString, int>::ConstIterator itAttr = attributes.find(attribute);
       
  1536     if (itAttr == attributes.constEnd())
       
  1537         return 0;
       
  1538     return itAttr.value();
       
  1539 }
       
  1540 
       
  1541 /*!
       
  1542     \fn void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &value)
       
  1543 
       
  1544     Sets the value of the given \a property to \a value.
       
  1545 
       
  1546     The specified \a value must be of a type returned by valueType(),
       
  1547     or of type that can be converted to valueType() using the
       
  1548     QVariant::canConvert() function, otherwise this function does
       
  1549     nothing.
       
  1550 
       
  1551     \sa value(), QtVariantProperty::setValue(), valueChanged()
       
  1552 */
       
  1553 void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &val)
       
  1554 {
       
  1555     int propType = val.userType();
       
  1556     if (!propType)
       
  1557         return;
       
  1558 
       
  1559     int valType = valueType(property);
       
  1560 
       
  1561     if (propType != valType && !val.canConvert(static_cast<QVariant::Type>(valType)))
       
  1562         return;
       
  1563 
       
  1564     QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1565     if (internProp == 0)
       
  1566         return;
       
  1567 
       
  1568 
       
  1569     QtAbstractPropertyManager *manager = internProp->propertyManager();
       
  1570     if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
       
  1571         intManager->setValue(internProp, qVariantValue<int>(val));
       
  1572         return;
       
  1573     } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
       
  1574         doubleManager->setValue(internProp, qVariantValue<double>(val));
       
  1575         return;
       
  1576     } else if (QtBoolPropertyManager *boolManager = qobject_cast<QtBoolPropertyManager *>(manager)) {
       
  1577         boolManager->setValue(internProp, qVariantValue<bool>(val));
       
  1578         return;
       
  1579     } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
       
  1580         stringManager->setValue(internProp, qVariantValue<QString>(val));
       
  1581         return;
       
  1582     } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
       
  1583         dateManager->setValue(internProp, qVariantValue<QDate>(val));
       
  1584         return;
       
  1585     } else if (QtTimePropertyManager *timeManager = qobject_cast<QtTimePropertyManager *>(manager)) {
       
  1586         timeManager->setValue(internProp, qVariantValue<QTime>(val));
       
  1587         return;
       
  1588     } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast<QtDateTimePropertyManager *>(manager)) {
       
  1589         dateTimeManager->setValue(internProp, qVariantValue<QDateTime>(val));
       
  1590         return;
       
  1591     } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast<QtKeySequencePropertyManager *>(manager)) {
       
  1592         keySequenceManager->setValue(internProp, qVariantValue<QKeySequence>(val));
       
  1593         return;
       
  1594     } else if (QtCharPropertyManager *charManager = qobject_cast<QtCharPropertyManager *>(manager)) {
       
  1595         charManager->setValue(internProp, qVariantValue<QChar>(val));
       
  1596         return;
       
  1597     } else if (QtLocalePropertyManager *localeManager = qobject_cast<QtLocalePropertyManager *>(manager)) {
       
  1598         localeManager->setValue(internProp, qVariantValue<QLocale>(val));
       
  1599         return;
       
  1600     } else if (QtPointPropertyManager *pointManager = qobject_cast<QtPointPropertyManager *>(manager)) {
       
  1601         pointManager->setValue(internProp, qVariantValue<QPoint>(val));
       
  1602         return;
       
  1603     } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
       
  1604         pointFManager->setValue(internProp, qVariantValue<QPointF>(val));
       
  1605         return;
       
  1606     } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
       
  1607         sizeManager->setValue(internProp, qVariantValue<QSize>(val));
       
  1608         return;
       
  1609     } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
       
  1610         sizeFManager->setValue(internProp, qVariantValue<QSizeF>(val));
       
  1611         return;
       
  1612     } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
       
  1613         rectManager->setValue(internProp, qVariantValue<QRect>(val));
       
  1614         return;
       
  1615     } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
       
  1616         rectFManager->setValue(internProp, qVariantValue<QRectF>(val));
       
  1617         return;
       
  1618     } else if (QtColorPropertyManager *colorManager = qobject_cast<QtColorPropertyManager *>(manager)) {
       
  1619         colorManager->setValue(internProp, qVariantValue<QColor>(val));
       
  1620         return;
       
  1621     } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
       
  1622         enumManager->setValue(internProp, qVariantValue<int>(val));
       
  1623         return;
       
  1624     } else if (QtSizePolicyPropertyManager *sizePolicyManager =
       
  1625                qobject_cast<QtSizePolicyPropertyManager *>(manager)) {
       
  1626         sizePolicyManager->setValue(internProp, qVariantValue<QSizePolicy>(val));
       
  1627         return;
       
  1628     } else if (QtFontPropertyManager *fontManager = qobject_cast<QtFontPropertyManager *>(manager)) {
       
  1629         fontManager->setValue(internProp, qVariantValue<QFont>(val));
       
  1630         return;
       
  1631 #ifndef QT_NO_CURSOR
       
  1632     } else if (QtCursorPropertyManager *cursorManager = qobject_cast<QtCursorPropertyManager *>(manager)) {
       
  1633         cursorManager->setValue(internProp, qVariantValue<QCursor>(val));
       
  1634         return;
       
  1635 #endif
       
  1636     } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
       
  1637         flagManager->setValue(internProp, qVariantValue<int>(val));
       
  1638         return;
       
  1639     }
       
  1640 }
       
  1641 
       
  1642 /*!
       
  1643     Sets the value of the specified \a attribute of the given \a
       
  1644     property, to \a value.
       
  1645 
       
  1646     The new \a value's type must be of the type returned by
       
  1647     attributeType(), or of a type that can be converted to
       
  1648     attributeType() using the QVariant::canConvert() function,
       
  1649     otherwise this function does nothing.
       
  1650 
       
  1651     \sa attributeValue(), QtVariantProperty::setAttribute(), attributeChanged()
       
  1652 */
       
  1653 void QtVariantPropertyManager::setAttribute(QtProperty *property,
       
  1654         const QString &attribute, const QVariant &value)
       
  1655 {
       
  1656     QVariant oldAttr = attributeValue(property, attribute);
       
  1657     if (!oldAttr.isValid())
       
  1658         return;
       
  1659 
       
  1660     int attrType = value.userType();
       
  1661     if (!attrType)
       
  1662         return;
       
  1663 
       
  1664     if (attrType != attributeType(propertyType(property), attribute) &&
       
  1665                 !value.canConvert((QVariant::Type)attrType))
       
  1666         return;
       
  1667 
       
  1668     QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1669     if (internProp == 0)
       
  1670         return;
       
  1671 
       
  1672     QtAbstractPropertyManager *manager = internProp->propertyManager();
       
  1673     if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
       
  1674         if (attribute == d_ptr->m_maximumAttribute)
       
  1675             intManager->setMaximum(internProp, qVariantValue<int>(value));
       
  1676         else if (attribute == d_ptr->m_minimumAttribute)
       
  1677             intManager->setMinimum(internProp, qVariantValue<int>(value));
       
  1678         else if (attribute == d_ptr->m_singleStepAttribute)
       
  1679             intManager->setSingleStep(internProp, qVariantValue<int>(value));
       
  1680         return;
       
  1681     } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
       
  1682         if (attribute == d_ptr->m_maximumAttribute)
       
  1683             doubleManager->setMaximum(internProp, qVariantValue<double>(value));
       
  1684         if (attribute == d_ptr->m_minimumAttribute)
       
  1685             doubleManager->setMinimum(internProp, qVariantValue<double>(value));
       
  1686         if (attribute == d_ptr->m_singleStepAttribute)
       
  1687             doubleManager->setSingleStep(internProp, qVariantValue<double>(value));
       
  1688         if (attribute == d_ptr->m_decimalsAttribute)
       
  1689             doubleManager->setDecimals(internProp, qVariantValue<int>(value));
       
  1690         return;
       
  1691     } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
       
  1692         if (attribute == d_ptr->m_regExpAttribute)
       
  1693             stringManager->setRegExp(internProp, qVariantValue<QRegExp>(value));
       
  1694         return;
       
  1695     } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
       
  1696         if (attribute == d_ptr->m_maximumAttribute)
       
  1697             dateManager->setMaximum(internProp, qVariantValue<QDate>(value));
       
  1698         if (attribute == d_ptr->m_minimumAttribute)
       
  1699             dateManager->setMinimum(internProp, qVariantValue<QDate>(value));
       
  1700         return;
       
  1701     } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
       
  1702         if (attribute == d_ptr->m_decimalsAttribute)
       
  1703             pointFManager->setDecimals(internProp, qVariantValue<int>(value));
       
  1704         return;
       
  1705     } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
       
  1706         if (attribute == d_ptr->m_maximumAttribute)
       
  1707             sizeManager->setMaximum(internProp, qVariantValue<QSize>(value));
       
  1708         if (attribute == d_ptr->m_minimumAttribute)
       
  1709             sizeManager->setMinimum(internProp, qVariantValue<QSize>(value));
       
  1710         return;
       
  1711     } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
       
  1712         if (attribute == d_ptr->m_maximumAttribute)
       
  1713             sizeFManager->setMaximum(internProp, qVariantValue<QSizeF>(value));
       
  1714         if (attribute == d_ptr->m_minimumAttribute)
       
  1715             sizeFManager->setMinimum(internProp, qVariantValue<QSizeF>(value));
       
  1716         if (attribute == d_ptr->m_decimalsAttribute)
       
  1717             sizeFManager->setDecimals(internProp, qVariantValue<int>(value));
       
  1718         return;
       
  1719     } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
       
  1720         if (attribute == d_ptr->m_constraintAttribute)
       
  1721             rectManager->setConstraint(internProp, qVariantValue<QRect>(value));
       
  1722         return;
       
  1723     } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
       
  1724         if (attribute == d_ptr->m_constraintAttribute)
       
  1725             rectFManager->setConstraint(internProp, qVariantValue<QRectF>(value));
       
  1726         if (attribute == d_ptr->m_decimalsAttribute)
       
  1727             rectFManager->setDecimals(internProp, qVariantValue<int>(value));
       
  1728         return;
       
  1729     } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
       
  1730         if (attribute == d_ptr->m_enumNamesAttribute)
       
  1731             enumManager->setEnumNames(internProp, qVariantValue<QStringList>(value));
       
  1732         if (attribute == d_ptr->m_enumIconsAttribute)
       
  1733             enumManager->setEnumIcons(internProp, qVariantValue<QtIconMap>(value));
       
  1734         return;
       
  1735     } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
       
  1736         if (attribute == d_ptr->m_flagNamesAttribute)
       
  1737             flagManager->setFlagNames(internProp, qVariantValue<QStringList>(value));
       
  1738         return;
       
  1739     }
       
  1740 }
       
  1741 
       
  1742 /*!
       
  1743     \reimp
       
  1744 */
       
  1745 bool QtVariantPropertyManager::hasValue(const QtProperty *property) const
       
  1746 {
       
  1747     if (propertyType(property) == groupTypeId())
       
  1748         return false;
       
  1749     return true;
       
  1750 }
       
  1751 
       
  1752 /*!
       
  1753     \reimp
       
  1754 */
       
  1755 QString QtVariantPropertyManager::valueText(const QtProperty *property) const
       
  1756 {
       
  1757     const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1758     return internProp ? internProp->valueText() : QString();
       
  1759 }
       
  1760 
       
  1761 /*!
       
  1762     \reimp
       
  1763 */
       
  1764 QIcon QtVariantPropertyManager::valueIcon(const QtProperty *property) const
       
  1765 {
       
  1766     const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
       
  1767     return internProp ? internProp->valueIcon() : QIcon();
       
  1768 }
       
  1769 
       
  1770 /*!
       
  1771     \reimp
       
  1772 */
       
  1773 void QtVariantPropertyManager::initializeProperty(QtProperty *property)
       
  1774 {
       
  1775     QtVariantProperty *varProp = variantProperty(property);
       
  1776     if (!varProp)
       
  1777         return;
       
  1778 
       
  1779     QMap<int, QtAbstractPropertyManager *>::ConstIterator it =
       
  1780             d_ptr->m_typeToPropertyManager.find(d_ptr->m_propertyType);
       
  1781     if (it != d_ptr->m_typeToPropertyManager.constEnd()) {
       
  1782         QtProperty *internProp = 0;
       
  1783         if (!d_ptr->m_creatingSubProperties) {
       
  1784             QtAbstractPropertyManager *manager = it.value();
       
  1785             internProp = manager->addProperty();
       
  1786             d_ptr->m_internalToProperty[internProp] = varProp;
       
  1787         }
       
  1788         propertyToWrappedProperty()->insert(varProp, internProp);
       
  1789         if (internProp) {
       
  1790             QList<QtProperty *> children = internProp->subProperties();
       
  1791             QListIterator<QtProperty *> itChild(children);
       
  1792             QtVariantProperty *lastProperty = 0;
       
  1793             while (itChild.hasNext()) {
       
  1794                 QtVariantProperty *prop = d_ptr->createSubProperty(varProp, lastProperty, itChild.next());
       
  1795                 lastProperty = prop ? prop : lastProperty;
       
  1796             }
       
  1797         }
       
  1798     }
       
  1799 }
       
  1800 
       
  1801 /*!
       
  1802     \reimp
       
  1803 */
       
  1804 void QtVariantPropertyManager::uninitializeProperty(QtProperty *property)
       
  1805 {
       
  1806     const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::iterator type_it = d_ptr->m_propertyToType.find(property);
       
  1807     if (type_it == d_ptr->m_propertyToType.end())
       
  1808         return;
       
  1809 
       
  1810     PropertyMap::iterator it = propertyToWrappedProperty()->find(property);
       
  1811     if (it != propertyToWrappedProperty()->end()) {
       
  1812         QtProperty *internProp = it.value();
       
  1813         if (internProp) {
       
  1814             d_ptr->m_internalToProperty.remove(internProp);
       
  1815             if (!d_ptr->m_destroyingSubProperties) {
       
  1816                 delete internProp;
       
  1817             }
       
  1818         }
       
  1819         propertyToWrappedProperty()->erase(it);
       
  1820     }
       
  1821     d_ptr->m_propertyToType.erase(type_it);
       
  1822 }
       
  1823 
       
  1824 /*!
       
  1825     \reimp
       
  1826 */
       
  1827 QtProperty *QtVariantPropertyManager::createProperty()
       
  1828 {
       
  1829     if (!d_ptr->m_creatingProperty)
       
  1830         return 0;
       
  1831 
       
  1832     QtVariantProperty *property = new QtVariantProperty(this);
       
  1833     d_ptr->m_propertyToType.insert(property, qMakePair(property, d_ptr->m_propertyType));
       
  1834 
       
  1835     return property;
       
  1836 }
       
  1837 
       
  1838 /////////////////////////////
       
  1839 
       
  1840 class QtVariantEditorFactoryPrivate
       
  1841 {
       
  1842     QtVariantEditorFactory *q_ptr;
       
  1843     Q_DECLARE_PUBLIC(QtVariantEditorFactory)
       
  1844 public:
       
  1845 
       
  1846     QtSpinBoxFactory           *m_spinBoxFactory;
       
  1847     QtDoubleSpinBoxFactory     *m_doubleSpinBoxFactory;
       
  1848     QtCheckBoxFactory          *m_checkBoxFactory;
       
  1849     QtLineEditFactory          *m_lineEditFactory;
       
  1850     QtDateEditFactory          *m_dateEditFactory;
       
  1851     QtTimeEditFactory          *m_timeEditFactory;
       
  1852     QtDateTimeEditFactory      *m_dateTimeEditFactory;
       
  1853     QtKeySequenceEditorFactory *m_keySequenceEditorFactory;
       
  1854     QtCharEditorFactory        *m_charEditorFactory;
       
  1855     QtEnumEditorFactory        *m_comboBoxFactory;
       
  1856     QtCursorEditorFactory      *m_cursorEditorFactory;
       
  1857     QtColorEditorFactory       *m_colorEditorFactory;
       
  1858     QtFontEditorFactory        *m_fontEditorFactory;
       
  1859 
       
  1860     QMap<QtAbstractEditorFactoryBase *, int> m_factoryToType;
       
  1861     QMap<int, QtAbstractEditorFactoryBase *> m_typeToFactory;
       
  1862 };
       
  1863 
       
  1864 /*!
       
  1865     \class QtVariantEditorFactory
       
  1866     \internal
       
  1867     \inmodule QtDesigner
       
  1868     \since 4.4
       
  1869 
       
  1870     \brief The QtVariantEditorFactory class provides widgets for properties
       
  1871     created by QtVariantPropertyManager objects.
       
  1872 
       
  1873     The variant factory provides the following widgets for the
       
  1874     specified property types:
       
  1875 
       
  1876     \table
       
  1877     \header
       
  1878         \o Property Type
       
  1879         \o Widget
       
  1880     \row
       
  1881         \o \c int
       
  1882         \o QSpinBox
       
  1883     \row
       
  1884         \o \c double
       
  1885         \o QDoubleSpinBox
       
  1886     \row
       
  1887         \o \c bool
       
  1888         \o QCheckBox
       
  1889     \row
       
  1890         \o QString
       
  1891         \o QLineEdit
       
  1892     \row
       
  1893         \o QDate
       
  1894         \o QDateEdit
       
  1895     \row
       
  1896         \o QTime
       
  1897         \o QTimeEdit
       
  1898     \row
       
  1899         \o QDateTime
       
  1900         \o QDateTimeEdit
       
  1901     \row
       
  1902         \o QKeySequence
       
  1903         \o customized editor
       
  1904     \row
       
  1905         \o QChar
       
  1906         \o customized editor
       
  1907     \row
       
  1908         \o \c enum
       
  1909         \o QComboBox
       
  1910     \row
       
  1911         \o QCursor
       
  1912         \o QComboBox
       
  1913     \endtable
       
  1914 
       
  1915     Note that QtVariantPropertyManager supports several additional property
       
  1916     types for which the QtVariantEditorFactory class does not provide
       
  1917     editing widgets, e.g. QPoint and QSize. To provide widgets for other
       
  1918     types using the variant approach, derive from the QtVariantEditorFactory
       
  1919     class.
       
  1920 
       
  1921     \sa QtAbstractEditorFactory, QtVariantPropertyManager
       
  1922 */
       
  1923 
       
  1924 /*!
       
  1925     Creates a factory with the given \a parent.
       
  1926 */
       
  1927 QtVariantEditorFactory::QtVariantEditorFactory(QObject *parent)
       
  1928     : QtAbstractEditorFactory<QtVariantPropertyManager>(parent), d_ptr(new QtVariantEditorFactoryPrivate())
       
  1929 {
       
  1930     d_ptr->q_ptr = this;
       
  1931 
       
  1932     d_ptr->m_spinBoxFactory = new QtSpinBoxFactory(this);
       
  1933     d_ptr->m_factoryToType[d_ptr->m_spinBoxFactory] = QVariant::Int;
       
  1934     d_ptr->m_typeToFactory[QVariant::Int] = d_ptr->m_spinBoxFactory;
       
  1935 
       
  1936     d_ptr->m_doubleSpinBoxFactory = new QtDoubleSpinBoxFactory(this);
       
  1937     d_ptr->m_factoryToType[d_ptr->m_doubleSpinBoxFactory] = QVariant::Double;
       
  1938     d_ptr->m_typeToFactory[QVariant::Double] = d_ptr->m_doubleSpinBoxFactory;
       
  1939 
       
  1940     d_ptr->m_checkBoxFactory = new QtCheckBoxFactory(this);
       
  1941     d_ptr->m_factoryToType[d_ptr->m_checkBoxFactory] = QVariant::Bool;
       
  1942     d_ptr->m_typeToFactory[QVariant::Bool] = d_ptr->m_checkBoxFactory;
       
  1943 
       
  1944     d_ptr->m_lineEditFactory = new QtLineEditFactory(this);
       
  1945     d_ptr->m_factoryToType[d_ptr->m_lineEditFactory] = QVariant::String;
       
  1946     d_ptr->m_typeToFactory[QVariant::String] = d_ptr->m_lineEditFactory;
       
  1947 
       
  1948     d_ptr->m_dateEditFactory = new QtDateEditFactory(this);
       
  1949     d_ptr->m_factoryToType[d_ptr->m_dateEditFactory] = QVariant::Date;
       
  1950     d_ptr->m_typeToFactory[QVariant::Date] = d_ptr->m_dateEditFactory;
       
  1951 
       
  1952     d_ptr->m_timeEditFactory = new QtTimeEditFactory(this);
       
  1953     d_ptr->m_factoryToType[d_ptr->m_timeEditFactory] = QVariant::Time;
       
  1954     d_ptr->m_typeToFactory[QVariant::Time] = d_ptr->m_timeEditFactory;
       
  1955 
       
  1956     d_ptr->m_dateTimeEditFactory = new QtDateTimeEditFactory(this);
       
  1957     d_ptr->m_factoryToType[d_ptr->m_dateTimeEditFactory] = QVariant::DateTime;
       
  1958     d_ptr->m_typeToFactory[QVariant::DateTime] = d_ptr->m_dateTimeEditFactory;
       
  1959 
       
  1960     d_ptr->m_keySequenceEditorFactory = new QtKeySequenceEditorFactory(this);
       
  1961     d_ptr->m_factoryToType[d_ptr->m_keySequenceEditorFactory] = QVariant::KeySequence;
       
  1962     d_ptr->m_typeToFactory[QVariant::KeySequence] = d_ptr->m_keySequenceEditorFactory;
       
  1963 
       
  1964     d_ptr->m_charEditorFactory = new QtCharEditorFactory(this);
       
  1965     d_ptr->m_factoryToType[d_ptr->m_charEditorFactory] = QVariant::Char;
       
  1966     d_ptr->m_typeToFactory[QVariant::Char] = d_ptr->m_charEditorFactory;
       
  1967 
       
  1968     d_ptr->m_cursorEditorFactory = new QtCursorEditorFactory(this);
       
  1969     d_ptr->m_factoryToType[d_ptr->m_cursorEditorFactory] = QVariant::Cursor;
       
  1970     d_ptr->m_typeToFactory[QVariant::Cursor] = d_ptr->m_cursorEditorFactory;
       
  1971 
       
  1972     d_ptr->m_colorEditorFactory = new QtColorEditorFactory(this);
       
  1973     d_ptr->m_factoryToType[d_ptr->m_colorEditorFactory] = QVariant::Color;
       
  1974     d_ptr->m_typeToFactory[QVariant::Color] = d_ptr->m_colorEditorFactory;
       
  1975 
       
  1976     d_ptr->m_fontEditorFactory = new QtFontEditorFactory(this);
       
  1977     d_ptr->m_factoryToType[d_ptr->m_fontEditorFactory] = QVariant::Font;
       
  1978     d_ptr->m_typeToFactory[QVariant::Font] = d_ptr->m_fontEditorFactory;
       
  1979 
       
  1980     d_ptr->m_comboBoxFactory = new QtEnumEditorFactory(this);
       
  1981     const int enumId = QtVariantPropertyManager::enumTypeId();
       
  1982     d_ptr->m_factoryToType[d_ptr->m_comboBoxFactory] = enumId;
       
  1983     d_ptr->m_typeToFactory[enumId] = d_ptr->m_comboBoxFactory;
       
  1984 }
       
  1985 
       
  1986 /*!
       
  1987     Destroys this factory, and all the widgets it has created.
       
  1988 */
       
  1989 QtVariantEditorFactory::~QtVariantEditorFactory()
       
  1990 {
       
  1991 }
       
  1992 
       
  1993 /*!
       
  1994     \internal
       
  1995 
       
  1996     Reimplemented from the QtAbstractEditorFactory class.
       
  1997 */
       
  1998 void QtVariantEditorFactory::connectPropertyManager(QtVariantPropertyManager *manager)
       
  1999 {
       
  2000     QList<QtIntPropertyManager *> intPropertyManagers = qFindChildren<QtIntPropertyManager *>(manager);
       
  2001     QListIterator<QtIntPropertyManager *> itInt(intPropertyManagers);
       
  2002     while (itInt.hasNext())
       
  2003         d_ptr->m_spinBoxFactory->addPropertyManager(itInt.next());
       
  2004 
       
  2005     QList<QtDoublePropertyManager *> doublePropertyManagers = qFindChildren<QtDoublePropertyManager *>(manager);
       
  2006     QListIterator<QtDoublePropertyManager *> itDouble(doublePropertyManagers);
       
  2007     while (itDouble.hasNext())
       
  2008         d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itDouble.next());
       
  2009 
       
  2010     QList<QtBoolPropertyManager *> boolPropertyManagers = qFindChildren<QtBoolPropertyManager *>(manager);
       
  2011     QListIterator<QtBoolPropertyManager *> itBool(boolPropertyManagers);
       
  2012     while (itBool.hasNext())
       
  2013         d_ptr->m_checkBoxFactory->addPropertyManager(itBool.next());
       
  2014 
       
  2015     QList<QtStringPropertyManager *> stringPropertyManagers = qFindChildren<QtStringPropertyManager *>(manager);
       
  2016     QListIterator<QtStringPropertyManager *> itString(stringPropertyManagers);
       
  2017     while (itString.hasNext())
       
  2018         d_ptr->m_lineEditFactory->addPropertyManager(itString.next());
       
  2019 
       
  2020     QList<QtDatePropertyManager *> datePropertyManagers = qFindChildren<QtDatePropertyManager *>(manager);
       
  2021     QListIterator<QtDatePropertyManager *> itDate(datePropertyManagers);
       
  2022     while (itDate.hasNext())
       
  2023         d_ptr->m_dateEditFactory->addPropertyManager(itDate.next());
       
  2024 
       
  2025     QList<QtTimePropertyManager *> timePropertyManagers = qFindChildren<QtTimePropertyManager *>(manager);
       
  2026     QListIterator<QtTimePropertyManager *> itTime(timePropertyManagers);
       
  2027     while (itTime.hasNext())
       
  2028         d_ptr->m_timeEditFactory->addPropertyManager(itTime.next());
       
  2029 
       
  2030     QList<QtDateTimePropertyManager *> dateTimePropertyManagers = qFindChildren<QtDateTimePropertyManager *>(manager);
       
  2031     QListIterator<QtDateTimePropertyManager *> itDateTime(dateTimePropertyManagers);
       
  2032     while (itDateTime.hasNext())
       
  2033         d_ptr->m_dateTimeEditFactory->addPropertyManager(itDateTime.next());
       
  2034 
       
  2035     QList<QtKeySequencePropertyManager *> keySequencePropertyManagers = qFindChildren<QtKeySequencePropertyManager *>(manager);
       
  2036     QListIterator<QtKeySequencePropertyManager *> itKeySequence(keySequencePropertyManagers);
       
  2037     while (itKeySequence.hasNext())
       
  2038         d_ptr->m_keySequenceEditorFactory->addPropertyManager(itKeySequence.next());
       
  2039 
       
  2040     QList<QtCharPropertyManager *> charPropertyManagers = qFindChildren<QtCharPropertyManager *>(manager);
       
  2041     QListIterator<QtCharPropertyManager *> itChar(charPropertyManagers);
       
  2042     while (itChar.hasNext())
       
  2043         d_ptr->m_charEditorFactory->addPropertyManager(itChar.next());
       
  2044 
       
  2045     QList<QtLocalePropertyManager *> localePropertyManagers = qFindChildren<QtLocalePropertyManager *>(manager);
       
  2046     QListIterator<QtLocalePropertyManager *> itLocale(localePropertyManagers);
       
  2047     while (itLocale.hasNext())
       
  2048         d_ptr->m_comboBoxFactory->addPropertyManager(itLocale.next()->subEnumPropertyManager());
       
  2049 
       
  2050     QList<QtPointPropertyManager *> pointPropertyManagers = qFindChildren<QtPointPropertyManager *>(manager);
       
  2051     QListIterator<QtPointPropertyManager *> itPoint(pointPropertyManagers);
       
  2052     while (itPoint.hasNext())
       
  2053         d_ptr->m_spinBoxFactory->addPropertyManager(itPoint.next()->subIntPropertyManager());
       
  2054 
       
  2055     QList<QtPointFPropertyManager *> pointFPropertyManagers = qFindChildren<QtPointFPropertyManager *>(manager);
       
  2056     QListIterator<QtPointFPropertyManager *> itPointF(pointFPropertyManagers);
       
  2057     while (itPointF.hasNext())
       
  2058         d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itPointF.next()->subDoublePropertyManager());
       
  2059 
       
  2060     QList<QtSizePropertyManager *> sizePropertyManagers = qFindChildren<QtSizePropertyManager *>(manager);
       
  2061     QListIterator<QtSizePropertyManager *> itSize(sizePropertyManagers);
       
  2062     while (itSize.hasNext())
       
  2063         d_ptr->m_spinBoxFactory->addPropertyManager(itSize.next()->subIntPropertyManager());
       
  2064 
       
  2065     QList<QtSizeFPropertyManager *> sizeFPropertyManagers = qFindChildren<QtSizeFPropertyManager *>(manager);
       
  2066     QListIterator<QtSizeFPropertyManager *> itSizeF(sizeFPropertyManagers);
       
  2067     while (itSizeF.hasNext())
       
  2068         d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itSizeF.next()->subDoublePropertyManager());
       
  2069 
       
  2070     QList<QtRectPropertyManager *> rectPropertyManagers = qFindChildren<QtRectPropertyManager *>(manager);
       
  2071     QListIterator<QtRectPropertyManager *> itRect(rectPropertyManagers);
       
  2072     while (itRect.hasNext())
       
  2073         d_ptr->m_spinBoxFactory->addPropertyManager(itRect.next()->subIntPropertyManager());
       
  2074 
       
  2075     QList<QtRectFPropertyManager *> rectFPropertyManagers = qFindChildren<QtRectFPropertyManager *>(manager);
       
  2076     QListIterator<QtRectFPropertyManager *> itRectF(rectFPropertyManagers);
       
  2077     while (itRectF.hasNext())
       
  2078         d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itRectF.next()->subDoublePropertyManager());
       
  2079 
       
  2080     QList<QtColorPropertyManager *> colorPropertyManagers = qFindChildren<QtColorPropertyManager *>(manager);
       
  2081     QListIterator<QtColorPropertyManager *> itColor(colorPropertyManagers);
       
  2082     while (itColor.hasNext()) {
       
  2083         QtColorPropertyManager *manager = itColor.next();
       
  2084         d_ptr->m_colorEditorFactory->addPropertyManager(manager);
       
  2085         d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
       
  2086     }
       
  2087 
       
  2088     QList<QtEnumPropertyManager *> enumPropertyManagers = qFindChildren<QtEnumPropertyManager *>(manager);
       
  2089     QListIterator<QtEnumPropertyManager *> itEnum(enumPropertyManagers);
       
  2090     while (itEnum.hasNext())
       
  2091         d_ptr->m_comboBoxFactory->addPropertyManager(itEnum.next());
       
  2092 
       
  2093     QList<QtSizePolicyPropertyManager *> sizePolicyPropertyManagers = qFindChildren<QtSizePolicyPropertyManager *>(manager);
       
  2094     QListIterator<QtSizePolicyPropertyManager *> itSizePolicy(sizePolicyPropertyManagers);
       
  2095     while (itSizePolicy.hasNext()) {
       
  2096         QtSizePolicyPropertyManager *manager = itSizePolicy.next();
       
  2097         d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
       
  2098         d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager());
       
  2099     }
       
  2100 
       
  2101     QList<QtFontPropertyManager *> fontPropertyManagers = qFindChildren<QtFontPropertyManager *>(manager);
       
  2102     QListIterator<QtFontPropertyManager *> itFont(fontPropertyManagers);
       
  2103     while (itFont.hasNext()) {
       
  2104         QtFontPropertyManager *manager = itFont.next();
       
  2105         d_ptr->m_fontEditorFactory->addPropertyManager(manager);
       
  2106         d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
       
  2107         d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager());
       
  2108         d_ptr->m_checkBoxFactory->addPropertyManager(manager->subBoolPropertyManager());
       
  2109     }
       
  2110 
       
  2111     QList<QtCursorPropertyManager *> cursorPropertyManagers = qFindChildren<QtCursorPropertyManager *>(manager);
       
  2112     QListIterator<QtCursorPropertyManager *> itCursor(cursorPropertyManagers);
       
  2113     while (itCursor.hasNext())
       
  2114         d_ptr->m_cursorEditorFactory->addPropertyManager(itCursor.next());
       
  2115 
       
  2116     QList<QtFlagPropertyManager *> flagPropertyManagers = qFindChildren<QtFlagPropertyManager *>(manager);
       
  2117     QListIterator<QtFlagPropertyManager *> itFlag(flagPropertyManagers);
       
  2118     while (itFlag.hasNext())
       
  2119         d_ptr->m_checkBoxFactory->addPropertyManager(itFlag.next()->subBoolPropertyManager());
       
  2120 }
       
  2121 
       
  2122 /*!
       
  2123     \internal
       
  2124 
       
  2125     Reimplemented from the QtAbstractEditorFactory class.
       
  2126 */
       
  2127 QWidget *QtVariantEditorFactory::createEditor(QtVariantPropertyManager *manager, QtProperty *property,
       
  2128         QWidget *parent)
       
  2129 {
       
  2130     const int propType = manager->propertyType(property);
       
  2131     QtAbstractEditorFactoryBase *factory = d_ptr->m_typeToFactory.value(propType, 0);
       
  2132     if (!factory)
       
  2133         return 0;
       
  2134     return factory->createEditor(wrappedProperty(property), parent);
       
  2135 }
       
  2136 
       
  2137 /*!
       
  2138     \internal
       
  2139 
       
  2140     Reimplemented from the QtAbstractEditorFactory class.
       
  2141 */
       
  2142 void QtVariantEditorFactory::disconnectPropertyManager(QtVariantPropertyManager *manager)
       
  2143 {
       
  2144     QList<QtIntPropertyManager *> intPropertyManagers = qFindChildren<QtIntPropertyManager *>(manager);
       
  2145     QListIterator<QtIntPropertyManager *> itInt(intPropertyManagers);
       
  2146     while (itInt.hasNext())
       
  2147         d_ptr->m_spinBoxFactory->removePropertyManager(itInt.next());
       
  2148 
       
  2149     QList<QtDoublePropertyManager *> doublePropertyManagers = qFindChildren<QtDoublePropertyManager *>(manager);
       
  2150     QListIterator<QtDoublePropertyManager *> itDouble(doublePropertyManagers);
       
  2151     while (itDouble.hasNext())
       
  2152         d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itDouble.next());
       
  2153 
       
  2154     QList<QtBoolPropertyManager *> boolPropertyManagers = qFindChildren<QtBoolPropertyManager *>(manager);
       
  2155     QListIterator<QtBoolPropertyManager *> itBool(boolPropertyManagers);
       
  2156     while (itBool.hasNext())
       
  2157         d_ptr->m_checkBoxFactory->removePropertyManager(itBool.next());
       
  2158 
       
  2159     QList<QtStringPropertyManager *> stringPropertyManagers = qFindChildren<QtStringPropertyManager *>(manager);
       
  2160     QListIterator<QtStringPropertyManager *> itString(stringPropertyManagers);
       
  2161     while (itString.hasNext())
       
  2162         d_ptr->m_lineEditFactory->removePropertyManager(itString.next());
       
  2163 
       
  2164     QList<QtDatePropertyManager *> datePropertyManagers = qFindChildren<QtDatePropertyManager *>(manager);
       
  2165     QListIterator<QtDatePropertyManager *> itDate(datePropertyManagers);
       
  2166     while (itDate.hasNext())
       
  2167         d_ptr->m_dateEditFactory->removePropertyManager(itDate.next());
       
  2168 
       
  2169     QList<QtTimePropertyManager *> timePropertyManagers = qFindChildren<QtTimePropertyManager *>(manager);
       
  2170     QListIterator<QtTimePropertyManager *> itTime(timePropertyManagers);
       
  2171     while (itTime.hasNext())
       
  2172         d_ptr->m_timeEditFactory->removePropertyManager(itTime.next());
       
  2173 
       
  2174     QList<QtDateTimePropertyManager *> dateTimePropertyManagers = qFindChildren<QtDateTimePropertyManager *>(manager);
       
  2175     QListIterator<QtDateTimePropertyManager *> itDateTime(dateTimePropertyManagers);
       
  2176     while (itDateTime.hasNext())
       
  2177         d_ptr->m_dateTimeEditFactory->removePropertyManager(itDateTime.next());
       
  2178 
       
  2179     QList<QtKeySequencePropertyManager *> keySequencePropertyManagers = qFindChildren<QtKeySequencePropertyManager *>(manager);
       
  2180     QListIterator<QtKeySequencePropertyManager *> itKeySequence(keySequencePropertyManagers);
       
  2181     while (itKeySequence.hasNext())
       
  2182         d_ptr->m_keySequenceEditorFactory->removePropertyManager(itKeySequence.next());
       
  2183 
       
  2184     QList<QtCharPropertyManager *> charPropertyManagers = qFindChildren<QtCharPropertyManager *>(manager);
       
  2185     QListIterator<QtCharPropertyManager *> itChar(charPropertyManagers);
       
  2186     while (itChar.hasNext())
       
  2187         d_ptr->m_charEditorFactory->removePropertyManager(itChar.next());
       
  2188 
       
  2189     QList<QtLocalePropertyManager *> localePropertyManagers = qFindChildren<QtLocalePropertyManager *>(manager);
       
  2190     QListIterator<QtLocalePropertyManager *> itLocale(localePropertyManagers);
       
  2191     while (itLocale.hasNext())
       
  2192         d_ptr->m_comboBoxFactory->removePropertyManager(itLocale.next()->subEnumPropertyManager());
       
  2193 
       
  2194     QList<QtPointPropertyManager *> pointPropertyManagers = qFindChildren<QtPointPropertyManager *>(manager);
       
  2195     QListIterator<QtPointPropertyManager *> itPoint(pointPropertyManagers);
       
  2196     while (itPoint.hasNext())
       
  2197         d_ptr->m_spinBoxFactory->removePropertyManager(itPoint.next()->subIntPropertyManager());
       
  2198 
       
  2199     QList<QtPointFPropertyManager *> pointFPropertyManagers = qFindChildren<QtPointFPropertyManager *>(manager);
       
  2200     QListIterator<QtPointFPropertyManager *> itPointF(pointFPropertyManagers);
       
  2201     while (itPointF.hasNext())
       
  2202         d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itPointF.next()->subDoublePropertyManager());
       
  2203 
       
  2204     QList<QtSizePropertyManager *> sizePropertyManagers = qFindChildren<QtSizePropertyManager *>(manager);
       
  2205     QListIterator<QtSizePropertyManager *> itSize(sizePropertyManagers);
       
  2206     while (itSize.hasNext())
       
  2207         d_ptr->m_spinBoxFactory->removePropertyManager(itSize.next()->subIntPropertyManager());
       
  2208 
       
  2209     QList<QtSizeFPropertyManager *> sizeFPropertyManagers = qFindChildren<QtSizeFPropertyManager *>(manager);
       
  2210     QListIterator<QtSizeFPropertyManager *> itSizeF(sizeFPropertyManagers);
       
  2211     while (itSizeF.hasNext())
       
  2212         d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itSizeF.next()->subDoublePropertyManager());
       
  2213 
       
  2214     QList<QtRectPropertyManager *> rectPropertyManagers = qFindChildren<QtRectPropertyManager *>(manager);
       
  2215     QListIterator<QtRectPropertyManager *> itRect(rectPropertyManagers);
       
  2216     while (itRect.hasNext())
       
  2217         d_ptr->m_spinBoxFactory->removePropertyManager(itRect.next()->subIntPropertyManager());
       
  2218 
       
  2219     QList<QtRectFPropertyManager *> rectFPropertyManagers = qFindChildren<QtRectFPropertyManager *>(manager);
       
  2220     QListIterator<QtRectFPropertyManager *> itRectF(rectFPropertyManagers);
       
  2221     while (itRectF.hasNext())
       
  2222         d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itRectF.next()->subDoublePropertyManager());
       
  2223 
       
  2224     QList<QtColorPropertyManager *> colorPropertyManagers = qFindChildren<QtColorPropertyManager *>(manager);
       
  2225     QListIterator<QtColorPropertyManager *> itColor(colorPropertyManagers);
       
  2226     while (itColor.hasNext()) {
       
  2227         QtColorPropertyManager *manager = itColor.next();
       
  2228         d_ptr->m_colorEditorFactory->removePropertyManager(manager);
       
  2229         d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
       
  2230     }
       
  2231 
       
  2232     QList<QtEnumPropertyManager *> enumPropertyManagers = qFindChildren<QtEnumPropertyManager *>(manager);
       
  2233     QListIterator<QtEnumPropertyManager *> itEnum(enumPropertyManagers);
       
  2234     while (itEnum.hasNext())
       
  2235         d_ptr->m_comboBoxFactory->removePropertyManager(itEnum.next());
       
  2236 
       
  2237     QList<QtSizePolicyPropertyManager *> sizePolicyPropertyManagers = qFindChildren<QtSizePolicyPropertyManager *>(manager);
       
  2238     QListIterator<QtSizePolicyPropertyManager *> itSizePolicy(sizePolicyPropertyManagers);
       
  2239     while (itSizePolicy.hasNext()) {
       
  2240         QtSizePolicyPropertyManager *manager = itSizePolicy.next();
       
  2241         d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
       
  2242         d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager());
       
  2243     }
       
  2244 
       
  2245     QList<QtFontPropertyManager *> fontPropertyManagers = qFindChildren<QtFontPropertyManager *>(manager);
       
  2246     QListIterator<QtFontPropertyManager *> itFont(fontPropertyManagers);
       
  2247     while (itFont.hasNext()) {
       
  2248         QtFontPropertyManager *manager = itFont.next();
       
  2249         d_ptr->m_fontEditorFactory->removePropertyManager(manager);
       
  2250         d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
       
  2251         d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager());
       
  2252         d_ptr->m_checkBoxFactory->removePropertyManager(manager->subBoolPropertyManager());
       
  2253     }
       
  2254 
       
  2255     QList<QtCursorPropertyManager *> cursorPropertyManagers = qFindChildren<QtCursorPropertyManager *>(manager);
       
  2256     QListIterator<QtCursorPropertyManager *> itCursor(cursorPropertyManagers);
       
  2257     while (itCursor.hasNext())
       
  2258         d_ptr->m_cursorEditorFactory->removePropertyManager(itCursor.next());
       
  2259 
       
  2260     QList<QtFlagPropertyManager *> flagPropertyManagers = qFindChildren<QtFlagPropertyManager *>(manager);
       
  2261     QListIterator<QtFlagPropertyManager *> itFlag(flagPropertyManagers);
       
  2262     while (itFlag.hasNext())
       
  2263         d_ptr->m_checkBoxFactory->removePropertyManager(itFlag.next()->subBoolPropertyManager());
       
  2264 }
       
  2265 
       
  2266 QT_END_NAMESPACE
       
  2267 
       
  2268 #include "moc_qtvariantproperty.cpp"