| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 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 |
| //------------------------------------------------------------------------------ |
| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 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.core.bridge; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.edit.provider.ITreeItemContentProvider; |
| import org.eclipse.emf.transaction.RollbackException; |
| import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter; |
| import org.eclipse.epf.library.edit.TngAdapterFactory; |
| import org.eclipse.epf.library.edit.command.IActionManager; |
| import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider; |
| import org.eclipse.epf.library.edit.process.BSActivityItemProvider; |
| import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; |
| import org.eclipse.epf.library.edit.process.IBSItemProvider; |
| import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory; |
| import org.eclipse.epf.library.edit.util.DescriptorPropUtil; |
| import org.eclipse.epf.library.edit.util.PredecessorList; |
| import org.eclipse.epf.library.edit.util.ProcessUtil; |
| import org.eclipse.epf.library.edit.util.TngUtil; |
| import org.eclipse.epf.uma.Activity; |
| import org.eclipse.epf.uma.BreakdownElement; |
| import org.eclipse.epf.uma.Descriptor; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.Milestone; |
| import org.eclipse.epf.uma.TaskDescriptor; |
| import org.eclipse.epf.uma.UmaFactory; |
| import org.eclipse.epf.uma.UmaPackage; |
| import org.eclipse.epf.uma.VariabilityElement; |
| import org.eclipse.epf.uma.WorkBreakdownElement; |
| import org.eclipse.epf.uma.WorkOrder; |
| import org.eclipse.gmf.runtime.notation.Edge; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.uml2.uml.ActivityEdge; |
| import org.eclipse.uml2.uml.ActivityNode; |
| import org.eclipse.uml2.uml.ActivityParameterNode; |
| import org.eclipse.uml2.uml.ControlNode; |
| import org.eclipse.uml2.uml.StructuredActivityNode; |
| import org.eclipse.uml2.uml.UMLFactory; |
| |
| /** |
| * @author Phong Nguyen Le |
| * @author Shilpa Toraskar |
| * |
| * @since 1.2 |
| */ |
| public class ActivityDiagramAdapter extends DiagramAdapter { |
| |
| public ActivityDiagramAdapter(BreakdownElementWrapperItemProvider wrapper) { |
| super(wrapper); |
| } |
| |
| /** |
| * @param e |
| */ |
| public ActivityDiagramAdapter(Activity e) { |
| super(e); |
| } |
| |
| protected ActivityNode addNode(Collection nodes, Object obj) { |
| if (obj instanceof Activity) { |
| Activity act = (Activity) obj; |
| VariabilityElement base = act.getVariabilityBasedOnElement(); |
| if (base != null) { |
| // find existing node for base and link it to the activity |
| // |
| org.eclipse.uml2.uml.Activity diagram = getDiagram(); |
| ActivityNode baseNode = BridgeHelper.findNode(diagram, base); |
| if (baseNode == null) { |
| baseNode = BridgeHelper.findNode(diagram, act); |
| } |
| if (baseNode != null) { |
| // disassociate with the base |
| // |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode); |
| if(nodeAdapter != null) { |
| nodeAdapter.dispose(); |
| } |
| |
| // associate base node with the activity |
| // |
| nodeAdapter = createNodeAdapter(act); |
| if(nodeAdapter != null) { |
| initializeNodeAdapter(nodeAdapter); |
| baseNode.eAdapters().add(nodeAdapter); |
| nodeAdapter.updateView(); |
| // if(ProcessUtil.isExtendingOrLocallyContributing(act)) { |
| BridgeHelper.associate(baseNode, act); |
| if(BridgeHelper.isInherited(nodeAdapter.getView())){ |
| BridgeHelper.unmarkInHerited(nodeAdapter.getView()); |
| } |
| nodeAdapter.setTargetReadOnly(false); |
| // } |
| } |
| |
| return null; |
| } |
| } |
| } |
| return super.addNode(nodes, obj); |
| } |
| |
| protected NodeAdapter createNodeAdapter(MethodElement e) { |
| if(e instanceof WorkBreakdownElement) { |
| return new WorkBreakdownElementNodeAdapter(e); |
| } |
| return null; |
| } |
| |
| protected void addToUmaModel(int position, ActivityNode addedNode) { |
| MethodElement e = BridgeHelper.getMethodElement(addedNode); |
| if(e == null) { |
| return; |
| } |
| Activity act = (Activity) getElement(); |
| |
| // translate ActivityNode index to Activity index |
| // |
| int i = toActivityIndex(position); |
| |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(addedNode); |
| boolean notify = nodeAdapter.notificationEnabled; |
| try { |
| nodeAdapter.notificationEnabled = false; |
| getActionManager().doAction(IActionManager.ADD, act, UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS, e, i); |
| BridgeHelper.addEAnnotation(addedNode, e); |
| } |
| finally { |
| nodeAdapter.notificationEnabled = notify; |
| } |
| |
| super.addToUmaModel(position, addedNode); |
| } |
| |
| private int toActivityIndex(int index) { |
| if (index == -1) |
| return index; |
| int size = getNodes().size(); |
| int i = index + 1; |
| if (i == size) |
| return -1; |
| ActivityNode node = (ActivityNode) getNodes().get(i); |
| if (node == null) |
| return -1; |
| |
| for (; !(BridgeHelper.getMethodElement(node) instanceof BreakdownElement) && i < size; i++) { |
| node = (ActivityNode) getNodes().get(i); |
| } |
| if (i == size) |
| return -1; |
| Activity act = (Activity) getElement(); |
| return act.getBreakdownElements().indexOf(BridgeHelper.getMethodElement(node)); |
| } |
| |
| protected List getBreakdownElementTypes() { |
| return Collections.singletonList(WorkBreakdownElement.class); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.diagram.core.bridge.DiagramAdapter#newNode(org.eclipse.epf.uma.MethodElement) |
| */ |
| protected ActivityNode newNode(MethodElement e) { |
| ActivityNode node = null; |
| if(e instanceof Activity ) { |
| node = UMLFactory.eINSTANCE.createStructuredActivityNode(); |
| } |
| else if(e instanceof TaskDescriptor || e instanceof Milestone) { |
| node = UMLFactory.eINSTANCE.createActivityParameterNode(); |
| } |
| else if(e instanceof WorkBreakdownElement) { |
| node = UMLFactory.eINSTANCE.createStructuredActivityNode(); |
| } |
| if(node != null) { |
| BridgeHelper.associate(node, e); |
| } |
| return node; |
| } |
| |
| |
| private boolean isValid(ActivityEdge link) { |
| if (link.getSource() == null || link.getTarget() == null |
| || !getNodes().contains(link.getSource()) |
| || !getNodes().contains(link.getTarget())) { |
| return false; |
| } |
| return true; |
| } |
| |
| private static boolean isValidWorkOrder(WorkOrder wo, Object pred) { |
| if (wo.getPred() == pred) { |
| return true; |
| } |
| |
| if (pred instanceof Activity) { |
| Activity act = (Activity) pred; |
| // check if predecessor reference in the given work order is base of |
| // pred |
| // |
| for (VariabilityElement ve = act.getVariabilityBasedOnElement(); ve != null; ve = ve |
| .getVariabilityBasedOnElement()) { |
| if (ve == wo.getPred()) { |
| return true; |
| } |
| } |
| } |
| |
| return false; |
| } |
| |
| /** |
| * Checks if Node src can reach Node target as the first ActivityNode in the |
| * diagram |
| * |
| * @param predNode |
| * @param node |
| * @return |
| */ |
| private static boolean canReachAsFirstActivityNode(ActivityNode predNode, ActivityNode node) { |
| for (Iterator iter = predNode.getOutgoings().iterator(); iter |
| .hasNext();) { |
| ActivityEdge link = (ActivityEdge) iter.next(); |
| if (link.getTarget() == node) { |
| return true; |
| } |
| if (link.getTarget() instanceof ControlNode |
| && canReachAsFirstActivityNode(link.getTarget(), node)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| protected List<WorkBreakdownElement> getLocalPredecessors(ActivityNode node) { |
| Activity diagramActivity = (Activity) BridgeHelper.getMethodElement(getDiagram()); |
| AdapterFactory adapterFactory = getAdapterFactory(); |
| ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(diagramActivity, ITreeItemContentProvider.class); |
| Collection<?> children = adapter.getChildren(diagramActivity); |
| return getLocalPredecessors(node, children); |
| } |
| |
| private List<WorkBreakdownElement> getLocalPredecessors(ActivityNode node, Collection<?> activityChildren) { |
| MethodElement e = BridgeHelper.getMethodElement(node); |
| if(e instanceof WorkBreakdownElement) { |
| // find item provider |
| // |
| Object object = null; |
| for (Object child : activityChildren) { |
| if(e == TngUtil.unwrap(child)) { |
| object = child; |
| break; |
| } |
| } |
| if(object != null) { |
| Object ip = getAdapterFactory().adapt(object, ITreeItemContentProvider.class); |
| if(ip instanceof IBSItemProvider) { |
| Object parent = ((ITreeItemContentProvider) ip).getParent(object); |
| ArrayList<WorkBreakdownElement> preds = new ArrayList<WorkBreakdownElement>(); |
| PredecessorList predList = ((IBSItemProvider) ip).getPredecessors(); |
| for (Object predIp : predList) { |
| Object pred = TngUtil.unwrap(predIp); |
| |
| if (ProcessUtil.isSynFree() && pred instanceof TaskDescriptor) { |
| DescriptorPropUtil propUtil = DescriptorPropUtil.getDesciptorPropUtil(); |
| List<? extends Descriptor> childList = propUtil.getCustomizingChildren((TaskDescriptor) pred); |
| if (childList != null && ! childList.isEmpty()) { |
| boolean processed = false; |
| for (Descriptor des : childList) { |
| if (des.getSuperActivities() == parent) { |
| preds.add((WorkBreakdownElement) des); |
| processed = true; |
| break; |
| } |
| } |
| if (processed) { |
| continue; |
| } |
| } |
| } |
| // make sure that predecessors are sibling |
| // |
| if(((ITreeItemContentProvider) predIp).getParent(pred) == parent) { |
| if(pred instanceof WorkBreakdownElement) { |
| preds.add((WorkBreakdownElement) pred); |
| } else if (pred instanceof Adapter) { |
| pred = ((Adapter) pred).getTarget(); |
| if(pred instanceof WorkBreakdownElement) { |
| preds.add((WorkBreakdownElement) pred); |
| } |
| } |
| } else if (ProcessUtil.isSynFree() && pred instanceof Adapter) { |
| pred = ((Adapter) pred).getTarget(); |
| if (pred instanceof TaskDescriptor) { |
| TaskDescriptor td = (TaskDescriptor) pred; |
| if (td.getSuperActivities() == parent) { |
| preds.add(td); |
| } |
| } |
| } |
| } |
| return preds; |
| } |
| } |
| } |
| return Collections.emptyList(); |
| } |
| |
| AdapterFactory getAdapterFactory(){ |
| AdapterFactory adapterFactory = null; |
| if (filter == null) { |
| adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(); |
| } else if (filter instanceof IAdapterFactoryFilter) { |
| adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter) |
| .getWBSAdapterFactory(); |
| } |
| return adapterFactory; |
| } |
| |
| @Override |
| protected void populateLinks(List<ActivityNode> selectedNodes) { |
| if(selectedNodes.isEmpty()) { |
| return; |
| } |
| |
| super.populateLinks(selectedNodes); |
| |
| // remove the invalid links |
| // |
| for (ActivityNode node : selectedNodes) { |
| WorkBreakdownElement wbe = null; |
| MethodElement me; |
| if ((me = BridgeHelper.getMethodElement(node)) instanceof WorkBreakdownElement) { |
| wbe = (WorkBreakdownElement) me; |
| } |
| ArrayList<ActivityEdge> linksToRemove = new ArrayList<ActivityEdge>(); |
| linkListWalk: for (Iterator iterator = node |
| .getIncomings().iterator(); iterator.hasNext();) { |
| ActivityEdge link = (ActivityEdge) iterator.next(); |
| if (!isValid(link)) { |
| linksToRemove.add(link); |
| } |
| |
| if (wbe != null) { |
| // TODO: need revisit to check the valid connection from a |
| // ForkNode or JoinNode |
| // |
| |
| if (link.getSource() != null && link.getSource() instanceof ControlNode) |
| continue linkListWalk; |
| |
| boolean workOrderFound = false; |
| WorkOrder workOrder = (WorkOrder) BridgeHelper.getMethodElement(link); |
| if(workOrder == null) { |
| Object pred = BridgeHelper.getMethodElement(link.getSource()); |
| find_WorkOrder: for (Iterator iterator1 = wbe |
| .getLinkToPredecessor().iterator(); iterator1 |
| .hasNext();) { |
| WorkOrder wo = (WorkOrder) iterator1.next(); |
| if (isValidWorkOrder(wo, pred)) { |
| workOrderFound = true; |
| break find_WorkOrder; |
| } |
| } |
| } else { |
| workOrderFound = true; |
| } |
| if (!workOrderFound) { |
| // invalid link, remove it |
| // |
| linksToRemove.add(link); |
| } |
| } |
| } |
| |
| for (ActivityEdge link : linksToRemove) { |
| BridgeHelper.removeLink(link); |
| } |
| linksToRemove.clear(); |
| |
| for (Iterator iterator = node.getOutgoings().iterator(); iterator |
| .hasNext();) { |
| ActivityEdge link = (ActivityEdge) iterator.next(); |
| if (!isValid(link)) { |
| linksToRemove.add(link); |
| } |
| } |
| |
| for (Iterator iterator = linksToRemove.iterator(); iterator |
| .hasNext();) { |
| ActivityEdge link = (ActivityEdge) iterator.next(); |
| BridgeHelper.removeLink(link); |
| } |
| linksToRemove.clear(); |
| linksToRemove = null; |
| } |
| |
| // Check the links of each ActivityNode |
| // set the WorkOrder to the link if needed |
| // add new link for those WorkOrders that still don't have the |
| // corresponding link |
| // |
| Activity diagramActivity = (Activity) BridgeHelper.getMethodElement(getDiagram()); |
| AdapterFactory adapterFactory = getAdapterFactory(); |
| ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(diagramActivity, ITreeItemContentProvider.class); |
| Collection<?> children = adapter.getChildren(diagramActivity); |
| |
| for (ActivityNode node : selectedNodes) { |
| List<WorkBreakdownElement> preds = getLocalPredecessors(node, children); |
| |
| // Iterate work orders and create links. |
| for (WorkBreakdownElement pred : preds) { |
| ActivityNode predNode = BridgeHelper.findNode(getDiagram(), |
| pred, true); |
| if (predNode != null) { |
| // check if there is a link for this work order |
| // already |
| // |
| boolean linkFound = false; |
| find_link: for (Iterator<?> iterator1 = node |
| .getIncomings().iterator(); iterator1 |
| .hasNext();) { |
| ActivityEdge link = (ActivityEdge) iterator1.next(); |
| if (link.getSource() == predNode) { |
| // link already exists |
| // check if work order is set to this link |
| // |
| linkFound = true; |
| // MethodElement me = BridgeHelper.getMethodElement(link); |
| // if (link != null) { |
| // BridgeHelper.setSemanticModel( |
| // link, workOrder); |
| // } |
| break find_link; |
| } |
| } |
| if (!linkFound) { |
| // check if this WorkOrder can be represented |
| // via links of TypedNodes |
| // |
| if (!canReachAsFirstActivityNode(predNode, node)) { |
| // add new link for this work order |
| // |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node); |
| NodeAdapter predNodeAdapter = BridgeHelper.getNodeAdapter(predNode); |
| if(nodeAdapter != null && predNodeAdapter != null) { |
| boolean oldNotify = nodeAdapter.notificationEnabled; |
| boolean predNodeNotify = predNodeAdapter.notificationEnabled; |
| try { |
| nodeAdapter.notificationEnabled = false; |
| predNodeAdapter.notificationEnabled = false; |
| ActivityEdge edge = nodeAdapter.addIncomingConnection(pred); |
| if(BridgeHelper.isInherited(node)) { |
| // target node is inherited, must find the custom work order and associate it with the edge |
| // |
| WorkBreakdownElement inheritedChild = (WorkBreakdownElement) BridgeHelper.getMethodElement(node); |
| if(inheritedChild != null) { |
| WorkOrder wo = ProcessUtil.findWorkOrder(diagramActivity, inheritedChild, pred); |
| if(wo != null) { |
| BridgeHelper.associate(edge, wo); |
| } |
| } |
| } |
| } finally { |
| nodeAdapter.notificationEnabled = oldNotify; |
| predNodeAdapter.notificationEnabled = predNodeNotify; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| cleanDuplicateLinks(selectedNodes); |
| } |
| |
| private void cleanDuplicateLinks(List<ActivityNode> selectedNodes) { |
| List<ActivityEdge> duplicateLinks = new ArrayList<ActivityEdge>(); |
| for (ActivityNode wbNode : selectedNodes) { |
| if(wbNode.getIncomings() != null){ |
| findDuplicateLinks(duplicateLinks, wbNode.getIncomings()); |
| } |
| if(wbNode.getOutgoings() !=null){ |
| findDuplicateLinks(duplicateLinks, wbNode.getOutgoings()); |
| } |
| } |
| for (ActivityEdge link : duplicateLinks) { |
| BridgeHelper.removeLink(link); |
| } |
| duplicateLinks.clear(); |
| duplicateLinks = null; |
| } |
| |
| private void findDuplicateLinks(List duplicateLinks, List links) { |
| for (int i = 0; i < links.size(); i++) { |
| ActivityEdge link = (ActivityEdge) links.get(i); |
| if(!duplicateLinks.contains(link)){ |
| for (int j = i + 1; j < links.size(); j++) { |
| ActivityEdge link1 = (ActivityEdge) links.get(j); |
| if (link1.getSource() == link.getSource() |
| && link1.getTarget() == link.getTarget()) { |
| duplicateLinks.add(link1); |
| } |
| } |
| } |
| } |
| } |
| |
| protected Collection populateNodes() { |
| HashSet selectedNodes = new HashSet(); |
| Collection children = getChildren(); |
| |
| // associate control nodes |
| // |
| selectedNodes.addAll(associateControlNodes(children)); |
| |
| // add WorkBreakdownElementNodes |
| // |
| selectedNodes.addAll(addElementNodes(children)); |
| |
| return selectedNodes; |
| } |
| |
| @Override |
| protected void updateView(Collection<?> selectedNodes) |
| throws InterruptedException, RollbackException { |
| super.updateView(selectedNodes); |
| hideUnusedSyncBars(); |
| } |
| |
| protected void hideUnusedSyncBars() { |
| View diagram = getView(); |
| for (Object child : diagram.getVisibleChildren()) { |
| View childView = (View) child; |
| // hide a sync bar that is not connected to any visible target node |
| // or source node, which is associated with a work breakdown element |
| // |
| if(childView.getElement() instanceof ControlNode && |
| BridgeHelper.isSynchBar((ActivityNode) childView.getElement()) && |
| !isConnectedToVisibleWBENode(childView)) { |
| childView.setVisible(false); |
| } |
| } |
| } |
| |
| private static boolean isConnectedToVisibleWBENode(View view) { |
| // check source nodes |
| // |
| for(Object object : view.getTargetEdges()) { |
| View connectedView = ((Edge) object).getSource(); |
| // if(connectedView != null && connectedView.isVisible() && |
| // connectedView.getElement() instanceof ActivityNode && |
| // BridgeHelper.getMethodElement(connectedView) instanceof WorkBreakdownElement) { |
| // return true; |
| // } |
| if(connectedView != null && connectedView.isVisible() && |
| connectedView.getElement() instanceof ActivityNode ) { |
| return true; |
| } |
| } |
| |
| // check target nodes |
| // |
| for(Object object : view.getSourceEdges()) { |
| View connectedView = ((Edge) object).getTarget(); |
| // if(connectedView != null && connectedView.isVisible() && |
| // connectedView.getElement() instanceof ActivityNode && |
| // BridgeHelper.getMethodElement(connectedView) instanceof WorkBreakdownElement) { |
| // return true; |
| // } |
| if(connectedView != null && connectedView.isVisible() && |
| connectedView.getElement() instanceof ActivityNode) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| private List<? extends ControlNode> associateControlNodes(Collection<?> methodElements) { |
| List<ControlNode> ctrlNodes = new ArrayList<ControlNode>(); |
| for (Iterator<?> iter = getDiagram().getNodes().iterator(); iter.hasNext();) { |
| ActivityNode node = (ActivityNode) iter.next(); |
| if(node instanceof ControlNode) { |
| if(addNodeAdapterTo(node) != null) { |
| ctrlNodes.add((ControlNode) node); |
| } |
| } |
| } |
| return ctrlNodes; |
| } |
| |
| /** |
| * Adds element nodes for the specified method elements if they don't exist yet. |
| * |
| * @param methodElements |
| */ |
| private List addElementNodes(Collection methodElements) { |
| ArrayList nodes = new ArrayList(); |
| ArrayList newNodes = new ArrayList(); |
| for (Iterator iter = methodElements.iterator(); iter.hasNext();) { |
| Object e = iter.next(); |
| Object child = TngUtil.unwrap(e); |
| if (child instanceof WorkBreakdownElement) { |
| ActivityNode node = BridgeHelper.findNode(getDiagram(), child); |
| if(node == null) { |
| node = toNode((MethodElement) child); |
| newNodes.add(node); |
| } |
| else { |
| // synchronize name with linked element |
| // |
| String name = BridgeHelper.getNodeName((MethodElement) child); |
| if(!name.equals(node.getName())) { |
| node.setName(name); |
| } |
| |
| addNodeAdapterTo(node); |
| } |
| nodes.add(node); |
| if (e instanceof BreakdownElementWrapperItemProvider && !isTargetReadOnly()) { |
| BreakdownElementWrapperItemProvider wrapper = ((BreakdownElementWrapperItemProvider) e); |
| if (wrapper.isReadOnly()) { |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node); |
| nodeAdapter.wrapper = wrapper; |
| // readOnly attribute is still needed |
| // after introduction of wrapper. |
| // For example, we can have a node adapter for a read-only base activity |
| // without supplying wrapper for this base activity. |
| // |
| nodeAdapter.basicSetTargetReadOnly(true); |
| } |
| } |
| } |
| } |
| getNodes().addAll(newNodes); |
| return nodes; |
| } |
| |
| /** |
| * Moved code from getChildren. getAdapter() will return Adapter, |
| * which will allow us to find itemprovider for the children. |
| * |
| * @return |
| */ |
| private ITreeItemContentProvider getAdapter(){ |
| ITreeItemContentProvider adapter = null; |
| if (wrapper != null) { |
| adapter = wrapper; |
| } else { |
| adapter = (ITreeItemContentProvider) getAdapterFactory().adapt( |
| getElement(), ITreeItemContentProvider.class); |
| } |
| return adapter; |
| } |
| |
| public Collection getChildren() { |
| ITreeItemContentProvider adapter = getAdapter(); |
| if (adapter != null) { |
| |
| //Turn off the VariabilityInfo for the activity diagram. |
| Object obj = null; |
| boolean enableVariabilityInfo = false; |
| if(adapter instanceof ActivityWrapperItemProvider){ |
| obj = ((ActivityWrapperItemProvider)adapter).getDelegatingItemProvider(); |
| } |
| if(adapter instanceof BSActivityItemProvider){ |
| obj = adapter; |
| } |
| |
| if(obj instanceof BSActivityItemProvider){ |
| enableVariabilityInfo = ((BSActivityItemProvider)obj).isEnableVariabilityInfo(); |
| ((BSActivityItemProvider)obj).setEnableVariabilityInfo(false); |
| } |
| // end of variability info |
| |
| |
| // return adapter.getChildren(getObject()); |
| // commented above line, For diagrams - rollup should be false, for |
| // handling rollup state below code. |
| List children = new ArrayList(); |
| extractChildren(adapter, getElement(), children); |
| |
| // reset variabilityinfo status back |
| if(obj instanceof BSActivityItemProvider){ |
| ((BSActivityItemProvider)obj).setEnableVariabilityInfo(enableVariabilityInfo); |
| } |
| |
| return children; |
| } else { |
| return Collections.EMPTY_LIST; |
| } |
| } |
| |
| protected boolean removeNode(Object obj) { |
| if (obj instanceof Activity) { |
| Activity act = (Activity) obj; |
| VariabilityElement base = act.getVariabilityBasedOnElement(); |
| if (base != null) { |
| org.eclipse.uml2.uml.Activity diagram = getDiagram(); |
| |
| // find existing node for the old activity and relink it to its |
| // base |
| // |
| ActivityNode node = BridgeHelper.findNode(diagram, act); |
| if(node == null) { |
| node = BridgeHelper.findNode(diagram, base); |
| } |
| if (node != null) { |
| // disassociate with the old activity |
| // |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node); |
| if(nodeAdapter != null) { |
| nodeAdapter.dispose(); |
| } |
| |
| // associate node with the base activity |
| // |
| nodeAdapter = createNodeAdapter(base); |
| if(nodeAdapter != null) { |
| initializeNodeAdapter(nodeAdapter); |
| nodeAdapter.basicSetTargetReadOnly(true); |
| node.eAdapters().add(nodeAdapter); |
| nodeAdapter.updateView(); |
| if(!BridgeHelper.isInherited(nodeAdapter.getView())){ |
| BridgeHelper.markInherited(nodeAdapter.getView()); |
| } |
| } |
| |
| return false; |
| } |
| } |
| } |
| return super.removeNode(obj); |
| } |
| |
| protected NodeAdapter addNodeAdapterTo(ActivityNode node) { |
| NodeAdapter adapter = BridgeHelper.getNodeAdapter(node); |
| if(adapter != null) { |
| return adapter; |
| } |
| if(node instanceof ControlNode) { |
| adapter = new ControlNodeAdapter(); |
| } |
| else { |
| MethodElement e = BridgeHelper.getMethodElement(node); |
| if(e == null) { |
| if(node instanceof StructuredActivityNode) { |
| String type = BridgeHelper.getType((StructuredActivityNode)node); |
| if (BridgeHelper.UMA_PHASE.equals(type)) { |
| e = UmaFactory.eINSTANCE.createPhase(); |
| } |
| else if (BridgeHelper.UMA_ITERATION.equals(type)) { |
| e = UmaFactory.eINSTANCE.createIteration(); |
| } |
| else { |
| e = UmaFactory.eINSTANCE.createActivity(); |
| } |
| } |
| else if(node instanceof ActivityParameterNode) { |
| String type = BridgeHelper.getType((ActivityParameterNode)node); |
| if(BridgeHelper.UMA_MILESTONE.equals(type)) { |
| e = UmaFactory.eINSTANCE.createMilestone(); |
| } |
| else { |
| e = UmaFactory.eINSTANCE.createTaskDescriptor(); |
| } |
| } |
| } |
| if(e != null) { |
| adapter = new WorkBreakdownElementNodeAdapter(e); |
| } |
| } |
| if(adapter != null) { |
| initializeNodeAdapter(adapter); |
| node.eAdapters().add(adapter); |
| return adapter; |
| } |
| return null; |
| } |
| |
| private ActivityNode reassociateBaseNode(Activity act) { |
| VariabilityElement base = act.getVariabilityBasedOnElement(); |
| if (base != null) { |
| // find existing node for base and link it to the activity |
| // |
| org.eclipse.uml2.uml.Activity diagram = getDiagram(); |
| ActivityNode baseNode = BridgeHelper.findNode(diagram, base); |
| if (baseNode == null) { |
| baseNode = BridgeHelper.findNode(diagram, act); |
| } |
| if (baseNode != null) { |
| // disassociate with the base |
| // |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode); |
| if(nodeAdapter != null) { |
| nodeAdapter.dispose(); |
| } |
| |
| // associate base node with the activity |
| // |
| nodeAdapter = createNodeAdapter(act); |
| if(nodeAdapter != null) { |
| initializeNodeAdapter(nodeAdapter); |
| baseNode.eAdapters().add(nodeAdapter); |
| nodeAdapter.updateView(); |
| // if(ProcessUtil.isExtendingOrLocallyContributing(act)) { |
| BridgeHelper.associate(baseNode, act); |
| if(BridgeHelper.isInherited(nodeAdapter.getView())){ |
| BridgeHelper.unmarkInHerited(nodeAdapter.getView()); |
| } |
| nodeAdapter.setTargetReadOnly(false); |
| // } |
| } |
| |
| return baseNode; |
| } |
| } |
| |
| return null; |
| } |
| |
| @Override |
| protected void replaceNode(Object oldElement, Object newElement) { |
| if(newElement instanceof MethodElement) { |
| // find existing node for old element and link it to the new element |
| // |
| org.eclipse.uml2.uml.Activity diagram = getDiagram(); |
| ActivityNode oldNode = BridgeHelper.findNode(diagram, oldElement); |
| if (oldNode != null) { |
| // disassociate with the old element |
| // |
| NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(oldNode); |
| if(nodeAdapter != null) { |
| nodeAdapter.dispose(); |
| } |
| |
| // associate base node with the new element |
| // |
| MethodElement e = (MethodElement) newElement; |
| nodeAdapter = createNodeAdapter(e); |
| if(nodeAdapter != null) { |
| initializeNodeAdapter(nodeAdapter); |
| oldNode.eAdapters().add(nodeAdapter); |
| nodeAdapter.updateView(); |
| BridgeHelper.associate(oldNode, e); |
| } |
| } |
| } |
| } |
| } |