/*******************************************************************************
* Copyright (c) 2003, 2005 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 API and implementation
*******************************************************************************/
package org.eclipse.gef.examples.flow.parts;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
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.requests.DirectEditRequest;
import org.eclipse.gef.examples.flow.figures.SubgraphFigure;
import org.eclipse.gef.examples.flow.model.StructuredActivity;
import org.eclipse.gef.examples.flow.policies.ActivityContainerEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivityContainerHighlightEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivityEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivityNodeEditPolicy;
import org.eclipse.gef.examples.flow.policies.StructuredActivityDirectEditPolicy;
import org.eclipse.gef.examples.flow.policies.StructuredActivityLayoutEditPolicy;
/**
* @author hudsonr
* Created on Jun 30, 2003
*/
public abstract class StructuredActivityPart extends ActivityPart
implements NodeEditPart {
static final Insets PADDING = new Insets(8, 6, 8, 6);
static final Insets INNER_PADDING = new Insets(0);
protected void applyChildrenResults(CompoundDirectedGraph graph, Map map) {
for (int i = 0; i < getChildren().size(); i++) {
ActivityPart part = (ActivityPart)getChildren().get(i);
part.applyGraphResults(graph, map);
}
}
protected void applyGraphResults(CompoundDirectedGraph graph, Map map) {
applyOwnResults(graph, map);
applyChildrenResults(graph, map);
}
protected void applyOwnResults(CompoundDirectedGraph graph, Map map) {
super.applyGraphResults(graph, map);
}
/**
* @see org.eclipse.gef.examples.flow.parts.ActivityPart#createEditPolicies()
*/
protected void createEditPolicies() {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ActivityNodeEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ActivityEditPolicy());
installEditPolicy(
EditPolicy.SELECTION_FEEDBACK_ROLE,
new ActivityContainerHighlightEditPolicy());
installEditPolicy(EditPolicy.CONTAINER_ROLE, new ActivityContainerEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new StructuredActivityLayoutEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new StructuredActivityDirectEditPolicy());
}
public void contributeNodesToGraph(CompoundDirectedGraph graph, Subgraph s, Map map) {
GraphAnimation.recordInitialState(getContentPane());
Subgraph me = new Subgraph(this, s);
// me.rowOrder = getActivity().getSortIndex();
me.outgoingOffset = 5;
me.incomingOffset = 5;
IFigure fig = getFigure();
if (fig instanceof SubgraphFigure) {
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 = INNER_PADDING;
me.setPadding(PADDING);
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);
}
}
private boolean directEditHitTest(Point requestLoc) {
IFigure header = ((SubgraphFigure)getFigure()).getHeader();
header.translateToRelative(requestLoc);
if (header.containsPoint(requestLoc))
return true;
return false;
}
/**
* @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
*/
public void performRequest(Request request) {
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
if (request instanceof DirectEditRequest
&& !directEditHitTest(((DirectEditRequest) request)
.getLocation()
.getCopy()))
return;
performDirectEdit();
}
}
int getAnchorOffset() {
return -1;
}
public IFigure getContentPane() {
if (getFigure() instanceof SubgraphFigure)
return ((SubgraphFigure)getFigure()).getContents();
return getFigure();
}
protected List getModelChildren() {
return getStructuredActivity().getChildren();
}
StructuredActivity getStructuredActivity() {
return (StructuredActivity)getModel();
}
/**
* @see org.eclipse.gef.examples.flow.parts.ActivityPart#performDirectEdit()
*/
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.editparts.AbstractEditPart#refreshVisuals()
*/
protected void refreshVisuals() {
((Label)((SubgraphFigure)getFigure()).getHeader()).setText(getActivity().getName());
((Label)((SubgraphFigure)getFigure()).getFooter())
.setText("/" + getActivity().getName()); //$NON-NLS-1$
}
}