/*******************************************************************************
* 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.graph.graphical;
import java.util.ArrayList;
import java.util.List;
//import javax.swing.text.StyleConstants.ColorConstants;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.NotificationImpl;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.henshin.model.Attribute;
import org.eclipse.emf.henshin.model.Edge;
import org.eclipse.emf.henshin.model.HenshinPackage;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.views.properties.IPropertySource;
import de.tub.tfs.henshin.editor.commands.graph.ChangeAttributesHideCommand;
import de.tub.tfs.henshin.editor.editparts.HenshinEditPolicy;
import de.tub.tfs.henshin.editor.editparts.graph.NodeClipboardEditPolicy;
import de.tub.tfs.henshin.editor.editparts.graph.NodeComponentEditPolicy;
import de.tub.tfs.henshin.editor.figure.graph.NodeFigure;
import de.tub.tfs.henshin.editor.figure.graph.SimpleNodeFigure;
import de.tub.tfs.henshin.editor.figure.graph.ToolTipFigure;
import de.tub.tfs.henshin.editor.model.properties.graph.NodePropertySource;
import de.tub.tfs.henshin.editor.util.ColorUtil;
import de.tub.tfs.henshin.editor.util.HenshinLayoutUtil;
import de.tub.tfs.henshin.editor.util.HenshinNotification;
import de.tub.tfs.henshin.editor.util.NodeUtil;
import de.tub.tfs.henshin.editor.util.validator.NameEditValidator;
import de.tub.tfs.henshin.model.layout.NodeLayout;
import de.tub.tfs.muvitor.gef.directedit.IDirectEditPart.IGraphicalDirectEditPart;
import de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart;
/**
* The Class NodeEditPart.
*/
public class NodeEditPart extends AdapterGraphicalEditPart<Node> implements
org.eclipse.gef.NodeEditPart, IGraphicalDirectEditPart, MouseListener {
/** The width. */
private int width;
// /** The height. */
// private int height;
/** The default color. */
private final Color defaultColor = ColorConstants.gray; //ColorUtil.int2Color(0);
/** The color. */
private Color color = defaultColor;
/** The layout model. */
private NodeLayout layoutModel;
private boolean collapsing = false;
/**
* Constructs a {@link NodeEditPart} for a given {@link Node} model object.
*
* @param model
* the model
*/
public NodeEditPart(Node model) {
super(model);
if (getLayoutModel() != null) {
registerAdapter(getLayoutModel());
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseListener#mouseReleased(org.eclipse.draw2d.MouseEvent
* )
*/
@Override
public void mouseReleased(MouseEvent me) {
// TODO Auto-generated method stub
}
/**
* Gets the name.
*
* @return the name
*/
public String getName() {
String name = new String();
if (getCastedModel().getName() != null) {
name = new String(getCastedModel().getName());
}
name += ":";
if (getCastedModel().getType() != null)
name += getCastedModel().getType().getName();
return name;
}
/**
* Gets the default color.
*
* @return the default color
*/
public Color getDefaultColor() {
return defaultColor;
}
/**
* Sets the color.
*
* @param color
* the new color
*/
public void setColor(Color color) {
this.color = color;
}
/**
* Sets the name.
*
* @param name
* the new name
*/
public void setName(String name) {
getNodeFigure().setName(name);
refreshSize();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef
* .ConnectionEditPart)
*/
@Override
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef
* .Request)
*/
@Override
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef
* .ConnectionEditPart)
*/
@Override
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef
* .Request)
*/
@Override
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
/**
* Gets the node figure.
*
* @return the node figure
*/
public NodeFigure getNodeFigure() {
return (NodeFigure) getFigure();
}
/*
* (non-Javadoc)
*
* @see muvitorkit.gef.directedit.IDirectEditPart#getDirectEditFeatureID()
*/
@Override
public int getDirectEditFeatureID() {
return HenshinPackage.NODE__NAME;
}
/*
* (non-Javadoc)
*
* @see muvitorkit.gef.directedit.IDirectEditPart#getDirectEditValidator()
*/
@Override
public ICellEditorValidator getDirectEditValidator() {
return new NameEditValidator(getCastedModel().getGraph(),
HenshinPackage.GRAPH__NODES, getCastedModel(), false);
}
/**
* Gets the layout model.
*
* @return the layout model
*/
public NodeLayout getLayoutModel() {
if (layoutModel == null) {
layoutModel = HenshinLayoutUtil.INSTANCE
.getLayout(getCastedModel());
}
return layoutModel;
}
/**
* @param layoutModel
* the layoutModel to set
*/
public void setLayoutModel(NodeLayout layoutModel) {
this.layoutModel = layoutModel;
registerAdapter(layoutModel);
}
/*
* (non-Javadoc)
*
* @see muvitorkit.gef.directedit.IDirectEditPart.IGraphicalDirectEditPart#
* getValueLabelTextBounds()
*/
@Override
public Rectangle getValueLabelTextBounds() {
return ((NodeFigure) getFigure()).getValueLabelTextBounds();
}
/*
* (non-Javadoc)
*
* @see muvitorkit.gef.directedit.IDirectEditPart.IGraphicalDirectEditPart#
* updateValueDisplay(java.lang.String)
*/
@Override
public void updateValueDisplay(String value) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseListener#mouseDoubleClicked(org.eclipse.draw2d
* .MouseEvent)
*/
@Override
public void mouseDoubleClicked(MouseEvent me) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseListener#mousePressed(org.eclipse.draw2d.MouseEvent
* )
*/
@Override
public void mousePressed(MouseEvent me) {
Command command = new ChangeAttributesHideCommand(getLayoutModel());
getViewer().getEditDomain().getCommandStack().execute(command);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
@Override
protected IFigure createFigure() {
width = NodeUtil.getWidth(getCastedModel(), false);
//height = NodeUtil.getHeight(getCastedModel());
figure = new SimpleNodeFigure(getCastedModel(), width, this);
figure.setBackgroundColor(color);
int x = 30;
int y = 30;
if (getLayoutModel() != null) {
x = getLayoutModel().getX();
y = getLayoutModel().getY();
((NodeFigure) figure).setHide(getLayoutModel().isHide());
}
figure.setLocation(new Point(x, y));
String toolTip = "Ecore model: " + getCastedModel().getType().getEPackage().getName();
figure.setToolTip(new ToolTipFigure(toolTip));
return figure;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.NODE_ROLE,
new NodeGraphicalEditPartPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new NodeXYLayoutEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE,
new NodeComponentEditPolicy());
installEditPolicy(HenshinEditPolicy.CLIPBOARD_ROLE,
new NodeClipboardEditPolicy());
}
/*
* (non-Javadoc)
*
* @see
* muvitorkit.gef.editparts.AdapterGraphicalEditPart#notifyChanged(org.eclipse
* .emf.common.notify.Notification)
*/
@Override
protected void notifyChanged(Notification notification) {
if (notification.getEventType() == Notification.REMOVING_ADAPTER) {
return;
}
if (notification.getEventType() == HenshinNotification.LAYOUT_ADDED) {
setLayoutModel((NodeLayout) notification.getNewValue());
refresh();
return;
}
if (notification.getNotifier() instanceof NodeLayout) {
refreshLocation();
refreshVisuals();
return;
}
if (notification.getEventType() == HenshinNotification.TREE_SELECTED) {
getViewer().select(this);
return;
}
final int featureId = notification.getFeatureID(HenshinPackage.class);
switch (featureId) {
case -1:
refreshSourceConnections();
refreshTargetConnections();
refreshChildren();
case HenshinPackage.NODE__NAME:
NodeFigure nodeFigure = (NodeFigure) getFigure();
nodeFigure.setName(getName());
if (!collapsing) {
nodeFigure.setSize(
NodeUtil.getWidth(getCastedModel(), !nodeFigure.isHide()),
nodeFigure.getSize().height);
}
refreshVisuals();
break;
case HenshinPackage.NODE__OUTGOING:
refreshSourceConnections();
break;
case HenshinPackage.NODE__INCOMING:
refreshTargetConnections();
break;
case HenshinPackage.MODULE:
final int type = notification.getEventType();
switch (type) {
case Notification.ADD:
case Notification.ADD_MANY:
case Notification.REMOVE:
case Notification.REMOVE_MANY:
refreshChildren();
case Notification.SET:
refreshVisuals();
break;
}
break;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
@Override
protected void refreshVisuals() {
NodeFigure fig = (NodeFigure) getFigure();
int color = getLayoutModel() == null ? 0 : getLayoutModel().getColor();
fig.setBackgroundColor(ColorUtil.int2Color(color));
fig.setName(getName());
refreshSize();
refreshLocation();
fig.invalidate();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections
* ()
*/
@Override
protected List<Edge> getModelSourceConnections() {
return getCastedModel().getOutgoing();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections
* ()
*/
@Override
protected List<Edge> getModelTargetConnections() {
return getCastedModel().getIncoming();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
*/
@Override
protected List<EObject> getModelChildren() {
List<EObject> list = new ArrayList<EObject>(getCastedModel()
.getAttributes());
List<EObject> listSotiert = new ArrayList<EObject>();
if (getCastedModel().getType() == null) {
listSotiert = list;
} else {
for (EAttribute eA : getCastedModel().getType().getEAllAttributes()) {
for (EObject attr : list) {
if (((Attribute) attr).getType() == eA) {
listSotiert.add(attr);
list.remove(attr);
break;
}
}
if (list.size() == 0) {
break;
}
}
}
return listSotiert;
}
/*
* (non-Javadoc)
*
* @see muvitorkit.gef.editparts.AdapterTreeEditPart#createPropertySource()
*/
@Override
protected IPropertySource createPropertySource() {
return new NodePropertySource(getCastedModel());
}
/*
* (non-Javadoc)
*
* @see
* muvitorkit.gef.editparts.AdapterGraphicalEditPart#performDirectEdit()
*/
@Override
protected void performDirectEdit() {
if (getLayoutModel().isEnabled()) {
super.performDirectEdit();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#fireSelectionChanged()
*/
@Override
protected void fireSelectionChanged() {
if (getSelected() == SELECTED_PRIMARY) {
getCastedModel().eNotify(
new NotificationImpl(HenshinNotification.SELECTED, false,
true));
}
super.fireSelectionChanged();
}
/**
* Refresh location.
*/
private void refreshLocation() {
NodeFigure figure = getNodeFigure();
int x = 30;
int y = 30;
if (getLayoutModel() != null) {
x = ((NodeLayout) getLayoutModel()).getX();
y = ((NodeLayout) getLayoutModel()).getY();
figure.setHide(getLayoutModel().isHide());
}
figure.setLocation(new Point(x, y));
}
/*
* (non-Javadoc)
*
* @see
* de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#performOpen()
*/
@Override
protected void performOpen() {
}
/**
* Size update.
*/
private void refreshSize() {
if (!collapsing) {
NodeFigure figure = getNodeFigure();
width = NodeUtil.getWidth(getCastedModel(), !figure.isHide());
int height = NodeUtil.getHeight(getCastedModel());
figure.setSize(width, height);
}
}
public void collapsing() {
collapsing = true;
if (figure instanceof SimpleNodeFigure) {
SimpleNodeFigure nodeFigure = (SimpleNodeFigure) figure;
nodeFigure.collapsing(collapsing);
}
GraphEditPart graphEditPart = (GraphEditPart) getParent();
graphEditPart.repaintChildren();
}
}