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 java.util.ArrayList;
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 DatasetDropTargetListener extends CoreDropTargetListener
{
protected AbstractGraphicalEditPart feedback;
protected DatasetDropTargetListener(GraphicalViewer viewer)
{
super(viewer);
}
/** wrap up the data change for the drop event
*
* @param axis
* @param datasets
* @return
*/
abstract protected Command createCommand(AbstractGraphicalEditPart axis,
List<Dataset> datasets);
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;
}
protected static boolean canDropDataset(final Chart chart, final Dataset dataset)
{
boolean possible = true;
// check the axis
final Iterator<DependentAxis> minIter = chart.getMinAxes().iterator();
final Iterator<DependentAxis> maxIter = chart.getMaxAxes().iterator();
if (datasetAlreadyExistsOnTheseAxes(minIter, dataset.getName())
|| datasetAlreadyExistsOnTheseAxes(maxIter, dataset.getName()))
{
possible = false;
}
return possible;
}
@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<Dataset> objects = convertSelectionToDataset(sel);
EditPart target = findPart(event);
AbstractGraphicalEditPart editPart = (AbstractGraphicalEditPart) target;
List<Dataset> datasets = new ArrayList<Dataset>(objects.size());
for (Object o : objects)
{
if (o instanceof Dataset)
{
datasets.add((Dataset) o);
}
else if (o instanceof List<?>)
{
List<?> list = (List<?>) o;
for (Iterator<?> iter = list.iterator(); iter.hasNext();)
{
Object item = (Object) iter.next();
if (item instanceof Dataset)
{
datasets.add((Dataset) item);
}
}
}
}
if(datasets.size() > 0)
{
Command command = createCommand(editPart, datasets);
getCommandStack().execute(command);
}
}
feedback = null;
}
}