/*******************************************************************************
* Copyright (c) 2010-2015 Henshin developers. 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:
* TU Berlin, University of Luxembourg, SES S.A.
*******************************************************************************/
/**
*
*/
package de.tub.tfs.henshin.editor.editparts.flow_diagram.graphical;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
import org.eclipse.swt.SWT;
import org.eclipse.ui.views.properties.IPropertySource;
import de.tub.tfs.henshin.editor.editparts.HenshinEditPolicy;
import de.tub.tfs.henshin.editor.editparts.flow_diagram.FlowDiagramClipBoardEditPolicy;
import de.tub.tfs.henshin.editor.figure.flow_diagram.TransitionConnectionRouter;
import de.tub.tfs.henshin.editor.util.HenshinLayoutUtil;
import de.tub.tfs.henshin.model.flowcontrol.FlowControlPackage;
import de.tub.tfs.henshin.model.flowcontrol.FlowDiagram;
import de.tub.tfs.henshin.model.flowcontrol.FlowElement;
import de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart;
import de.tub.tfs.muvitor.ui.utils.SWTResourceManager;
/**
* @author nam
*
*/
public class FlowDiagramEditpart extends AdapterGraphicalEditPart<FlowDiagram> {
private Label nameLabel;
/**
* @param model
*/
public FlowDiagramEditpart(FlowDiagram model) {
super(model);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
@Override
protected IFigure createFigure() {
FreeformLayer fig = new FreeformLayer();
fig.setLayoutManager(new FreeformLayout());
ConnectionLayer connectionLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
TransitionConnectionRouter router = new TransitionConnectionRouter(fig);
connectionLayer.setAntialias(SWT.ON);
connectionLayer.setConnectionRouter(router);
nameLabel = new Label();
nameLabel.setFont(SWTResourceManager.getFont("Sans", 12, SWT.BOLD));
nameLabel.setForegroundColor(ColorConstants.gray);
nameLabel.setText(getCastedModel().getName());
fig.add(nameLabel, new Rectangle(5, 5, -1, -1));
return fig;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
*/
@SuppressWarnings("rawtypes")
@Override
protected List getModelChildren() {
List<EObject> children = new LinkedList<EObject>();
children.addAll(getCastedModel().getElements());
return children;
}
/*
* (non-Javadoc)
*
* @see
* de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#notifyChanged
* (org.eclipse.emf.common.notify.Notification)
*/
@Override
protected void notifyChanged(Notification notification) {
int msgId = notification.getFeatureID(FlowControlPackage.class);
switch (msgId) {
case FlowControlPackage.FLOW_DIAGRAM__NAME:
nameLabel.setText(getCastedModel().getName());
break;
default:
break;
}
refresh();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
*/
@Override
protected void refreshChildren() {
super.refreshChildren();
for (Object child : getChildren()) {
((EditPart) child).refresh();
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractEditPart#addChild(org.eclipse.gef.EditPart
* , int)
*/
@Override
protected void addChild(EditPart child, int index) {
Object childModel = child.getModel();
if (childModel instanceof FlowElement) {
registerAdapter(HenshinLayoutUtil.INSTANCE
.getLayout((FlowElement) childModel));
}
super.addChild(child, index);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.LAYOUT_ROLE,
new FlowDiagramXYLayoutEditPolicy(getCastedModel()));
installEditPolicy("Snap Feedback", new SnapFeedbackPolicy());
installEditPolicy(HenshinEditPolicy.CLIPBOARD_ROLE,
new FlowDiagramClipBoardEditPolicy() {
@Override
protected boolean canCopy() {
return false;
}
});
}
/*
* (non-Javadoc)
*
* @see
* de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#getAdapter(
* java.lang.Class)
*/
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class key) {
if (key == SnapToHelper.class) {
List<SnapToHelper> helpers = new ArrayList<SnapToHelper>();
helpers.add(new SnapToGeometry(this));
helpers.add(new SnapToGrid(this));
if (helpers.size() == 0) {
return null;
} else {
return new CompoundSnapToHelper(
helpers.toArray(new SnapToHelper[0]));
}
}
return super.getAdapter(key);
}
@Override
protected IPropertySource createPropertySource() {
return super.createPropertySource();
}
}