import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.MenuComponent;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;import javax.swing.AbstractButton;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreePath;public class CopyFileWizard extends Panel{ /**
*
*/
private static final long serialVersionUID = 1L;
private FileTree updateFileTree;
private FileTree deleteFileTree;
public CopyFileWizard() {
super();
init();
}
private void init() {
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
JPanel updatePanel = new JPanel();
updatePanel.setLayout(new BoxLayout(updatePanel, BoxLayout.Y_AXIS));
updatePanel.add(new JLabel("需要更新的文件"));
updateFileTree=this.createUpdateFileTree();
JScrollPane scrollPane = new JScrollPane(updateFileTree);
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
updatePanel.add(scrollPane);
updatePanel.add(Box.createRigidArea(new Dimension(10, 1)));
JPanel deletePanel = new JPanel();
deletePanel.setLayout(new BoxLayout(deletePanel, BoxLayout.Y_AXIS));
deletePanel.add(new JLabel("需要删除的文件"));
this.deleteFileTree=this.createUpdateFileTree();
scrollPane = new JScrollPane(deleteFileTree);
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
deletePanel.add(scrollPane);
deletePanel.add(Box.createRigidArea(new Dimension(10, 1)));
this.add(updatePanel);
this.add(Box.createRigidArea(new Dimension(15, 1)));
this.add(deletePanel);
}
private FileTree createUpdateFileTree() {
FileTree fileTree=new FileTree();
return fileTree;
}
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
CopyFileWizard copyFileWizard=new CopyFileWizard();
frame.add(copyFileWizard);
frame.setSize(new Dimension(900, 600));
frame.setVisible(true);
}
}
DragSourceListener, DropTargetListener {
private static final long serialVersionUID = 1L;
private Point lastPoint = new Point();
private TreePath lastPath;
private JPopupMenu popup;
public FileTree() {
super();
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
setModel(createTreeModel());
this.addTreeWillExpandListener(new TreeWillExpandListener() {
public void treeWillExpand(TreeExpansionEvent e)
throws ExpandVetoException {
TreePath path = e.getPath();
if (path != null) {
FileNode node = (FileNode) path.getLastPathComponent();
DefaultTreeModel model = (DefaultTreeModel) getModel(); if (!node.isExplored()) {
node.explore();
// model.nodeStructureChanged(node);
}
// model.reload(node);
}
}
public void treeWillCollapse(TreeExpansionEvent event)
throws ExpandVetoException {
}
});
addTreeExpansionListener(new TreeExpansionListener() {
public void treeCollapsed(TreeExpansionEvent e) {
}
public void treeExpanded(TreeExpansionEvent e) { }
});
setCellRenderer(new DefaultTreeCellRenderer() {
private static final long serialVersionUID = 7616415055309322562L;
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
TreePath tp = tree.getPathForRow(row);
if (tp != null) {
FileNode node = (FileNode) tp.getLastPathComponent();
File f = node.getFile();
try {
Icon icon = FileSystemView.getFileSystemView()
.getSystemIcon(f);
this.setIcon(icon);
this.setLeafIcon(icon);
this.setOpenIcon(icon);
this.setClosedIcon(icon);
this.setDisabledIcon(icon);
} catch (Exception e) {
e.printStackTrace();
}
}
return super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
}
});
super.setScrollsOnExpand(true);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
int modifiers = e.getModifiers();
if (code == 'v' || code == 'V') {
System.out.println("find v");
System.out.println("modifiers:" + modifiers + "\t"
+ ((modifiers & KeyEvent.CTRL_MASK) != 0));
}
if ((modifiers & KeyEvent.CTRL_MASK) != 0
&& (code == 'v' || code == 'V')) {
Transferable tr = Toolkit.getDefaultToolkit()
.getSystemClipboard().getContents(null);
TreePath path = getSelectionPath();
if (path == null) {
return;
}
FileNode node = (FileNode) path.getLastPathComponent();
if (node.isDirectory()) {
System.out.println("file cp");
try {
List<?> list = (List<?>) (tr
.getTransferData(DataFlavor.javaFileListFlavor));
Iterator<?> iterator = list.iterator();
File parent = node.getFile();
while (iterator.hasNext()) {
File f = (File) iterator.next();
cp(f, new File(parent, f.getName()));
}
node.reexplore();
} catch (Exception ioe) {
ioe.printStackTrace();
}
updateUI();
}
}
}
});
this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e) {
showPopup(e);
} @Override
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
private void showPopup(MouseEvent e){
popup = new JPopupMenu();
JMenuItem menuItem = new JMenuItem("删除");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
popup.add(menuItem);
if(e.isPopupTrigger()){
popup.show(e.getComponent(),e.getX(),e.getY());
}
System.out.println(popup.isVisible());
}
});
} private void cp(File src, File dest) throws IOException {
if (src.isDirectory()) {
if (!dest.exists()) {
boolean ret = dest.mkdir();
if (ret == false)
return;
}
File[] fs = src.listFiles();
for (int i = 0; i < fs.length; i++) {
cp(fs[i], new File(dest, fs[i].getName()));
}
return;
}
byte[] buf = new byte[1024];
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
int len;
try {
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
in.close();
out.close();
}
}
private DefaultTreeModel createTreeModel() {
File root = FileSystemView.getFileSystemView().getRoots()[0];
FileNode rootNode = new FileNode(root);
rootNode.explore();
return new DefaultTreeModel(rootNode);
}
////////////////////////////////////////
public void dragEnter(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
} public void dragOver(DropTargetDragEvent dtde) {
Point pt = dtde.getLocation();
if (pt.equals(lastPoint)) {
return;
} else{
lastPoint=pt;
}
TreePath path = getClosestPathForLocation(pt.x, pt.y);
TreePath temp=lastPath;
if (!(path == lastPath)) {
lastPath = path;
this.setSelectionPath(lastPath);
if(lastPath.getParentPath()!=temp){
this.collapsePath(temp);
}
} else{
this.expandPath(lastPath);
}
} public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
} public void dragExit(DropTargetEvent dte) {
// TODO Auto-generated method stub
} public void drop(DropTargetDropEvent dtde) {
try {
DataFlavor stringFlavor = DataFlavor.stringFlavor;
if(this.lastPath==null){
return;
}
FileNode node = (FileNode) this.lastPath.getLastPathComponent();
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
&& node.isDirectory()) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
System.out.println("file cp");
List<?> list = (List<?>) (dtde.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor));
Iterator<?> iterator = list.iterator();
File parent = node.getFile();
while (iterator.hasNext()) {
File f = (File) iterator.next();
cp(f, new File(parent, f.getName()));
}
node.reexplore();
dtde.dropComplete(true);
this.updateUI();
}else{
dtde.rejectDrop();
}
}catch (IOException ioe) {
ioe.printStackTrace();
} catch (UnsupportedFlavorException ufe) {
ufe.printStackTrace();
} finally {
this.repaint();
}
}
///////////////////////////////
public void dragEnter(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
} public void dragOver(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
} public void dropActionChanged(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
} public void dragExit(DragSourceEvent dse) {
// TODO Auto-generated method stub
} public void dragDropEnd(DragSourceDropEvent dsde) {
// TODO Auto-generated method stub
}
//////////////////////////////////
public void dragGestureRecognized(DragGestureEvent dge) {
// TODO Auto-generated method stub
}
}
private static final long serialVersionUID = -6713369593920467035L;
private boolean explored = false;
public FileNode(File file) {
setUserObject(file);
}
public boolean getAllowsChildren() {
return isDirectory();
}
public boolean isLeaf() {
return !isDirectory();
}
public File getFile() {
return (File) getUserObject();
}
public boolean isExplored() {
return explored;
}
public boolean isDirectory() {
File file = getFile();
return file.isDirectory();
}
public String toString() {
File file = (File) getUserObject();
String filename = file.toString();
int index = filename.lastIndexOf(File.separator);
return (index != -1 && index != filename.length() - 1) ? filename
.substring(index + 1) : filename;
}
public void explore() {
if (!isDirectory())
return;
if (!isExplored()) {
File file = getFile();
File[] children = file.listFiles();
for (int i = 0; i < children.length; ++i) {
if (children[i].isDirectory())
add(new FileNode(children[i]));
}
for (int i = 0; i < children.length; ++i) {
if (!children[i].isDirectory())
add(new FileNode(children[i]));
}
explored = true;
}
}
public void reexplore() {
this.removeAllChildren();
explored = false;
explore();
}
}