/*
* Copyright 2005 Pi4 Technologies Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
* Change History:
* Jul 14, 2005 : Initial version created by gary
*/
package org.savara.tools.scenario.designer.policies;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.Viewport;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.ReconnectRequest;
import org.savara.scenario.model.*;
import org.savara.tools.scenario.designer.commands.*;
import org.savara.tools.scenario.designer.model.*;
import org.savara.tools.scenario.designer.parts.*;
import org.savara.tools.scenario.designer.view.ViewSupport;
/**
* This class provides the edit policy for the connectable
* types container.
*/
public class ConnectableRoleEditPolicy
extends org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy {
/**
*
*/
public ConnectableRoleEditPolicy() {
super();
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCompleteCommand(org.eclipse.gef.requests.CreateConnectionRequest)
*/
protected Command getConnectionCompleteCommand(CreateConnectionRequest request) {
Command command =null;
Command requestCommand=request.getStartCommand();
if (requestCommand instanceof ConnectionCommand) {
RoleConnectionCommand newCommand=new RoleConnectionCommand();
newCommand.setSource(((ConnectionCommand)requestCommand).getSource());
newCommand.setLink(((ConnectionCommand)requestCommand).getLink());
requestCommand = newCommand;
}
if (requestCommand instanceof RoleConnectionCommand) {
command = requestCommand;
((RoleConnectionCommand)command).setTarget((Role)getRole());
ScenarioBaseEditPart target=null;
FigureCanvas canvas=(FigureCanvas)
getHost().getViewer().getControl();
Viewport port = canvas.getViewport();
org.eclipse.draw2d.geometry.Point point=
request.getLocation().getTranslated(port.getClientArea().getTopLeft());
if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Event.class);
if (target == null) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
} else if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Event.class);
if (target == null) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
}
if (target != null) {
((RoleConnectionCommand)command).setScenario(target.getScenarioDiagram().getScenario());
}
/* GPB: WAS
if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
if (target == null) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
} else if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
if (target == null) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
}
*/
// GPB: TODO Mislocating target editpart - put
// into to ensure does not try to drop on message
// event part
// Need to check how an edit part is found based
// on bounds and locations
if (target instanceof MessageEventEditPart) {
if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Event.class);
} else if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Event.class);
}
return(null);
}
/* GPB: WAS
if (target instanceof MessageEventEditPart) {
if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
} else if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
target = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
}
return(null);
}
*/
// Prior to connecting, clear selection so as not to interfere with ScenarioEditorPage refresh
getHost().getViewer().deselectAll();
Scenario scenario=null;
if (target != null) {
scenario = target.getScenarioDiagram().getScenario();
}
// Calculate the index position
int y=port.getClientArea().y + request.getLocation().y
- ViewSupport.getHeaderPadding(scenario, target.getModel()); /* -
ViewSupport.INITIAL_YPADDING
- ViewSupport.YPADDING;*/
y -= target.getFigure().getBounds().y;
int index=0;
java.util.List list=ModelSupport.getChildren(target.getModel());
for (int i=0; y > 0 && i < list.size(); i++) {
index++;
y -= ViewSupport.getHeight(list.get(i),
target.getScenarioDiagram());
y -= ViewSupport.getPadding(list, i);
}
((RoleConnectionCommand)command).setTargetParent(target.getModel());
if (((RoleConnectionCommand)command).getSourceParent() == target.getModel()) {
index++;
}
((RoleConnectionCommand)command).setTargetIndex(index);
}
return command;
}
/**
* Feedback should be added to the scaled feedback layer.
* @see org.eclipse.gef.editpolicies.GraphicalEditPolicy#getFeedbackLayer()
*/
protected org.eclipse.draw2d.IFigure getFeedbackLayer() {
return getLayer(org.eclipse.gef.LayerConstants.SCALED_FEEDBACK_LAYER);
}
protected RoleEditPart getConnectableEditPart() {
return((RoleEditPart)getHost());
}
protected Role getRole() {
return((Role)getHost().getModel());
}
/* (non-Javadoc)
* @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCreateCommand(org.eclipse.gef.requests.CreateConnectionRequest)
*/
protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
RoleConnectionCommand command=null;
ScenarioBaseEditPart source=null;
FigureCanvas canvas=(FigureCanvas)
getHost().getViewer().getControl();
Viewport port = canvas.getViewport();
org.eclipse.draw2d.geometry.Point point=
request.getLocation().getTranslated(port.getClientArea().getTopLeft());
if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
source = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Group.class);
if (source == null) {
source = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
/*
} else if (request.getSourceEditPart() instanceof RoleEditPart) {
source = ((RoleEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
*/
} else if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
source = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Group.class);
if (source == null) {
source = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
/*
} else if (request.getTargetEditPart() instanceof RoleEditPart) {
source = ((RoleEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Group.class);
source = ((RoleEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
*/
}
/* GPB: WAS
if (request.getSourceEditPart() instanceof ScenarioBaseEditPart) {
source = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
if (source == null) {
source = ((ScenarioBaseEditPart)request.getSourceEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
} else if (request.getTargetEditPart() instanceof ScenarioBaseEditPart) {
source = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
ScenarioObject.class);
if (source == null) {
source = ((ScenarioBaseEditPart)request.getTargetEditPart()).getScenarioDiagram().findEditPartAtLocation(point,
Scenario.class);
}
}
*/
//if (getParticipant() != null &&
// getParticipant().getDirection() ==
// MessageDirection.SEND) {
if (source instanceof GroupEditPart ||
source instanceof ScenarioEditPart) {
command = new RoleConnectionCommand();
command.setLink((Link) request.getNewObject());
command.setSource((Role)getRole());
request.setStartCommand(command);
// Calculate the index position
int y=port.getClientArea().y + request.getLocation().y
- ViewSupport.getHeaderPadding(source.getScenarioDiagram().getScenario(),
source.getModel()); /* -
ViewSupport.INITIAL_YPADDING
- ViewSupport.YPADDING;*/
y -= source.getFigure().getBounds().y;
int index=0;
java.util.List list=ModelSupport.getChildren(source.getModel());
for (int i=0; y > 0 && i < list.size(); i++) {
index++;
y -= ViewSupport.getHeight(list.get(i), source.getScenarioDiagram());
y -= ViewSupport.getPadding(list, i);
}
command.setSourceIndex(index);
command.setSourceParent(source.getModel());
if (source != null) {
((RoleConnectionCommand)command).setScenario(source.getScenarioDiagram().getScenario());
}
}
return(command);
}
/* (non-Javadoc)
* @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectTargetCommand(org.eclipse.gef.requests.ReconnectRequest)
*/
protected Command getReconnectTargetCommand(ReconnectRequest request) {
RoleConnectionCommand command = null; //new ParticipantConnectionCommand();
/*
MessageLink rel = (MessageLink)((MessageLinkEditPart) request.getConnectionEditPart()).getModel();
command.setMessageLink(rel);
command.setOldTarget(rel.getTarget());
command.setTarget((MessageEvent)getParticipant());
*/
return command;
}
/* (non-Javadoc)
* @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectSourceCommand(org.eclipse.gef.requests.ReconnectRequest)
*/
protected Command getReconnectSourceCommand(ReconnectRequest request) {
RoleConnectionCommand command = null; //new ParticipantConnectionCommand();
/*
MessageLink rel = (MessageLink)((MessageLinkEditPart) request.getConnectionEditPart()).getModel();
command.setMessageLink(rel);
command.setOldSource(rel.getSource());
command.setSource((MessageEvent)getParticipant());
*/
return command;
}
}