| //------------------------------------------------------------------------------ |
| // 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.authoring.gef.edit; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.epf.diagram.model.ActivityDetailDiagram; |
| import org.eclipse.epf.diagram.model.Node; |
| import org.eclipse.epf.diagram.model.TaskNode; |
| import org.eclipse.epf.diagram.model.WorkProductComposite; |
| import org.eclipse.epf.diagram.model.WorkProductDescriptorNode; |
| import org.eclipse.epf.uma.TaskDescriptor; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.GraphicalEditPart; |
| |
| |
| /** |
| * @author Phong Nguyen Le |
| * @author Shashidhar Kannoori |
| * @since 1.0 |
| * |
| */ |
| public class ActivityDetailDiagramEditPart extends DiagramEditPart { |
| |
| int y = 60; |
| |
| boolean xaxisbegin = false; |
| |
| boolean loading = true; |
| |
| final static int spacing = 40; |
| |
| final static int yspacing = 20; |
| |
| boolean miscellaneous = false; |
| |
| int x = 10; |
| |
| public static final String OUTPUTS = "outputs"; //$NON-NLS-1$ |
| |
| public static final String INPUTS = "inputs"; //$NON-NLS-1$ |
| |
| private List recentlyAddedParts = new ArrayList(); |
| |
| /** |
| * EditPart for ActivityDetailDiagram. |
| */ |
| public ActivityDetailDiagramEditPart(ActivityDetailDiagram model) { |
| super(model); |
| } |
| |
| /** |
| * Override method super.resetChildrenLocations. In this, All the Task's |
| * MandatoryInput workproducts placed on top. and RoleTask composite in the |
| * middle. and Task's output workproducts south. |
| */ |
| protected void resetChildrenLocations() { |
| final int yspacing = 40; |
| List rolecompositeList = new ArrayList(); |
| List inputworkproductCompositeList = new ArrayList(); |
| List outputWorkProductCompositeList = new ArrayList(); |
| List miscList = new ArrayList(); |
| List taskList = new ArrayList(); |
| this.recentlyAddedParts = new ArrayList(); |
| |
| HashMap map = new HashMap(); |
| |
| for (Iterator iter = getChildren().iterator(); iter.hasNext();) { |
| Object child = iter.next(); |
| Node n = (Node) ((EditPart) child).getModel(); |
| if (n.getLocation() == null || n.getLocation().x == -1) { |
| this.recentlyAddedParts.add(child); |
| } |
| if (child instanceof RoleTaskCompositeEditPart) { |
| rolecompositeList.add(child); |
| List list = ((RoleTaskCompositeEditPart) child).getChildren(); |
| for (Iterator it = list.iterator(); it.hasNext();) { |
| Object obj = it.next(); |
| Node objNode = (Node) ((NodeEditPart) obj).getModel(); |
| if (objNode instanceof TaskNode) { |
| taskList.add(objNode); |
| HashMap taskMap = new HashMap(); |
| List inputList = new ArrayList(); |
| List outputList = new ArrayList(); |
| taskMap.put("inputs", inputList); //$NON-NLS-1$ |
| taskMap.put("outputs", outputList); //$NON-NLS-1$ |
| map.put(objNode, taskMap); |
| } |
| } |
| } else if (child instanceof WorkProductCompositeEditPart) { |
| GraphicalEditPart part = (GraphicalEditPart) child; |
| if (part.getModel() instanceof WorkProductComposite) { |
| WorkProductComposite node = (WorkProductComposite) part |
| .getModel(); |
| if (node.getType() == WorkProductComposite.INPUTS) { |
| inputworkproductCompositeList.add(child); |
| } else if (node.getType() == WorkProductComposite.OUTPUTS) { |
| outputWorkProductCompositeList.add(child); |
| } |
| calcSize(child); |
| } |
| } else { |
| miscList.add(child); |
| } |
| } |
| |
| // Set size for the rolecomposite. |
| if (!rolecompositeList.isEmpty()) { |
| for (Iterator itor = rolecompositeList.iterator(); itor.hasNext();) { |
| Object object = itor.next(); |
| List list = ((RoleTaskCompositeEditPart) object).getChildren(); |
| for (Iterator itor1 = list.iterator(); itor1.hasNext();) { |
| Object obj = itor1.next(); |
| if (obj instanceof DescriptorNodeEditPart) { |
| if (((DescriptorNodeEditPart) obj).getModel() instanceof TaskNode) { |
| TaskNode taskNode = (TaskNode) ((DescriptorNodeEditPart) obj) |
| .getModel(); |
| TaskDescriptor task = (TaskDescriptor) taskNode |
| .getObject(); |
| for (Iterator wpitor = inputworkproductCompositeList |
| .iterator(); wpitor.hasNext();) { |
| WorkProductCompositeEditPart wpEditPart = (WorkProductCompositeEditPart) wpitor |
| .next(); |
| WorkProductComposite wpCompositeNode = (WorkProductComposite) wpEditPart |
| .getModel(); |
| Object wpObject = wpCompositeNode.getObject(); |
| if (wpObject.equals(task)) { |
| int width = wpEditPart.getFigure() |
| .getPreferredSize().width; |
| int height = ((DescriptorNodeEditPart) obj) |
| .getFigure().getPreferredSize().height; |
| ((DescriptorNodeEditPart) obj) |
| .getFigure() |
| .setPreferredSize( |
| new Dimension(width, height)); |
| if (((WorkProductComposite) wpEditPart |
| .getModel()).getType() == WorkProductComposite.INPUTS) { |
| List inputList = (List) ((HashMap) map |
| .get(taskNode)).get(INPUTS); |
| inputList.add(wpEditPart); |
| } else if (((WorkProductComposite) wpEditPart |
| .getModel()).getType() == WorkProductComposite.OUTPUTS) { |
| List outputList = (List) ((HashMap) map |
| .get(taskNode)).get(OUTPUTS); |
| outputList.add(wpEditPart); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| if (!rolecompositeList.isEmpty()) { |
| for (int i = 0; i < rolecompositeList.size(); i++) { |
| List confirmedSeqInputList = new ArrayList(); |
| List confirmedSeqOutputList = new ArrayList(); |
| List list = ((RoleTaskCompositeEditPart) rolecompositeList |
| .get(i)).getChildren(); |
| for (int j = 0; j < list.size(); j++) { |
| DescriptorNodeEditPart task = (DescriptorNodeEditPart) list |
| .get(j); |
| if (task.getModel() instanceof TaskNode) { |
| TaskNode tasknode = (TaskNode) task.getModel(); |
| for (int k = 0; k < inputworkproductCompositeList |
| .size(); k++) { |
| WorkProductComposite wpcomp = ((WorkProductComposite) ((WorkProductCompositeEditPart) inputworkproductCompositeList |
| .get(k)).getModel()); |
| if (wpcomp.getObject().equals(tasknode.getObject())) { |
| if (wpcomp.getType() == WorkProductComposite.INPUTS) { |
| confirmedSeqInputList |
| .add(inputworkproductCompositeList |
| .get(k)); |
| } |
| } |
| } |
| for (int k = 0; k < outputWorkProductCompositeList |
| .size(); k++) { |
| WorkProductComposite wpcomp = ((WorkProductComposite) ((WorkProductCompositeEditPart) outputWorkProductCompositeList |
| .get(k)).getModel()); |
| if (wpcomp.getObject().equals(tasknode.getObject())) { |
| if (wpcomp.getType() == WorkProductComposite.OUTPUTS) { |
| confirmedSeqOutputList |
| .add(outputWorkProductCompositeList |
| .get(k)); |
| } |
| } |
| } |
| } |
| } |
| if (!confirmedSeqInputList.isEmpty()) { |
| setObjectsLocations(confirmedSeqInputList); |
| y = cachedPoint.y + cachedHeight + yspacing; |
| } |
| List roleC = new ArrayList(); |
| roleC.add(rolecompositeList.get(i)); |
| setObjectsLocations(roleC); |
| |
| y = cachedPoint.y + cachedHeight + yspacing; |
| if (!confirmedSeqOutputList.isEmpty()) { |
| setObjectsLocations(confirmedSeqOutputList); |
| y = cachedPoint.y + cachedHeight + yspacing; |
| } |
| } |
| |
| } |
| |
| if (!miscList.isEmpty()) { |
| if (debug) { |
| System.out.println("Print Size of misc: " + miscList.size()); //$NON-NLS-1$ |
| } |
| if (!loading) { |
| miscellaneous = true; |
| } |
| setObjectsLocations(miscList); |
| miscellaneous = false; |
| } |
| |
| loading = false; |
| } |
| |
| private void calcSize(Object child) { |
| List list = ((GraphicalEditPart) child).getChildren(); |
| int largestWidth = 0; |
| int largestHeight = 0; |
| for (Iterator it = list.iterator(); it.hasNext();) { |
| Object obj = it.next(); |
| Node objNode = (Node) ((NodeEditPart) obj).getModel(); |
| if (objNode instanceof WorkProductDescriptorNode) { |
| int nodeWidth = ((DescriptorNodeEditPart) obj).getFigure() |
| .getPreferredSize().width; |
| int nodeHeight = ((DescriptorNodeEditPart) obj).getFigure() |
| .getPreferredSize().height; |
| if (nodeWidth > largestWidth) |
| largestWidth = nodeWidth; |
| if (nodeHeight > largestHeight) |
| largestHeight = nodeHeight; |
| } |
| } |
| ((WorkProductCompositeEditPart) child).getFigure().setPreferredSize( |
| new Dimension(largestWidth * 2 + 10, 20 + largestHeight |
| * (list.size() / 2 + 1))); |
| } |
| |
| private void setObjectsLocations(List list) { |
| |
| xaxisbegin = true; |
| x = 10; |
| for (Iterator iter = list.iterator(); iter.hasNext();) { |
| Object child = iter.next(); |
| if (child instanceof GraphicalEditPart) { |
| GraphicalEditPart part = (GraphicalEditPart) child; |
| if (part.getModel() instanceof Node) { |
| Node node = (Node) part.getModel(); |
| Point p = node.getLocation(); |
| if (p == null || p.x == -1) { |
| int viewerWidth = part.getRoot().getViewer() |
| .getControl().getBounds().width; |
| if (!xaxisbegin) { |
| x = cachedPoint.x + cachedWidth + spacing; |
| } |
| // check if p is null, create Point. |
| if (p == null) |
| p = new Point(); |
| |
| if (!loading && miscellaneous) { |
| p.x = x; |
| p.y = 10; |
| } else { |
| p.x = x; |
| p.y = y; |
| } |
| node.setLocation(p); |
| if (!miscellaneous) |
| cachedPoint = p; |
| cachedWidth = part.getFigure().getPreferredSize().width; |
| if (part.getFigure().getPreferredSize().height > cachedHeight) |
| cachedHeight = part.getFigure().getPreferredSize().height; |
| xaxisbegin = false; |
| if (debug) { |
| System.out |
| .println("Point : " + new Point(x, y).toString() + "And width=" //$NON-NLS-1$ //$NON-NLS-2$ |
| + cachedWidth |
| + ", Height=" + cachedHeight + ", Width of Viewer: " + viewerWidth); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * Returns recently addded editparts. Usually called |
| * by diagram services to do autolayout adjustment. |
| */ |
| public List getRecentlyAddedParts() { |
| return recentlyAddedParts; |
| } |
| |
| /** |
| * Clear the recently added editparts from the list. |
| */ |
| public void clearRecentlyAddedParts() { |
| recentlyAddedParts.clear(); |
| } |
| |
| } |