/*
* Copyright (c) 2012, 2013 Hemanta Sapkota.
* 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:
* Hemanta Sapkota (laex.pearl@gmail.com)
*/
package com.laex.cg2d.screeneditor.editparts;
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.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.ShortestPathConnectionRouter;
import org.eclipse.gef.CompoundSnapToHelper;
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.SnapToHelper;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
import com.laex.cg2d.model.model.ModelElement;
import com.laex.cg2d.model.model.ShapesDiagram;
import com.laex.cg2d.screeneditor.editparts.policies.ShapesXYLayoutEditPolicy;
/**
* The Class ShapesDiagramEditPart.
*/
public class ScreenEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
public void activate() {
if (!isActive()) {
super.activate();
((ModelElement) getModel()).addPropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate()
*/
public void deactivate() {
if (isActive()) {
super.deactivate();
((ModelElement) getModel()).removePropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new ShapesXYLayoutEditPolicy());
installEditPolicy("Snap Feedback", new SnapFeedbackPolicy()); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang
* .Class)
*/
@Override
public Object getAdapter(Class adapter) {
if (adapter == ShapesDiagram.class) {
return getModel();
}
if (adapter == SnapToHelper.class) {
List<SnapToHelper> snapStragies = new ArrayList<SnapToHelper>();
boolean gridEnabled = (Boolean) getViewer().getProperty(SnapToGrid.PROPERTY_GRID_VISIBLE);
if (gridEnabled) {
snapStragies.add(new SnapToGrid(this));
}
boolean snapEnabled = (Boolean) getViewer().getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED);
if (snapEnabled) {
snapStragies.add(new SnapToGeometry(this));
}
if (snapStragies.size() == 0) {
return null;
}
if (snapStragies.size() == 1) {
return snapStragies.get(0);
}
SnapToHelper[] ss = new SnapToHelper[snapStragies.size()];
for (int i = 0; i < ss.length; i++) {
ss[i] = snapStragies.get(i);
}
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
protected IFigure createFigure() {
FreeformLayer f = new FreeformLayer();
f.setBorder(new MarginBorder(1));
FreeformLayout fl = new FreeformLayout();
f.setLayoutManager(fl);
// Create the static router for the connection layer
ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
connLayer.setConnectionRouter(new ShortestPathConnectionRouter(f));
return f;
}
/**
* Gets the casted model.
*
* @return the casted model
*/
private ShapesDiagram getCastedModel() {
return (ShapesDiagram) getModel();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
*/
protected List<?> getModelChildren() {
return getCastedModel().getChildren();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractEditPart#getCommand(org.eclipse.gef.Request
* )
*/
@Override
public Command getCommand(Request request) {
return super.getCommand(request);
}
/*
* (non-Javadoc)
*
* @see
* java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent
* )
*/
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
// these properties are fired when Shapes are added into or removed from
// the ShapeDiagram instance and must cause a call of refreshChildren()
// to update the shapes's contents.
if (ShapesDiagram.CHILD_ADDED_PROP.equals(prop) || ShapesDiagram.CHILD_REMOVED_PROP.equals(prop)) {
refreshChildren();
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractGraphicalEditPart#getLayer(java.lang.
* Object)
*/
@Override
protected IFigure getLayer(Object layer) {
return super.getLayer(layer);
}
}