blob: 705043651fbeb8b5411129da0624aa99e4eaa556 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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();
}
}