package net.ms.designer.editors.componentdetail.editparts; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import net.ms.designer.editors.componentdetail.models.Container; import net.ms.designer.editors.componentdetail.models.Element; import net.ms.designer.editors.componentdetail.models.FlowField; import net.ms.designer.editors.componentdetail.models.Table; import net.ms.designer.editors.componentdetail.policies.ElementEditPolicy; import net.ms.designer.editors.componentdetail.policies.NodeEditPolicy; import net.ms.designer.editors.componentdetail.policies.PropertyEditPolicy; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.Connection; 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.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; /** * @author lili * @version 1.1.0 * @explain defind the BaseEditPart,it is the parent of the other EditPart,it can let EditPolicy to do somethings */ public abstract class BaseEditPart extends AbstractGraphicalEditPart implements NodeEditPart, PropertyChangeListener { private AccessibleEditPart acc; //defind the record change abstract protected AccessibleEditPart createAccessible(); /** * @return return the AccessibleEditPart acc */ protected AccessibleEditPart getAccessibleEditPart() { if (acc == null) acc = createAccessible(); return acc; } /** * @explain: construct of BaseEditPart() * */ public BaseEditPart() { super(); } /** * @explain: defind the idea of EditPolicies,let the Policies work on somethings */ protected void createEditPolicies() { // installEditPolicy(EditPolicy.COMPONENT_ROLE, new KCGElementEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new NodeEditPolicy()); this.installEditPolicy(EditPolicy.LAYOUT_ROLE,new PropertyEditPolicy()); this.installEditPolicy(EditPolicy.COMPONENT_ROLE, new ElementEditPolicy()); } /* * (non-Javadoc) * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (Element.CHILDREN.equals(prop)){ refreshChildren(); }else if (Table.INPUTS.equals(prop)) refreshTargetConnections(); else if (Table.OUTPUTS.equals(prop)) refreshSourceConnections(); else if (prop.equals(Container.ID_SIZE) || prop.equals(Container.ID_LOCATION) || prop.equals(Element.ID_NAME) || prop.equals((Element.ID_FIELD_LABEL))) refreshVisuals(); } protected void refreshVisuals() { Point loc = getFieldBase().getLocation(); Dimension size = getFieldBase().getSize(); Rectangle r = new Rectangle(loc, size); /*Temp solution for show*/ // if(getFigure() instanceof BringbackFigure) // ((KCGBringbackFigure)getFigure()).setLabelText(((BringbackFieldModel)getModel()).getFieldLabel()); ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), r); } /* * ���� Javadoc�� * * @see org.eclipse.gef.EditPart#activate() */ public void activate() { if (isActive()) return; super.activate(); getFieldBase().addPropertyChangeListener(this); } /** * @return return the model */ protected Element getFieldBase() { return (Element) getModel(); } /* * ���� Javadoc�� * * @see org.eclipse.gef.EditPart#deactivate() */ public void deactivate() { if (!isActive()) return; getFieldBase().removePropertyChangeListener(this); super.deactivate(); } /** * The ChopboxAnchor's location is found by calculating the intersection of a line drawn * from the center point of its owner's box to a reference point on that box. Thus * {@link Connection Connections} using the ChopBoxAnchor will be oriented such that they * point to their owner's center. */ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /** * @explain: if there is a request ,new ChopboxAnchor */ public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /** * @explain: if there is connection,new ChopboxAnchor */ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /** * @explain: if there is a request ,new ChopboxAnchor */ public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /** * @explain:if model instancof table,return SourceConnections */ protected List getModelSourceConnections() { if (getFieldBase() instanceof Table) { Table kcgt = (Table) getFieldBase(); return kcgt.getSourceConnections(); } else if(getFieldBase() instanceof FlowField ) { FlowField fField = (FlowField)getFieldBase(); return fField.getSourceConnections(); } return super.getModelSourceConnections(); } /** * @explain: if model instanceof table,return TargeConnections */ protected List getModelTargetConnections() { if (getFieldBase() instanceof Table) { Table kcgt = (Table) getFieldBase(); return kcgt.getTargetConnections(); } return super.getModelTargetConnections(); } }