/*****************************************************************************
* Limpet - the Lightweight InforMation ProcEssing Toolkit
* http://limpet.info
*
* (C) 2015-2016, Deep Blue C Technologies Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html)
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*****************************************************************************/
package info.limpet.ui.editors.dnd;
import info.limpet.IStore;
import info.limpet.IStoreGroup;
import info.limpet.IStoreItem;
import info.limpet.data.csv.CsvParser;
import info.limpet.data.persistence.xml.XStreamHandler;
import info.limpet.data.store.StoreGroup;
import info.limpet.ui.Activator;
import info.limpet.ui.data_provider.data.GroupWrapper;
import info.limpet.ui.editors.LimpetDragListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.TransferData;
public class DataManagerDropAdapter extends ViewerDropAdapter
{
private IStore _store;
public DataManagerDropAdapter(Viewer viewer, IStore store)
{
super(viewer);
this._store = store;
}
@Override
public boolean performDrop(Object data)
{
if (!(data instanceof String[]) && !(data instanceof List[])
&& !(data instanceof String))
{
return false;
}
if (data instanceof String[])
{
String[] fileNames = (String[]) data;
return filesDropped(fileNames);
}
if (data instanceof String)
{
// ok, it's some data from the control itself.
final boolean validTarget;
final Object target = getCurrentTarget();
if (target == getSelectedObject())
{
return false;
}
if (target == null)
{
validTarget = true;
}
else if (target instanceof GroupWrapper)
{
validTarget = true;
}
else
{
validTarget = false;
}
if (!validTarget)
{
return false;
}
else
{
String str = (String) data;
String[] items = str.split(LimpetDragListener.SEPARATOR);
for (int i = 0; i < items.length; i++)
{
String thisS = items[i];
// find the item
IStoreItem item = _store.get(UUID.fromString(thisS));
if (item == null)
{
Activator.logError(Status.ERROR,
"Failed to find matching UUID, from another editor?", null);
return false;
}
IStoreGroup hisParent = item.getParent();
if (hisParent != null)
{
// remove the item from the current parent
hisParent.remove(item);
}
else
{
if (_store instanceof StoreGroup)
{
StoreGroup mem = (StoreGroup) _store;
mem.remove(item);
}
}
// sort out the object
if (target instanceof GroupWrapper)
{
GroupWrapper group = (GroupWrapper) target;
// and add to the new one
group.getGroup().add(item);
}
else
{
// ok, put it at the top level
_store.add(item);
}
}
changed();
return true;
}
}
// else if (data instanceof List[])
// {
// Object target = getCurrentTarget();
// if (target == getSelectedObject())
// {
// return false;
// }
// if (target instanceof GroupWrapper)
// {
// for (@SuppressWarnings("rawtypes")
// List list : (List[]) data)
// {
// for (Object object : list)
// {
// if (object instanceof GroupWrapper)
// {
// GroupWrapper groupWrapper = (GroupWrapper) object;
// List<IStoreItem> l = new ArrayList<IStoreItem>();
// StoreGroup storeGroup = new StoreGroup(groupWrapper.toString());
// l.add(storeGroup);
// storeGroup.addAll(groupWrapper.getGroup());
// ((GroupWrapper) target).getGroup().addAll(l);
// }
// else if (object instanceof CollectionWrapper)
// {
// CollectionWrapper collectionWrapper = (CollectionWrapper) object;
// ((GroupWrapper) target).getGroup().add(
// collectionWrapper.getCollection());
// }
// }
// }
// changed();
// return true;
// }
// }
return false;
}
@Override
public boolean validateDrop(Object target, int operation,
TransferData transferType)
{
boolean validTarget = target == null || target instanceof GroupWrapper;
return FileTransfer.getInstance().isSupportedType(transferType)
|| TextTransfer.getInstance().isSupportedType(transferType)
|| validTarget;
}
private boolean filesDropped(String[] fileNames)
{
if (fileNames != null)
{
for (int i = 0; i < fileNames.length; i++)
{
String fileName = fileNames[i];
if (fileName != null && fileName.endsWith(".csv"))
{
try
{
parseCsv(fileName);
}
catch (IOException e)
{
MessageDialog.openWarning(getViewer().getControl().getShell(),
"Warning", "Cannot drop '" + fileName
+ "'. See log for more details");
Activator.log(e);
return false;
}
}
else if (fileName != null && fileName.endsWith(".lap"))
{
// defer that
// try
// {
// parseLap(fileName);
// }
// catch (IOException e)
// {
// MessageDialog.openWarning(getViewer().getControl().getShell(),
// "Warning", "Cannot drop '" + fileName +
// "'. See log for more details");
// Activator.log(e);
// return false;
// }
}
}
}
return true;
}
private void parseCsv(String fileName) throws IOException
{
List<IStoreItem> collections = new CsvParser().parse(fileName);
Object target = getCurrentTarget();
if (target instanceof GroupWrapper)
{
((GroupWrapper) target).getGroup().addAll(collections);
}
else
{
_store.addAll(collections);
}
changed();
}
private void changed()
{
getViewer().refresh();
}
@SuppressWarnings("unused")
private void parseLap(String fileName) throws IOException
{
Object target = getCurrentTarget();
IStore store = new XStreamHandler().load(fileName);
final List<IStoreItem> list = new ArrayList<IStoreItem>();
if (store instanceof StoreGroup && target instanceof GroupWrapper)
{
final Iterator<IStoreItem> iter = ((StoreGroup) store).iterator();
GroupWrapper groupWrapper = (GroupWrapper) target;
while (iter.hasNext())
{
final IStoreItem item = iter.next();
list.add(item);
}
groupWrapper.getGroup().addAll(list);
}
changed();
}
}