/******************************************************************************
* Copyright (c) 2016 Oracle
* 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:
* Ling Hao - initial implementation and ongoing maintenance
* Shenxue Zhou - Turn on anti-aliasing on diagram connection layer;
* Move DiagramXYLayoutEditPolicy inner class to its own file.
* SnapToHelper Adapter and Snap feedback policy.
******************************************************************************/
package org.eclipse.sapphire.ui.swt.gef.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ShortestPathConnectionRouter;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToGuides;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
import org.eclipse.gef.rulers.RulerProvider;
import org.eclipse.sapphire.ui.swt.gef.DiagramConfigurationManager;
import org.eclipse.sapphire.ui.swt.gef.model.DiagramModel;
import org.eclipse.sapphire.ui.swt.gef.model.DiagramNodeModel;
import org.eclipse.sapphire.ui.swt.gef.policies.DiagramXYLayoutEditPolicy;
import org.eclipse.sapphire.ui.swt.gef.policies.SapphireSnapFeedbackPolicy;
import org.eclipse.sapphire.ui.swt.gef.presentation.DiagramPagePresentation;
import org.eclipse.swt.SWT;
/**
* @author <a href="mailto:ling.hao@oracle.com">Ling Hao</a>
*/
public class SapphireDiagramEditorPageEditPart extends AbstractGraphicalEditPart
implements PropertyChangeListener, IConfigurationManagerHolder {
private DiagramConfigurationManager configManager;
public SapphireDiagramEditorPageEditPart(DiagramConfigurationManager configManager) {
this.configManager = configManager;
}
public DiagramConfigurationManager getConfigurationManager() {
return this.configManager;
}
public DiagramPagePresentation getPresentation()
{
if (getModel() instanceof DiagramModel) {
DiagramModel diagramModel = (DiagramModel)getModel();
return diagramModel.getPresentation();
}
return null;
}
@Override
protected IFigure createFigure()
{
getPresentation().render();
IFigure f = getPresentation().getFigure();
// Create the static router for the connection layer
ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
connLayer.setConnectionRouter(new ShortestPathConnectionRouter(f));
connLayer.setAntialias(SWT.ON);
return f;
}
@Override
protected void createEditPolicies() {
// disallows the removal of this edit part from its parent
installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
// handles constraint changes (e.g. moving and/or resizing) of model
// elements and creation of new model elements
installEditPolicy(EditPolicy.LAYOUT_ROLE, new DiagramXYLayoutEditPolicy(getCastedModel().getPresentation()));
installEditPolicy("Snap Feedback", new SapphireSnapFeedbackPolicy(getPresentation().getResourceCache())); //$NON-NLS-1$
}
@Override
public void activate() {
if (!isActive()) {
super.activate();
getCastedModel().addPropertyChangeListener(this);
}
}
@Override
public void deactivate() {
if (isActive()) {
super.deactivate();
getCastedModel().removePropertyChangeListener(this);
}
}
private DiagramModel getCastedModel() {
return (DiagramModel)getModel();
}
@Override
protected List<DiagramNodeModel> getModelChildren() {
return getCastedModel().getNodes();
}
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (DiagramModel.NODE_ADDED.equals(prop)) {
refreshChildren();
} else if (DiagramModel.NODE_REMOVED.equals(prop)) {
refreshChildren();
}
}
@Override
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
if (adapter == SnapToHelper.class) {
List<SnapToHelper> snapStrategies = new ArrayList<SnapToHelper>();
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 snapStrategies.get(0);
SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++)
ss[i] = snapStrategies.get(i);
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
}