Commit 98eee9db authored by Thomas Hartmann's avatar Thomas Hartmann
Browse files

QmlDesigner.metaInfo: replace old NodeMetaInfo with new implementation

The new implementation is based on the QmlJS::Interpreter
meta info system and gets its info from parsing qml and qmldumper
instead of interogating QDeclarative classes.

So we share this code with the Qml TextEditor and this approach is also
way more flexible. It also work with different Qt versions.

The meta info is now bound to a document/rewriter.

The api has changed slightly.

subComponentManager: cleanup
The SubComponentManager does not have to provide meta info, anymore.

propertyParser: cleanup
Enums were never properly converted. here.

metaInfo: remove old MetaInfo classes
Removing the old MetaInfo classes and code
parent 9055cd3e
......@@ -625,7 +625,7 @@ void DesignDocumentController::paste()
int offset = double(qrand()) / RAND_MAX * 20 - 10;
foreach (const ModelNode &node, selectedNodes) {
QString defaultProperty(targetNode.metaInfo().defaultProperty());
QString defaultProperty(targetNode.metaInfo().defaultPropertyName());
ModelNode pastedNode(view.insertModel(node));
pastedNodeList.append(pastedNode);
scatterItem(pastedNode, targetNode, offset);
......@@ -658,7 +658,7 @@ void DesignDocumentController::paste()
targetNode = targetNode.parentProperty().parentModelNode();
QString defaultProperty(targetNode.metaInfo().defaultProperty());
QString defaultProperty(targetNode.metaInfo().defaultPropertyName());
scatterItem(pastedNode, targetNode);
if (targetNode.nodeListProperty(defaultProperty).isValid()) {
......
......@@ -33,7 +33,6 @@
#include <nodelistproperty.h>
#include <nodeproperty.h>
#include <metainfo.h>
#include <propertymetainfo.h>
#include <qgraphicswidget.h>
#include <abstractview.h>
#include <rewriterview.h>
......@@ -137,7 +136,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
if (!parentNode.metaInfo().hasDefaultProperty())
return false;
targetIndex -= visibleProperties(parentNode).count();
parentPropertyName = parentNode.metaInfo().defaultProperty();
parentPropertyName = parentNode.metaInfo().defaultPropertyName();
}
else {
parentItemIndex = parentIndex.parent();
......@@ -482,7 +481,7 @@ void NavigatorTreeModel::removeSubTree(const ModelNode &node)
void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty parentProperty, const QList<ModelNode> &modelNodes, int targetIndex)
{
try {
QString propertyQmlType = qmlTypeInQtContainer(parentProperty.metaInfo().type());
QString propertyQmlType = qmlTypeInQtContainer(parentProperty.parentModelNode().metaInfo().propertyTypeName(parentProperty.name()));
RewriterTransaction transaction = m_view->beginRewriterTransaction();
foreach (const ModelNode &node, modelNodes) {
......@@ -539,7 +538,7 @@ QList<ModelNode> NavigatorTreeModel::modelNodeChildren(const ModelNode &parentNo
QStringList properties;
if (parentNode.metaInfo().hasDefaultProperty())
properties << parentNode.metaInfo().defaultProperty();
properties << parentNode.metaInfo().defaultPropertyName();
properties << visibleProperties(parentNode);
......@@ -565,7 +564,7 @@ QString NavigatorTreeModel::qmlTypeInQtContainer(const QString &qtContainerType)
if (typeName.endsWith('*'))
typeName.chop(1);
return m_view->model()->metaInfo().fromQtTypes(typeName);
return typeName;
}
......@@ -573,13 +572,13 @@ QStringList NavigatorTreeModel::visibleProperties(const ModelNode &node) const
{
QStringList propertyList;
foreach (const QString &propertyName, node.metaInfo().propertyNamesOnlyContainer()) {
if (!m_hiddenProperties.contains(propertyName) &&
propertyName != node.metaInfo().defaultProperty()) { // TODO: ask the node instances
foreach (const QString &propertyName, node.metaInfo().propertyNames()) {
if (node.metaInfo().propertyIsWritable(propertyName) && !m_hiddenProperties.contains(propertyName) &&
propertyName != node.metaInfo().defaultPropertyName()) { // TODO: ask the node instances
QString qmlType = qmlTypeInQtContainer(node.metaInfo().propertyType(propertyName));
if (node.metaInfo().metaInfo().hasNodeMetaInfo(qmlType) &&
node.metaInfo().metaInfo().nodeMetaInfo(qmlType).isSubclassOf("QGraphicsObject", -1, -1)) {
QString qmlType = qmlTypeInQtContainer(node.metaInfo().propertyTypeName(propertyName));
if (node.model()->metaInfo(qmlType).isValid() &&
node.model()->metaInfo(qmlType).isSubclassOf("QGraphicsObject", -1, -1)) {
propertyList.append(propertyName);
}
}
......
......@@ -32,13 +32,10 @@
#include <nodemetainfo.h>
#include <metainfo.h>
#include <propertymetainfo.h>
#include <invalididexception.h>
#include <rewritingexception.h>
#include <invalidnodestateexception.h>
#include <variantproperty.h>
#include <propertymetainfo.h>
#include <bindingproperty.h>
......@@ -226,10 +223,10 @@ void PropertyEditor::NodeType::initialSetup(const QString &typeName, const QUrl
{
QDeclarativeContext *ctxt = m_view->rootContext();
NodeMetaInfo metaInfo = propertyEditor->model()->metaInfo().nodeMetaInfo(typeName, 4, 7);
NodeMetaInfo metaInfo = propertyEditor->model()->metaInfo(typeName, 4, 7);
foreach (const QString &propertyName, metaInfo.propertyNames())
setupPropertyEditorValue(propertyName, &m_backendValuesPropertyMap, propertyEditor, metaInfo.propertyType(propertyName));
setupPropertyEditorValue(propertyName, &m_backendValuesPropertyMap, propertyEditor, metaInfo.propertyTypeName(propertyName));
PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(QDeclarativeMetaType::toQObject(m_backendValuesPropertyMap.value("className")));
if (!valueObject)
......@@ -388,7 +385,7 @@ void PropertyEditor::changeValue(const QString &propertyName)
QVariant castedValue;
if (fxObjectNode.modelNode().metaInfo().isValid() && fxObjectNode.modelNode().metaInfo().hasProperty(propertyName)) {
castedValue = fxObjectNode.modelNode().metaInfo().nativePropertyValue(propertyName, value->value());
castedValue = fxObjectNode.modelNode().metaInfo().propertyCastedValue(propertyName, value->value());
} else {
qWarning() << "PropertyEditor:" <<propertyName << "cannot be casted (metainfo)";
return ;
......@@ -400,7 +397,7 @@ void PropertyEditor::changeValue(const QString &propertyName)
}
if (fxObjectNode.modelNode().metaInfo().isValid() && fxObjectNode.modelNode().metaInfo().hasProperty(propertyName))
if (fxObjectNode.modelNode().metaInfo().propertyType(propertyName) == QLatin1String("QUrl")) { //turn absolute local file paths into relative paths
if (fxObjectNode.modelNode().metaInfo().propertyTypeName(propertyName) == QLatin1String("QUrl")) { //turn absolute local file paths into relative paths
QString filePath = castedValue.toUrl().toString();
if (QFileInfo(filePath).exists() && QFileInfo(filePath).isAbsolute()) {
QDir fileDir(QFileInfo(model()->fileUrl().toLocalFile()).absolutePath());
......@@ -448,12 +445,12 @@ void PropertyEditor::changeExpression(const QString &name)
PropertyEditorValue *value = qobject_cast<PropertyEditorValue*>(QDeclarativeMetaType::toQObject(m_currentType->m_backendValuesPropertyMap.value(underscoreName)));
if (fxObjectNode.modelNode().metaInfo().isValid() && fxObjectNode.modelNode().metaInfo().hasProperty(name)) {
if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("QColor")) {
if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("QColor")) {
if (QColor(value->expression().remove('"')).isValid()) {
fxObjectNode.setVariantProperty(name, QColor(value->expression().remove('"')));
return;
}
} else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("bool")) {
} else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("bool")) {
if (value->expression().compare("false", Qt::CaseInsensitive) == 0 || value->expression().compare("true", Qt::CaseInsensitive) == 0) {
if (value->expression().compare("true", Qt::CaseInsensitive) == 0)
fxObjectNode.setVariantProperty(name, true);
......@@ -461,14 +458,14 @@ void PropertyEditor::changeExpression(const QString &name)
fxObjectNode.setVariantProperty(name, false);
return;
}
} else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("int")) {
} else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("int")) {
bool ok;
int intValue = value->expression().toInt(&ok);
if (ok) {
fxObjectNode.setVariantProperty(name, intValue);
return;
}
} else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("qreal")) {
} else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("qreal")) {
bool ok;
qreal realValue = value->expression().toFloat(&ok);
if (ok) {
......@@ -585,7 +582,7 @@ QString templateGeneration(NodeMetaInfo type, NodeMetaInfo superType, const QmlO
QString properName = name;
properName.replace(".", "_");
QString typeName = type.propertyType(name);
QString typeName = type.propertyTypeName(name);
//alias resolution only possible with instance
if (typeName == QLatin1String("alias") && objectNode.isValid())
typeName = objectNode.instanceType(name);
......@@ -650,7 +647,7 @@ void PropertyEditor::resetView()
if (m_selectedNode.isValid() && !QFileInfo(qmlSpecificsFile.toLocalFile()).exists() && m_selectedNode.metaInfo().isValid()) {
//do magic !!
specificQmlData = templateGeneration(m_selectedNode.metaInfo(), model()->metaInfo().nodeMetaInfo(specificsClassName), m_selectedNode);
specificQmlData = templateGeneration(m_selectedNode.metaInfo(), model()->metaInfo(specificsClassName), m_selectedNode);
}
NodeType *type = m_typeHash.value(qmlFile.toString());
......
......@@ -34,7 +34,6 @@
#include <model.h>
#include <nodemetainfo.h>
#include <metainfo.h>
#include <propertymetainfo.h>
#include <nodeproperty.h>
#include <qmlobjectnode.h>
......@@ -54,7 +53,7 @@ QVariant PropertyEditorValue::value() const
{
QVariant returnValue = m_value;
if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name()))
if (modelNode().metaInfo().propertyType(name()) == QLatin1String("QUrl")) {
if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QUrl")) {
returnValue = returnValue.toUrl().toString();
}
return returnValue;
......@@ -98,7 +97,7 @@ void PropertyEditorValue::setValueWithEmit(const QVariant &value)
if (m_value != value) {
QVariant newValue = value;
if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name()))
if (modelNode().metaInfo().propertyType(name()) == QLatin1String("QUrl")) {
if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QUrl")) {
newValue = QUrl(newValue.toString());
}
......@@ -272,7 +271,7 @@ void PropertyEditorNodeWrapper::add(const QString &type)
if ((m_editorValue && m_editorValue->modelNode().isValid())) {
if (propertyType.isEmpty())
propertyType = m_editorValue->modelNode().metaInfo().propertyType(m_editorValue->name());
propertyType = m_editorValue->modelNode().metaInfo().propertyTypeName(m_editorValue->name());
while (propertyType.contains('*')) //strip star
propertyType.chop(1);
m_modelNode = m_editorValue->modelNode().view()->createModelNode(propertyType, 4, 7);
......
......@@ -11,10 +11,8 @@ DEPENDPATH += $$PWD $$PWD/include
SOURCES += $$PWD/model/abstractview.cpp \
$$PWD/instances/nodeinstanceview.cpp \
$$PWD/model/rewriterview.cpp \
$$PWD/metainfo/enumeratormetainfo.cpp \
$$PWD/metainfo/metainfo.cpp \
$$PWD/metainfo/metainfoparser.cpp \
$$PWD/metainfo/propertymetainfo.cpp \
$$PWD/metainfo/nodemetainfo.cpp \
$$PWD/metainfo/itemlibraryinfo.cpp \
$$PWD/metainfo/subcomponentmanager.cpp \
......@@ -126,11 +124,9 @@ HEADERS += $$PWD/include/corelib_global.h \
$$PWD/include/abstractview.h \
$$PWD/include/nodeinstanceview.h \
$$PWD/include/rewriterview.h \
$$PWD/include/enumeratormetainfo.h \
$$PWD/include/metainfo.h \
$$PWD/include/metainfoparser.h \
$$PWD/include/nodemetainfo.h \
$$PWD/include/propertymetainfo.h \
$$PWD/include/itemlibraryinfo.h \
$$PWD/model/internalproperty.h \
$$PWD/include/modelnode.h \
......
......@@ -52,7 +52,6 @@ namespace QmlDesigner {
class Model;
class ModelNode;
class AbstractView;
class PropertyMetaInfo;
class CORESHARED_EXPORT VariantProperty;
class CORESHARED_EXPORT NodeListProperty;
class CORESHARED_EXPORT NodeAbstractProperty;
......@@ -88,7 +87,6 @@ public:
ModelNode parentModelNode() const;
QmlObjectNode parentQmlObjectNode() const;
PropertyMetaInfo metaInfo() const;
bool isDefaultProperty() const;
VariantProperty toVariantProperty() const;
NodeListProperty toNodeListProperty() const;
......
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#ifndef ENUMERATORMETAINFO_H
#define ENUMERATORMETAINFO_H
#include "corelib_global.h"
#include <QExplicitlySharedDataPointer>
#include <QList>
#include <QString>
namespace QmlDesigner {
class MetaInfo;
namespace Internal {
class MetaInfoParser;
class MetaInfoPrivate;
class EnumeratorMetaInfoData;
}
class CORESHARED_EXPORT EnumeratorMetaInfo
{
friend class QmlDesigner::MetaInfo;
friend class QmlDesigner::Internal::MetaInfoPrivate;
friend class QmlDesigner::Internal::MetaInfoParser;
public:
EnumeratorMetaInfo();
~EnumeratorMetaInfo();
EnumeratorMetaInfo(const EnumeratorMetaInfo &other);
EnumeratorMetaInfo& operator=(const EnumeratorMetaInfo &other);
QString name() const;
QString scope() const;
bool isFlagType() const;
bool isValid() const;
QString scopeAndName(const QString &combiner = QString("::")) const;
QList<QString> elementNames() const;
int elementValue(const QString &enumeratorName) const;
QString valueToString(int value) const;
private:
void setScope(const QString &scope);
void setName(const QString &name);
void setIsFlagType(bool isFlagType);
void setValid(bool valid);
void addElement(const QString &enumeratorName, int enumeratorValue);
private:
QExplicitlySharedDataPointer<Internal::EnumeratorMetaInfoData> m_data;
};
}
#endif // ENUMERATORMETAINFO_H
......@@ -38,10 +38,7 @@
#include <QtCore/QSharedPointer>
#include <nodemetainfo.h>
#include "propertymetainfo.h"
#include "itemlibraryinfo.h"
#include "enumeratormetainfo.h"
namespace QmlDesigner {
......@@ -66,7 +63,6 @@ class CORESHARED_EXPORT MetaInfo
friend class QmlDesigner::Internal::ModelPrivate;
friend class QmlDesigner::Internal::MetaInfoParser;
friend class QmlDesigner::Internal::SubComponentManagerPrivate;
friend class QmlDesigner::NodeMetaInfo;
friend bool QmlDesigner::operator==(const MetaInfo &, const MetaInfo &);
public:
......@@ -74,17 +70,7 @@ public:
~MetaInfo();
MetaInfo& operator=(const MetaInfo &other);
bool hasNodeMetaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1) const;
NodeMetaInfo nodeMetaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1) const;
bool hasEnumerator(const QString &enumeratorName) const;
EnumeratorMetaInfo enumerator(const QString &enumeratorName) const;
ItemLibraryInfo *itemLibraryInfo() const;
QString fromQtTypes(const QString &type) const;
public:
static MetaInfo global();
static void clearGlobal();
......@@ -92,12 +78,6 @@ public:
static void setPluginPaths(const QStringList &paths);
private:
void addNodeInfo(NodeMetaInfo &info);
void removeNodeInfo(NodeMetaInfo &info);
EnumeratorMetaInfo addEnumerator(const QString &enumeratorScope, const QString &enumeratorName);
EnumeratorMetaInfo addFlag(const QString &enumeratorScope, const QString &enumeratorName);
bool isGlobal() const;
private:
......
......@@ -55,9 +55,11 @@ class AbstractView;
class WidgetQueryView;
class NodeStateChangeSet;
class MetaInfo;
class NodeMetaInfo;
class ModelState;
class NodeAnchors;
class AbstractProperty;
class RewriterView;
typedef QList<QPair<QString, QVariant> > PropertyListType;
......@@ -88,6 +90,7 @@ public:
const MetaInfo metaInfo() const;
MetaInfo metaInfo();
NodeMetaInfo metaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1);
void setMetaInfo(const MetaInfo &metaInfo);
void attachView(AbstractView *view);
......@@ -100,6 +103,8 @@ public:
void addImport(const Import &import);
void removeImport(const Import &import);
RewriterView *rewriterView() const;
protected:
Model();
......
......@@ -45,93 +45,60 @@ QT_END_NAMESPACE
namespace QmlDesigner {
class MetaInfo;
class Model;
class AbstractProperty;
namespace Internal {
class MetaInfoPrivate;
class MetaInfoParser;
class NodeMetaInfoData;
class SubComponentManagerPrivate;
class ItemLibraryEntryData;
class NodeMetaInfoPrivate;
}
class PropertyMetaInfo;
class CORESHARED_EXPORT NodeMetaInfo
{
friend class QmlDesigner::MetaInfo;
friend class QmlDesigner::Internal::ItemLibraryEntryData;
friend class QmlDesigner::Internal::MetaInfoPrivate;
friend class QmlDesigner::Internal::MetaInfoParser;
friend class QmlDesigner::Internal::SubComponentManagerPrivate;
friend class QmlDesigner::AbstractProperty;
friend CORESHARED_EXPORT uint qHash(const NodeMetaInfo &nodeMetaInfo);
friend CORESHARED_EXPORT bool operator ==(const NodeMetaInfo &firstNodeInfo, const NodeMetaInfo &secondNodeInfo);
public:
NodeMetaInfo();
NodeMetaInfo(Model *model, QString type, int maj, int min);
~NodeMetaInfo();
NodeMetaInfo(const NodeMetaInfo &other);
NodeMetaInfo &operator=(const NodeMetaInfo &other);
bool isValid() const;
MetaInfo metaInfo() const;
bool isComponent() const;
bool hasProperty(const QString &propertyName) const;
QStringList propertyNames() const;
QStringList directPropertyNames() const;
QString defaultPropertyName() const;
bool hasDefaultProperty() const;
QString propertyTypeName(const QString &propertyName) const;
bool propertyIsWritable(const QString &propertyName) const;
bool propertyIsListProperty(const QString &propertyName) const;
bool propertyIsEnumType(const QString &propertyName) const;
QString propertyEnumScope(const QString &propertyName) const;
QStringList propertyKeysForEnum(const QString &propertyName) const;
QVariant propertyCastedValue(const QString &propertyName, const QVariant &value) const;
QList<NodeMetaInfo> superClasses() const;
NodeMetaInfo directSuperClass() const;
QStringList propertyNames() const;
QStringList propertyNamesOnlyContainer() const;
QString propertyType(const QString &propertyName) const;
QVariant nativePropertyValue(const QString &propertyName, const QVariant &value) const;
QString typeName() const;
int majorVersion() const;
int minorVersion() const;
bool availableInVersion(int majorVersion, int minorVersion) const;
bool hasDefaultProperty() const;
QString defaultProperty() const;
QString componentSource() const;
QString componentFileName() const;
bool hasProperty(const QString &propertyName) const;
bool isContainer() const;
bool isComponent() const;
bool availableInVersion(int majorVersion, int minorVersion) const;
bool isSubclassOf(const QString& type, int majorVersion, int minorVersio) const;
QString componentString() const;
QIcon icon() const;
private:
NodeMetaInfo();
NodeMetaInfo(const MetaInfo &metaInfo);
void setInvalid();
void setType(const QString &typeName, int majorVersion, int minorVersion);
void addProperty(const PropertyMetaInfo &property);
void setIsContainer(bool isContainer);
void setIcon(const QIcon &icon);
void setQmlFile(const QString &filePath);
void setDefaultProperty(const QString &defaultProperty);
void setSuperClass(const QString &typeName, int majorVersion = -1, int minorVersion = -1);
bool hasLocalProperty(const QString &propertyName, bool resolveDotSyntax = true) const;
QHash<QString,PropertyMetaInfo> dotProperties() const;
QHash<QString,PropertyMetaInfo> properties(bool resolveDotSyntax = true) const;
PropertyMetaInfo property(const QString &propertyName, bool resolveDotSyntax = true) const;
private:
QExplicitlySharedDataPointer<Internal::NodeMetaInfoData> m_data;
QSharedPointer<Internal::NodeMetaInfoPrivate> m_privateData;
};
CORESHARED_EXPORT uint qHash(const NodeMetaInfo &nodeMetaInfo);
CORESHARED_EXPORT bool operator ==(const NodeMetaInfo &firstNodeInfo,
const NodeMetaInfo &secondNodeInfo);
//QDataStream& operator<<(QDataStream& stream, const NodeMetaInfo& nodeMetaInfo);
//QDataStream& operator>>(QDataStream& stream, NodeMetaInfo& nodeMetaInfo);
}
} //QmlDesigner
#endif // NODEMETAINFO_H
......@@ -37,8 +37,6 @@
#include <QDataStream>
#include <QVariant>
#include <enumeratormetainfo.h>
namespace QmlDesigner {
class PropertyContainer;
......
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#ifndef PROPERTYMETAINFO_H
#define PROPERTYMETAINFO_H
#include "corelib_global.h"