/** * Add a classifier to the data structure. * @param classifier the classifier to add * @param parent the tree item under which the classifier is placed * @param addSuper add it to the base classifier folder * @param addSub add it to the derived classifier folder * @param recurse ... */ void RefactoringAssistant::addClassifier(UMLClassifier *classifier, QTreeWidgetItem *parent, bool addSuper, bool addSub, bool recurse) { if (!classifier) { uWarning() << "No classifier given - do nothing!"; return; } DEBUG(DBG_SRC) << classifier->name() << " added."; QTreeWidgetItem *classifierItem, *item; if (parent) { classifierItem = parent; } else { classifierItem = new QTreeWidgetItem(this, QStringList(classifier->name())); m_umlObjectMap[classifierItem] = classifier; } m_alreadySeen << classifier; connect(classifier, SIGNAL(modified()), this, SLOT(objectModified())); // add attributes connect(classifier, SIGNAL(attributeAdded(UMLClassifierListItem*)), this, SLOT(attributeAdded(UMLClassifierListItem*))); connect(classifier, SIGNAL(attributeRemoved(UMLClassifierListItem*)), this, SLOT(attributeRemoved(UMLClassifierListItem*))); QStringList itemTextAt; itemTextAt << i18n("Attributes") << QLatin1String("attributes"); QTreeWidgetItem *attsFolder = new QTreeWidgetItem(classifierItem, itemTextAt); attsFolder->setIcon(0, Icon_Utils::SmallIcon(Icon_Utils::it_Folder_Orange)); attsFolder->setExpanded(true); UMLAttributeList atts(classifier->getAttributeList()); foreach(UMLAttribute* att, atts) { attributeAdded(att); }
/** * Slot for adding an attribute to the tree. * @param listItem the new attribute to add */ void RefactoringAssistant::attributeAdded(UMLClassifierListItem *listItem) { UMLAttribute *att = static_cast<UMLAttribute*>(listItem); DEBUG(DBG_SRC) << "attribute = " << att->name(); //:TODO: UMLClassifier *parent = dynamic_cast<UMLClassifier*>(att->parent()); if (!parent) { uWarning() << att->name() << " - Parent of attribute is not a classifier!"; return; } QTreeWidgetItem *item = findListViewItem(parent); if (!item) { uWarning() << "Parent is not in tree!"; return; } for (int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *folder = item->child(i); if (folder->text(1) == QLatin1String("attributes")) { item = new QTreeWidgetItem(folder, QStringList(att->name())); m_umlObjectMap[item] = att; connect(att, SIGNAL(modified()), this, SLOT(objectModified())); setVisibilityIcon(item, att); DEBUG(DBG_SRC) << "attribute = " << att->name() << " added!"; //:TODO: break; } } }
/** * Slot for adding an operation to the tree. * @param listItem the new operation to add */ void RefactoringAssistant::operationAdded(UMLClassifierListItem *listItem) { UMLOperation *op = static_cast<UMLOperation*>(listItem); DEBUG(DBG_SRC) << "operation = " << op->name(); //:TODO: UMLClassifier *parent = dynamic_cast<UMLClassifier*>(op->parent()); if (!parent) { uWarning() << op->name() << " - Parent of operation is not a classifier!"; return; } QTreeWidgetItem *item = findListViewItem(parent); if (!item) { return; } for (int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *folder = item->child(i); if (folder->text(1) == QLatin1String("operations")) { item = new QTreeWidgetItem(folder, QStringList(op->name())); m_umlObjectMap[item] = op; connect(op, SIGNAL(modified()), this, SLOT(objectModified())); setVisibilityIcon(item, op); DEBUG(DBG_SRC) << "operation = " << op->name() << " added!"; //:TODO: break; } } }
/** * Slot for removing an operation from the tree. * @param listItem the operation to be removed */ void RefactoringAssistant::operationRemoved(UMLClassifierListItem *listItem) { UMLOperation *op = static_cast<UMLOperation*>(listItem); QTreeWidgetItem *item = findListViewItem(op); if (!item) { return; } disconnect(op, SIGNAL(modified()), this, SLOT(objectModified())); m_umlObjectMap.remove(item); delete item; }
void HAbstractCdsDataSource::objectModified_( HObject* source, const HObjectEventInfo& eventInfo) { emit objectModified(source, eventInfo); HContainer* parent = findContainer(source->parentId()); if (parent) { HContainerEventInfo info(HContainerEventInfo::ChildModified, source->id()); emit containerModified(parent, info); } }
/** * Slot for removing an attribute from the tree. * @param listItem the attribute to be removed */ void RefactoringAssistant::attributeRemoved(UMLClassifierListItem *listItem) { UMLAttribute *att = static_cast<UMLAttribute*>(listItem); DEBUG(DBG_SRC) << "attribute = " << att->name(); //:TODO: QTreeWidgetItem *item = findListViewItem(att); if (!item) { uWarning() << "Attribute is not in tree!"; return; } disconnect(att, SIGNAL(modified()), this, SLOT(objectModified())); m_umlObjectMap.remove(item); delete item; DEBUG(DBG_SRC) << "attribute = " << att->name() << " deleted!"; //:TODO: }
ObjectMapperForwarder::ObjectMapperForwarder(ObjectMapper *m, QObject *o) : QObject(m), m_mapper(m), m_source(o) { for (int i = 0; i < o->metaObject()->propertyCount(); ++i) { QMetaProperty property = o->metaObject()->property(i); if (!property.isStored() || !property.isReadable() || !property.isWritable()) { continue; } if (!property.hasNotifySignal()) { DEBUG << "ObjectMapperForwarder: No notify signal for property " << property.name() << endl; continue; } // Signals can be connected to slots with fewer arguments, so // long as the arguments they do have match. So we connect // the property notify signal to our universal // property-changed slot, and use the sender() of that to // discover which object's property has changed. // Unfortunately, we don't then know which property it was // that changed, as the identity of the signal that activated // the slot is not available to us. The annoying part of this // is that Qt does actually store the identity of the signal // in the same structure as used for the sender() object data; // it just doesn't (at least as of Qt 4.5) make it available // through the public API. QString sig = QString("%1%2").arg(QSIGNAL_CODE) .arg(property.notifySignal().methodSignature().data()); QByteArray ba = sig.toLocal8Bit(); if (!connect(o, ba.data(), this, SLOT(objectModified()))) { std::cerr << "ObjectMapperForwarder: Failed to connect notify signal" << std::endl; } } connect(o, SIGNAL(destroyed(QObject *)), this, SLOT(objectDestroyed())); }
void NotifyManager::modified(Db* db, const QString& database, const QString& object) { emit objectModified(db, database, object); }