/******************************************************************************* * Copyright (c) 2007 Spring IDE Developers * 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: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.webflow.ui.graph.policies; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.gef.EditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy; import org.eclipse.gef.requests.CreateConnectionRequest; import org.eclipse.gef.requests.ReconnectRequest; import org.springframework.ide.eclipse.webflow.core.model.IActionElement; import org.springframework.ide.eclipse.webflow.core.model.IAttributeMapper; import org.springframework.ide.eclipse.webflow.core.model.IDecisionState; import org.springframework.ide.eclipse.webflow.core.model.IEndState; import org.springframework.ide.eclipse.webflow.core.model.IIf; import org.springframework.ide.eclipse.webflow.core.model.IIfTransition; import org.springframework.ide.eclipse.webflow.core.model.IInlineFlowState; import org.springframework.ide.eclipse.webflow.core.model.IState; import org.springframework.ide.eclipse.webflow.core.model.IStateTransition; import org.springframework.ide.eclipse.webflow.core.model.ITransitionableFrom; import org.springframework.ide.eclipse.webflow.core.model.ITransitionableTo; import org.springframework.ide.eclipse.webflow.ui.graph.commands.IfTransitionCreateCommand; import org.springframework.ide.eclipse.webflow.ui.graph.commands.ReconnectIfTransitionTargetCommand; import org.springframework.ide.eclipse.webflow.ui.graph.commands.ReconnectSourceCommand; import org.springframework.ide.eclipse.webflow.ui.graph.commands.ReconnectTargetCommand; import org.springframework.ide.eclipse.webflow.ui.graph.commands.StateTransitionCreateCommand; import org.springframework.ide.eclipse.webflow.ui.graph.parts.AbstractStatePart; /** * @author Christian Dupuis */ public class StateNodeEditPolicy extends GraphicalNodeEditPolicy { /* (non-Javadoc) * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCompleteCommand(org.eclipse.gef.requests.CreateConnectionRequest) */ protected Command getConnectionCompleteCommand( CreateConnectionRequest request) { if (request.getNewObject() instanceof IStateTransition) { if (getHost().getModel() instanceof ITransitionableTo) { StateTransitionCreateCommand cmd = (StateTransitionCreateCommand) request .getStartCommand(); IState source = cmd.getSource(); ITransitionableTo target = (ITransitionableTo) getState(); if (!(target instanceof IInlineFlowState) && source.getElementParent().equals(target.getElementParent())) { cmd.setTarget((ITransitionableTo) getState()); return cmd; } else { return null; } } } else if (request.getNewObject() instanceof IIfTransition) { if (getHost().getModel() instanceof ITransitionableTo) { IfTransitionCreateCommand cmd = (IfTransitionCreateCommand) request .getStartCommand(); cmd.setTarget((ITransitionableTo) getState()); return cmd; } } return null; } /* (non-Javadoc) * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCreateCommand(org.eclipse.gef.requests.CreateConnectionRequest) */ protected Command getConnectionCreateCommand(CreateConnectionRequest request) { if (request.getNewObject() instanceof IStateTransition) { if (getHost().getModel() instanceof IEndState || getHost().getModel() instanceof IActionElement || getHost().getModel() instanceof IAttributeMapper || getHost().getModel() instanceof IDecisionState || getHost().getModel() instanceof IIf || getHost().getModel() instanceof IInlineFlowState) return null; StateTransitionCreateCommand cmd = new StateTransitionCreateCommand(); cmd.setSource((ITransitionableFrom) getHost().getModel()); request.setStartCommand(cmd); return cmd; } else if (request.getNewObject() instanceof IIfTransition) { if (!(getHost().getModel() instanceof IIf)) return null; if (((IIf) getHost().getModel()).getElseTransition() != null) return null; IfTransitionCreateCommand cmd = new IfTransitionCreateCommand(); cmd.setSource((IIf) getHost().getModel()); request.setStartCommand(cmd); return cmd; } return null; } /** * * * @return */ protected AbstractStatePart getStatePart() { return (AbstractStatePart) getHost(); } /** * * * @return */ protected IState getState() { return (IState) getHost().getModel(); } /* (non-Javadoc) * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectSourceCommand(org.eclipse.gef.requests.ReconnectRequest) */ protected Command getReconnectSourceCommand(ReconnectRequest request) { if (request.getConnectionEditPart().getModel() instanceof IStateTransition && getHost().getModel() instanceof ITransitionableFrom) { ReconnectSourceCommand cmd = new ReconnectSourceCommand(); cmd.setTransition((IStateTransition) request .getConnectionEditPart().getModel()); cmd.setSource((ITransitionableFrom) getState()); return cmd; } else if (request.getConnectionEditPart().getModel() instanceof IIfTransition && getHost().getModel() instanceof IIf) { /* * ReconnectIfTransitionSourceCommand cmd = new * ReconnectIfTransitionSourceCommand(); * cmd.setTransition((IIfTransition) request * .getConnectionEditPart().getModel()); cmd.setSource((IIf) * getHost().getModel()); return cmd; */ } return null; } /* (non-Javadoc) * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectTargetCommand(org.eclipse.gef.requests.ReconnectRequest) */ protected Command getReconnectTargetCommand(ReconnectRequest request) { if (request.getConnectionEditPart().getModel() instanceof IStateTransition && getHost().getModel() instanceof ITransitionableTo) { ReconnectTargetCommand cmd = new ReconnectTargetCommand(); cmd.setTransition((IStateTransition) request .getConnectionEditPart().getModel()); cmd.setTarget((ITransitionableTo) getState()); return cmd; } else if (request.getConnectionEditPart().getModel() instanceof IIfTransition && getHost().getModel() instanceof ITransitionableTo) { ReconnectIfTransitionTargetCommand cmd = new ReconnectIfTransitionTargetCommand(); cmd.setTransition((IIfTransition) request.getConnectionEditPart() .getModel()); cmd.setTarget((ITransitionableTo) getState()); return cmd; } return null; } /* (non-Javadoc) * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getTargetConnectionAnchor(org.eclipse.gef.requests.CreateConnectionRequest) */ protected ConnectionAnchor getTargetConnectionAnchor( CreateConnectionRequest request) { EditPart target = request.getTargetEditPart(); if (target != null && (target.getModel() instanceof IActionElement || target.getModel() instanceof IAttributeMapper)) return null; return target instanceof NodeEditPart ? ((NodeEditPart) target) .getTargetConnectionAnchor(request) : null; } }