diff options
author | Martin Jones <martin.jones@nokia.com> | 2009-08-24 23:11:26 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2009-08-24 23:11:26 (GMT) |
commit | 6d57d71824ba67cfed07bcb27ab62349ee7d4c6e (patch) | |
tree | a55d522d56ca64c7a970da861ffc4b48b33623ef /src/declarative | |
parent | a33e3d8a7fefc3d2ad254dcb76a127b068b7c63d (diff) | |
parent | 9e2114fa326be128b03268865b39ddb2731e0173 (diff) | |
download | Qt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.zip Qt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.tar.gz Qt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.tar.bz2 |
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/qml/qmlcompositetypemanager.cpp | 19 | ||||
-rw-r--r-- | src/declarative/qml/qmldom.cpp | 150 | ||||
-rw-r--r-- | src/declarative/qml/qmldom.h | 16 | ||||
-rw-r--r-- | src/declarative/qml/qmlengine.cpp | 111 | ||||
-rw-r--r-- | src/declarative/qml/qmlengine_p.h | 18 | ||||
-rw-r--r-- | src/declarative/qml/qmlparser.cpp | 2 | ||||
-rw-r--r-- | src/declarative/qml/qmlparser_p.h | 5 | ||||
-rw-r--r-- | src/declarative/qml/qmlscriptparser.cpp | 12 |
8 files changed, 167 insertions, 166 deletions
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp index 0fb6c86..5bf2dc0 100644 --- a/src/declarative/qml/qmlcompositetypemanager.cpp +++ b/src/declarative/qml/qmlcompositetypemanager.cpp @@ -327,8 +327,23 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit) } QUrl url; - if (!QmlEnginePrivate::get(engine)->resolveType(unit->imports, typeName, &ref.type, &url)) { - // XXX could produce error message here. + QmlEnginePrivate::ImportedNamespace *s; + QByteArray localTypeName; + + QmlEnginePrivate::get(engine)->resolveNamespace(unit->imports, typeName, &s, &localTypeName); + if (QmlEnginePrivate::get(engine)->resolveTypeInNamespace(s, localTypeName, &ref.type, &url)) { + int majorVersion; + int minorVersion; + if (s->getTypeInfo(localTypeName, 0, &majorVersion, &minorVersion)) { + foreach (QmlParser::Object *obj, parserRef->refObjects) { + // store namespace for DOM + obj->majorVersion = majorVersion; + obj->minorVersion = minorVersion; + } + } + } else { + // try base url + url = unit->imports.baseUrl().resolved(QUrl(QLatin1String(typeName + ".qml"))); } if (ref.type) { diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp index 22a8e49..2aaf492 100644 --- a/src/declarative/qml/qmldom.cpp +++ b/src/declarative/qml/qmldom.cpp @@ -76,15 +76,11 @@ QmlDomDocumentPrivate::~QmlDomDocumentPrivate() \brief The QmlDomDocument class represents the root of a QML document A QML document is a self-contained snippet of QML, usually contained in a - single file. Each document has a version number, accessible through - QmlDomDocument::version(), and a root object, accessible through + single file. Each document has a root object, accessible through QmlDomDocument::rootObject(). - The QmlDomDocument class allows the programmer to load a QML document, by - calling QmlDomDocument::load(), manipulate it and save it to textual form - by calling QmlDomDocument::save(). By using the QML DOM API, editors can - non-destructively modify a QML document even if they only understand a - subset of the total QML functionality. + The QmlDomDocument class allows the programmer to inspect a QML document by + calling QmlDomDocument::load(). The following example loads a QML file from disk, and prints out its root object type and the properties assigned in the root object. @@ -136,15 +132,6 @@ QmlDomDocument &QmlDomDocument::operator=(const QmlDomDocument &other) } /*! - Return the version number of the Qml document. Currently only version - 1 exists. -*/ -int QmlDomDocument::version() const -{ - return 1; -} - -/*! Returns all import statements in qml. */ QList<QmlDomImport> QmlDomDocument::imports() const @@ -157,7 +144,7 @@ QList<QmlDomImport> QmlDomDocument::imports() const data. On success, true is returned. If the \a data is malformed, false is returned and QmlDomDocument::loadError() contains an error description. - \sa QmlDomDocument::save() QmlDomDocument::loadError() + \sa QmlDomDocument::loadError() */ bool QmlDomDocument::load(QmlEngine *engine, const QByteArray &data, const QUrl &url) { @@ -224,17 +211,6 @@ QList<QmlError> QmlDomDocument::errors() const } /*! - Return a saved copy of the QmlDomDocument. The returned data will be valid - QML XML data. - - \sa load() -*/ -QByteArray QmlDomDocument::save() const -{ - return QByteArray(); -} - -/*! Returns the document's root object, or an invalid QmlDomObject if the document has no root. @@ -417,15 +393,6 @@ QmlDomValue QmlDomProperty::value() const } /*! - Sets the QmlDomValue that is assigned to this property to \a value. -*/ -void QmlDomProperty::setValue(const QmlDomValue &value) -{ - Q_UNUSED(value); - qWarning("QmlDomProperty::setValue(const QmlDomValue &): Not Implemented"); -} - -/*! Returns the position in the input data where the property ID startd, or -1 if the property is invalid. */ @@ -689,11 +656,6 @@ QGraphicsWidget { "opacity" and "size". Obviously QGraphicsWidget has many more properties than just these two, but the QML DOM representation only contains those assigned values (or bindings) in the QML file. - - The DOM tree can be modified to include new property assignments by calling - QmlDomObject::addProperty(). Existing property assignments can be modified - through the QmlDomProperty::setValue() method, or removed entirely by - calling QmlDomObject::removeProperty(). */ /*! @@ -776,6 +738,21 @@ QByteArray QmlDomObject::objectClassName() const return QByteArray(); } +int QmlDomObject::objectTypeMajorVersion() const +{ + if (d->object) + return d->object->majorVersion; + else + return -1; +} + +int QmlDomObject::objectTypeMinorVersion() const +{ + if (d->object) + return d->object->minorVersion; + else + return -1; +} /*! Returns the QML id assigned to this object, or an empty QByteArray if no id @@ -793,17 +770,6 @@ QString QmlDomObject::objectId() const } /*! - Set the object \a id. If any other object within the DOM tree has the same - id, the other object's id will be cleared. -*/ -void QmlDomObject::setObjectId(const QByteArray &id) -{ - Q_UNUSED(id); - qWarning("QmlDomObject::setObjectId(const QByteArray &): Not implemented"); -} - - -/*! Returns the list of assigned properties on this object. In the following example, "text" and "x" properties would be returned. @@ -863,27 +829,6 @@ QmlDomProperty QmlDomObject::property(const QByteArray &name) const return QmlDomProperty(); } -/*! - Remove the property \a name from this object, if it exists. Otherwise does - nothing. -*/ -void QmlDomObject::removeProperty(const QByteArray &name) -{ - Q_UNUSED(name); - qWarning("QmlDomObject::removeProperty(const QByteArray &): Not implemented"); -} - -/*! - Adds the property \a name with the specified \a value to this object. If - a property by \a name already exists, it will be removed. -*/ -void QmlDomObject::addProperty(const QByteArray &name, const QmlDomValue &value) -{ - Q_UNUSED(name); - Q_UNUSED(value); - qWarning("QmlDomObject::addProperty(const QByteArray &, const QmlDomValue &): Not implemented"); -} - QList<QmlDomDynamicProperty> QmlDomObject::dynamicProperties() const { QList<QmlDomDynamicProperty> properties; @@ -935,18 +880,6 @@ bool QmlDomObject::isCustomType() const } /*! - Sets the custom type \a data. If this type is not a custom type, this - method does nothing. - - \sa QmlDomObject::isCustomType() QmlDomObject::customTypeData() -*/ -void QmlDomObject::setCustomTypeData(const QByteArray &data) -{ - Q_UNUSED(data); - qWarning("QmlDomObject::setCustomTypeData(const QByteArray &): Not implemented"); -} - -/*! If this object represents a custom type, returns the data associated with the custom type, otherwise returns an empty QByteArray(). QmlDomObject::isCustomType() can be used to check if this object represents @@ -1101,15 +1034,6 @@ QString QmlDomValueLiteral::literal() const } /*! - Sets the literal \a value. -*/ -void QmlDomValueLiteral::setLiteral(const QString &value) -{ - Q_UNUSED(value); - qWarning("QmlDomValueLiteral::setLiteral(const QString &): Not implemented"); -} - -/*! \class QmlDomValueBinding \internal \brief The QmlDomValueBinding class represents a property binding. @@ -1171,15 +1095,6 @@ QString QmlDomValueBinding::binding() const } /*! - Sets the binding \a expression. -*/ -void QmlDomValueBinding::setBinding(const QString &expression) -{ - Q_UNUSED(expression); - qWarning("QmlDomValueBinding::setBinding(const QString &): Not implemented"); -} - -/*! \class QmlDomValueValueSource \internal \brief The QmlDomValueValueSource class represents a value source assignment value. @@ -1259,14 +1174,6 @@ QmlDomObject QmlDomValueValueSource::object() const return rv; } -/*! - Sets the value source \a object. -*/ -void QmlDomValueValueSource::setObject(const QmlDomObject &object) -{ - Q_UNUSED(object); - qWarning("QmlDomValueValueSource::setObject(const QmlDomObject &): Not implemented"); -} QmlDomValuePrivate::QmlDomValuePrivate() : property(0), value(0) @@ -1644,15 +1551,6 @@ QList<QmlDomValue> QmlDomList::values() const } /*! - Set the list of QmlDomValue's to \a values. -*/ -void QmlDomList::setValues(const QList<QmlDomValue> &values) -{ - Q_UNUSED(values); - qWarning("QmlDomList::setValues(const QList<QmlDomValue> &): Not implemented"); -} - -/*! Returns the position in the input data where the list started, or -1 if the property is invalid. */ @@ -1778,16 +1676,6 @@ QmlDomObject QmlDomComponent::componentRoot() const return rv; } -/*! - Set the component's \a root object. -*/ -void QmlDomComponent::setComponentRoot(const QmlDomObject &root) -{ - Q_UNUSED(root); - qWarning("QmlDomComponent::setComponentRoot(const QmlDomObject &): Not implemented"); -} - - QmlDomImportPrivate::QmlDomImportPrivate() : type(File) { diff --git a/src/declarative/qml/qmldom.h b/src/declarative/qml/qmldom.h index 32ed2da..f344bb2 100644 --- a/src/declarative/qml/qmldom.h +++ b/src/declarative/qml/qmldom.h @@ -72,12 +72,10 @@ public: ~QmlDomDocument(); QmlDomDocument &operator=(const QmlDomDocument &); - int version() const; QList<QmlDomImport> imports() const; QList<QmlError> errors() const; bool load(QmlEngine *, const QByteArray &, const QUrl & = QUrl()); - QByteArray save() const; QmlDomObject rootObject() const; @@ -100,7 +98,6 @@ public: bool isDefaultProperty() const; QmlDomValue value() const; - void setValue(const QmlDomValue &); int position() const; int length() const; @@ -152,21 +149,19 @@ public: QByteArray objectType() const; QByteArray objectClassName() const; + int objectTypeMajorVersion() const; + int objectTypeMinorVersion() const; + QString objectId() const; - void setObjectId(const QByteArray &); QList<QmlDomProperty> properties() const; QmlDomProperty property(const QByteArray &) const; - void removeProperty(const QByteArray &); - void addProperty(const QByteArray &, const QmlDomValue &); - QList<QmlDomDynamicProperty> dynamicProperties() const; QmlDomDynamicProperty dynamicProperty(const QByteArray &) const; bool isCustomType() const; QByteArray customTypeData() const; - void setCustomTypeData(const QByteArray &); bool isComponent() const; QmlDomComponent toComponent() const; @@ -194,7 +189,6 @@ public: QmlDomValueLiteral &operator=(const QmlDomValueLiteral &); QString literal() const; - void setLiteral(const QString &); private: friend class QmlDomValue; @@ -210,7 +204,6 @@ public: QmlDomValueBinding &operator=(const QmlDomValueBinding &); QString binding() const; - void setBinding(const QString &); private: friend class QmlDomValue; @@ -226,7 +219,6 @@ public: QmlDomValueValueSource &operator=(const QmlDomValueValueSource &); QmlDomObject object() const; - void setObject(const QmlDomObject &); private: friend class QmlDomValue; @@ -242,7 +234,6 @@ public: QmlDomComponent &operator=(const QmlDomComponent &); QmlDomObject componentRoot() const; - void setComponentRoot(const QmlDomObject &); }; class Q_DECLARATIVE_EXPORT QmlDomValue @@ -295,7 +286,6 @@ public: QmlDomList &operator=(const QmlDomList &); QList<QmlDomValue> values() const; - void setValues(const QList<QmlDomValue> &); int position() const; int length() const; diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index 351bd8a..fd18b26 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -1072,7 +1072,7 @@ void QmlObjectScriptClass::setProperty(QScriptValue &object, } -struct QmlEnginePrivate::ImportedNamespace { +struct QmlImportedNamespacePrivate { QStringList urls; QList<int> majversions; QList<int> minversions; @@ -1177,10 +1177,10 @@ public: } else { url = base.resolved(QUrl(url)).toString(); } - s->urls.append(url); - s->majversions.append(vmaj); - s->minversions.append(vmin); - s->isLibrary.append(importType == QmlScriptParser::Import::Library); + s->d->urls.append(url); + s->d->majversions.append(vmaj); + s->d->minversions.append(vmin); + s->d->isLibrary.append(importType == QmlScriptParser::Import::Library); return true; } @@ -1202,7 +1202,7 @@ public: } QString unqualifiedtype = type.mid(slash+1); if (s) - return s->find(unqualifiedtype); + return s->d->find(unqualifiedtype); else return QUrl(); } @@ -1226,16 +1226,37 @@ public: } QByteArray unqualifiedtype = slash < 0 ? type : type.mid(slash+1); // common-case opt (QString::mid works fine, but slower) if (s) - return s->findBuiltin(unqualifiedtype,found); + return s->d->findBuiltin(unqualifiedtype,found); else return 0; - } + } QmlEnginePrivate::ImportedNamespace *findNamespace(const QString& type) { return set.value(type); } + void resolveNamespace(const QByteArray &type, QmlEnginePrivate::ImportedNamespace **ns, QByteArray *unqualifiedType) + { + QmlEnginePrivate::ImportedNamespace *s = 0; + int slash = type.indexOf('/'); + if (slash >= 0) { + while (!s) { + s = set.value(QString::fromLatin1(type.left(slash))); + int nslash = type.indexOf('/',slash+1); + if (nslash > 0) + slash = nslash; + else + break; + } + } else { + s = &unqualifiedset; + } + + *ns = s; + *unqualifiedType = slash < 0 ? type : type.mid(slash+1); // common-case opt (QString::mid works fine, but slower) + } + private: QmlEnginePrivate::ImportedNamespace unqualifiedset; QHash<QString,QmlEnginePrivate::ImportedNamespace* > set; @@ -1258,6 +1279,37 @@ void QmlEnginePrivate::Imports::setBaseUrl(const QUrl& url) base = url; } +QmlEnginePrivate::ImportedNamespace::ImportedNamespace() + : d(new QmlImportedNamespacePrivate) +{ +} + +QmlEnginePrivate::ImportedNamespace::~ImportedNamespace() +{ + delete d; +} + +bool QmlEnginePrivate::ImportedNamespace::getTypeInfo(const QByteArray &typeName, QString *uri, int *majorVersion, int *minorVersion) +{ + for (int i=0; i<d->urls.count(); ++i) { + int vmaj = d->majversions.at(i); + int vmin = d->minversions.at(i); + QByteArray qt = d->urls.at(i).toLatin1(); + qt += "/"; + qt += typeName; + if (QmlMetaType::qmlType(qt,vmaj,vmin)) { + if (uri) + *uri = d->urls.at(i); + if (majorVersion) + *majorVersion = d->majversions.at(i); + if (minorVersion) + *minorVersion = d->minversions.at(i); + return true; + } + } + return false; +} + /*! Adds \a path as a directory where installed QML components are defined in a URL-based directory structure. @@ -1312,11 +1364,6 @@ bool QmlEnginePrivate::addToImport(Imports* imports, const QString& uri, const Q */ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& type, QmlType** type_return, QUrl* url_return, ImportedNamespace** ns_return) const { - if (ns_return) { - *ns_return = imports.d->findNamespace(QLatin1String(type)); - if (*ns_return) - return true; - } if (type_return) { QmlType* t = imports.d->findBuiltin(type); if (!t) t = QmlMetaType::qmlType(type,0,0); // Try global namespace @@ -1339,6 +1386,11 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ return true; } } + if (ns_return) { + *ns_return = imports.d->findNamespace(QLatin1String(type)); + if (*ns_return) + return true; + } if (qmlImportTrace()) qDebug() << "QmlEngine::resolveType" << type << " not found"; return false; @@ -1347,6 +1399,16 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ /*! \internal + Splits a fully qualified type name into the namespace and the unqualified type name. +*/ +void QmlEnginePrivate::resolveNamespace(const Imports& imports, const QByteArray &type, ImportedNamespace **ns, QByteArray *unqualifiedType) const +{ + imports.d->resolveNamespace(type, ns, unqualifiedType); +} + +/*! + \internal + Searching \e only in the namespace \a ns (previously returned in a call to resolveType(), \a type is found and returned to either a QmlType stored at \a type_return, or @@ -1354,14 +1416,31 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ If either return pointer is 0, the corresponding search is not done. */ -void QmlEnginePrivate::resolveTypeInNamespace(ImportedNamespace* ns, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const +bool QmlEnginePrivate::resolveTypeInNamespace(ImportedNamespace* ns, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const { + if (!ns) + return false; + if (type_return) { - *type_return = ns->findBuiltin(type); + QmlType* t = ns->d->findBuiltin(type); + if (!t) t = QmlMetaType::qmlType(type,0,0); // Try global namespace + if (t) { + *type_return = t; + if (qmlImportTrace()) + qDebug() << "QmlEngine::resolveTypeInNamespace" << type << "= (builtin)"; + return true; + } } if (url_return) { - *url_return = ns->find(QLatin1String(type)); + QUrl url = ns->d->find(QLatin1String(type)); + if (url.isValid()) { + if (url_return) *url_return = url; + if (qmlImportTrace()) + qDebug() << "QmlEngine::resolveType" << type << "=" << url; + return true; + } } + return false; } QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h index 4142872..c84b3b5 100644 --- a/src/declarative/qml/qmlengine_p.h +++ b/src/declarative/qml/qmlengine_p.h @@ -195,10 +195,24 @@ public: QUrl base; QmlImportsPrivate *d; }; - struct ImportedNamespace; + + struct ImportedNamespace { + ImportedNamespace(); + ~ImportedNamespace(); + + bool getTypeInfo(const QByteArray &typeName, QString *uri, int *vmaj, int *vmin); + private: + friend class QmlImportsPrivate; + friend class QmlEnginePrivate; + class QmlImportedNamespacePrivate *d; + }; + bool addToImport(Imports*, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const; + bool resolveType(const Imports&, const QByteArray& type, QmlType** type_return, QUrl* url_return, ImportedNamespace** ns_return=0) const; - void resolveTypeInNamespace(ImportedNamespace*, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const; + + void resolveNamespace(const Imports& imports, const QByteArray &type, ImportedNamespace **s, QByteArray *unqualifiedType) const; + bool resolveTypeInNamespace(ImportedNamespace*, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const; static QScriptValue qmlScriptObject(QObject*, QmlEngine*); diff --git a/src/declarative/qml/qmlparser.cpp b/src/declarative/qml/qmlparser.cpp index 2a67c92..0f2a282 100644 --- a/src/declarative/qml/qmlparser.cpp +++ b/src/declarative/qml/qmlparser.cpp @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE using namespace QmlParser; QmlParser::Object::Object() -: type(-1), idIndex(-1), metatype(0), defaultProperty(0), parserStatusCast(-1) +: type(-1), majorVersion(-1), minorVersion(-1), idIndex(-1), metatype(0), defaultProperty(0), parserStatusCast(-1) { } diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h index 120af75..8a92a9f 100644 --- a/src/declarative/qml/qmlparser_p.h +++ b/src/declarative/qml/qmlparser_p.h @@ -115,6 +115,11 @@ namespace QmlParser int type; // The url of this object if it is an external type. Used by the DOM QUrl url; + + // version information if type is defined in library or C++ + int majorVersion; + int minorVersion; + // The fully-qualified name of this type QByteArray typeName; // The class name diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp index 187f640..ca2d295 100644 --- a/src/declarative/qml/qmlscriptparser.cpp +++ b/src/declarative/qml/qmlscriptparser.cpp @@ -432,8 +432,17 @@ bool ProcessAST::visit(AST::UiImport *node) AST::SourceLocation startLoc = node->importToken; AST::SourceLocation endLoc = node->semicolonToken; - if (node->importId) + if (node->importId) { import.qualifier = node->importId->asString(); + if (!import.qualifier.at(0).isUpper()) { + QmlError error; + error.setDescription(QLatin1String("Invalid import qualifier ID")); + error.setLine(node->importIdToken.startLine); + error.setColumn(node->importIdToken.startColumn); + _parser->_errors << error; + return false; + } + } if (node->versionToken.isValid()) import.version = textAt(node->versionToken); @@ -831,6 +840,7 @@ void QmlScriptParser::clear() root->release(); root = 0; } + _imports.clear(); qDeleteAll(_refTypes); _refTypes.clear(); _errors.clear(); |