}
bool Dispatcher::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
-
+
ConnectedInterface* ref1 = iface1->refInter;
ConnectedInterface* ref2 = iface2->refInter;
+ ConnectedInterface* asso1 = iface1->refInter->getAssociatedIface();
+ ConnectedInterface* asso2 = iface2->refInter->getAssociatedIface();
// connect both interface
bool ok1 = false;
bool ok2 = false;
- if (ref1->canConnectTo(ref2)) {
- ok1 = ref1->connectTo(ref2);
- ok1 = ok1 & ref2->connectFrom(ref1);
- }
- if (ref2->canConnectTo(ref1)) {
- ok2 = ref2->connectTo(ref1);
- ok2 = ok2 & ref1->connectFrom(ref2);
+ // test the ref1->ref2 connection
+ if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
+ ref1->connectTo(ref2);
+ ref2->connectFrom(ref1);
+ if ((asso1 != NULL) && (asso2 != NULL)) {
+ asso1->connectTo(asso2);
+ asso2->connectFrom(asso1);
+ }
+ ok1 = true;
+ }
+ // if the frist one did not work, test ref2->ref1
+ if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {
+ ref2->connectTo(ref1);
+ ref1->connectFrom(ref2);
+ if ((asso1 != NULL) && (asso2 != NULL)) {
+ asso1->connectFrom(asso2);
+ asso2->connectTo(asso1);
+ }
+ ok2 = true;
}
if ((ok1 == true) || (ok2 == true)) {
item->refInter->setName(text);
AbstractInterface* assoIface = item->refInter->getAssociatedIface();
if (assoIface != NULL) {
- assoIface->setName(text+"_ctl");
+ assoIface->setName(text+"_enb");
}
item->updateName(text);
item->getOwner()->nameChanged();
// creating control interface if needed
if (refI->getAssociatedIface() != NULL) {
- QString ctlName = cloneIface->getName()+"_ctl";
+ QString ctlName = cloneIface->getName()+"_enb";
ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1);
refB->addInterface(ctlIface);
if (! ctlIface->setAssociatedIface(cloneIface)) {
ConnectedInterface *fromInter = fromIfaceItem->refInter;
ConnectedInterface *toInter = toIfaceItem->refInter;
- // process the speical case source->group apart
+ // process the special case source->group apart
if (fromIfaceItem->getOwner()->isSourceItem()) {
// remove from graph
fromInter->removeConnectedTo(toInter);
GroupItem *parentItem = item->getOwner()->getScene()->getGroupItem();
// creating/adding the group interface in the graph model
- GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose());
- groupInter->setType(refInter->getType());
- groupInter->setWidth(refInter->getWidth());
- groupInter->setPurpose(refInter->getPurpose());
+ GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose());
parentItem->getRefBlock()->addInterface(groupInter);
+ // creating/adding the group control interface in the graph model
+ GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control);
+ groupCtlInter->setAssociatedIface(groupInter);
+ parentItem->getRefBlock()->addInterface(groupCtlInter);
// connect both interface
bool ok = true;
else if (refInter->getDirection() == AbstractInterface::Input) {
groupInter = refInter->getConnectedFrom();
refInter->clearConnectedFrom();
- groupInter->clearConnectedTo();
+ groupInter->removeConnectedTo(refInter);
}
else if (refInter->getDirection() == AbstractInterface::InOut) {
groupInter = refInter->getConnectionToParentGroup(); // must be a single connection to
cout << "removing group interface item, and connection item ..." ;
#endif
+ bool groupInterRemove = false;
+ if ((groupInter->isConnectedTo() == false) && (groupInter->isConnectedFrom() == false)) groupInterRemove = true;
+
item->removeConnectionItem(conn);
groupIfaceItem->removeConnectionItem(conn);
- parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item.
+ if (groupInterRemove) {
+ parentItem->removeInterface(groupIfaceItem); // CAUTION : this deletes the interface item.
+ }
parentItem->getScene()->removeConnectionItem(conn);
#ifdef DEBUG
cout << "done." << endl ;
#endif
- // removing the interface box item in the parent scene
+ if (groupInterRemove) {
+ // removing the interface box item in the parent scene
#ifdef DEBUG
- cout << "removing the inteeface item of box item in parent scene if needed ..." ;
+ cout << "removing the inteeface item of box item in parent scene if needed ..." ;
#endif
-
- BoxItem* parent2Item = parentItem->getParentItem();
- if (parent2Item != NULL) {
- InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter);
- parent2Item->removeInterface(group2IfaceItem);
- }
+
+ BoxItem* parent2Item = parentItem->getParentItem();
+ if (parent2Item != NULL) {
+ InterfaceItem* group2IfaceItem = parent2Item->searchInterfaceByRef(groupInter);
+ parent2Item->removeInterface(group2IfaceItem);
+ }
#ifdef DEBUG
- cout << "done." << endl ;
+ cout << "done." << endl ;
#endif
-
- // removing the interface group from the group
+
+ // removing the interface group from the group
#ifdef DEBUG
- cout << "removing group interface ..." ;
+ cout << "removing group interface ..." ;
#endif
- parentGroup->removeInterface(groupInter);
+ parentGroup->removeInterface(groupInter);
#ifdef DEBUG
- cout << "done." << endl ;
+ cout << "done." << endl ;
#endif
+ }
}
void Dispatcher::removeFunctionalInterface(InterfaceItem *item) {