package org.freeplane.plugin.workspace.actions;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import javax.swing.tree.TreePath;
import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
import org.freeplane.plugin.workspace.dnd.DnDController;
import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
import org.freeplane.plugin.workspace.dnd.IWorspaceClipboardOwner;
import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
@CheckEnableOnPopup
public class NodeCopyAction extends AWorkspaceAction {
public static final String KEY = "workspace.action.node.copy";
private static final long serialVersionUID = 1L;
public NodeCopyAction() {
super(KEY);
}
public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
if(node.isSystem() || !node.isTransferable() || !(node instanceof IWorkspaceTransferableCreator)) {
setEnabled(false);
}
else{
setEnabled();
}
}
public void actionPerformed(final ActionEvent e) {
AWorkspaceTreeNode[] targetNodes = getSelectedNodes(e);
WorkspaceTransferable transferable = null;
for (AWorkspaceTreeNode targetNode : targetNodes) {
if(targetNode instanceof IWorkspaceTransferableCreator) {
if(transferable == null) {
transferable = ((IWorkspaceTransferableCreator)targetNode).getTransferable();
}
else {
transferable.merge(((IWorkspaceTransferableCreator)targetNode).getTransferable());
}
}
}
if(transferable == null) {
return;
}
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, new CopyClipboardOwner(transferable));
}
class CopyClipboardOwner implements IWorspaceClipboardOwner {
private final WorkspaceTransferable transferable;
public CopyClipboardOwner(WorkspaceTransferable transfer) {
this.transferable = transfer;
DnDController.getSystemClipboardController().setClipboardOwner(this);
}
public void lostOwnership(Clipboard clipboard, Transferable contents) {
if(this.equals(DnDController.getSystemClipboardController().getClipboardOwner()) ) {
DnDController.getSystemClipboardController().resetClipboardOwner(this);
if(transferable != null) {
transferable.refreshNodes();
}
}
}
public WorkspaceTransferable getTransferable() {
return this.transferable;
}
}
}