package info.limpet.stackedcharts.ui.editor.parts; import org.eclipse.draw2d.ActionEvent; import org.eclipse.draw2d.ActionListener; import org.eclipse.draw2d.Button; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CommandStack; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.editpolicies.ComponentEditPolicy; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.requests.GroupRequest; /** * An edit part for Scatter Set object */ import info.limpet.stackedcharts.model.Chart; import info.limpet.stackedcharts.model.ChartSet; import info.limpet.stackedcharts.model.Orientation; import info.limpet.stackedcharts.model.ScatterSet; import info.limpet.stackedcharts.model.StackedchartsPackage; import info.limpet.stackedcharts.ui.editor.StackedchartsImages; import info.limpet.stackedcharts.ui.editor.commands.DeleteScatterSetCommand; import info.limpet.stackedcharts.ui.editor.figures.DirectionalIconLabel; import info.limpet.stackedcharts.ui.editor.figures.DirectionalShape; public class ScatterSetEditPart extends AbstractGraphicalEditPart implements ActionListener { private ScatterSetAdapter adapter = new ScatterSetAdapter(); private DirectionalIconLabel scatterSetNameLabel; @Override protected IFigure createFigure() { DirectionalShape figure = new DirectionalShape(); scatterSetNameLabel = new DirectionalIconLabel(StackedchartsImages.getImage( StackedchartsImages.DESC_DATASET)); figure.add(scatterSetNameLabel); final Button button = new Button(StackedchartsImages.getImage( StackedchartsImages.DESC_DELETE)); button.setToolTip(new Label("Remove scatter set")); button.addActionListener(this); figure.add(button); return figure; } @Override public ScatterSet getModel() { return (ScatterSet) super.getModel(); } @Override public void activate() { super.activate(); getModel().eAdapters().add(adapter); } @Override public void deactivate() { getModel().eAdapters().remove(adapter); super.deactivate(); } @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new NonResizableEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() { protected Command createDeleteCommand(GroupRequest deleteRequest) { // TODO: implement // 1. do not use this scatter set in the current chart // 2. if scatter set used only here, then delete scatter set from shared axis return new DeleteScatterSetCommand(getModel(), getChart()); } }); } @Override protected void refreshVisuals() { super.refreshVisuals(); ScatterSet scatterSet = getModel(); String name = scatterSet.getName(); scatterSetNameLabel.getLabel().setText(name != null ? name : "<unnamed>"); ChartSet chartSet = getChart().getParent(); boolean vertical = chartSet.getOrientation() == Orientation.VERTICAL; ((DirectionalShape) getFigure()).setVertical(!vertical); scatterSetNameLabel.setVertical(!vertical); } public Chart getChart() { return (Chart) getParent().getParent().getModel(); } @Override public void actionPerformed(ActionEvent event) { Command deleteCommand = getCommand(new GroupRequest(REQ_DELETE)); if (deleteCommand != null) { CommandStack commandStack = getViewer().getEditDomain().getCommandStack(); commandStack.execute(deleteCommand); } } public class ScatterSetAdapter implements Adapter { @Override public void notifyChanged(Notification notification) { int featureId = notification.getFeatureID(StackedchartsPackage.class); switch (featureId) { case StackedchartsPackage.SCATTER_SET__NAME: refreshVisuals(); break; } } @Override public Notifier getTarget() { return getModel(); } @Override public void setTarget(Notifier newTarget) { // Do nothing. } @Override public boolean isAdapterForType(Object type) { return type.equals(ScatterSet.class); } } }