package net.ms.designer.editors.componentdetail.editparts;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.List;
import net.ms.designer.editors.componentdetail.figures.ShortestPathConnectionRouter;
import net.ms.designer.editors.componentdetail.models.Container;
import net.ms.designer.editors.componentdetail.policies.LogicContainerEditPolicy;
import net.ms.designer.editors.componentdetail.policies.LogicXYLayoutEditPolicy;
import org.eclipse.draw2d.AutomaticRouter;
import org.eclipse.draw2d.BendpointConnectionRouter;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.FanRouter;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ManhattanConnectionRouter;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.Request;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToGuides;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
import org.eclipse.gef.requests.SelectionRequest;
import org.eclipse.gef.rulers.RulerProvider;
import org.eclipse.gef.tools.DeselectAllTracker;
import org.eclipse.gef.tools.MarqueeDragTracker;
import org.eclipse.swt.accessibility.AccessibleEvent;
/**
* @author lili
* @version 1.1.0
* defind the DiagramEditPart,it extends containerEditPart
* it include connetion's idea and adapter idea.
*/
public class DiagramEditPart extends ContainerEditPart implements
LayerConstants {
private FreeformLayout layout = new FreeformLayout();
/*
* (non-Javadoc)
* @see net.ms.designer.editors.componentdetail.editparts.BaseEditPart#createAccessible()
*/
protected AccessibleEditPart createAccessible() {
return new AccessibleGraphicalEditPart() {
public void getName(AccessibleEvent e) {
e.result = getDiagram().getName();
}
};
}
/*
* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.NODE_ROLE, null);
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
installEditPolicy(EditPolicy.COMPONENT_ROLE,
new RootComponentEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new LogicXYLayoutEditPolicy(
(XYLayout) getContentPane().getLayoutManager()));
installEditPolicy("Snap Feedback", new SnapFeedbackPolicy());
installEditPolicy(EditPolicy.CONTAINER_ROLE,
new LogicContainerEditPolicy());
}
/*
* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
protected IFigure createFigure() {
Figure f = new FreeformLayer();
// f.setBorder(new GroupBoxBorder("Diagram"));
f.setLayoutManager(layout);
f.setBorder(new MarginBorder(5));
return f;
}
/*
* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
////System.out.println(adapter);
if (adapter == SnapToHelper.class) {
List snapStrategies = new ArrayList();
Boolean val = (Boolean) getViewer().getProperty(
RulerProvider.PROPERTY_RULER_VISIBILITY);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGuides(this));
val = (Boolean) getViewer().getProperty(
SnapToGeometry.PROPERTY_SNAP_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGeometry(this));
val = (Boolean) getViewer().getProperty(
SnapToGrid.PROPERTY_GRID_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGrid(this));
if (snapStrategies.size() == 0)
return null;
if (snapStrategies.size() == 1)
return (SnapToHelper) snapStrategies.get(0);
SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++)
ss[i] = (SnapToHelper) snapStrategies.get(i);
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
/*
* (non-Javadoc)
* @see org.eclipse.gef.EditPart#getDragTracker(org.eclipse.gef.Request)
*/
public DragTracker getDragTracker(Request req) {
if (req instanceof SelectionRequest
&& ((SelectionRequest) req).getLastButtonPressed() == 3)
return new DeselectAllTracker(this);
return new MarqueeDragTracker();
}
/**
* Returns <code>NULL</code> as it does not hold any connections.
*
* @return ConnectionAnchor
*/
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart editPart) {
return null;
}
/**
* Returns <code>NULL</code> as it does not hold any connections.
*
* @return ConnectionAnchor
*/
public ConnectionAnchor getSourceConnectionAnchor(int x, int y) {
return null;
}
/**
* Returns <code>NULL</code> as it does not hold any connections.
*
* @return ConnectionAnchor
*/
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart editPart) {
return null;
}
/**
* Returns <code>NULL</code> as it does not hold any connections.
*
* @return ConnectionAnchor
*/
public ConnectionAnchor getTargetConnectionAnchor(int x, int y) {
return null;
}
/*
* (non-Javadoc)
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
if (Container.ID_ROUTER.equals(evt.getPropertyName()))
refreshVisuals();
else
super.propertyChange(evt);
}
/**
* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
* do the connection
*/
protected void refreshVisuals() {
ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
getFigure().setLayoutManager(layout);
if (getDiagram().getConnectionRouter().equals(
Container.ROUTER_MANUAL)) {
AutomaticRouter router = new FanRouter();
router.setNextRouter(new BendpointConnectionRouter());
cLayer.setConnectionRouter(router);
} else if (getDiagram().getConnectionRouter().equals(
Container.ROUTER_MANHATTAN))
cLayer.setConnectionRouter(new ManhattanConnectionRouter());
else {
ShortestPathConnectionRouter router = new ShortestPathConnectionRouter(
getFigure());
cLayer.setConnectionRouter(router);
getFigure().setLayoutManager(
new ShortestPathConnectionRouter.LayoutWrapper(layout,
router));
}
}
/**
* Returns the model of this as a LogicDiagram.
*
* @return LogicDiagram of this.
*/
public Container getDiagram() {
return (Container) getModel();
}
/**
* Returns the children of this through the model.
*
* @return Children of this as a List.
*/
protected List getModelChildren() {
return getDiagram().getChildren();
}
}