package org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.gef;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsElement;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNodeEnumeration;
import org.eclipse.uml2.diagram.sequence.internal.missed.MissedMethods;
/**
*
*/
public class AbsNodeGef extends AbsElementGef implements AbsNode {
AbsNodeGef(GraphicalEditPart modelNodeEditPart, AbsDiagramGef diagram, boolean alterMinimumSize) {
super(modelNodeEditPart, diagram);
myModelNodeEditPart = modelNodeEditPart;
myAlterMinimumSize = alterMinimumSize;
}
public EObject getModelEntity() {
return getEditPart().resolveSemanticElement();
}
private Rectangle getBounds(){
return MissedMethods._graphicalEditPart().getBounds(myModelNodeEditPart);
}
private void setBounds(Rectangle rectangle){
MissedMethods._graphicalEditPart().setBounds(myModelNodeEditPart, rectangle);
}
public int getX() {
return getBounds().x;
}
public void setX(int x) {
Rectangle rectangle = getBounds();
boolean changed = rectangle.x != x;
if (changed) {
rectangle.x = x;
setBounds(rectangle);
boundsAreChanged(AbsDiagramGef.ChangePositionWatcher.ChangePositionListener.X);
}
}
public int getY() {
return getBounds().y;
}
public void setY(int y) {
Rectangle rectangle = getBounds();
boolean changed = rectangle.y != y;
if (changed) {
rectangle.y = y;
setBounds(rectangle);
boundsAreChanged(AbsDiagramGef.ChangePositionWatcher.ChangePositionListener.Y);
}
}
public int getWidth() {
return getBounds().width;
}
public void setWidth(int width) {
Rectangle rectangle = getBounds();
boolean changed = rectangle.width != width;
if (changed) {
rectangle.width = width;
setBounds(rectangle);
}
if (myAlterMinimumSize) {
myModelNodeEditPart.getFigure().setMinimumSize(new org.eclipse.draw2d.geometry.Dimension(rectangle.width, rectangle.height));
}
if (changed) {
boundsAreChanged(AbsDiagramGef.ChangePositionWatcher.ChangePositionListener.WIDTH);
}
}
public int getHeight() {
return getBounds().height;
}
public void setHeight(int height) {
Rectangle rectangle = getBounds();
boolean changed = rectangle.height != height;
if (changed){
rectangle.height = height;
setBounds(rectangle);
}
if (myAlterMinimumSize) {
myModelNodeEditPart.getFigure().setMinimumSize(new org.eclipse.draw2d.geometry.Dimension(rectangle.width, rectangle.height));
}
if (changed) {
boundsAreChanged(AbsDiagramGef.ChangePositionWatcher.ChangePositionListener.HEIGHT);
}
}
/**
* public to allow access from AbsLayoutAccessGef
*/
public void boundsAreChanged(int coordCode) {
AbsDiagramGef.ChangePositionWatcher changePositionWatcher = getAbsDiagramGef().getChangePositionWatcher();
changePositionWatcher.nodeBoundsAreChanged(this, coordCode);
}
public AbsElement getParentGdeElement() {
GraphicalEditPart parentNode = (GraphicalEditPart)myModelNodeEditPart.getParent();
if (parentNode == null) {
return null;
}
return getAbsElementFactory().createAbsNode(parentNode);
}
public AbsNodeEnumeration subnodes() {
@SuppressWarnings("unchecked")
List<EditPart> modelPartList = myModelNodeEditPart.getChildren();
List<AbsNodeGef> resultList = new ArrayList<AbsNodeGef>(modelPartList.size());
for (EditPart next : modelPartList){
if (next instanceof ITextAwareEditPart){
continue;
}
if (next instanceof ConnectionEditPart){
continue;
}
if (next instanceof GraphicalEditPart){
resultList.add(getAbsElementFactory().createAbsNode((GraphicalEditPart)next));
}
}
return new AbsNodeEnumerationImpl(resultList.iterator());
}
public Dimension getPreferredSize() {
org.eclipse.draw2d.geometry.Dimension dimension = myModelNodeEditPart.getFigure().getPreferredSize();
return new Dimension(dimension.width, dimension.height);
}
public boolean isUserResized() {
return MissedMethods._graphicalEditPart().isUserResized(myModelNodeEditPart);
}
public void markUserResized() {
MissedMethods._graphicalEditPart().markUserResized(myModelNodeEditPart);
}
public boolean isExternal() {
return myModelNodeEditPart instanceof IBorderItemEditPart;
}
private final GraphicalEditPart myModelNodeEditPart;
private final boolean myAlterMinimumSize;
private static class AbsNodeEnumerationImpl implements AbsNodeEnumeration {
AbsNodeEnumerationImpl(Iterator<?> iterator) {
myIterator = iterator;
}
public AbsNode nextGdeNode() {
return (AbsNode) myIterator.next();
}
public Object nextElement() {
return nextGdeNode();
}
public boolean hasMoreElements() {
return myIterator.hasNext();
}
private final Iterator<?> myIterator;
}
}