32 #include <boost/weak_ptr.hpp>
37 class DataStructurePrivate
40 DataStructurePrivate()
48 boost::weak_ptr<DataStructure> q;
52 QMap<int, DataList> _dataTypeLists;
53 QMap<int, PointerList> _pointerTypeLists;
54 QHash<int, DataPtr> _dataIdentifierMap;
56 QList<GroupPtr> _groups;
58 QPointF _relativeCenter;
64 QScriptEngine *_engine;
70 return create<DataStructure>(parent);
75 return create<DataStructure>(other, parent);
86 d->_identifierCount = 1;
89 foreach (
int identifier, d->_document->dataTypeList()) {
90 registerDataType(identifier);
92 foreach (
int identifier, d->_document->pointerTypeList()) {
93 registerPointerType(identifier);
95 connect(
document(), SIGNAL(dataTypeCreated(
int)),
this, SLOT(registerDataType(
int)));
96 connect(
document(), SIGNAL(pointerTypeCreated(
int)),
this, SLOT(registerPointerType(
int)));
97 connect(
document(), SIGNAL(dataTypeRemoved(
int)),
this, SLOT(removeDataType(
int)));
98 connect(
document(), SIGNAL(pointerTypeRemoved(
int)),
this, SLOT(removePointerType(
int)));
110 : d(new DataStructurePrivate)
112 d->_document = parent;
118 d->_readOnly = other->readOnly();
121 QHash <Data*, DataPtr> dataTodata;
123 foreach(
DataPtr n, other->dataList(0)) {
125 newdata->setColor(n->color());
127 newdata->setX(n->x());
128 newdata->setY(n->y());
129 newdata->setWidth(n->width());
130 dataTodata.insert(n.get(), newdata);
134 DataPtr from = dataTodata.value(e->from().get());
135 DataPtr to = dataTodata.value(e->to().get());
138 newPointer->setColor(e->color());
151 if (d->_dataTypeLists.contains(dataType)) {
152 return d->_dataTypeLists[dataType];
154 kWarning() <<
"returning empty data list: data type not registered";
162 foreach(
int type,
document()->dataTypeList()) {
171 if (d->_pointerTypeLists.contains(pointerType)) {
172 return d->_pointerTypeLists[pointerType];
174 kWarning() <<
"returning empty pointer list: pointer type not registered";
182 foreach(
int type,
document()->pointerTypeList()) {
189 void DataStructure::registerDataType(
int identifier)
191 if (d->_dataTypeLists.contains(identifier)) {
192 kWarning() <<
"DataType already registered: aborting";
195 if (!d->_document->dataType(identifier)) {
196 kError() <<
"DataType not registered at document: aborting";
199 d->_dataTypeLists.insert(identifier,
DataList());
203 void DataStructure::registerPointerType(
int identifier)
205 if (d->_pointerTypeLists.contains(identifier)) {
206 kWarning() <<
"PointerType already registered: aborting";
209 if (!d->_document->pointerType(identifier)) {
210 kError() <<
"PointerType not registered at document: aborting";
213 d->_pointerTypeLists.insert(identifier,
PointerList());
217 void DataStructure::removeDataType(
int identifier)
219 if (identifier == 0) {
220 kWarning() <<
"Could not remove non-existing DataType";
224 foreach(
DataPtr data, d->_dataTypeLists[identifier]) {
227 d->_dataTypeLists[identifier].clear();
228 d->_dataTypeLists.remove(identifier);
232 void DataStructure::removePointerType(
int pointerType)
234 if (pointerType == 0 || !d->_pointerTypeLists.contains(pointerType)) {
235 kWarning() <<
"Could not remove non-existing PointerType";
239 foreach(
PointerPtr pointer, d->_pointerTypeLists[pointerType]) {
242 d->_pointerTypeLists[pointerType].clear();
243 d->_pointerTypeLists.remove(pointerType);
249 foreach(
int dataType, d->_document->dataTypeList()) {
250 d->_dataTypeLists[dataType].removeAll(data);
252 d->_dataTypeLists[data->dataType()].append(data);
258 foreach(
int pointerType, d->_document->pointerTypeList()) {
259 d->_pointerTypeLists[pointerType].removeAll(pointer);
261 d->_pointerTypeLists[pointer->pointerType()].append(pointer);
268 d->_document->setModified();
275 foreach(
const PointerList &pointerType, d->_pointerTypeLists) {
276 foreach(
const PointerPtr &pointer, pointerType) {
280 d->_pointerTypeLists.clear();
284 foreach(
const DataList &dataType, d->_dataTypeLists) {
285 foreach(
const DataPtr &data, dataType) {
289 d->_dataTypeLists.clear();
290 d->_dataIdentifierMap.clear();
297 return d->_identifierCount++;
306 n->setProperty(
"name", name);
313 Q_ASSERT(data->dataType() >= 0 && data->dataType() <= d->_dataTypeLists.size());
316 d->_dataTypeLists[data->dataType()].append(data);
318 foreach(
const QString &property, type->properties()) {
319 if (!data->property(property.toLatin1()).isValid()
320 || data->property(property.toLatin1()).isNull())
322 data->addDynamicProperty(property, type->propertyDefaultValue(property));
327 d->_dataIdentifierMap.insert(data->identifier(), data);
332 connect(data.get(), SIGNAL(propertyChanged(QString)),
this, SIGNAL(
changed()));
333 connect(data.get(), SIGNAL(colorChanged(QColor)),
this, SIGNAL(
changed()));
334 connect(data.get(), SIGNAL(posChanged(QPointF)),
this, SIGNAL(
dataPositionChanged(QPointF)));
335 connect(data.get(), SIGNAL(useColorChanged(
bool)),
this, SIGNAL(
changed()));
342 data->setPos(pos.x(), pos.y());
360 QList< DataPtr > dataCreateList;
361 QList< QPair<QString, QPointF> >::const_iterator dataDefinition =
dataList.constBegin();
362 while (dataDefinition !=
dataList.constEnd()) {
364 data->setPos(dataDefinition->second.x(), dataDefinition->second.y());
365 dataCreateList << data;
369 return dataCreateList;
374 Q_ASSERT(d->_pointerTypeLists.contains(pointer->pointerType()));
377 d->_pointerTypeLists[pointer->pointerType()].append(pointer);
379 foreach(
const QString &property, type->properties()) {
380 if (!pointer->property(property.toLatin1()).isValid()
381 || pointer->property(property.toLatin1()).isNull())
383 pointer->addDynamicProperty(property, type->propertyDefaultValue(property));
389 connect(pointer.get(), SIGNAL(
changed()),
this, SIGNAL(
changed()));
395 Q_ASSERT(d->_document->pointerTypeList().contains(pointerType));
404 if (from->dataStructure() != to->dataStructure()) {
413 if (d->_dataIdentifierMap.contains(uniqueIdentifier)) {
414 return d->_dataIdentifierMap[uniqueIdentifier];
417 foreach(
const DataList &dataType, d->_dataTypeLists) {
418 foreach(
DataPtr data, dataType) {
419 if (data->identifier() == uniqueIdentifier) {
420 kWarning() <<
"Access do data element that is not registered at data-identifier mapper.";
430 if (!d->_dataTypeLists[data->dataType()].contains(data)) {
431 kWarning() <<
"Data element not registered, aborting removal.";
436 if (d->_dataIdentifierMap.remove(data->identifier()) != 1) {
437 kWarning() <<
"Data identifier hash is dirty.";
439 if (d->_dataTypeLists[data->dataType()].removeOne(data)) {
449 if (!d->_pointerTypeLists[pointer->pointerType()].contains(pointer)) {
450 kWarning() <<
"Pointer not registered, aborting removal.";
454 if (d->_pointerTypeLists[pointer->pointerType()].removeOne(pointer)) {
463 if (d->_groups.removeOne(group)) {
471 group->setName(name);
484 kWarning() <<
"Property identifier \"" <<
property <<
"\" is not valid: aborting";
487 setProperty(property.toAscii(), value);
492 setProperty(property.toAscii(), QVariant::Invalid);
498 kWarning() <<
"Property identifier \"" << newName <<
"\" is not valid: aborting";
501 setProperty(newName.toLatin1(), property(oldName.toLatin1()));
502 setProperty(oldName.toLatin1(), QVariant::Invalid);
518 d->_value = d->_engine->newQObject(
this);
520 if (! d->_name.isEmpty()) {
521 d->_engine->globalObject().setProperty(d->_name, d->_value);
524 foreach(
const DataList& dataType, d->_dataTypeLists) {
525 for (
int i = 0; i < dataType.size(); ++i) {
526 dataType.at(i)->setEngine(engine);
530 foreach(
const PointerList& pointerType, d->_pointerTypeLists) {
531 for (
int i = 0; i < pointerType.size(); ++i) {
532 pointerType.at(i)->setEngine(engine);
548 return QMap<QString,QString>();
virtual void setPluginProperty(const QString &, const QString &)
Set plugin specific properties of data structure.
QScriptEngine * engine() const
void pointerCreated(PointerPtr e)
void updatePointer(PointerPtr pointer)
Updates registration of pointer in internal reference list.
void dataCreated(DataPtr n)
PointerList pointerListAll() const
Gives list all pointers of all existing types.
boost::shared_ptr< PointerType > PointerTypePtr
boost::shared_ptr< DataStructure > DataStructurePtr
const PointerList pointers(int pointerType) const
Gives list of pointers of specified type if type exists.
DataStructure(Document *parent=0)
Default constructor.
const DataList dataList(int dataType) const
Gives list of data elements of specified type if type exists.
virtual DataStructurePtr getDataStructure() const
virtual void importStructure(DataStructurePtr other)
overwrites the current DataStructure with all values (Data and Pointer) from the given datastructure ...
static DataStructurePtr create(Document *parent=0)
void renameDynamicProperty(const QString &oldName, const QString &newName)
QList< boost::shared_ptr< Data > > DataList
const QList< GroupPtr > groups() const
PointerPtr addPointer(PointerPtr pointer)
static GroupPtr create(DataStructurePtr dataStructure, int uniqueIdentifier, int groupType)
DataList dataListAll() const
Gives list of all data elements of all existing types.
void dataPositionChanged(const QPointF)
void remove_property(const QString &name)
remove the string named name from this data structure.
virtual ~DataStructure()
Default destructor.
boost::shared_ptr< Pointer > PointerPtr
DataPtr addData(DataPtr data)
virtual QMap< QString, QString > pluginProperties() const
Gives a map with plugin specific properties of the data structure.
virtual void setEngine(QScriptEngine *engine)
void add_property(const QString &name, const QVariant &value)
add the property named name to this Data structure.
virtual DataList addDataList(DataList dataList)
virtual GroupPtr addGroup(const QString &name)
void updateData(DataPtr data)
Updates registration of data in internal reference list.
virtual DataPtr createData(const QString &name, int dataType)
Document * document() const
static PointerPtr create(DataStructurePtr dataStructure, DataPtr from, DataPtr to, int pointerType)
Create pointer objects.
void setName(const QString &s)
virtual PointerPtr createPointer(DataPtr from, DataPtr to, int pointerType)
Creates new pointer from data element "from" to data element "to" of given type "pointerType".
int generateUniqueIdentifier()
virtual void cleanUpBeforeConvert()
clear data that only is useful for a type of data structure and that cannot be converted to others ...
void remove()
if this datastructure shall be deleted, call ONLY this function
PointerTypePtr pointerType(int pointerType) const
boost::shared_ptr< Group > GroupPtr
boost::shared_ptr< Data > DataPtr
DataTypePtr dataType(int dataType) const
boost::shared_ptr< DataType > DataTypePtr
void removeDynamicProperty(const QString &property)
static bool isValidIdentifier(const QString &identifier)
Evaluates given string and returns true if identifier is valid, otherwise returns false...
void nameChanged(const QString &name)
DataPtr getData(int uniqueIdentifier)
Access data element by its unique identifier.
QScriptValue scriptValue() const
static DataPtr create(DataStructurePtr dataStructure, int uniqueIdentifier, int dataType)
Create data element objects.
QList< boost::shared_ptr< Pointer > > PointerList
void addDynamicProperty(const QString &property, const QVariant &value=QVariant(0))