//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.diagram.model.util; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.common.util.AbstractTreeIterator; import org.eclipse.epf.diagram.model.ActivityDetailDiagram; import org.eclipse.epf.diagram.model.DiagramResources; import org.eclipse.epf.diagram.model.Link; import org.eclipse.epf.diagram.model.ModelFactory; import org.eclipse.epf.diagram.model.Node; import org.eclipse.epf.diagram.model.NodeContainer; import org.eclipse.epf.diagram.model.RoleTaskComposite; import org.eclipse.epf.diagram.model.TypedNode; import org.eclipse.epf.diagram.model.WorkBreakdownElementNode; import org.eclipse.epf.diagram.model.WorkProductComposite; import org.eclipse.epf.diagram.model.impl.NamedNodeImpl; import org.eclipse.epf.library.edit.LibraryEditPlugin; import org.eclipse.epf.library.edit.Providers; import org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider; import org.eclipse.epf.library.edit.util.IDiagramManager; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.Diagram; import org.eclipse.epf.uma.DiagramElement; import org.eclipse.epf.uma.Dimension; import org.eclipse.epf.uma.GraphConnector; import org.eclipse.epf.uma.GraphEdge; import org.eclipse.epf.uma.GraphNode; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.Property; import org.eclipse.epf.uma.SemanticModelBridge; import org.eclipse.epf.uma.SimpleSemanticModelElement; import org.eclipse.epf.uma.TaskDescriptor; import org.eclipse.epf.uma.UMASemanticModelBridge; import org.eclipse.epf.uma.UmaFactory; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.VariabilityElement; import org.eclipse.epf.uma.VariabilityType; import org.eclipse.epf.uma.WorkBreakdownElement; import org.eclipse.epf.uma.WorkOrder; import org.eclipse.epf.uma.util.UmaUtil; /** * @author Phong Nguyen Le * @since 1.0 */ public class GraphicalDataHelper { /** Diagram type constants */ public static final int ACTIVITY_DIAGRAM = IDiagramManager.ACTIVITY_DIAGRAM; public static final int WORK_PRODUCT_DEPENDENCY_DIAGRAM = IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM; public static final int ACTIVITY_DETAIL_DIAGRAM = IDiagramManager.ACTIVITY_DETAIL_DIAGRAM; static final int[] DIAGRAM_TYPES = { ACTIVITY_DIAGRAM, ACTIVITY_DETAIL_DIAGRAM, WORK_PRODUCT_DEPENDENCY_DIAGRAM }; static final String[] DIAGRAM_TYPE_TEXTS = { DiagramResources.type_activity, DiagramResources.type_WPD, DiagramResources.type_activityDetail }; /** Property names */ public static final String PROP_TYPE = "type"; //$NON-NLS-1$ public static final String PROP_WORK_PRODUCT_COMPOSITE_TYPE = "wpCompositeType"; //$NON-NLS-1$ /** property names for activity detail diagram **/ public static final String PROP_AUTO_LAYOUT = "autolayout"; //$NON-NLS-1$ public static final String PROP_INDEX = "index"; //$NON-NLS-1$ /** property values constants for autolayout **/ public static final String PROP_AUTO_LAYOUT_VALUE_TRUE = "true"; //$NON-NLS-1$ public static final String PROP_AUTO_LAYOUT_VALUE_FALSE = "false"; //$NON-NLS-1$ /** Type info for UI node (@see TypedNode) */ public static final String GRAPH_NODE_SYNCH_BAR = "synchnonization bar"; //$NON-NLS-1$ public static final String GRAPH_NODE_START = "start node"; //$NON-NLS-1$ public static final String GRAPH_NODE_END = "end node"; //$NON-NLS-1$ public static final String GRAPH_NODE_DECISION = "decision node"; //$NON-NLS-1$ public static final String GRAPH_NODE_FREE_TEXT = "free text"; //$NON-NLS-1$ /** Diagram type string constants */ public static final String DIAGRAM_WORKFLOW = "Workflow"; //$NON-NLS-1$ public static final String DIAGRAM_WORK_PRODUCT_DEPENDENCY = "Work Product Dependency"; //$NON-NLS-1$ public static final String DIAGRAM_ACTIVITY_DETAIL = "Activity Detail"; //$NON-NLS-1$ public static final String ADD_DIAGRAM_TASKS_PER_ROW = "ACTIVITY_DETAIL_DIAGRAM_TASKS_PER_ROW"; //$NON-NLS-1$ public static Point toPoint(org.eclipse.epf.uma.Point p) { return new Point(p.getX().doubleValue(), p.getY().doubleValue()); } public static org.eclipse.epf.uma.Point newModelPoint(int x, int y) { org.eclipse.epf.uma.Point p = UmaFactory.eINSTANCE.createPoint(); p.setX(new Double(x)); p.setY(new Double(y)); return p; } public static Property findProperty(GraphNode node, String propKey) { for (int i = node.getProperty().size() - 1; i > -1; i--) { Property prop = (Property) node.getProperty().get(i); if (propKey.equals(prop.getKey())) return prop; } return null; } /** * @param width * @param height * @return */ public static Dimension newModelDimension(int width, int height) { Dimension size = UmaFactory.eINSTANCE.createDimension(); size.setWidth(new Double(width)); size.setHeight(new Double(height)); return size; } public static void fillConnections(Node node, GraphNode graphNode) { boolean old = node.eDeliver(); try { node.eSetDeliver(false); org.eclipse.epf.diagram.model.Diagram diagram = (org.eclipse.epf.diagram.model.Diagram) node .eContainer(); for (Iterator iter = graphNode.getAnchorage().iterator(); iter .hasNext();) { GraphConnector conn = ((GraphConnector) iter.next()); for (Iterator iterator = conn.getGraphEdge().iterator(); iterator .hasNext();) { GraphEdge edge = (GraphEdge) iterator.next(); if(edge.getAnchor().size() > 1) { GraphConnector targetConnector; Link link = null; if (edge.eContainer() == graphNode) { targetConnector = (GraphConnector) edge.getAnchor() .get(1); GraphNode targetGraphNode = (GraphNode) targetConnector .eContainer(); if (graphNode.eContainer() == targetGraphNode .eContainer()) { Object linkedObject = targetGraphNode; if (targetGraphNode.getSemanticModel() instanceof UMASemanticModelBridge) { linkedObject = ((UMASemanticModelBridge) targetGraphNode .getSemanticModel()).getElement(); } if(linkedObject != null){ Node targetNode = findNode(diagram, linkedObject); link = ModelFactory.eINSTANCE.createLink(); link.setSource(node); link.setTarget(targetNode); link.setObject(edge); }else{ if(LibraryEditPlugin.getDefault().isDebugging()){ System.out.println("Linked object is null: for: "+ node.getGraphNode() + //$NON-NLS-1$ ": for graphConnector: "+ targetConnector); //$NON-NLS-1$ } } } } } } } } finally { node.eSetDeliver(old); } } public static Node findNode(org.eclipse.epf.diagram.model.Diagram diagram, GraphNode gNode, Class adapterType) { SemanticModelBridge bridge = gNode.getSemanticModel(); if (bridge instanceof UMASemanticModelBridge) { INodeChangeListener listener = (INodeChangeListener) UmaUtil .getAdapter(((UMASemanticModelBridge) bridge).getElement(), adapterType); return listener.getNode(); } // gNode is not a activity's GraphNode. Try to find a Node with gNode as // a linked object in the diagram. // for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) { Node element = (Node) iter.next(); if (gNode == element.getObject()) { return element; } } return null; } /** * Finds node whose linked object is the given object * * @return */ public static Node findNode(NodeContainer container, Object object) { for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) { Node element = (Node) iter.next(); if (object == element.getObject() || object == element.getLinkedElement()) { return element; } } return null; } /** * Finds node whose linked object or one of its base is the given object * * @param container * @param object * @return */ public static Node findNode(NodeContainer container, Object object, boolean checkBase) { for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) { Node node = (Node) iter.next(); if (object == node.getObject()) { return node; } else if (checkBase && node.getObject() instanceof VariabilityElement) { for (VariabilityElement ve = ((VariabilityElement) node .getObject()).getVariabilityBasedOnElement(); ve != null; ve = ve .getVariabilityBasedOnElement()) { if (ve == object) { return node; } } } } return null; } public static Node findNode(ActivityDetailDiagram diagram, Object object) { Node node = null; for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) { Node element = (Node) iter.next(); if (element instanceof RoleTaskComposite || element instanceof WorkProductComposite) { node = findNode((NodeContainer) element, object); if (node != null) return node; } if (object == element.getObject()) { return element; } } return null; } public static Node findNode(ActivityDetailDiagram diagram, Object object, Class type) { Node node = null; for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) { Node element = (Node) iter.next(); if (element instanceof RoleTaskComposite || element instanceof WorkProductComposite) { node = findNode((NodeContainer) element, object); if (node != null) return node; } if (object == element.getObject() && type.isInstance(element)) { return element; } } return null; } public static Link findLink(Node source, Object targetLinkedElement) { for (Iterator iter = source.getOutgoingConnections().iterator(); iter.hasNext();) { Link link = (Link) iter.next(); Node target = link.getTarget(); if(target != null && target.getLinkedElement() == targetLinkedElement) { return link; } } return null; } private static String getTypeString(int type) { switch (type) { case TypedNode.DECISION: return GRAPH_NODE_DECISION; case TypedNode.END: return GRAPH_NODE_END; case TypedNode.START: return GRAPH_NODE_START; case TypedNode.SYNCH_BAR: return GRAPH_NODE_SYNCH_BAR; case TypedNode.FREE_TEXT: return GRAPH_NODE_FREE_TEXT; } return null; } public static GraphNode newTypedGraphNode(int type) { GraphNode graphNode = UmaFactory.eINSTANCE.createGraphNode(); SimpleSemanticModelElement bridge = UmaFactory.eINSTANCE .createSimpleSemanticModelElement(); bridge.setTypeInfo(getTypeString(type)); graphNode.setSemanticModel(bridge); org.eclipse.epf.uma.Point point = UmaFactory.eINSTANCE.createPoint(); point.setX(new Double(-1)); point.setY(new Double(-1)); graphNode.setPosition(point); org.eclipse.epf.uma.Dimension dim = UmaFactory.eINSTANCE.createDimension(); dim.setWidth(new Double(-1)); dim.setHeight(new Double(-1)); graphNode.setSize(dim); if (type == TypedNode.FREE_TEXT) { graphNode.setName(DiagramResources.addFreeTxt); } if (type == TypedNode.FREE_TEXT) { Property property = UmaFactory.eINSTANCE.createProperty(); property.setKey(GRAPH_NODE_FREE_TEXT); property.setValue(DiagramResources.addFreeTxt); List list = new ArrayList(); list.add(property); graphNode.set(UmaPackage.GRAPH_NODE__PROPERTY, list); } return graphNode; } /** * @param link */ public static void removeGraphicalData(Link link) { // GraphicalDataManager.getInstance().removeGraphConnectorPair(link.getSource().getGraphNode(), // link.getTarget().getGraphNode()); GraphEdge edge = (GraphEdge) link.getObject(); if(edge != null) { GraphicalDataManager.getInstance().removeGraphEdge(edge); } } /** * @param link */ public static void addGraphicalData(Link link) { GraphEdge edge = (GraphEdge) link.getObject(); if (edge == null) { // new link // edge = GraphicalDataManager.getInstance().addGraphConnectorPair( link.getSource().getGraphNode(), link.getTarget().getGraphNode()); link.setObject(edge); // save the source end point and target end point from the given // link // link.setSourceEndPoint(link.getSourceEndPoint()); link.setTargetEndPoint(link.getTargetEndPoint()); } else { // undo deleted link // GraphNode srcNode = link.getSource().getGraphNode(); GraphNode targetNode = link.getTarget().getGraphNode(); Object srcConnector = edge.getAnchor().get(0); srcNode.getAnchorage().add((GraphConnector) srcConnector); srcNode.getContained().add(edge); Object targetConnector = edge.getAnchor().get(1); targetNode.getAnchorage().add((GraphConnector) targetConnector); } } public static void setSemanticModel(Link link, WorkOrder workOrder) { // set the WorkOrder as the element of the SemanticModel of the link's // GraphEdge // GraphEdge edge = (GraphEdge) link.getObject(); UMASemanticModelBridge bridge = UmaFactory.eINSTANCE .createUMASemanticModelBridge(); bridge.setElement(workOrder); edge.setSemanticModel(bridge); } // public static Collection getSourceActivityNodes(TypedNode typedNode) { // List actNodes = new ArrayList(); // getSourceActivityNodes(actNodes, typedNode); // return actNodes; // } public static Collection getSourceNodes(TypedNode typedNode, Class type) { List actNodes = new ArrayList(); getSourceNodes(actNodes, typedNode, type); return actNodes; } // public static void getSourceActivityNodes(Collection actNodes, TypedNode // typedNode) { // for (Iterator iter = typedNode.getIncomingConnections().iterator(); // iter.hasNext();) { // Link link = (Link)iter.next(); // Node source = link.getSource(); // if(source instanceof ActivityNode) { // actNodes.add(source); // } // else if(source instanceof TypedNode) { // getSourceActivityNodes(actNodes, (TypedNode) source); // } // } // } // public static Collection getTargetActivityNodes(TypedNode typedNode) { // List actNodes = new ArrayList(); // getTargetActivityNodes(actNodes, typedNode); // return actNodes; // } public static Collection getTargetNodes(TypedNode typedNode, Class type) { List actNodes = new ArrayList(); getTargetNodes(actNodes, typedNode, type); return actNodes; } // public static void getTargetActivityNodes(Collection actNodes, TypedNode // typedNode) { // for (Iterator iter = typedNode.getOutgoingConnections().iterator(); // iter.hasNext();) { // Link link = (Link)iter.next(); // Node target = link.getTarget(); // if(target instanceof ActivityNode) { // actNodes.add(target); // } // else if(target instanceof TypedNode) { // getTargetActivityNodes(actNodes, (TypedNode) target); // } // } // } /** * Gets all nodes with the given type that are direct or indirect targets of * the given source typedNode. * * @param actNodes * @param typedNode * @param type */ public static void getTargetNodes(Collection actNodes, TypedNode typedNode, Class type) { for (Iterator iter = typedNode.getOutgoingConnections().iterator(); iter .hasNext();) { Link link = (Link) iter.next(); Node target = link.getTarget(); if (type.isInstance(target)) { actNodes.add(target); } else if (target instanceof TypedNode) { getTargetNodes(actNodes, (TypedNode) target, type); } } } public static void getSourceNodes(Collection actNodes, TypedNode typedNode, Class type) { for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter .hasNext();) { Link link = (Link) iter.next(); Node source = link.getSource(); if (type.isInstance(source)) { actNodes.add(source); } else if (source instanceof TypedNode) { getSourceNodes(actNodes, (TypedNode) source, type); } } } public static Node getFirstSourceNode(TypedNode typedNode, Class type) { for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter .hasNext();) { Link link = (Link) iter.next(); Node source = link.getSource(); if (type.isInstance(source)) { return source; } else if (source instanceof TypedNode) { source = getFirstSourceNode((TypedNode) source, type); if (source != null) return source; } } return null; } public static WorkOrder removeWorkOrder(NamedNodeImpl node, Object predBreakdownElement) { boolean notify = node.isNotificationEnabled(); try { node.setNotificationEnabled(false); return UmaUtil.removeWorkOrder((WorkBreakdownElement) node .getObject(), predBreakdownElement); } finally { node.setNotificationEnabled(notify); } } public static WorkOrder addDefaultWorkOrder(NamedNodeImpl node, WorkBreakdownElement predBreakdownElement) { boolean notify = node.isNotificationEnabled(); try { node.setNotificationEnabled(false); return UmaUtil.createDefaultWorkOrder((WorkBreakdownElement) node .getObject(), predBreakdownElement); } finally { node.setNotificationEnabled(notify); } } /** * @param taskDescriptor * @return */ public static boolean hasNoRoleDescriptorAssociated( TaskDescriptor taskDescriptor) { return taskDescriptor.getPerformedPrimarilyBy().isEmpty(); // commented - requirements not to allow additional performer and // assisted by in diagrams. // && taskDescriptor.getAdditionallyPerformedBy().isEmpty(); // && taskDescriptor.getAssistedBy().isEmpty(); } /** * @param diagram * @param node * @return */ public static boolean contains(NodeContainer container, Node node) { for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) { Object child = iter.next(); if (child == node) return true; if (child instanceof NodeContainer && contains((NodeContainer) child, node)) { return true; } } return false; } public static boolean refreshFromBase(Diagram diagram) { // find the base diagram // SemanticModelBridge modelBridge = diagram.getSemanticModel(); if (modelBridge instanceof UMASemanticModelBridge) { UMASemanticModelBridge umaModelBridge = ((UMASemanticModelBridge) modelBridge); Activity act = (Activity) umaModelBridge.getElement(); Activity base = (Activity) act.getVariabilityBasedOnElement(); if (base == null || act.getVariabilityType() == VariabilityType.LOCAL_REPLACEMENT) { return false; } int diagramType = GraphicalDataManager.getInstance() .getDiagramType(diagram); switch (diagramType) { case ACTIVITY_DIAGRAM: { Diagram baseDiagram = GraphicalDataManager.getInstance() .getUMADiagram(base, diagramType, false); if (baseDiagram == null) return false; List oldNodes = new ArrayList(); Diagram copy = copyDiagram(baseDiagram); for (Iterator iter = baseDiagram.getContained().iterator(); iter .hasNext();) { GraphNode baseNode = (GraphNode) iter.next(); modelBridge = baseNode.getSemanticModel(); if (modelBridge instanceof UMASemanticModelBridge) { // this is a element's node MethodElement e = ((UMASemanticModelBridge) modelBridge) .getElement(); GraphNode node = GraphicalDataManager.findGraphNode( diagram, e); if (node != null) { oldNodes.add(node); } } else if (isUIGraphNode(baseNode)) { GraphNode node = findUIGraphNode(diagram, baseNode .getGuid()); if (node != null) { oldNodes.add(node); } } } // // remove all the GraphEdges of the old nodes // // // List removeEdges = new ArrayList(); // for (Iterator iter = oldNodes.iterator(); iter.hasNext();) { // GraphNode node = (GraphNode) iter.next(); // for (Iterator iterator = node.getContained().iterator(); // iterator.hasNext();) { // Object element = iterator.next(); // if(element instanceof GraphEdge) { // removeEdges.add(element); // } // } // } // if(!removeEdges.isEmpty()) { // for (Iterator iter = removeEdges.iterator(); iter // .hasNext();) { // GraphicalDataManager.getInstance().removeGraphEdge((GraphEdge) // iter.next()); // } // } // remove old nodes // diagram.getContained().removeAll(oldNodes); // remove unused old UI nodes && nodes of contributor/replacer for (Iterator iter = diagram.getContained().iterator(); iter .hasNext();) { GraphNode node = (GraphNode) iter.next(); if (isUIGraphNode(node) && node.getBriefDescription() != null && node.getBriefDescription().length() > 0 // && node.getContained().isEmpty() ) { iter.remove(); } else { SemanticModelBridge bridge = node.getSemanticModel(); if (bridge instanceof UMASemanticModelBridge) { MethodElement e = ((UMASemanticModelBridge) bridge) .getElement(); if (e instanceof Activity && ((Activity) e) .getVariabilityBasedOnElement() != null) { iter.remove(); } } } } // replace associated base element with contributing/replacing // element // for (Iterator iter = act.getBreakdownElements().iterator(); iter .hasNext();) { Object element = iter.next(); if (element instanceof Activity) { VariabilityElement baseElement = ((Activity) element) .getVariabilityBasedOnElement(); GraphNode node = GraphicalDataManager.findGraphNode( copy, baseElement); if (node != null) { UMASemanticModelBridge bridge = (UMASemanticModelBridge) node .getSemanticModel(); bridge.setElement((MethodElement) element); } } } // add new nodes // diagram.getContained().addAll(copy.getContained()); break; } default: { Diagram baseDiagram = GraphicalDataManager.getInstance() .getUMADiagram(base, diagramType, false); if (baseDiagram == null) return false; List oldNodes = new ArrayList(); Diagram copy = copyDiagram(baseDiagram); for (Iterator iter = baseDiagram.getContained().iterator(); iter .hasNext();) { GraphNode baseNode = (GraphNode) iter.next(); modelBridge = baseNode.getSemanticModel(); if (modelBridge instanceof UMASemanticModelBridge) { // this is a element's node MethodElement e = ((UMASemanticModelBridge) modelBridge) .getElement(); GraphNode node = GraphicalDataManager.findGraphNode( diagram, e); if (node != null) { oldNodes.add(node); } } } // remove old nodes // diagram.getContained().removeAll(oldNodes); // add new nodes // diagram.getContained().addAll(copy.getContained()); break; } } } return false; } /** * @param diagram * @param baseGuid * the GUID of the base UI GraphNode * @return */ private static GraphNode findUIGraphNode(Diagram diagram, String baseGuid) { for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) { GraphNode node = (GraphNode) iter.next(); if (isUIGraphNode(node) && baseGuid.equals(node.getBriefDescription())) { return node; } } return null; } public static boolean isUIGraphNode(GraphNode gNode) { SemanticModelBridge modelBridge = gNode.getSemanticModel(); if (modelBridge instanceof SimpleSemanticModelElement) { String typeInfo = ((SimpleSemanticModelElement) modelBridge) .getTypeInfo(); if (typeInfo.equals(GRAPH_NODE_DECISION) || typeInfo.equals(GRAPH_NODE_END) || typeInfo.equals(GRAPH_NODE_START) || typeInfo.equals(GRAPH_NODE_SYNCH_BAR) || typeInfo.equals(GRAPH_NODE_FREE_TEXT)) { return true; } } return false; } public static Diagram copyDiagram(Diagram baseDiagram) { Diagram copy = (Diagram) TngUtil.copy(baseDiagram); // HACK: // go thru the nodes of the diagram copy, if any node is a UI-only node // (see TypedNode) // save the GUID of the original one in its briefDescription to remember // who is base. // int size = copy.getContained().size(); for (int i = 0; i < size; i++) { GraphNode gNode = (GraphNode) copy.getContained().get(i); if (GraphicalDataHelper.isUIGraphNode(gNode)) { gNode.setBriefDescription(((DiagramElement) baseDiagram .getContained().get(i)).getGuid()); } } return copy; } /** * Gets all diagrams of this activities. * * @param selectedActivity * @return */ public static Collection getDiagrams(Activity act) { return getDiagrams(act, false); } public static Collection getDiagrams(Activity act, boolean create) { ArrayList diagrams = new ArrayList(); for (int i = 0; i < DIAGRAM_TYPES.length; i++) { Diagram diagram = GraphicalDataManager.getInstance().getUMADiagram( act, DIAGRAM_TYPES[i], create); if (diagram != null) { diagrams.add(diagram); } } return diagrams; } public static String getDiagramTypeText(Diagram diagram) { int type = GraphicalDataManager.getInstance().getDiagramType(diagram); if (type != -1) { return DIAGRAM_TYPE_TEXTS[type]; } return DiagramResources.type_unknown; } /** * Sets or unsets suppressed flag of all diagrams in the given process * * @param proc */ public static void setAllDiagramSuppressed(Process proc, boolean suppressed) { Iterator iter = new AbstractTreeIterator(proc) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = -618949014476371114L; protected Iterator getChildren(Object object) { Activity act = (Activity) object; ArrayList children = new ArrayList(); for (Iterator iterator = act.getBreakdownElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if (element instanceof Activity) { children.add(element); } } return children.iterator(); } }; while (iter.hasNext()) { Collection diagrams = getDiagrams((Activity) iter.next(), suppressed); for (Iterator iterator = diagrams.iterator(); iterator.hasNext();) { Diagram diagram = (Diagram) iterator.next(); diagram.setSuppressed(Boolean.valueOf(suppressed)); } } } // public static boolean removeUMAPoint(Collection umaPoints, int x, int y) // { // for (Iterator iter = umaPoints.iterator(); iter.hasNext();) { // org.eclipse.epf.uma.Point p = (org.eclipse.epf.uma.Point) iter.next(); // if(p.getX().intValue() == x && p.getY().intValue() == y) { // iter.remove(); // return true; // } // } // return false; // } public static void removeLink(Link link) { Node sourceNode = link.getSource(); Node targetNode = link.getTarget(); boolean srcNotify = sourceNode != null ? sourceNode.eDeliver() : false; boolean targetNotify = targetNode != null ? targetNode.eDeliver() : false; try { if (sourceNode != null) { sourceNode.eSetDeliver(false); } if (targetNode != null) { targetNode.eSetDeliver(false); } link.setSource(null); link.setTarget(null); } finally { if (sourceNode != null) { sourceNode.eSetDeliver(srcNotify); } if (targetNode != null) { targetNode.eSetDeliver(targetNotify); } } } /** * Finds the object or its wrapper in the given collection * * @param allElements * @param e * @return */ public static Object findElement(Collection allElements, Object e) { for (Iterator iter = allElements.iterator(); iter.hasNext();) { Object element = iter.next(); if (e == TngUtil.unwrap(element)) { return element; } // If object (e) is a workproduct descriptor( sub-artifact) // passed collection donot have wrapper for sub-artifact, check the // container artifact's wrapper. //https://bugs.eclipse.org/bugs/show_bug.cgi?id=155914 if(element instanceof WorkProductDescriptorWrapperItemProvider){ Object childElement = findElement(((WorkProductDescriptorWrapperItemProvider)element).getChildren(element), e); if(childElement != null){ return childElement; } } } return null; } /* * Method to check if any duplicate predecessor in the predecessors list of * WorkBreakdownElement. */ public static boolean anyDuplicatePredecessors(WorkBreakdownElement e) { List list = new ArrayList(); List predlist = new ArrayList(); getPreds(e, predlist); for (Iterator itor = predlist.iterator(); itor.hasNext();) { Object obj = itor.next(); if (!list.contains(obj)) { list.add(obj); } else { return true; } } return false; } /* * Utility method to get all the predecessors activities instead of * workorders. */ public static void getPreds(WorkBreakdownElement e, List list) { List predlist = e.getLinkToPredecessor(); for (Iterator itor = predlist.iterator(); itor.hasNext();) { WorkOrder workorder = (WorkOrder) itor.next(); list.add(workorder.getPred()); } } /* * Method to check before deleting a link. If duplicate predecessor exists * in the legacy data, check if deleting link should remove all the * predecessors or not by verifying if target or indirect target have direct * or indirect links. */ public static boolean canRemoveAllPreds(Link link, Node oldSource, Node oldTarget) { if (oldTarget instanceof WorkBreakdownElementNode) { List inlist = oldTarget.getIncomingConnections(); for (Iterator itor = inlist.iterator(); itor.hasNext();) { Link incominglink = (Link) itor.next(); // RATLC00384245 : Predecessor changes should be done only in // case of Synchronization Bar. if (incominglink.getSource() instanceof TypedNode && ((TypedNode) incominglink.getSource()).getType() == TypedNode.SYNCH_BAR) { Collection col = GraphicalDataHelper.getSourceNodes( (TypedNode) incominglink.getSource(), WorkBreakdownElementNode.class); if (col.contains(oldSource)) { return false; } } else if (incominglink.getSource() instanceof WorkBreakdownElementNode) { if (incominglink.getSource().equals(oldSource)) return false; } } } return true; } /* * Method to get the sources of SyncBar inComming connections * and if syncbar have incoming connection from decision point, * and decision point have incomming connections (workbreaddown elemtns) * collections will ignore all the incoming connection from decision point. * @return */ public static void getSyncBarSourceNodes(TypedNode typedNode, Collection actNodes){ for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter.hasNext();) { Link link = (Link) iter.next(); Node source = link.getSource(); if(source instanceof WorkBreakdownElementNode){ actNodes.add(source); }else if(source instanceof TypedNode){ if(((TypedNode)source).getType() == TypedNode.SYNCH_BAR) getSyncBarSourceNodes((TypedNode)source,actNodes); } } } /* * Method to collect synchronization bar outgoing connection * except any connection going from decision points. */ public static void getSyncBarTargetNodes(TypedNode typedNode, Collection actNodes){ for (Iterator iter = typedNode.getOutgoingConnections().iterator(); iter.hasNext();) { Link link = (Link) iter.next(); Node target = link.getTarget(); if(target instanceof WorkBreakdownElementNode){ actNodes.add(target); }else if(target instanceof TypedNode){ if(((TypedNode)target).getType() == TypedNode.SYNCH_BAR) getSyncBarTargetNodes((TypedNode)target, actNodes); } } } public static Node findNode(NodeContainer container, Object object, Class nodeType) { for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) { Node element = (Node) iter.next(); if (object == element.getObject() && nodeType.isInstance(element)) { return element; } } return null; } /** * Convenient method to add a property to GraphNode property list * (UmaPackage.GRAPH_NODE__PROPERTY) Verifies property exists or not, if not * creates a property with given key and value. and set into graph node * property list, if exists just sets value for property. * * @param graphNode * @param key * @param value * @return Property * @author skannoor */ public static Property createProperty(GraphNode graphNode, String key, String value) { Property property = null; if (graphNode != null) { property = findProperty(graphNode, key); } if (property == null) { property = UmaFactory.eINSTANCE.createProperty(); property.setKey(key); property.setValue(value); List list = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY); if (list == null) { list = new ArrayList(); graphNode.set(UmaPackage.GRAPH_NODE__PROPERTY, list); } list.add(property); } else { property.setValue(value); } return property; } /** * Accesible method for ActivityDetailDiagram, to get a autolayout flag from * GraphhNode property list. return string can be * GraphicalDataHelper.PROP_AUTOLAYOUT_VALUE_TRUE, * GraphicalDataHelper.PROP_AUTOLAYOUT_VALUE_FALSE, or null. * * @param diagram * @return String */ public static String getAutoLayoutFlag(ActivityDetailDiagram diagram) { String flag = null; GraphNode graphNode = diagram.getGraphNode(); if (graphNode != null) { List propList = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY); if (propList != null && propList.size() > 0) { Property property = GraphicalDataHelper.findProperty(graphNode, GraphicalDataHelper.PROP_AUTO_LAYOUT); if (property != null) { flag = property.getValue(); } } } return flag; } public static boolean isAutoLayout(ActivityDetailDiagram diagram){ GraphNode graphNode = diagram.getGraphNode(); if(graphNode != null){ List propList = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY); if(propList != null && propList.size() > 0){ Property property = GraphicalDataHelper.findProperty( graphNode, GraphicalDataHelper.PROP_AUTO_LAYOUT); if(property != null){ String temp = property.getValue(); if(temp != null && temp != "" && //$NON-NLS-1$ (GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_TRUE.equals(temp) || GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_FALSE.equals(temp))){ return new Boolean(temp).booleanValue(); } } } } return false; } public static int getTasksPerRow(){ // String count = LibraryEditPlugin.getDefault().getPreferenceStore() // .getString(GraphicalDataHelper.ADD_DIAGRAM_TASKS_PER_ROW); // if (count != null && count.length() > 0) { // try { // int i = Integer.parseInt(count); // return i; // } catch (NumberFormatException ne) { // return 10; // } // } // return 10; int count = Providers.getAuthoringPluginPreferenceStore().getInt(GraphicalDataHelper.ADD_DIAGRAM_TASKS_PER_ROW); if (count <= 0) return 10; return count; } /** * @param list the list of {@link Property} objects * @param key * @return */ public static Property getPropertyByKey(List list, String key) { if (!list.isEmpty()) { for (Iterator iror = list.iterator(); iror.hasNext();) { Property property = (Property) iror.next(); if (property != null) { if (property.getKey().equals(key)) { return property; } // else { // return null; // } } } } return null; } public static Property getProperty(Node node, String key) { GraphNode graphNode = node.getGraphNode(); if (graphNode != null) { List list = graphNode.getProperty(); if (list != null && !list.isEmpty()) { for (int i = list.size() - 1; i > -1; i--) { Property prop = (Property) list.get(i); if (key.equals(prop.getKey())) { return prop; } } } } return null; } }