Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativelistscriptclass.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 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 QtDeclarative module 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 "private/qdeclarativelistscriptclass_p.h"
43
44 #include "private/qdeclarativeengine_p.h"
45 #include "private/qdeclarativeguard_p.h"
46 #include "private/qdeclarativelist_p.h"
47
48 QT_BEGIN_NAMESPACE
49
50 struct ListData : public QScriptDeclarativeClass::Object {
51     QDeclarativeGuard<QObject> object;
52     QDeclarativeListProperty<QObject> property;
53     int propertyType;
54 };
55
56 QDeclarativeListScriptClass::QDeclarativeListScriptClass(QDeclarativeEngine *e)
57 : QScriptDeclarativeClass(QDeclarativeEnginePrivate::getScriptEngine(e)), engine(e)
58 {
59     QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
60     Q_UNUSED(scriptEngine);
61
62     m_lengthId = createPersistentIdentifier(QLatin1String("length"));
63 }
64
65 QDeclarativeListScriptClass::~QDeclarativeListScriptClass()
66 {
67 }
68
69 QScriptValue QDeclarativeListScriptClass::newList(QObject *object, int propId, int propType)
70 {
71     QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
72
73     if (!object || propId == -1)
74         return scriptEngine->nullValue();
75
76     ListData *data = new ListData;
77     data->object = object;
78     data->propertyType = propType;
79     void *args[] = { &data->property, 0 };
80     QMetaObject::metacall(object, QMetaObject::ReadProperty, propId, args);
81
82     return newObject(scriptEngine, this, data);
83 }
84
85 QScriptValue QDeclarativeListScriptClass::newList(const QDeclarativeListProperty<QObject> &prop, int propType)
86 {
87     QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
88
89     ListData *data = new ListData;
90     data->object = prop.object;
91     data->property = prop;
92     data->propertyType = propType;
93
94     return newObject(scriptEngine, this, data);
95 }
96
97 QScriptClass::QueryFlags 
98 QDeclarativeListScriptClass::queryProperty(Object *object, const Identifier &name, 
99                                   QScriptClass::QueryFlags flags)
100 {
101     Q_UNUSED(object);
102     Q_UNUSED(flags);
103     if (name == m_lengthId.identifier)
104         return QScriptClass::HandlesReadAccess;
105
106     bool ok = false;
107     quint32 idx = toArrayIndex(name, &ok);
108
109     if (ok) {
110         lastIndex = idx;
111         return QScriptClass::HandlesReadAccess;
112     } else {
113         return 0;
114     }
115 }
116
117 QDeclarativeListScriptClass::Value QDeclarativeListScriptClass::property(Object *obj, const Identifier &name)
118 {
119     QScriptEngine *scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine);
120     QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
121
122     ListData *data = (ListData *)obj;
123     if (!data->object) 
124         return Value();
125
126     quint32 count = data->property.count?data->property.count(&data->property):0;
127
128     if (name == m_lengthId.identifier)
129         return Value(scriptEngine, count);
130     else if (lastIndex < count && data->property.at)
131         return Value(scriptEngine, enginePriv->objectClass->newQObject(data->property.at(&data->property, lastIndex)));
132     else
133         return Value();
134 }
135
136 QVariant QDeclarativeListScriptClass::toVariant(Object *obj, bool *ok)
137 {
138     ListData *data = (ListData *)obj;
139
140     if (!data->object) {
141         if (ok) *ok = false;
142         return QVariant();
143     }
144
145     return QVariant::fromValue(QDeclarativeListReferencePrivate::init(data->property, data->propertyType, engine));
146 }
147
148 QT_END_NAMESPACE
149