| 
									
										
										
										
											2011-02-22 12:08:19 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-07-19 12:26:56 +02:00
										 |  |  | ** Contact: http://www.qt-project.org/
 | 
					
						
							| 
									
										
										
										
											2011-02-22 12:08:19 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** 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.
 | 
					
						
							| 
									
										
										
										
											2011-02-22 12:08:19 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** rights. These rights are described in the Nokia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2011-02-22 12:08:19 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** Other Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used in accordance with the terms and | 
					
						
							|  |  |  | ** conditions contained in a signed written agreement between you and Nokia. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-02-22 12:08:19 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  | #include "nodeinstancesignalspy.h"
 | 
					
						
							| 
									
										
										
										
											2010-03-19 11:52:48 +01:00
										 |  |  | #include "objectnodeinstance.h"
 | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QMetaProperty>
 | 
					
						
							|  |  |  | #include <QMetaObject>
 | 
					
						
							| 
									
										
										
										
											2012-08-06 13:42:46 +02:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  | #include <QSharedPointer>
 | 
					
						
							| 
									
										
										
										
											2010-03-19 11:52:48 +01:00
										 |  |  | #include <private/qdeclarativemetatype_p.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace QmlDesigner { | 
					
						
							|  |  |  | namespace Internal { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NodeInstanceSignalSpy::NodeInstanceSignalSpy() : | 
					
						
							|  |  |  |     QObject() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-22 13:18:52 +01:00
										 |  |  |     blockSignals(true); | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NodeInstanceSignalSpy::setObjectNodeInstance(const ObjectNodeInstance::Pointer &nodeInstance) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     methodeOffset = QObject::staticMetaObject.methodCount() + 1; | 
					
						
							|  |  |  |     registerObject(nodeInstance->object()); | 
					
						
							|  |  |  |     m_objectNodeInstance = nodeInstance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NodeInstanceSignalSpy::registerObject(QObject *spiedObject, const QString &prefix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-05 20:55:31 +02:00
										 |  |  |     if (m_registeredObjectList.contains(spiedObject)) // prevent cycles
 | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 20:55:31 +02:00
										 |  |  |     m_registeredObjectList.append(spiedObject); | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |     for (int index = QObject::staticMetaObject.propertyOffset(); | 
					
						
							|  |  |  |          index < spiedObject->metaObject()->propertyCount(); | 
					
						
							|  |  |  |          index++) { | 
					
						
							|  |  |  |              QMetaProperty metaProperty = spiedObject->metaObject()->property(index); | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |              // handle dot properties and connect the signals to the object
 | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |              if (metaProperty.isReadable() | 
					
						
							|  |  |  |                  && !metaProperty.isWritable() | 
					
						
							| 
									
										
										
										
											2010-02-26 14:47:44 +01:00
										 |  |  |                  && QDeclarativeMetaType::isQObject(metaProperty.userType())) { | 
					
						
							|  |  |  |                   QObject *propertyObject = QDeclarativeMetaType::toQObject(metaProperty.read(spiedObject)); | 
					
						
							| 
									
										
										
										
											2010-02-17 14:49:05 +01:00
										 |  |  |                   if (propertyObject) | 
					
						
							| 
									
										
										
										
											2011-02-25 15:27:13 +01:00
										 |  |  |                       registerObject(propertyObject, prefix + metaProperty.name() + QLatin1Char('.')); | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |              } else if (metaProperty.hasNotifySignal()) { | 
					
						
							|  |  |  |                  QMetaMethod metaMethod = metaProperty.notifySignal(); | 
					
						
							|  |  |  |                  bool isConnecting = QMetaObject::connect(spiedObject, metaMethod.methodIndex(), this, methodeOffset, Qt::DirectConnection); | 
					
						
							|  |  |  |                  Q_ASSERT(isConnecting); | 
					
						
							| 
									
										
										
										
											2011-02-24 17:47:41 +01:00
										 |  |  |                  Q_UNUSED(isConnecting); | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |                  m_indexPropertyHash.insert(methodeOffset, prefix + metaProperty.name()); | 
					
						
							|  |  |  |                  methodeOffset++; | 
					
						
							|  |  |  |              } | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |              // search recursive in objects
 | 
					
						
							|  |  |  |              if (metaProperty.isReadable() | 
					
						
							|  |  |  |                  && metaProperty.isWritable() | 
					
						
							|  |  |  |                  && QDeclarativeMetaType::isQObject(metaProperty.userType())) { | 
					
						
							|  |  |  |                  QObject *propertyObject = QDeclarativeMetaType::toQObject(metaProperty.read(spiedObject)); | 
					
						
							|  |  |  |                  if (propertyObject) | 
					
						
							| 
									
										
										
										
											2011-02-25 15:27:13 +01:00
										 |  |  |                      registerObject(propertyObject, prefix + metaProperty.name() + QLatin1Char('/')); | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  |              } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // search recursive in objects list
 | 
					
						
							|  |  |  |              if (metaProperty.isReadable() | 
					
						
							|  |  |  |                  && QDeclarativeMetaType::isList(metaProperty.userType())) { | 
					
						
							|  |  |  |                  QDeclarativeListReference list(spiedObject, metaProperty.name()); | 
					
						
							| 
									
										
										
										
											2011-08-31 14:27:56 +02:00
										 |  |  | #if QT_VERSION<0x050000
 | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  |                  if (list.canCount() && list.canAt()) { | 
					
						
							| 
									
										
										
										
											2011-08-31 14:27:56 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  |                  if (list.isReadable()) { | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  |                      for (int i = 0; i < list.count(); i++) { | 
					
						
							|  |  |  |                          QObject *propertyObject = list.at(i); | 
					
						
							|  |  |  |                          if (propertyObject) | 
					
						
							| 
									
										
										
										
											2011-02-25 15:27:13 +01:00
										 |  |  |                              registerObject(propertyObject, prefix + metaProperty.name() + QLatin1Char('/')); | 
					
						
							| 
									
										
										
										
											2010-06-09 14:52:33 +02:00
										 |  |  |                      } | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |              } | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |          } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int NodeInstanceSignalSpy::qt_metacall(QMetaObject::Call call, int methodId, void **a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (call == QMetaObject::InvokeMetaMethod && methodId > QObject::staticMetaObject.methodCount()) { | 
					
						
							|  |  |  |         ObjectNodeInstance::Pointer nodeInstance = m_objectNodeInstance.toStrongRef(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-24 14:52:06 +01:00
										 |  |  |         if (nodeInstance && nodeInstance->nodeInstanceServer() && nodeInstance->isValid()) { | 
					
						
							|  |  |  |             nodeInstance->nodeInstanceServer()->notifyPropertyChange(nodeInstance->instanceId(), m_indexPropertyHash.value(methodId)); | 
					
						
							| 
									
										
										
										
											2010-02-15 17:05:20 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return QObject::qt_metacall(call, methodId, a); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Internal
 | 
					
						
							|  |  |  | } // namespace QmlDesigner
 |