/******************************************************************************* * Copyright (c) 2000, 2005 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); } }