package com.xrosstools.xunit.editor.parts; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.jdt.core.IType; import com.xrosstools.xunit.editor.figures.TopLevelUnitFigure; import com.xrosstools.xunit.editor.model.UnitNode; import com.xrosstools.xunit.editor.model.UnitNodeDiagram; import com.xrosstools.xunit.editor.policies.UnitNodeContainerLayoutPolicy; public class UnitNodeDiagramPart extends AbstractGraphicalEditPart implements PropertyChangeListener{ // cached for next visit; TODO should be revised if there is only one match for the name private Map<String, IType> s_sourceTypes = new HashMap<String, IType>(); public IType getSourceType(String className){ if(className == null || className.trim().length() == 0) return null; return s_sourceTypes.get(className.trim()); } public void setSourceType(IType type){ if(type == null) return; s_sourceTypes.put(type.getFullyQualifiedName(), type); } private Figure panel; protected List getModelChildren() { return ((UnitNodeDiagram)getModel()).getUnits(); } protected IFigure createFigure() { Figure figure = new FreeformLayer(); figure.setLayoutManager(new FreeformLayout()); panel = new Figure(); ToolbarLayout layout= new ToolbarLayout(); layout.setVertical(true); layout.setSpacing(100); layout.setStretchMinorAxis(false); layout.setMinorAlignment(ToolbarLayout.ALIGN_TOPLEFT); panel.setLayoutManager(layout); panel.setBorder(new MarginBorder(50)); figure.add(panel); Point loc = new Point(100, 100); Dimension size = new Dimension(-1, -1); Rectangle rectangle = new Rectangle(loc, size); this.setLayoutConstraint(this, panel, rectangle); return figure; } public IFigure getContentPane(){ return panel; } protected void addChildVisual(EditPart childEditPart, int index) { IFigure child = ((GraphicalEditPart) childEditPart).getFigure(); UnitNode unit = (UnitNode)childEditPart.getModel(); getContentPane().add(new TopLevelUnitFigure(unit.getName(), child), index); } protected void removeChildVisual(EditPart childEditPart) { IFigure wrappedChild = ((GraphicalEditPart) childEditPart).getFigure(); IFigure wrapper = null; for(Object figure:getContentPane().getChildren()){ TopLevelUnitFigure curWrapper = (TopLevelUnitFigure)figure; if(curWrapper.getFigure() != wrappedChild) continue; wrapper = curWrapper; } getContentPane().remove(wrapper); } public void propertyChange(PropertyChangeEvent evt) { // String prop = evt.getPropertyName(); refreshChildren(); } public void activate() { super.activate(); ((UnitNodeDiagram)getModel()).getListeners().addPropertyChangeListener(this); } public void deactivate() { super.deactivate(); ((UnitNodeDiagram)getModel()).getListeners().removePropertyChangeListener(this); } protected void createEditPolicies() { installEditPolicy(EditPolicy.LAYOUT_ROLE, new UnitNodeContainerLayoutPolicy()); } }