Java tutorial
/* SWT/JFace in Action GUI Design with Eclipse 3.0 Matthew Scarpino, Stephen Holder, Stanford Ng, and Laurent Mihalkovic ISBN: 1932394273 Publisher: Manning */ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; public class Ch12FileBrowserComposite extends Composite { private FileBrowser browser; public Ch12FileBrowserComposite(Composite parent) { super(parent, SWT.NONE); RowLayout layout = new RowLayout(SWT.HORIZONTAL); setLayout(layout); Button copyButton = new Button(this, SWT.PUSH); copyButton.setText("Copy"); copyButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { Clipboard clipboard = new Clipboard(getDisplay()); FileTransfer transfer = FileTransfer.getInstance(); clipboard.setContents(new Object[] { browser.getSelectedFiles() }, new Transfer[] { transfer }); clipboard.dispose(); } public void widgetDefaultSelected(SelectionEvent e) { } }); Button pasteButton = new Button(this, SWT.PUSH); pasteButton.setText("Paste"); pasteButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { Clipboard clipboard = new Clipboard(getDisplay()); FileTransfer transfer = FileTransfer.getInstance(); Object data = clipboard.getContents(transfer); if (data != null) { browser.copyFiles((String[]) data); } clipboard.dispose(); } public void widgetDefaultSelected(SelectionEvent e) { } }); browser = new FileBrowser(this); new FileBrowser(this); } } class FileBrowser { private ListViewer viewer; private File currentDirectory; public FileBrowser(Composite parent) { super(); buildListViewer(parent); Transfer[] types = new Transfer[] { FileTransfer.getInstance() }; viewer.addDropSupport(DND.DROP_COPY, types, new FileDropListener(this)); viewer.addDragSupport(DND.DROP_COPY, types, new FileDragListener(this)); } private void buildListViewer(Composite parent) { viewer = new ListViewer(parent); viewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { File file = (File) element; String name = file.getName(); return file.isDirectory() ? "<Dir> " + name : name; } }); viewer.setContentProvider(new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { File file = (File) inputElement; if (file.isDirectory()) { return file.listFiles(); } else { return new Object[] { file.getName() }; } } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); viewer.setSorter(new ViewerSorter() { public int category(Object element) { return ((File) element).isDirectory() ? 0 : 1; } public int compare(Viewer viewer, Object e1, Object e2) { int cat1 = category(e1); int cat2 = category(e2); if (cat1 != cat2) return cat1 - cat2; return ((File) e1).getName().compareTo(((File) e2).getName()); } }); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); setCurrentDirectory((File) selection.getFirstElement()); } }); setCurrentDirectory(File.listRoots()[0]); } private void setCurrentDirectory(File directory) { if (!directory.isDirectory()) throw new RuntimeException(directory + " is not a directory!"); currentDirectory = directory; viewer.setInput(directory); } String[] getSelectedFiles() { IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); List fileNameList = new LinkedList(); Iterator iterator = selection.iterator(); while (iterator.hasNext()) { File file = (File) iterator.next(); fileNameList.add(file.getAbsoluteFile().toString()); } return (String[]) fileNameList.toArray(new String[fileNameList.size()]); } void copyFiles(String[] sourceFileList) { for (int i = 0; i < sourceFileList.length; i++) { File sourceFile = new File(sourceFileList[i]); if (sourceFile.canRead() && currentDirectory.canWrite()) { File destFile = new File(currentDirectory, sourceFile.getName()); if (!destFile.exists()) { FileOutputStream out; FileInputStream in; try { out = new FileOutputStream(destFile); in = new FileInputStream(sourceFile); byte[] buffer = new byte[1024]; while ((in.read(buffer)) != -1) { out.write(buffer); } out.flush(); out.close(); in.close(); viewer.refresh(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println(destFile + " already exists, refusing to clobber"); } } else { System.out.println("Sorry, either your source file is not readable " + "or the target directory is not writable"); } } } } final class FileDropListener implements DropTargetListener { private final FileBrowser browser; FileDropListener(FileBrowser browser) { this.browser = browser; } public void dragEnter(DropTargetEvent event) { } public void dragLeave(DropTargetEvent event) { } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void dropAccept(DropTargetEvent event) { } public void drop(DropTargetEvent event) { String[] sourceFileList = (String[]) event.data; browser.copyFiles(sourceFileList); } } class FileDragListener implements DragSourceListener { private FileBrowser browser; public FileDragListener(FileBrowser browser) { this.browser = browser; } public void dragStart(DragSourceEvent event) { event.doit = true; } public void dragSetData(DragSourceEvent event) { event.data = browser.getSelectedFiles(); } public void dragFinished(DragSourceEvent event) { } }