/**
*
*/
package org.korsakow.ide.ui.controller.dnd;
import java.awt.Point;
import java.awt.datatransfer.Transferable;
import java.awt.event.InputEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import javax.swing.tree.TreePath;
import org.dsrg.soenea.domain.command.CommandException;
import org.korsakow.domain.CommandExecutor;
import org.korsakow.domain.command.RenameResourceCommand;
import org.korsakow.domain.command.Request;
import org.korsakow.domain.command.Response;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.ide.ui.components.tree.FolderNode;
import org.korsakow.ide.ui.components.tree.KNode;
import org.korsakow.ide.ui.dnd.AggregateFileTransferHandler;
import org.korsakow.ide.ui.dnd.AggregateTransferHandler;
import org.korsakow.ide.ui.dnd.TransferableTreeTableNodes;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTable;
public class ResourceTreeTransferHandler extends AggregateTransferHandler
{
protected ResourceTreeTable resourceTreeTable;
public ResourceTreeTransferHandler(ResourceTreeTable comp) {
// add in the order of priority/preference
AggregateFileTransferHandler fileHandler = new AggregateFileTransferHandler();
fileHandler.addHandler(new ResourceTreeKifTransferHandler());
fileHandler.addHandler(new ResourceTreeProjectTransferHandler());
fileHandler.addHandler(new ResourceTreeMediaFileTransferHandler(this));
addHandler(fileHandler);
addHandler(new ResourceTreeNodeTransferHandler(this));
addHandler(new ResourceTreeMediaTransferHandler(this));
resourceTreeTable = comp;
}
@Override
public void exportAsDrag(JComponent comp, InputEvent e, int action) {
super.exportAsDrag(comp, e, action);
}
@Override
public Transferable createTransferable(JComponent comp)
{
List<? extends KNode> nodes = resourceTreeTable.getSelectedNodes();
List<KNode> toRemove = new ArrayList<KNode>();
for (KNode node : nodes) {
if (node == resourceTreeTable.getRootNode())
toRemove.add(node);
}
nodes.removeAll(toRemove);
return new TransferableTreeTableNodes(nodes);
}
@Override
protected TransferHandler pickTransferHandler(TransferSupport support) {
for (TransferHandler handler : handlers)
if (handler.canImport(support))
return handler;
return null;
}
protected KNode getDropPointNode(int[] indexref)
{
KNode dropPointNode = resourceTreeTable.getSelectedNode();
if (dropPointNode == null) {
Point point = resourceTreeTable.getMousePosition();
if (point == null)
return null;
TreePath path = resourceTreeTable.getPathForLocation(point.x, point.y);
if (path == null)
return null;
dropPointNode = (KNode)path.getLastPathComponent();
if (dropPointNode == null)
return null;
}
int index = 0;
if (dropPointNode instanceof FolderNode) {
index = dropPointNode.getChildCount();
} else {
index = dropPointNode.getParent().getIndex(dropPointNode);
dropPointNode = dropPointNode.getParent();
}
if (indexref!=null && indexref.length>0)
indexref[0] = index;
return dropPointNode;
}
static void renameMedia(IMedia medium, String newName) throws CommandException
{
Request request = new Request();
request.set(RenameResourceCommand.ID, medium.getId());
request.set(RenameResourceCommand.NAME, newName);
Response response = new Response();
CommandExecutor.executeCommand(RenameResourceCommand.class, request, response);
}
}