/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.examples.logicdesigner.edit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.gef.examples.logicdesigner.figures.NodeFigure;
import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
import org.eclipse.gef.examples.logicdesigner.model.Wire;
/**
* Porvides support for
*/
abstract public class LogicEditPart extends
org.eclipse.gef.editparts.AbstractGraphicalEditPart implements
NodeEditPart, PropertyChangeListener {
private AccessibleEditPart acc;
public void activate() {
if (isActive())
return;
super.activate();
getLogicSubpart().addPropertyChangeListener(this);
}
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE,
new LogicElementEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
new LogicNodeEditPolicy());
}
abstract protected AccessibleEditPart createAccessible();
/**
* Makes the EditPart insensible to changes in the model by removing itself
* from the model's list of listeners.
*/
public void deactivate() {
if (!isActive())
return;
super.deactivate();
getLogicSubpart().removePropertyChangeListener(this);
}
protected AccessibleEditPart getAccessibleEditPart() {
if (acc == null)
acc = createAccessible();
return acc;
}
/**
* Returns the model associated with this as a LogicSubPart.
*
* @return The model of this as a LogicSubPart.
*/
protected LogicSubpart getLogicSubpart() {
return (LogicSubpart) getModel();
}
/**
* Returns a list of connections for which this is the source.
*
* @return List of connections.
*/
protected List getModelSourceConnections() {
return getLogicSubpart().getSourceConnections();
}
/**
* Returns a list of connections for which this is the target.
*
* @return List of connections.
*/
protected List getModelTargetConnections() {
return getLogicSubpart().getTargetConnections();
}
/**
* Returns the Figure of this, as a node type figure.
*
* @return Figure as a NodeFigure.
*/
protected NodeFigure getNodeFigure() {
return (NodeFigure) getFigure();
}
/**
* Returns the connection anchor for the given ConnectionEditPart's source.
*
* @return ConnectionAnchor.
*/
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connEditPart) {
Wire wire = (Wire) connEditPart.getModel();
return getNodeFigure().getConnectionAnchor(wire.getSourceTerminal());
}
/**
* Returns the connection anchor of a source connection which is at the
* given point.
*
* @return ConnectionAnchor.
*/
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
Point pt = new Point(((DropRequest) request).getLocation());
return getNodeFigure().getSourceConnectionAnchorAt(pt);
}
/**
* Returns the connection anchor for the given ConnectionEditPart's target.
*
* @return ConnectionAnchor.
*/
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connEditPart) {
Wire wire = (Wire) connEditPart.getModel();
return getNodeFigure().getConnectionAnchor(wire.getTargetTerminal());
}
/**
* Returns the connection anchor of a terget connection which is at the
* given point.
*
* @return ConnectionAnchor.
*/
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
Point pt = new Point(((DropRequest) request).getLocation());
return getNodeFigure().getTargetConnectionAnchorAt(pt);
}
/**
* Returns the name of the given connection anchor.
*
* @return The name of the ConnectionAnchor as a String.
*/
final protected String mapConnectionAnchorToTerminal(ConnectionAnchor c) {
return getNodeFigure().getConnectionAnchorName(c);
}
/**
* Handles changes in properties of this. It is activated through the
* PropertyChangeListener. It updates children, source and target
* connections, and the visuals of this based on the property changed.
*
* @param evt
* Event which details the property change.
*/
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (LogicSubpart.CHILDREN.equals(prop)) {
if (evt.getOldValue() instanceof Integer)
// new child
addChild(createChild(evt.getNewValue()),
((Integer) evt.getOldValue()).intValue());
else
// remove child
removeChild((EditPart) getViewer().getEditPartRegistry().get(
evt.getOldValue()));
} else if (LogicSubpart.INPUTS.equals(prop))
refreshTargetConnections();
else if (LogicSubpart.OUTPUTS.equals(prop))
refreshSourceConnections();
else if (prop.equals(LogicSubpart.ID_SIZE)
|| prop.equals(LogicSubpart.ID_LOCATION))
refreshVisuals();
}
/**
* Updates the visual aspect of this.
*/
protected void refreshVisuals() {
Point loc = getLogicSubpart().getLocation();
Dimension size = getLogicSubpart().getSize();
Rectangle r = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), r);
}
}