/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.config.graph.parts;
import java.util.List;
import java.util.Map;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.graph.CompoundDirectedGraph;
import org.eclipse.draw2d.graph.Subgraph;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.jface.viewers.TextCellEditor;
import org.springframework.ide.eclipse.config.graph.figures.ParallelActivityFigure;
import org.springframework.ide.eclipse.config.graph.figures.SequentialActivityFigure;
import org.springframework.ide.eclipse.config.graph.figures.SubgraphFigure;
import org.springframework.ide.eclipse.config.graph.model.Activity;
import org.springframework.ide.eclipse.config.graph.model.StructuredActivity;
import org.springframework.ide.eclipse.config.graph.policies.ActivityContainerHighlightEditPolicy;
import org.springframework.ide.eclipse.config.graph.policies.ActivityEditPolicy;
import org.springframework.ide.eclipse.config.graph.policies.ActivityNodeEditPolicy;
import org.springframework.ide.eclipse.config.graph.policies.StructuredActivityDirectEditPolicy;
import org.springframework.ide.eclipse.config.graph.policies.StructuredActivityLayoutEditPolicy;
/**
* @author Leo Dos Santos
* @author Christian Dupuis
*/
public abstract class StructuredActivityPart extends ActivityPart implements NodeEditPart {
public StructuredActivityPart(StructuredActivity activity) {
super(activity);
}
protected void applyChildrenResults(CompoundDirectedGraph graph, Map<AbstractGraphicalEditPart, Object> map) {
for (int i = 0; i < getChildren().size(); i++) {
ActivityPart part = (ActivityPart) getChildren().get(i);
part.applyGraphResults(graph, map);
}
}
@Override
protected void applyGraphResults(CompoundDirectedGraph graph, Map<AbstractGraphicalEditPart, Object> map) {
applyOwnResults(graph, map);
applyChildrenResults(graph, map);
}
protected void applyOwnResults(CompoundDirectedGraph graph, Map<AbstractGraphicalEditPart, Object> map) {
super.applyGraphResults(graph, map);
}
@Override
protected void contributeNodesToGraph(CompoundDirectedGraph graph, Subgraph s,
Map<AbstractGraphicalEditPart, Object> map) {
GraphAnimation.recordInitialState(getContentPane());
Subgraph me = new Subgraph(this, s);
// me.setRowConstraint(getActivity().getSortIndex());
me.outgoingOffset = 5;
me.incomingOffset = 5;
IFigure fig = getFigure();
if (fig instanceof SubgraphFigure) {
if (graph.getDirection() == PositionConstants.EAST) {
if (fig instanceof ParallelActivityFigure) {
me.width = fig.getPreferredSize(me.width, me.height).width;
int tagHeight = ((SubgraphFigure) fig).getHeader().getPreferredSize().height;
int tagWidth = ((SubgraphFigure) fig).getHeader().getPreferredSize().width;
me.insets.left = tagHeight;
me.insets.top = tagWidth;
me.insets.right = tagHeight;
}
else if (fig instanceof SequentialActivityFigure) {
me.height = fig.getPreferredSize(me.width, me.height).height;
int tagWidth = ((SubgraphFigure) fig).getHeader().getPreferredSize().width;
me.insets.top = tagWidth;
me.insets.left = 0;
me.insets.bottom = tagWidth;
}
}
else {
me.width = fig.getPreferredSize(me.width, me.height).width;
int tagHeight = ((SubgraphFigure) fig).getHeader().getPreferredSize().height;
me.insets.top = tagHeight;
me.insets.left = 0;
me.insets.bottom = tagHeight;
}
}
me.innerPadding = new Insets(0);
if (graph.getDirection() == PositionConstants.EAST) {
me.setPadding(new Insets(6, 8, 6, 8));
}
else {
me.setPadding(new Insets(8, 6, 8, 6));
}
map.put(this, me);
graph.nodes.add(me);
for (int i = 0; i < getChildren().size(); i++) {
ActivityPart activity = (ActivityPart) getChildren().get(i);
activity.contributeNodesToGraph(graph, me, map);
}
for (int i = 0; i < getSourceConnections().size(); i++) {
TransitionPart trans = (TransitionPart) getSourceConnections().get(i);
Subgraph sub = (Subgraph) map.get(getViewer().getContents());
trans.contributeNodesToGraph(graph, s, map);
}
}
/**
* @see org.springframework.ide.eclipse.config.graph.parts.ActivityPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ActivityEditPolicy());
// installEditPolicy(EditPolicy.CONTAINER_ROLE, new
// ActivityContainerEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new StructuredActivityDirectEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ActivityNodeEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new StructuredActivityLayoutEditPolicy());
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ActivityContainerHighlightEditPolicy());
}
private boolean directEditHitTest(Point requestLoc) {
IFigure header = ((SubgraphFigure) getFigure()).getHeader();
header.translateToRelative(requestLoc);
if (header.containsPoint(requestLoc)) {
return true;
}
return false;
}
@Override
protected int getAnchorOffset() {
return -1;
}
@Override
public IFigure getContentPane() {
if (getFigure() instanceof SubgraphFigure) {
return ((SubgraphFigure) getFigure()).getContents();
}
return getFigure();
}
@Override
protected List<Activity> getModelChildren() {
return getStructuredActivity().getChildren();
}
StructuredActivity getStructuredActivity() {
return (StructuredActivity) getModel();
}
/**
* @see org.springframework.ide.eclipse.config.graph.parts.ActivityPart#performDirectEdit()
*/
@Override
protected void performDirectEdit() {
if (manager == null) {
Label l = ((Label) ((SubgraphFigure) getFigure()).getHeader());
manager = new ActivityDirectEditManager(this, TextCellEditor.class, new ActivityCellEditorLocator(l), l);
}
manager.show();
}
/**
* @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
*/
@Override
public void performRequest(Request request) {
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
if (request instanceof DirectEditRequest
&& !directEditHitTest(((DirectEditRequest) request).getLocation().getCopy())) {
return;
}
performDirectEdit();
}
else if (request.getType() == RequestConstants.REQ_OPEN) {
performOpen();
}
}
@Override
protected void refreshFigureVisuals() {
((Label) ((SubgraphFigure) getFigure()).getHeader()).setText(getActivity().getName());
((Label) ((SubgraphFigure) getFigure()).getFooter()).setText("/" + getActivity().getName()); //$NON-NLS-1$
}
}