/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.graphics.Image;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.connection.NodeConnectionModel;
import org.teiid.designer.diagram.ui.util.DiagramEntityManager;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.metamodels.diagram.DiagramEntity;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
/**
* @author blafond AbstractLocalDiagramModelNode
*
* @since 8.0
*/
abstract public class AbstractLocalDiagramModelNode implements DiagramModelNode, DiagramUiConstants {
private Vector m_sourceConnections = new Vector();
private Vector m_targetConnections = new Vector();
private EObject modelObject;
private List children = null;
private DiagramModelNode parent;
private Image firstOverlayImage;
private Image secondOverlayImage;
private String editorID;
protected Diagram diagram;
private boolean readOnly = false;
private boolean errorState = false;
private boolean warningState = false;
private int x;
private int y;
protected int width;
protected int height;
private String name;
private boolean heightFixed = false;
private int fixedHeight = DEFAULT_FIXED_HEIGHT;
/**
* Constructor
*/
public AbstractLocalDiagramModelNode( EObject modelObject,
String name ) {
this.modelObject = modelObject;
setName(name);
}
/**
* Set the Model Object
*/
@Override
public void setModelObject( EObject object ) {
modelObject = object;
setReadOnly(DiagramUiUtilities.getReadOnlyState(object));
}
/**
* Set the Diagram Model Object
*/
@Override
public void setDiagramModelObject( DiagramEntity object ) {
// Does nothing
}
/**
* Get the Model Object
*/
@Override
public EObject getModelObject() {
return modelObject;
}
/**
* Get the Diagram Model Object
*/
@Override
public DiagramEntity getDiagramModelObject() {
return null;
}
/**
* Add a Child
*/
@Override
public void addChild( DiagramModelNode child ) {
if (children == null) {
children = new ArrayList();
}
child.setParent(this);
children.add(child);
fireStructureChange(DiagramUiConstants.DiagramNodeProperties.CHILDREN, child);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#addChildren(java.util.List)
*/
@Override
public void addChildren( List newChildren ) {
if (newChildren != null && !newChildren.isEmpty()) {
if (children == null) {
children = new ArrayList();
}
Object nextChild;
Iterator iter = newChildren.iterator();
while (iter.hasNext()) {
nextChild = iter.next();
if (nextChild instanceof DiagramModelNode) ((DiagramModelNode)nextChild).setParent(this);
children.add(nextChild);
}
fireStructureChange(DiagramNodeProperties.CHILDREN, this);
}
}
/**
* Remove a Child
*/
@Override
public void removeChild( DiagramModelNode child,
boolean deleteDiagramEntity ) {
if (children == null) {
return;
}
Diagram diagram = child.getDiagram();
DiagramEntity staleDE = child.getDiagramModelObject();
if (staleDE != null) DiagramEntityManager.removeEntity(diagram, child.getModelObject());
children.remove(child);
if (deleteDiagramEntity && staleDE != null && !ModelObjectUtilities.isReadOnly(getModelObject())) {
DiagramEntityManager.cleanUpDiagram(diagram);
DiagramEntityManager.cleanDiagramEntities(diagram);
}
fireStructureChange(DiagramUiConstants.DiagramNodeProperties.CHILDREN, child);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#removeChildren(java.util.List)
*/
@Override
public void removeChildren( List oldChildren,
boolean deleteDiagramEntities ) {
if (oldChildren != null && !oldChildren.isEmpty()) {
if (children == null) {
return;
}
Diagram diagram = null;
DiagramModelNode nextChild = null;
Iterator iter = oldChildren.iterator();
List removeList = new ArrayList(oldChildren.size());
while (iter.hasNext()) {
nextChild = (DiagramModelNode)iter.next();
DiagramEntity staleDE = nextChild.getDiagramModelObject();
if (diagram == null) diagram = nextChild.getDiagram();
if (staleDE != null) DiagramEntityManager.removeEntity(diagram, nextChild.getModelObject());
children.remove(nextChild);
if (deleteDiagramEntities && staleDE != null) {
removeList.add(staleDE);
}
}
if (deleteDiagramEntities && !removeList.isEmpty()) {
DiagramEntityManager.cleanDiagramEntities(diagram);
DiagramUiUtilities.deleteDiagramEntities(removeList, this);
}
fireStructureChange(DiagramNodeProperties.CHILDREN, this);
}
}
@Override
public void updateForChild( boolean isMove ) {
fireStructureChange(DiagramUiConstants.DiagramNodeProperties.CHILDREN, "EMPTY"); //$NON-NLS-1$
}
/**
* Set the List of Children
*/
@Override
public void setChildren( List childList ) {
children = childList;
}
/**
* Get the List of Children
*/
@Override
public List getChildren() {
if (children == null || children.isEmpty()) {
return Collections.EMPTY_LIST;
}
return children;
}
/**
* Get the number of Children
*/
public int getNumberOfChildren() {
if (children == null || children.isEmpty()) {
return 0;
}
return children.size();
}
@Override
public void setParent( DiagramModelNode parent ) {
this.parent = parent;
}
@Override
public DiagramModelNode getParent() {
return this.parent;
}
@Override
public void setPosition( Point position ) {
this.x = position.x;
this.y = position.y;
firePropertyChange(DiagramUiConstants.DiagramNodeProperties.LOCATION, null, position);
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#setCenterXY(int, int)
*/
@Override
public void setCenterXY( int newCenterX,
int newCenterY ) {
int newX = newCenterX - this.getWidth() / 2;
int newY = newCenterY - this.getHeight() / 2;
this.x = newX;
this.y = newY;
firePropertyChange(DiagramNodeProperties.LOCATION, null, new Point(newX, newY));
}
@Override
public void setCenterX( int newCenterX ) {
int newX = newCenterX - this.getWidth() / 2;
this.x = newX;
firePropertyChange(DiagramUiConstants.DiagramNodeProperties.LOCATION, null, new Point(newX, this.y));
}
@Override
public void setCenterY( int newCenterY ) {
int newY = newCenterY - this.getHeight() / 2;
this.y = newY;
firePropertyChange(DiagramUiConstants.DiagramNodeProperties.LOCATION, null, new Point(this.x, newY));
}
@Override
public Point getPosition() {
Point posn = new Point(this.x, this.y);
return posn;
}
@Override
public void setSize( Dimension dimension ) {
this.width = dimension.width;
this.height = dimension.height;
firePropertyChange(DiagramUiConstants.DiagramNodeProperties.SIZE, null, dimension);
}
@Override
public Dimension getSize() {
Dimension size = new Dimension(this.width, this.height);
return size;
}
transient protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);
@Override
public void addPropertyChangeListener( PropertyChangeListener l ) {
listeners.addPropertyChangeListener(l);
}
@Override
public void firePropertyChange( String prop,
Object old,
Object newValue ) {
listeners.firePropertyChange(prop, old, newValue);
}
// Used to alert the Edit Part that the children have been modified
// and a refreshChildren() is needed.
protected void fireStructureChange( String prop,
Object child ) {
listeners.firePropertyChange(prop, null, child);
}
public Object getEditableValue() {
return this;
}
@Override
public void removePropertyChangeListener( PropertyChangeListener l ) {
listeners.removePropertyChangeListener(l);
}
@Override
public void update() {
firePropertyChange(DiagramUiConstants.DiagramNodeProperties.PROPERTIES, null, null);
}
@Override
public void update( String property ) {
firePropertyChange(property, null, null);
}
@Override
public void update( String prop,
String oldValue,
String newValue ) {
firePropertyChange(prop, oldValue, newValue);
}
@Override
public void setName( String name ) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public String getDisplayString() {
return getName();
}
// public void setPath(String newString) {
// path = newString;
// }
public String getPath() {
return "Path"; //$NON-NLS-1$
}
public int getXPosition() {
return this.x;
}
public int getYPosition() {
return this.y;
}
@Override
public int getX() {
return this.x;
}
@Override
public int getY() {
return this.y;
}
@Override
public int getCenterX() {
return (this.x + this.width / 2);
}
@Override
public int getCenterY() {
return (this.y + this.height / 2);
}
@Override
public int getWidth() {
return this.width;
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getHeight()
*/
@Override
public int getHeight() {
return this.height;
}
@Override
public String toString() {
StringBuffer result = new StringBuffer(super.toString());
result.append(" (name: "); //$NON-NLS-1$
result.append(getName());
result.append(", path: "); //$NON-NLS-1$
result.append(getPath());
result.append(", xPosition: "); //$NON-NLS-1$
result.append(getXPosition());
result.append(", yPosition: "); //$NON-NLS-1$
result.append(getYPosition());
result.append(", height: "); //$NON-NLS-1$
result.append(getHeight());
result.append(", width: "); //$NON-NLS-1$
result.append(getWidth());
result.append(')');
return result.toString();
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getSourceConnections()
*/
@Override
public Vector getSourceConnections() {
return m_sourceConnections;
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getTargetConnections()
*/
@Override
public Vector getTargetConnections() {
return m_targetConnections;
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#addSourceConnection(org.teiid.designer.diagram.ui.connection.NodeConnectionModel)
*/
@Override
public void addSourceConnection( NodeConnectionModel iConnection ) {
m_sourceConnections.addElement(iConnection);
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#addTargetConnection(org.teiid.designer.diagram.ui.connection.NodeConnectionModel)
*/
@Override
public void addTargetConnection( NodeConnectionModel iConnection ) {
m_targetConnections.addElement(iConnection);
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#removeSourceConnection(org.teiid.designer.diagram.ui.connection.NodeConnectionModel)
*/
@Override
public void removeSourceConnection( NodeConnectionModel iConnection ) {
m_sourceConnections.removeElement(iConnection);
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#removeTargetConnection(org.teiid.designer.diagram.ui.connection.NodeConnectionModel)
*/
@Override
public void removeTargetConnection( NodeConnectionModel iConnection ) {
m_targetConnections.removeElement(iConnection);
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getAssociations()
*/
@Override
public List getAssociations( HashMap nodeMap ) {
return Collections.EMPTY_LIST;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#updateAssociations()
*/
@Override
public void updateAssociations() {
// Does nothing
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#hasErrors()
*/
@Override
public boolean hasErrors() {
return errorState;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#hasWarnings()
*/
@Override
public boolean hasWarnings() {
return warningState;
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#recoverObjectProperties()
*/
@Override
public void recoverObjectProperties() {
// Default Impl
}
/*
* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#wasLayedOut()
*/
@Override
public boolean wasLayedOut() {
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getDependencies()
*/
@Override
public List getDependencies() {
return Collections.EMPTY_LIST;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getFirstOverlayImage()
*/
@Override
public Image getFirstOverlayImage() {
return firstOverlayImage;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#setFirstOverlayImage(org.eclipse.swt.graphics.Image)
*/
@Override
public void setFirstOverlayImage( Image image,
String editorID ) {
this.firstOverlayImage = image;
this.editorID = editorID;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getSecondOverlayImage()
*/
@Override
public Image getSecondOverlayImage() {
return secondOverlayImage;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#setSecondOverlayImage(org.eclipse.swt.graphics.Image)
*/
@Override
public void setSecondOverlayImage( Image image,
int positionIndex ) {
this.secondOverlayImage = image;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#updateForErrorsAndWarnings()
*/
@Override
public void updateForErrorsAndWarnings() {
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#getDiagram()
*/
@Override
public Diagram getDiagram() {
// XXX Auto-generated method stub
return diagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#isReadOnly()
*/
@Override
public boolean isReadOnly() {
return readOnly;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.model.DiagramModelNode#setReadOnly(boolean)
*/
@Override
public void setReadOnly( boolean readOnly ) {
this.readOnly = readOnly;
}
/**
* @see org.teiid.designer.diagram.ui.model.DiagramModelNode#hideLocation()
* @since 4.2
*/
@Override
public boolean hideLocation() {
return false;
}
/**
* @see org.teiid.designer.diagram.ui.model.DiagramModelNode#setHideLocation(boolean)
* @since 4.2
*/
@Override
public void setHideLocation( boolean hideLocation ) {
}
@Override
public String getEditorID() {
return this.editorID;
}
public void setEditorID( String editorID ) {
this.editorID = editorID;
}
@Override
public int getFixedHeight() {
// return DiagramModelNode.DEFAULT_FIXED_HEIGHT;
return this.fixedHeight;
}
@Override
public void setFixedHeight( int theFixedHeight ) {
this.fixedHeight = theFixedHeight;
}
@Override
public boolean isHeightFixed() {
return this.heightFixed;
}
@Override
public void setHeightFixed( boolean theHeightFixed ) {
this.heightFixed = theHeightFixed;
if (children != null && !children.isEmpty()) {
for (Iterator iter = children.iterator(); iter.hasNext();) {
DiagramModelNode nextChildNode = (DiagramModelNode)iter.next();
nextChildNode.setHeightFixed(theHeightFixed);
}
}
}
}