Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qtdeclarative
[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 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
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