FlowPartList FlowPart::inputParts() { FlowPartList list; const NodeInfoMap::iterator nEnd = m_nodeMap.end(); for (NodeInfoMap::iterator it = m_nodeMap.begin(); it != nEnd; ++it) { Node *node = m_pFlowCodeDocument->nodeWithID(it.data().id); FlowPartList newList; if (FPNode *fpNode = dynamic_cast<FPNode*>(node)) newList = fpNode->inputFlowParts(); const FlowPartList::iterator nlEnd = newList.end(); for (FlowPartList::iterator it = newList.begin(); it != nlEnd; ++it) { if (*it) list.append(*it); } } return list; }
FlowPart* FlowPart::endPart(QStringList ids, FlowPartList *previousParts) { if (ids.empty()) { const NodeInfoMap::iterator end = m_nodeMap.end(); for (NodeInfoMap::iterator it = m_nodeMap.begin(); it != end; ++it) { ids.append(it.key()); } filterEndPartIDs(&ids); } const bool createdList = (!previousParts); if (createdList) { previousParts = new FlowPartList; } else if (previousParts->contains(this)) { return 0l; } previousParts->append(this); if (ids.empty()) { return 0; } if (ids.size() == 1) { return outputPart(*(ids.begin())); } typedef QValueList<FlowPartList> ValidPartsList; ValidPartsList validPartsList; const QStringList::iterator idsEnd = ids.end(); for (QStringList::iterator it = ids.begin(); it != idsEnd; ++it) { int prevLevel = level(); FlowPartList validParts; FlowPart *part = outputPart(*it); while (part) { if (!validParts.contains(part)) { validParts.append(part); // if ( part->level() >= level() ) { const int _l = part->level(); part = part->endPart(QStringList(), previousParts); prevLevel = _l; // } else { // part = 0l; // } } else { part = 0; } } if (!validParts.empty()) { validPartsList.append(validParts); } } if (createdList) { delete previousParts; previousParts = 0; } if (validPartsList.empty()) return 0; FlowPartList firstList = *(validPartsList.begin()); const FlowPartList::iterator flEnd = firstList.end(); const ValidPartsList::iterator vplEnd = validPartsList.end(); for (FlowPartList::iterator it = firstList.begin(); it != flEnd; ++it) { bool ok = true; for (ValidPartsList::iterator vplit = validPartsList.begin(); vplit != vplEnd; ++vplit) { if (!(*vplit).contains(*it)) ok = false; } if (ok) return *it; } return 0l; }