/*
* BrowserTransferHandler.java
*
* Created on March 4, 2005, 1:42 PM
*/
package kiyut.ekspos;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.*;
import javax.swing.tree.*;
import kiyut.swing.shell.io.*;
import kiyut.swing.shell.util.*;
import kiyut.swing.shell.shelllistview.*;
import kiyut.swing.shell.shelltreeview.*;
/**
* Browser Window DnD Support
* @author Kiyut
*/
public class BrowserTransferHandler extends TransferHandler {
protected ResourceBundle bundle = ResourceBundle.getBundle("kiyut.ekspos.BrowserWindow");
/** Destination directory or folder */
protected File targetFile;
/** Boolean flag indicated clipboardTransfer or not */
protected boolean clipboardTransfer = false;
/** action requested */
protected int action;
/** Target Component */
protected JComponent target;
/** Source Component */
protected JComponent source;
/** Creates a new instance of BrowserTransferHandler */
public BrowserTransferHandler() {
}
@Override
protected Transferable createTransferable(JComponent c) {
List<File> fileList = new ArrayList<File>();
if (c instanceof ViewComponent) {
ViewComponent sourceComp = (ViewComponent)c;
fileList.addAll(((ShellListViewSelectionModel)sourceComp.getSelectionModel()).getSelectedFiles());
} else if (c instanceof ShellTreeView) {
ShellTreeView sourceComp = (ShellTreeView)c;
TreePath[] paths = sourceComp.getSelectionPaths();
if (paths == null || paths.length == 0) { return null; }
for (int i=0; i<paths.length; i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)paths[i].getLastPathComponent();
fileList.add((File)node.getUserObject());
}
}
if (fileList.size() == 0) {
return null;
}
Collections.sort(fileList);
Transferable transferable = new FileTransferable(fileList);
return transferable;
}
@Override
public int getSourceActions(JComponent comp) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
boolean b = false;
for (int i=0; i<transferFlavors.length; i++) {
if (transferFlavors[i].equals(DataFlavor.javaFileListFlavor)) {
b = true;
break;
}
}
return b;
}
@Override
public void exportToClipboard(JComponent comp, Clipboard clip, int action) {
clipboardTransfer = true;
this.action = action;
super.exportToClipboard(comp,clip,action);
}
@Override
public void exportAsDrag(JComponent comp, InputEvent evt, int action) {
clipboardTransfer = false;
super.exportAsDrag(comp,evt,action);
}
@Override
public boolean importData(JComponent comp, Transferable t) {
boolean imported = false;
if (canImport(comp,t.getTransferDataFlavors()) == false) {
return imported;
}
List fileList = null;
try {
fileList = (List)t.getTransferData(DataFlavor.javaFileListFlavor);
} catch (UnsupportedFlavorException ex) {
return imported;
} catch (IOException ex) {
return imported;
}
if (fileList == null) {
return imported;
}
if (comp instanceof ViewComponent) {
ViewComponent targetComp = (ViewComponent)comp;
targetFile = ((ShellListViewSelectionModel)targetComp.getSelectionModel()).getLastSelectedFile();
} else if (comp instanceof ShellTreeView) {
ShellTreeView targetComp = (ShellTreeView)comp;
DefaultMutableTreeNode targetNode = (DefaultMutableTreeNode)targetComp.getLastSelectedPathComponent();
if (targetNode != null) {
targetFile = (File)targetNode.getUserObject();
}
}
if (targetFile == null) {
return imported;
}
if (!targetFile.isDirectory()) {
targetFile = null;
return imported;
}
target = comp;
if (clipboardTransfer == true) {
startTransfer(source,target,action,fileList,targetFile);
}
imported = true;
return imported;
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
this.action = action;
if (data == null) { return; }
List fileList = null;
try {
fileList = (List)data.getTransferData(DataFlavor.javaFileListFlavor);
} catch (UnsupportedFlavorException ex) {
return;
} catch (IOException ex) {
return;
}
if (fileList == null) {
return ;
}
this.source = source;
if (clipboardTransfer == false) {
startTransfer(source,target,action,fileList,targetFile);
}
/*final JComponent parentComponent = source;
final List sourceList = fileList;
if (action == TransferHandler.COPY) {
ShellProgressMonitor shellProgressMonitor = new ShellProgressMonitor(parentComponent);
try {
shellProgressMonitor.start(ShellProgressMonitor.COPY,sourceList,targetFile);
} catch (Exception ex) {
String msg = ex.getMessage().trim().length() > 0 ? ex.getMessage() : bundle.getString("message.copyException.text");
JOptionPane.showMessageDialog(parentComponent, msg, bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
shellProgressMonitor.cancel();
}
} else if (action == TransferHandler.MOVE) {
ShellProgressMonitor shellProgressMonitor = new ShellProgressMonitor(parentComponent);
try {
shellProgressMonitor.start(ShellProgressMonitor.MOVE,sourceList,targetFile);
} catch (Exception ex) {
String msg = ex.getMessage().trim().length() > 0 ? ex.getMessage() : bundle.getString("message.moveException.text");
JOptionPane.showMessageDialog(parentComponent, msg, bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
shellProgressMonitor.cancel();
}
}*/
}
protected void startTransfer(JComponent source, JComponent target, int action, List<File> sourceList, File targetFile) {
if (action == TransferHandler.COPY) {
ShellProgressMonitor shellProgressMonitor = new ShellProgressMonitor(source);
try {
shellProgressMonitor.start(ShellProgressMonitor.COPY,sourceList,targetFile);
} catch (Exception ex) {
String msg = ex.getMessage().trim().length() > 0 ? ex.getMessage() : bundle.getString("message.copyException.text");
JOptionPane.showMessageDialog(source, msg, bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
shellProgressMonitor.cancel();
}
if (target instanceof ViewComponent) {
((ViewComponent)target).getViewModel().refresh();
} else if (target instanceof ShellTreeView) {
ShellTreeView treeView = (ShellTreeView)target;
DefaultMutableTreeNode targetNode = (DefaultMutableTreeNode)treeView.getLastSelectedPathComponent();
if (targetNode != null) {
((ShellTreeViewModel)treeView.getModel()).reload(targetNode);
}
}
} else if (action == TransferHandler.MOVE) {
ShellProgressMonitor shellProgressMonitor = new ShellProgressMonitor(source);
try {
shellProgressMonitor.start(ShellProgressMonitor.MOVE,sourceList,targetFile);
} catch (Exception ex) {
String msg = ex.getMessage().trim().length() > 0 ? ex.getMessage() : bundle.getString("message.moveException.text");
JOptionPane.showMessageDialog(source, msg, bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
shellProgressMonitor.cancel();
}
if (target instanceof ViewComponent) {
((ViewComponent)target).getViewModel().refresh();
} else if (target instanceof ShellTreeView) {
ShellTreeView treeView = (ShellTreeView)target;
DefaultMutableTreeNode targetNode = (DefaultMutableTreeNode)treeView.getLastSelectedPathComponent();
if (targetNode != null) {
((ShellTreeViewModel)treeView.getModel()).reload(targetNode);
}
}
}
}
}