package info.limpet.stackedcharts.ui.editor.drop;
import info.limpet.stackedcharts.model.Chart;
import info.limpet.stackedcharts.model.Dataset;
import info.limpet.stackedcharts.model.DependentAxis;
import info.limpet.stackedcharts.model.ScatterSet;
import info.limpet.stackedcharts.ui.editor.parts.AxisEditPart;
import info.limpet.stackedcharts.ui.editor.parts.ChartEditPart;
import info.limpet.stackedcharts.ui.editor.parts.ScatterSetContainerEditPart;
import java.util.Iterator;
import java.util.List;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
/**
* base for classes supporting the drop process, including establishing if the target is valid
*
* @author ian
*
*/
abstract public class ScatterSetDropTargetListener extends
CoreDropTargetListener
{
protected AbstractGraphicalEditPart feedback;
protected ScatterSetDropTargetListener(GraphicalViewer viewer)
{
super(viewer);
}
/**
* wrap up the data change for the drop event
*
* @param chart
* @param scatterSets
* @return
*/
abstract protected Command createScatterCommand(Chart chart,
List<ScatterSet> scatterSets);
protected static boolean datasetAlreadyExistsOnTheseAxes(
final Iterator<DependentAxis> axes, final String name)
{
boolean exists = false;
while (axes.hasNext())
{
final DependentAxis dAxis = (DependentAxis) axes.next();
Iterator<Dataset> dIter = dAxis.getDatasets().iterator();
while (dIter.hasNext())
{
Dataset thisD = (Dataset) dIter.next();
if (name.equals(thisD.getName()))
{
// ok, we can't add it
System.err.println("Not adding dataset - duplicate name");
exists = true;
break;
}
}
}
return exists;
}
@Override
public void drop(DropTargetEvent event)
{
if (LocalSelectionTransfer.getTransfer().isSupportedType(
event.currentDataType))
{
StructuredSelection sel =
(StructuredSelection) LocalSelectionTransfer.getTransfer()
.getSelection();
if (sel.isEmpty())
{
event.detail = DND.DROP_NONE;
return;
}
List<ScatterSet> scatterSets = convertSelectionToScatterSet(sel);
EditPart part = findPart(event);
AbstractGraphicalEditPart target = (AbstractGraphicalEditPart) part;
// ok, now build up the commands necessary to
// make the changes
Command scatterCommand;
if (scatterSets.size() > 0)
{
Chart chart = null;
// get the target - we need the chart
if (target instanceof AxisEditPart)
{
AxisEditPart axis = (AxisEditPart) target;
chart = (Chart) axis.getParent().getModel();
}
else if (target instanceof ChartEditPart)
{
chart = (Chart) target.getModel();
}
else if(target instanceof ScatterSetContainerEditPart)
{
ScatterSetContainerEditPart scatter = (ScatterSetContainerEditPart) target;
chart = (Chart) scatter.getParent().getModel();
}
scatterCommand = createScatterCommand(chart, scatterSets);
}
else
{
scatterCommand = null;
}
if (scatterCommand != null)
{
getCommandStack().execute(scatterCommand);
}
}
feedback = null;
}
}