package info.limpet.stackedcharts.ui.editor.parts;
import info.limpet.stackedcharts.model.Chart;
import info.limpet.stackedcharts.model.ChartSet;
import info.limpet.stackedcharts.model.Dataset;
import info.limpet.stackedcharts.model.DependentAxis;
import info.limpet.stackedcharts.model.Orientation;
import info.limpet.stackedcharts.model.StackedchartsPackage;
import info.limpet.stackedcharts.model.Styling;
import info.limpet.stackedcharts.ui.editor.StackedchartsImages;
import info.limpet.stackedcharts.ui.editor.commands.DeleteDatasetsFromAxisCommand;
import info.limpet.stackedcharts.ui.editor.figures.DatasetFigure;
import info.limpet.stackedcharts.ui.editor.figures.DirectionalShape;
import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Button;
import org.eclipse.draw2d.GridData;
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.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
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;
import org.eclipse.ui.views.properties.IPropertySource;
/**
* An {@link GraphicalEditPart} to represent datasets
*/
public class DatasetEditPart extends AbstractGraphicalEditPart implements
ActionListener, IPropertySourceProvider
{
private DatasetFigure contentPane;
private DatasetAdapter adapter = new DatasetAdapter();
@Override
protected IFigure createFigure()
{
DirectionalShape figure = new DirectionalShape();
contentPane = new DatasetFigure();
figure.add(contentPane);
Button button =
new Button(StackedchartsImages
.getImage(StackedchartsImages.DESC_DELETE));
button.setToolTip(new Label("Remove the dataset from this axis"));
button.addActionListener(this);
figure.add(button);
return figure;
}
@Override
protected void addChildVisual(EditPart childEditPart, int index)
{
super.addChildVisual(childEditPart, getContentPane().getChildren().size());
}
@Override
public IFigure getContentPane()
{
return contentPane;
}
@Override
public IPropertySource getPropertySource()
{
final Dataset axis = getDataset();
final Styling axisType = getDataset().getStyling();
// Proxy two objects in to one
return new CombinedProperty(axis, axisType, "Styling");
}
@Override
protected void createEditPolicies()
{
installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
new NonResizableEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy()
{
protected Command createDeleteCommand(GroupRequest deleteRequest)
{
Dataset dataset = (Dataset) getHost().getModel();
DependentAxis parent = (DependentAxis) getHost().getParent().getModel();
DeleteDatasetsFromAxisCommand cmd =
new DeleteDatasetsFromAxisCommand(parent, dataset);
return cmd;
}
});
}
@Override
public void activate()
{
super.activate();
getDataset().eAdapters().add(adapter);
}
@Override
public void deactivate()
{
getDataset().eAdapters().remove(adapter);
super.deactivate();
}
@Override
protected void refreshVisuals()
{
contentPane.setName(getDataset().getName());
ChartSet parent =
((Chart) getParent().getParent().getParent().getModel()).getParent();
boolean horizontal = parent.getOrientation() == Orientation.HORIZONTAL;
((DirectionalShape) getFigure()).setVertical(!horizontal);
if (horizontal)
{
contentPane.setVertical(false);
setLayoutConstraint(this, getFigure(), new GridData(GridData.FILL,
GridData.FILL, true, false));
}
else
{
contentPane.setVertical(true);
setLayoutConstraint(this, getFigure(), new GridData(GridData.CENTER,
GridData.FILL, false, true));
}
}
protected Dataset getDataset()
{
return (Dataset) 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 DatasetAdapter implements Adapter
{
@Override
public void notifyChanged(Notification notification)
{
int featureId = notification.getFeatureID(StackedchartsPackage.class);
switch (featureId)
{
case StackedchartsPackage.DATASET__STYLING:
refreshChildren();
break;
case StackedchartsPackage.DATASET__NAME:
refreshVisuals();
break;
}
}
@Override
public Notifier getTarget()
{
return getDataset();
}
@Override
public void setTarget(Notifier newTarget)
{
}
@Override
public boolean isAdapterForType(Object type)
{
return type.equals(Dataset.class);
}
}
}