/** * author: Marcel Genzmehr * 29.07.2011 */ package org.freeplane.plugin.workspace.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import org.freeplane.core.util.LogUtils; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; import org.freeplane.plugin.workspace.nodes.AFolderNode; /** * */ public class WorkspaceTransferable implements Transferable { public static DataFlavor WORKSPACE_DROP_ACTION_FLAVOR; // = new DataFlavor("text/drop-action; class=java.lang.String"); public static DataFlavor WORKSPACE_NODE_FLAVOR; // = new DataFlavor("application/x-java-jvm-local-objectref; class=org.freeplane.plugin.workspace.config.node.AWorkspaceNode"); public static DataFlavor WORKSPACE_FILE_LIST_FLAVOR; // = DataFlavor.javaFileListFlavor; public static DataFlavor WORKSPACE_FREEPLANE_NODE_FLAVOR; // = new DataFlavor("text/freeplane-nodes; class=java.lang.String"); public static DataFlavor WORKSPACE_SERIALIZED_FLAVOR; public static DataFlavor WORKSPACE_URI_LIST_FLAVOR; public static DataFlavor WORKSPACE_MOVE_NODE_FLAVOR; static { try { WORKSPACE_DROP_ACTION_FLAVOR = new DataFlavor("text/drop-action; class=java.lang.String"); WORKSPACE_NODE_FLAVOR = new DataFlavor("application/x-java-jvm-local-objectref; class=java.util.List"); WORKSPACE_FILE_LIST_FLAVOR = new DataFlavor("application/x-java-file-list; class=java.util.List"); WORKSPACE_FREEPLANE_NODE_FLAVOR = new DataFlavor("text/freeplane-nodes; class=java.lang.String"); WORKSPACE_SERIALIZED_FLAVOR = new DataFlavor("application/x-java-serialized-object; class=java.lang.String"); WORKSPACE_URI_LIST_FLAVOR = new DataFlavor("text/uri-list; class=java.lang.String"); WORKSPACE_MOVE_NODE_FLAVOR = new DataFlavor("text/move-action; class=java.lang.String"); } catch (final Exception e) { LogUtils.severe(e); } } private final Hashtable<DataFlavor, Object> dataMap = new Hashtable<DataFlavor, Object>(); private boolean isCopy = true; /*********************************************************************************** * CONSTRUCTORS **********************************************************************************/ public WorkspaceTransferable(DataFlavor flavor, Object data) { addData(flavor, data); } public WorkspaceTransferable() { } /*********************************************************************************** * METHODS **********************************************************************************/ public boolean isCopy() { return this.isCopy ; } public void setAsCopy(boolean asCopy) { boolean old = isCopy(); this.isCopy = asCopy; if(old != isCopy()) { if(isCopy()) { dataMap.remove(WORKSPACE_MOVE_NODE_FLAVOR); } else { dataMap.put(WORKSPACE_MOVE_NODE_FLAVOR, "move-action"); } } } public boolean addData(DataFlavor flavor, Object data) { dataMap.put(flavor, data); return true; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if(dataMap.containsKey(flavor)) { return dataMap.get(flavor); } throw new UnsupportedFlavorException(flavor); } public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[dataMap.size()]; int i = 0; for(Enumeration<DataFlavor> e = dataMap.keys(); e.hasMoreElements(); i++) { flavors[i] = e.nextElement(); } return flavors; } // Returns whether or not the specified data flavor is supported for // this object. public boolean isDataFlavorSupported(DataFlavor flavor) { if(dataMap.containsKey(flavor)) { return true; } return false; } public void merge(WorkspaceTransferable transferable) { if(transferable == null) { return; } for(DataFlavor flavor : transferable.getTransferDataFlavors()) { if(isDataFlavorSupported(flavor)) { try { merge(flavor, transferable.getTransferData(flavor)); } catch (UnsupportedFlavorException e) { //cannot happen } } else { try { addData(flavor, transferable.getTransferData(flavor)); } catch (UnsupportedFlavorException e) { //cannot happen } } } } @SuppressWarnings("unchecked") private void merge(DataFlavor flavor, Object transferData) { if(flavor.equals(WORKSPACE_URI_LIST_FLAVOR)) { mergeURIList((String)transferData); } else if(flavor.equals(WORKSPACE_FILE_LIST_FLAVOR)) { mergeFileList((List<File>)transferData); } else if(flavor.equals(WORKSPACE_NODE_FLAVOR)) { mergeNodeList((List<AWorkspaceTreeNode>)transferData); } } @SuppressWarnings("unchecked") private void mergeNodeList(List<AWorkspaceTreeNode> transferData) { List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR); for (AWorkspaceTreeNode newNode : transferData) { if(!nodes.contains(newNode)) { nodes.add(newNode); } } } @SuppressWarnings("unchecked") private void mergeFileList(List<File> transferData) { List<File> files = (List<File>) dataMap.get(WORKSPACE_FILE_LIST_FLAVOR); for (File newFile : transferData) { if(!files.contains(newFile)) { files.add(newFile); } } } private void mergeURIList(String transferData) { String URI_SEP = "\r\n"; String[] uris = transferData.split(URI_SEP); StringBuffer buffer = new StringBuffer((String)dataMap.get(WORKSPACE_URI_LIST_FLAVOR)); for (String uri : uris) { if(buffer.indexOf(uri) < 0) { buffer.append(URI_SEP); buffer.append(uri); } } } @SuppressWarnings("unchecked") public boolean contains(AWorkspaceTreeNode node) { if(node != null) { List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR); if(nodes != null) { for (AWorkspaceTreeNode inNode : nodes) { if(inNode.getKey().equals(node.getKey())) { return true; } } } } return false; } @SuppressWarnings("unchecked") public void refreshNodes() { List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR); if(nodes != null) { for (AWorkspaceTreeNode node : nodes) { if(!(node instanceof AFolderNode)) { node.getParent().refresh(); } else { node.refresh(); } } } } /*********************************************************************************** * REQUIRED METHODS FOR INTERFACES **********************************************************************************/ }