/** * author: Marcel Genzmehr * 22.07.2011 */ package org.freeplane.plugin.workspace.nodes; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDropEvent; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.tree.DefaultTreeCellRenderer; import org.apache.commons.io.FileUtils; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.mindmapmode.MModeController; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.WorkspaceUtils; import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu; import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder; import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable; import org.freeplane.plugin.workspace.event.WorkspaceActionEvent; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; /** * */ public class FolderFileNode extends DefaultFileNode { private static final Icon FOLDER_OPEN_ICON = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange_open.png")); private static final Icon FOLDER_CLOSED_ICON = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange.png")); private static final Icon NOT_EXISTING = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange-missing.png")); private static final long serialVersionUID = 1L; private static WorkspacePopupMenu popupMenu = null; /*********************************************************************************** * CONSTRUCTORS **********************************************************************************/ /** * @param name * @param file */ public FolderFileNode(String name, File file) { super(name, file); } /*********************************************************************************** * METHODS **********************************************************************************/ public void delete() { delete(getFile()); } private void delete(File file) { if(file.isDirectory()) { for(File child : file.listFiles()) { delete(child); } } file.delete(); } public boolean setIcons(DefaultTreeCellRenderer renderer) { if(getFile() == null || !getFile().exists()) { renderer.setLeafIcon(NOT_EXISTING); renderer.setOpenIcon(NOT_EXISTING); renderer.setClosedIcon(NOT_EXISTING); return true; } renderer.setOpenIcon(FOLDER_OPEN_ICON); renderer.setClosedIcon(FOLDER_CLOSED_ICON); renderer.setLeafIcon(FOLDER_CLOSED_ICON); return true; } public AWorkspaceTreeNode clone() { FolderFileNode node = new FolderFileNode(getName(), getFile()); return clone(node); } public void refresh() { try { if (getFile().isDirectory()) { WorkspaceUtils.getModel().removeAllElements(this); WorkspaceController.getController().getFilesystemMgr().scanFileSystem(this, getFile()); WorkspaceUtils.getModel().reload(this); } } catch (Exception e) { e.printStackTrace(); } } public void initializePopup() { if (popupMenu == null) { if (popupMenu == null) { popupMenu = new WorkspacePopupMenu(); WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] { WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")), "workspace.action.node.new.folder", "workspace.action.file.new.mindmap", //WorkspacePopupMenuBuilder.SEPARATOR, //"workspace.action.file.new.file", WorkspacePopupMenuBuilder.endSubMenu(), WorkspacePopupMenuBuilder.SEPARATOR, "workspace.action.node.open.location", WorkspacePopupMenuBuilder.SEPARATOR, "workspace.action.node.cut", "workspace.action.node.copy", "workspace.action.node.paste", WorkspacePopupMenuBuilder.SEPARATOR, "workspace.action.node.rename", "workspace.action.node.remove", "workspace.action.file.delete", WorkspacePopupMenuBuilder.SEPARATOR, "workspace.action.node.refresh" }); } } } public WorkspacePopupMenu getContextMenu() { if (popupMenu == null) { initializePopup(); } return popupMenu; } private void processWorkspaceNodeDrop(List<AWorkspaceTreeNode> nodes, int dropAction) { try { File targetDir = getFile(); for(AWorkspaceTreeNode node : nodes) { if(node instanceof DefaultFileNode) { if(targetDir != null && targetDir.isDirectory()) { if(dropAction == DnDConstants.ACTION_COPY) { ((DefaultFileNode) node).copyTo(targetDir); } else if(dropAction == DnDConstants.ACTION_MOVE) { File oldFile = ((DefaultFileNode) node).getFile(); if(oldFile.equals(targetDir)) return; ((DefaultFileNode) node).moveTo(targetDir); File newFile = new File(targetDir, ((DefaultFileNode) node).getName()); AWorkspaceTreeNode parent = node.getParent(); WorkspaceUtils.getModel().cutNodeFromParent(node); parent.refresh(); WorkspaceUtils.getModel().nodeMoved(node, oldFile, newFile); } } } else if(node instanceof LinkTypeFileNode) { File srcFile = WorkspaceUtils.resolveURI(((LinkTypeFileNode) node).getLinkPath()); if(targetDir != null && targetDir.isDirectory()) { FileUtils.copyFileToDirectory(srcFile, targetDir); if(dropAction == DnDConstants.ACTION_MOVE) { AWorkspaceTreeNode parent = node.getParent(); WorkspaceUtils.getModel().cutNodeFromParent(node); parent.refresh(); WorkspaceUtils.getModel().nodeMoved(node, srcFile, new File(targetDir, srcFile.getName())); } } } } } catch (Exception e) { LogUtils.warn(e); } WorkspaceController.getController().getExpansionStateHandler().addPathKey(this.getKey()); refresh(); } private void processFileListDrop(List<File> files, int dropAction) { try { File targetDir = getFile(); for(File srcFile : files) { if(srcFile.isDirectory()) { FileUtils.copyDirectoryToDirectory(srcFile, targetDir); } else { FileUtils.copyFileToDirectory(srcFile, targetDir, true); } } refresh(); } catch (Exception e) { LogUtils.warn(e); } refresh(); } private void processUriListDrop(List<URI> uris, int dropAction) { try { File targetDir = getFile(); for(URI uri : uris) { File srcFile = new File(uri); if(srcFile == null || !srcFile.exists()) { continue; } if(srcFile.isDirectory()) { FileUtils.copyDirectoryToDirectory(srcFile, targetDir); } else { FileUtils.copyFileToDirectory(srcFile, targetDir, true); } } refresh(); } catch (Exception e) { LogUtils.warn(e); } refresh(); } public boolean acceptDrop(DataFlavor[] flavors) { for(DataFlavor flavor : flavors) { 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; } public boolean processDrop(DropTargetDropEvent event) { event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); Transferable transferable = event.getTransferable(); if(processDrop(transferable, event.getDropAction())) { event.dropComplete(true); return true; } event.dropComplete(false); return false; } @SuppressWarnings("unchecked") public boolean processDrop(Transferable transferable, int dropAction) { try { if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)) { processWorkspaceNodeDrop((List<AWorkspaceTreeNode>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR), dropAction); } else if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)) { processFileListDrop((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(URI.create(singleUri)); } catch (Exception e) { LogUtils.info("DOCEAR - "+ e.getMessage()); } } processUriListDrop(uriList, dropAction); } } catch (Exception e) { LogUtils.warn(e); } return true; } /*********************************************************************************** * REQUIRED METHODS FOR INTERFACES **********************************************************************************/ public void handleAction(WorkspaceActionEvent event) { if(event.getType() == WorkspaceActionEvent.WSNODE_CHANGED) { Controller.getCurrentController().selectMode(MModeController.MODENAME); if(rename(event.getBaggage().toString())) { setName(event.getBaggage().toString()); if(event.getSource() instanceof AWorkspaceTreeNode) { Enumeration<AWorkspaceTreeNode> childs = ((AWorkspaceTreeNode)event.getSource()).children(); while(childs.hasMoreElements()) { AWorkspaceTreeNode node = ((AWorkspaceTreeNode) childs.nextElement()); if(node instanceof DefaultFileNode) { ((DefaultFileNode)node).relocateFile(getFile()); } } } } else { LogUtils.warn("Could not rename File("+getName()+") to File("+event.getBaggage()+")"); } } else if(event.getType() == WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT) { // try { // Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(getFile())); // event.consume(); // } catch (Exception e) { // LogUtils.warn(e); // } } else { super.handleAction(event); } } }