package org.freeplane.plugin.workspace.actions;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.event.ActionEvent;
import javax.swing.tree.TreePath;
import org.freeplane.core.util.LogUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
import org.freeplane.plugin.workspace.dnd.DnDController;
import org.freeplane.plugin.workspace.dnd.NoDropHandlerFoundExeption;
import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
@CheckEnableOnPopup
public class NodePasteAction extends AWorkspaceAction {
public static final String KEY = "workspace.action.node.paste";
private static final long serialVersionUID = 1L;
public NodePasteAction() {
super(KEY);
}
public void setEnabled() {
try {
if(Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)
|| Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR)
|| Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)
|| Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_FREEPLANE_NODE_FLAVOR)
) {
setEnabled(true);
}
else {
setEnabled(false);
}
}
catch (Exception ex) {
// if the system clipboard has a problem
LogUtils.warn(ex.getLocalizedMessage());
}
}
public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
if(!DnDController.isDropAllowed(node)) {
setEnabled(false);
return;
}
super.setEnabledFor(node, selectedPaths);
}
public void actionPerformed(final ActionEvent e) {
AWorkspaceTreeNode targetNode = getNodeFromActionEvent(e);
if(DnDController.isDropAllowed(targetNode)) {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable transf = clip.getContents(null);
if(transf == null) {
return;
}
int dndAction = DnDConstants.ACTION_COPY;
if(transf.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_MOVE_NODE_FLAVOR)) {
dndAction = DnDConstants.ACTION_MOVE;
}
if(WorkspaceController.getCurrentModeExtension().getView() != null) {
try {
WorkspaceController.getCurrentModeExtension().getView().getTransferHandler().handleDrop(targetNode, transf, dndAction);
if(dndAction == DnDConstants.ACTION_MOVE ) {
clip.setContents(null, null);
}
} catch (NoDropHandlerFoundExeption ex) {
LogUtils.info("Exception in org.freeplane.plugin.workspace.actions.NodePasteAction.actionPerformed(ActionEvent): "+ ex.getMessage());
}
}
}
}
}