package org.freeplane.plugin.workspace.mindmapmode;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.freeplane.core.util.LogUtils;
import org.freeplane.plugin.workspace.URIUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.components.IWorkspaceView;
import org.freeplane.plugin.workspace.dnd.INodeDropHandler;
import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
public class VirtualFolderDropHandler implements INodeDropHandler {
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
/***********************************************************************************
* METHODS
**********************************************************************************/
private void processWorkspaceNodeDrop(AWorkspaceTreeNode targetNode, List<AWorkspaceTreeNode> nodes, int dropAction) {
try {
for(AWorkspaceTreeNode node : nodes) {
AWorkspaceTreeNode newNode = null;
if(node instanceof DefaultFileNode) {
newNode = createFSNodeLinks(targetNode, ((DefaultFileNode) node).getFile());
}
else {
if(dropAction == DnDConstants.ACTION_COPY) {
newNode = node.clone();
}
else if (dropAction == DnDConstants.ACTION_MOVE) {
AWorkspaceTreeNode parent = node.getParent();
targetNode.getModel().cutNodeFromParent(node);
parent.refresh();
newNode = node;
}
}
if(newNode == null) {
continue;
}
targetNode.getModel().addNodeTo(newNode, targetNode);
// WorkspaceController.getController().getExpansionStateHandler().addPathKey(this.getKey());
}
// WorkspaceUtils.saveCurrentConfiguration();
}
catch (Exception e) {
LogUtils.warn(e);
}
}
private void processFileListDrop(AWorkspaceTreeNode targetNode, List<File> files, int dropAction) {
try {
for(File srcFile : files) {
AWorkspaceTreeNode node = createFSNodeLinks(targetNode, srcFile);
targetNode.getModel().addNodeTo(node, targetNode);
node.refresh();
}
// WorkspaceUtils.saveCurrentConfiguration();
}
catch (Exception e) {
LogUtils.warn(e);
}
}
private void processUriListDrop(AWorkspaceTreeNode targetNode, List<URI> uris, int dropAction) {
try {
for(URI uri : uris) {
File srcFile = new File(uri);
if(srcFile == null || !srcFile.exists()) {
continue;
}
AWorkspaceTreeNode node = createFSNodeLinks(targetNode, srcFile);
targetNode.getModel().addNodeTo(node, targetNode);
node.refresh();
};
// WorkspaceUtils.saveCurrentConfiguration();
}
catch (Exception e) {
LogUtils.warn(e);
}
}
/**
* @param file
* @return
*/
private AWorkspaceTreeNode createFSNodeLinks(AWorkspaceTreeNode targetNode, File file) {
AWorkspaceTreeNode node = null;
AWorkspaceProject project = WorkspaceController.getSelectedProject(targetNode);
if(file.isDirectory()) {
FolderLinkNode pNode = new FolderLinkNode();
pNode.setPath(project.getRelativeURI(file.toURI()));
node = pNode;
}
else {
LinkTypeFileNode lNode = new LinkTypeFileNode();
lNode.setLinkURI(project.getRelativeURI(file.toURI()));
node = lNode;
}
node.setName(file.getName());
return node;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
@SuppressWarnings("unchecked")
public boolean processDrop(AWorkspaceTreeNode targetNode, Transferable transferable, int dropAction) {
try {
if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)) {
processWorkspaceNodeDrop(targetNode, (List<AWorkspaceTreeNode>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR), dropAction);
}
else if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)) {
processFileListDrop(targetNode, (List<File>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR), dropAction);
}
else if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR)) {
ArrayList<URI> uriList = new ArrayList<URI>();
String uriString = (String) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR);
if (!uriString.startsWith("file://")) {
return false;
}
String[] uriArray = uriString.split("\r\n");
for(String singleUri : uriArray) {
try {
uriList.add(URIUtils.createURI(singleUri));
}
catch (Exception e) {
LogUtils.info("org.freeplane.plugin.workspace.mindmapmode.VirtualFolderDropHandler.processDrop(targetNode, transferable, dropAction)@1:"+ e.getMessage());
}
}
processUriListDrop(targetNode, uriList, dropAction);
}
targetNode.refresh();
IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
if(view != null) {
view.expandPath(targetNode.getTreePath());
WorkspaceController.getCurrentModeExtension().getView().refreshView();
}
}
catch (Exception e) {
LogUtils.warn("org.freeplane.plugin.workspace.mindmapmode.VirtualFolderDropHandler.processDrop(targetNode, transferable, dropAction)@2", e);
}
return true;
}
public boolean acceptDrop(Transferable transferable) {
for(DataFlavor flavor : transferable.getTransferDataFlavors()) {
if(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR.equals(flavor)
|| WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR.equals(flavor)
|| WorkspaceTransferable.WORKSPACE_NODE_FLAVOR.equals(flavor)
) {
return true;
}
}
return false;
}
}