public static void updateConnections( IFeatureProvider fp, AnchorContainer ac, List<Connection> alreadyUpdated) { for (int ai = 0; ai < ac.getAnchors().size(); ++ai) { Anchor a = ac.getAnchors().get(ai); for (int ci = 0; ci < a.getIncomingConnections().size(); ++ci) { Connection c = a.getIncomingConnections().get(ci); if (c instanceof FreeFormConnection) { if (!alreadyUpdated.contains(c)) { updateConnection(fp, c, true); alreadyUpdated.add(c); } } } } for (int ai = 0; ai < ac.getAnchors().size(); ++ai) { Anchor a = ac.getAnchors().get(ai); for (int ci = 0; ci < a.getOutgoingConnections().size(); ++ci) { Connection c = a.getOutgoingConnections().get(ci); if (c instanceof FreeFormConnection) { if (!alreadyUpdated.contains(c)) { updateConnection(fp, c, true); alreadyUpdated.add(c); } } } } }
/** * Collects all Shapes and any Connections attached to them, that are children or descendants of * the given Lane or Pool container. Only Shapes that are NOT Lanes are collected. * * @param containerShape the current Pool or Lane shape. This method is recursive and is initially * invoked for the root container. * @param descendants the list of descendant Shapes and attached Connections * @param includeLanes if true, includes all Lane shapes in the results list */ public static void collectChildren( ContainerShape containerShape, List<PictogramElement> descendants, boolean includeLanes) { for (PictogramElement pe : containerShape.getChildren()) { if (pe instanceof ContainerShape) { if (isLane(pe)) { if (includeLanes) descendants.add(pe); collectChildren((ContainerShape) pe, descendants, includeLanes); } else { if (isBpmnShape(pe)) { descendants.add(pe); for (Anchor a : ((ContainerShape) pe).getAnchors()) { for (Connection c : a.getIncomingConnections()) { if (c instanceof FreeFormConnection && !descendants.contains(c)) { descendants.add(c); } } for (Connection c : a.getOutgoingConnections()) { if (c instanceof FreeFormConnection && !descendants.contains(c)) { descendants.add(c); } } } } } } } }
private Set<Contract> getExistingConnections(AnchorContainer container) { Set<Contract> existingConnections = new LinkedHashSet<Contract>(); for (Anchor anchor : container.getAnchors()) { for (Connection connection : anchor.getIncomingConnections()) { Object bo = getBusinessObjectForPictogramElement(connection.getStart()); if (bo instanceof Contract || bo == null) { existingConnections.add((Contract) bo); } } } return existingConnections; }
public static void updateCategoryValues(IFeatureProvider fp, List<ContainerShape> shapes) { // Update CategoryValues for SequenceFlows also List<Connection> connections = new ArrayList<Connection>(); for (ContainerShape cs : shapes) { updateCategoryValues(fp, cs); for (Anchor a : cs.getAnchors()) { for (Connection c : a.getIncomingConnections()) { if (!connections.contains(c)) connections.add(c); } for (Connection c : a.getOutgoingConnections()) { if (!connections.contains(c)) connections.add(c); } } } for (Connection c : connections) { updateCategoryValues(fp, c); } }
@Override public boolean update(IUpdateContext context) { _hasDoneChanges = false; // retrieve name from business model ContainerShape cs = (ContainerShape) context.getPictogramElement(); Reference reference = (Reference) getBusinessObjectForPictogramElement(cs); // remove it if it's gone if (!GraphitiInternal.getEmfService().isObjectAlive(reference)) { IRemoveContext removeContext = new RemoveContext(context.getPictogramElement()); final IRemoveFeature removeFeature = getFeatureProvider().getRemoveFeature(removeContext); if (removeFeature != null && removeFeature.canRemove(removeContext)) { removeFeature.remove(removeContext); _hasDoneChanges = removeFeature.hasDoneChanges(); return true; } } // Set name in pictogram model String pictogramName = null; Text foundText = GraphitiUtil.findChildGA(cs.getGraphicsAlgorithm(), Text.class); if (foundText != null) { pictogramName = foundText.getValue(); } String businessName = reference.getName(); boolean updateNameNeeded = ((pictogramName == null && businessName != null) || (pictogramName != null && !pictogramName.contentEquals(businessName))); if (updateNameNeeded) { foundText.setValue(businessName); _hasDoneChanges = true; } // update the wires final Set<Contract> existingConnections = getExistingConnections(cs); final Anchor anchor = cs.getAnchors().get(0); for (ComponentReference promotedReference : reference.getPromote()) { if (promotedReference != null && !existingConnections.remove(promotedReference)) { for (PictogramElement pe : getFeatureProvider().getAllPictogramElementsForBusinessObject(promotedReference)) { if (pe instanceof Anchor) { AddConnectionContext addContext = new AddConnectionContext((Anchor) pe, anchor); addContext.setNewObject(reference); updatePictogramElement(getFeatureProvider().addIfPossible(addContext)); _hasDoneChanges = true; break; } } } } for (Connection connection : new ArrayList<Connection>(anchor.getIncomingConnections())) { Object bo = getBusinessObjectForPictogramElement(connection.getStart()); if (bo == null || existingConnections.remove(bo)) { RemoveContext removeContext = new RemoveContext(connection); IRemoveFeature removeFeature = getFeatureProvider().getRemoveFeature(removeContext); if (removeFeature.canExecute(removeContext)) { removeFeature.execute(removeContext); _hasDoneChanges = _hasDoneChanges || removeFeature.hasDoneChanges(); } } } return _hasDoneChanges; }