package de.danielsenff.radds.models; import java.awt.Component; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.event.TreeModelListener; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; /** * {@link TreeModel} for displaying a {@link FileSystemView}. * @author dahie * */ public class FileTreeModel implements TreeModel { private static final FileSystemView FILE_SYSTEM_VIEW = FileSystemView.getFileSystemView(); private FileNode _rootNode; private FileFilter fileFilter; /** * @param dir */ public FileTreeModel(final File dir) { this(dir, new FileFilter() { @Override public boolean accept(File pathname) { return true; } }); } /** * Constructor takes the root directory of this file tree. * The {@link FileFilter} defines a filter for files to include in the tree. * @param dir * @param fileFilter */ public FileTreeModel(final File dir, final FileFilter fileFilter) { this.fileFilter = fileFilter; _rootNode = new FileNode(dir, fileFilter); } @Override public Object getRoot() { return _rootNode; } private List<File> getFiles(final File directory) { return Arrays.asList(directory.listFiles(fileFilter)); } private List<File> getSortedFiles(final File directory) { List<File> files = getFiles(directory); Collections.sort(files); // just stupid javasorting return files; } @Override public int getChildCount(final Object parent) { return ((FileNode) parent).getChildrenCount(); } @Override public boolean isLeaf(final Object node) { return !((FileNode) node).isDirectory() || !((FileNode) node).hasChildren(); } @Override public Object getChild(final Object parent, final int index) { final FileNode node = ((FileNode) parent); // List<File> sortedFiles = getSortedFiles(file); return node.isDirectory() ? new FileNode(node.getChild(index), fileFilter) : null; } @Override public int getIndexOfChild(final Object parent, final Object child) { final File file = ((FileNode) child).getFile(); final FileNode node = (FileNode) parent; return node.getIndexOfChild(file); } @Override public void addTreeModelListener(final TreeModelListener l) {} @Override public void removeTreeModelListener(final TreeModelListener l) {} @Override public void valueForPathChanged(final TreePath path, final Object newValue) {} /** * Test-Frame for FileTreeModel * @param args */ public static void main(final String[] args) { final File userHomeDir = new File(System.getProperty("user.home")); final JTree tree = new JTree(new FileTreeModel(userHomeDir)); tree.setCellRenderer(new DefaultTreeCellRenderer() { @Override public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus) { final JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); final File f = ((FileNode)value).getFile(); label.setText(FILE_SYSTEM_VIEW.getSystemDisplayName(f)); label.setIcon(FILE_SYSTEM_VIEW.getSystemIcon(f)); return label; } }); tree.addKeyListener(new KeyAdapter() { @Override public void keyPressed(final KeyEvent event) { final TreePath selectionPath = tree.getSelectionPath(); if ( (event.isMetaDown() || event.isControlDown()) && event.getKeyCode() == KeyEvent.VK_R ) { tree.setModel(new FileTreeModel(userHomeDir)); tree.expandPath(selectionPath); tree.setSelectionPath(selectionPath); tree.invalidate(); } } }); final JFrame frame = new JFrame("FileBrowser"); frame.getContentPane().add(new JScrollPane(tree)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 500); frame.setVisible(true); } }