package com.xrosstools.xunit.editor.policies;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
import org.eclipse.gef.requests.CreateRequest;
import com.xrosstools.xunit.editor.commands.UnitNodeContainerAddCommand;
import com.xrosstools.xunit.editor.commands.UnitNodeContainerCreateCommand;
import com.xrosstools.xunit.editor.commands.UnitNodeContainerMoveChildCommand;
import com.xrosstools.xunit.editor.model.EndPointNode;
import com.xrosstools.xunit.editor.model.LocatorNode;
import com.xrosstools.xunit.editor.model.StartPointNode;
import com.xrosstools.xunit.editor.model.UnitNode;
import com.xrosstools.xunit.editor.model.UnitNodeContainer;
import com.xrosstools.xunit.editor.model.UnitNodeDiagram;
import com.xrosstools.xunit.editor.model.ValidatorNode;
public class UnitNodeContainerLayoutPolicy extends FlowLayoutEditPolicy {
/**
* @return <code>true</code> if the host's LayoutManager is in a horizontal
* orientation
*/
protected boolean isHorizontal() {
IFigure figure = getLayoutContainer();
return ((ToolbarLayout) figure.getLayoutManager()).isHorizontal();
}
protected Command getCreateCommand(CreateRequest request) {
if(!checkAddAllowed((UnitNode)request.getNewObject()))
return null;
if(!checkDropAllowed(getInsertionReference(request)))
return null;
if(isTypeIncompatible(request.getNewObject()))
return null;
return new UnitNodeContainerCreateCommand(
(UnitNodeContainer)getHost().getModel(),
(UnitNode)request.getNewObject(), getIndex(request));
}
@Override
protected Command createAddCommand(EditPart child, EditPart after) {
if(!checkDropAllowed(after))
return null;
if(!selectable(child))
return null;
return new UnitNodeContainerAddCommand(
(UnitNodeContainer)child.getParent().getModel(),
(UnitNodeContainer)getHost().getModel(),
(UnitNode)child.getModel(), getIndex(after));
}
@Override
protected Command createMoveChildCommand(EditPart child, EditPart after) {
return new UnitNodeContainerMoveChildCommand(
(UnitNodeContainer)getHost().getModel(),
(UnitNode)child.getModel(), getIndex(after));
}
private boolean checkAddAllowed(UnitNode unit){
if(!(getHost().getModel() instanceof UnitNodeDiagram))
return true;
return !(unit instanceof StartPointNode || unit instanceof EndPointNode);
}
private boolean checkDropAllowed(EditPart after){
return ((UnitNodeContainer)getHost().getModel()).checkDropAllowed(getIndex(after));
}
private int getIndex(Request request) {
return getIndex(getInsertionReference(request));
}
private int getIndex(EditPart after) {
UnitNodeContainer container = (UnitNodeContainer)getHost().getModel();
int index = -1;
if(after == null)
index = container.getFixedSize() == -1 ? container.size() : container.getFixedSize();
else
index = container.indexOf((UnitNode)after.getModel());
return index;
}
private boolean selectable(EditPart child){
return ((UnitNodeContainer)child.getParent().getModel()).indexOf((UnitNode)child.getModel()) >= 0;
}
private boolean isTypeIncompatible(Object unit){
return invalidTypes.contains(unit.getClass());
}
private Set<Class> invalidTypes = getInvalidTypes();
private Set<Class> getInvalidTypes(){
Set<Class> invalidTypes = new HashSet<Class>();
invalidTypes.add(StartPointNode.class);
invalidTypes.add(EndPointNode.class);
invalidTypes.add(ValidatorNode.class);
invalidTypes.add(LocatorNode.class);
return invalidTypes;
}
}