package de.danielsenff.radds.view; import java.awt.Component; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.util.Enumeration; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeModelEvent; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import util.FileUtil; public class FileSystemTree extends JTree { private FileSystemView fileSystemView = FileSystemView.getFileSystemView(); public FileSystemTree() { super(); updateTreeNodes(); getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); setRootVisible(true); setCellRenderer(new DefaultTreeCellRenderer() { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; File f = (File)node.getUserObject(); label.setText(fileSystemView.getSystemDisplayName(f)); label.setIcon(fileSystemView.getSystemIcon(f)); return label; } }); addKeyListener(new KeyListener() { public void keyPressed(KeyEvent event) { TreePath selectionPath = getSelectionPath(); if(event.getKeyCode() == KeyEvent.VK_ENTER) { final TreeNode node = (TreeNode) selectionPath.getLastPathComponent(); // loadImage(node); } else if ( (event.isMetaDown() || event.isControlDown()) && event.getKeyCode() == KeyEvent.VK_R ) { System.out.println("selection path: " + selectionPath); updateTreeNodes(); //preparePath(selectionPath, 1, (DefaultMutableTreeNode) getModel().getRoot()); expandPath(selectionPath); setSelectionPath(selectionPath); invalidate(); } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }); addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent event) { TreePath path = event.getPath(); TreeNode collapsedNode = (TreeNode) path.getLastPathComponent(); TreePath selectedPath = getSelectionPath(); TreeNode selectedNode = null; if (selectedPath != null) { selectedNode = (TreeNode) selectedPath.getLastPathComponent(); if (isSelectedNodeInCollapsedNode(selectedNode.getParent(), collapsedNode)) setSelectionPath(path); } } private boolean isSelectedNodeInCollapsedNode(TreeNode selectedNodeParent, TreeNode collapsedNode){ if(selectedNodeParent == null) return false; else if(collapsedNode.equals(selectedNodeParent)) return true; else return isSelectedNodeInCollapsedNode(selectedNodeParent.getParent(), collapsedNode); } public void treeExpanded(TreeExpansionEvent event) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) event.getPath().getLastPathComponent(); prepareChildTreeNodes(node); } }); } /** * */ public void updateTreeNodes() { //final File[] roots = fileSystemView.getRoots(); //File file = roots[0]; File file = fileSystemView.getHomeDirectory(); DefaultMutableTreeNode node = new FileSystemTreeNode(file); prepareTreeNode(node); prepareChildTreeNodes(node); expandRow(0); // expand root ((DefaultTreeModel) getModel()).setRoot(node); } /** * add new leaves to the node * @param node * @return */ public void prepareTreeNode(DefaultMutableTreeNode node) { File f = (File) node.getUserObject(); File[] files = fileSystemView.getFiles(f, true); for(int i = 0; i < files.length; i++) { File file = files[i]; if(file.isDirectory() || FileUtil.getFileSuffix(file).contains("dds") || FileUtil.getFileSuffix(file).contains("tex") || FileUtil.getFileSuffix(file).contains("tga")) node.add(new FileSystemTreeNode(file)); } } /** * prepare each child of this parent node * @param node */ private void prepareChildTreeNodes(DefaultMutableTreeNode node) { Enumeration<DefaultMutableTreeNode> e = node.children(); System.out.println(node); while(e.hasMoreElements()) { DefaultMutableTreeNode child = e.nextElement(); System.out.println("child: "+ child); prepareTreeNode(child); } } class FileSystemTreeNode extends DefaultMutableTreeNode { public FileSystemTreeNode(File file) { super(file); } @Override public int hashCode() { int hc = 17; int hashMultiplier = 59; hc = hc * hashMultiplier + this.toString().length(); hc = hc * hashMultiplier + this.toString().hashCode(); return hc; } @Override public boolean equals(Object obj) { //System.out.println(obj.toString() + " " + this.toString()); //System.out.println(obj.toString().equals(this.toString())); return obj.toString().equals(this.toString()); } } }