blob: 1021851f15adffc6b8b360cd32e1e2d7fe6162bf [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.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.BendpointConnectionRouter;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.FanRouter;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.authoring.gef.commands.DeleteCommand;
import org.eclipse.epf.authoring.gef.edit.policies.NodeContainerEditPolicy;
import org.eclipse.epf.authoring.gef.edit.policies.NodeContainerFlowLayoutEditPolicy;
import org.eclipse.epf.diagram.model.Diagram;
import org.eclipse.epf.diagram.model.ModelPackage;
import org.eclipse.epf.diagram.model.NamedNode;
import org.eclipse.epf.diagram.model.Node;
import org.eclipse.epf.diagram.model.NodeContainer;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.ComponentEditPolicy;
import org.eclipse.gef.requests.GroupRequest;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.gef.ui.actions.ActionRegistry;
/**
* NodeContainerEditPart manages the child editparts in a {@link GraphicalViewer}.
* Provides instructure to handle the notifications from model.
*
* @author Phong Nguyen Le
* @since 1.0
*/
public abstract class NodeContainerEditPart extends AbstractGraphicalEditPart
implements LayerConstants {
private BendpointConnectionRouter cRouter;
protected Adapter modelListener = new AdapterImpl() {
public void notifyChanged(Notification msg) {
handlePropertyChanged(msg);
}
};
public NodeContainerEditPart(NodeContainer model) {
super();
setModel(model);
}
public void activate() {
super.activate();
NodeContainer model = (NodeContainer) ((EObject) getModel());
model.eAdapters().add(modelListener);
model.addConsumer(this);
}
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
protected Command createDeleteCommand(GroupRequest deleteRequest) {
Boolean bool = (Boolean) deleteRequest.getExtendedData().get(
DeleteCommand.KEY_PERM_DELETE);
boolean permDelete = bool == null ? false : bool.booleanValue();
DeleteCommand cmd = new DeleteCommand(permDelete);
cmd.setPartToBeDeleted(getHost().getModel());
return cmd;
}
});
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
installEditPolicy(EditPolicy.CONTAINER_ROLE,
new NodeContainerEditPolicy());
installEditPolicy(EditPolicy.NODE_ROLE, null);
installEditPolicy(EditPolicy.LAYOUT_ROLE,
new NodeContainerFlowLayoutEditPolicy());
}
public void deactivate() {
NodeContainer model = (NodeContainer) ((EObject) getModel());
model.eAdapters().remove(modelListener);
model.removeConsumer(this);
super.deactivate();
}
protected EditPart findChildByModel(Object model) {
for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
EditPart child = (EditPart) iter.next();
if (child.getModel() == model) {
return child;
}
}
return null;
}
protected void addPartToEdit(Collection partsToEdit, Object node) {
if (node instanceof NamedNode) {
EditPart editPart = findChildByModel(node);
if (editPart instanceof BaseEditPart) {
DirectEditManager editManager = ((BaseEditPart) editPart)
.getDirectEditManager();
if (editManager instanceof ValidatingDirectEditManager
&& ((ValidatingDirectEditManager) editManager)
.validate(((NamedNode) node).getName()) != null) {
partsToEdit.add(editPart);
}
}
}
}
protected void handlePropertyChanged(Notification msg) {
switch (msg.getFeatureID(NodeContainer.class)) {
case ModelPackage.NODE__LOCATION:
case ModelPackage.NODE__WIDTH:
refreshVisuals();
break;
case ModelPackage.NODE__OUTGOING_CONNECTIONS:
refreshSourceConnections();
break;
case ModelPackage.NODE__INCOMING_CONNECTIONS:
refreshTargetConnections();
break;
case ModelPackage.NODE_CONTAINER__NODES:
refreshChildren();
List partsToEdit = new ArrayList();
switch (msg.getEventType()) {
case Notification.ADD:
addPartToEdit(partsToEdit, msg.getNewValue());
break;
case Notification.ADD_MANY:
for (Iterator iter = ((Collection) msg.getNewValue())
.iterator(); iter.hasNext();) {
addPartToEdit(partsToEdit, iter.next());
}
break;
}
if (getViewer().getControl().isFocusControl()) {
for (Iterator iter = partsToEdit.iterator(); iter.hasNext();) {
BaseEditPart editPart = (BaseEditPart) iter.next();
editPart.performDirectEdit();
}
}
break;
}
}
protected void refreshVisuals() {
Node node = (Node) getModel();
Dimension size = new Dimension(node.getWidth(), node.getHeight());
if (size == null) {
size = new Dimension(60, 100);
}
Point loc = node.getLocation();
if (loc == null) {
loc = new Point(10, 10);
}
Rectangle r = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), r);
if (cRouter == null) {
ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
FanRouter router = new FanRouter();
router.setSeparation(30);
cRouter = new BendpointConnectionRouter();
router.setNextRouter(cRouter);
cLayer.setConnectionRouter(router);
}
}
protected List getModelChildren() {
return ((NodeContainer) getModel()).getNodes();
}
/**
* Only useful in case of ADD. Placed here in order to invoke in sub classes.
* TODO: Move this method to utility class.
*/
protected void cleanUpDiagram(EditPart part) {
EditPart dep = (EditPart) part.getParent();
if(dep instanceof ActivityDetailDiagramEditPart ){
ActivityDetailDiagramEditPart add = ((ActivityDetailDiagramEditPart)dep);
if(!((Diagram)add.getModel()).isReadOnly()){
add.getRecentlyAddedParts().addAll(dep.getChildren());
// clean up the diagram
DefaultEditDomain editingDomain = new DefaultEditDomain(null);
ActionRegistry actionRegistry = new ActionRegistry();
DiagramActionService actionService = new DiagramActionService(
(GraphicalViewer)getParent().getViewer(), editingDomain, actionRegistry);
actionService.registerVerticalAlignFirstSelectedAction();
DiagramUpdateService service = new DiagramUpdateService(
(GraphicalViewer)getParent().getViewer(), editingDomain, actionRegistry);
service.cleanUpDiagram();
}
}
}
}