package com.jds.swing; import javax.swing.*; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeWillExpandListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.Arrays; import java.util.ResourceBundle; /** * User: VISTALL * I not a author. @author INTERNET * Company: J Develop Station * Date: 18.09.2009 * Time: 18:55:12 */ public class JDirectoryChooser extends JComponent { private JTextField folderPath; private JLabel messageLabel; private JButton select; private JButton cancel; private File selectedFolder; private boolean fileSelected; private boolean showHidden; private JTree tree; private JDialog dialog; public JDirectoryChooser(JDialog parent) // { this.dialog = new JDialog(parent, ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("ChooseFolder"), true); JPanel northPanel = new JPanel(); JPanel centerPanel = new JPanel(); JPanel southPanel = new JPanel(); northPanel.setLayout(new BorderLayout()); this.messageLabel = new JLabel(ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("ChooseFolder")); northPanel.add(this.messageLabel); northPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); centerPanel.setLayout(new BorderLayout(10, 10)); DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("My Computer"); DefaultTreeModel rootModel = new DefaultTreeModel(rootNode, true); File[] rootDrive = File.listRoots(); DefaultMutableTreeNode[] rootDriveTree = new DefaultMutableTreeNode[rootDrive.length]; for (int i = 0; i < rootDrive.length; ++i) { rootDriveTree[i] = new DefaultMutableTreeNode(rootDrive[i]); rootNode.add(rootDriveTree[i]); } DefaultTreeCellRenderer cellRenderer = new DefaultTreeCellRenderer(); cellRenderer.setLeafIcon(cellRenderer.getClosedIcon()); this.tree = new JTree(rootModel); this.tree.setCellRenderer(cellRenderer); //this.tree.setRootVisible(false); this.tree.setExpandsSelectedPaths(true); this.tree.putClientProperty("JTree.lineStyle", "Angled"); centerPanel.add(new JScrollPane(this.tree), "Center"); JPanel namePanel = new JPanel(); namePanel.setLayout(new BorderLayout(10, 10)); namePanel.add(new JLabel(ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("Folder")), "West"); namePanel.add(this.folderPath = new JTextField(), "Center"); centerPanel.add(namePanel, "South"); centerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.select = new JButton(ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("Select")); this.select.setMnemonic('S'); this.cancel = new JButton(ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("Cancel")); this.cancel.setMnemonic('C'); southPanel.setLayout(new FlowLayout(2, 10, 10)); southPanel.add(this.select); southPanel.add(this.cancel); this.dialog.getContentPane().setLayout(new BorderLayout()); this.dialog.getContentPane().add(northPanel, "North"); this.dialog.getContentPane().add(centerPanel, "Center"); this.dialog.getContentPane().add(southPanel, "South"); this.dialog.setSize(325, 325); this.dialog.setLocationRelativeTo(parent); this.dialog.getRootPane().setDefaultButton(this.select); this.tree.addTreeWillExpandListener(new TreeWillExpandListener() { public void treeWillExpand(TreeExpansionEvent e) { TreePath selectionPath = e.getPath(); if (selectionPath == null) { return; } DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent(); int i = selectionPath.getPathCount(); StringBuffer temp = new StringBuffer(); for (int j = 1; j < i - 1; ++j) { temp.append(selectionPath.getPathComponent(j) + "/"); } temp.append(selectionPath.getPathComponent(i - 1)); JDirectoryChooser.this.selectedFolder = new File(temp.toString()); JDirectoryChooser.this.folderPath.setText(selectionPath.getPathComponent(i - 1).toString()); if (node.getChildCount() > 0) { node.removeAllChildren(); } JDirectoryChooser.this.createDriveTree(new File(temp.toString()), node); JDirectoryChooser.this.tree.setSelectionPath(selectionPath); JDirectoryChooser.this.tree.scrollPathToVisible(selectionPath); } public void treeWillCollapse(TreeExpansionEvent e) { TreePath selectionPath = JDirectoryChooser.this.tree.getSelectionPath(); if (selectionPath == null) { return; } int i = selectionPath.getPathCount(); StringBuffer temp = new StringBuffer(); for (int j = 1; j < i - 1; ++j) { temp.append(selectionPath.getPathComponent(j) + "/"); } temp.append(selectionPath.getPathComponent(i - 1)); JDirectoryChooser.this.selectedFolder = new File(temp.toString()); JDirectoryChooser.this.folderPath.setText(selectionPath.getPathComponent(i - 1).toString()); JDirectoryChooser.this.tree.setSelectionPath(selectionPath); } }); this.select.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (JDirectoryChooser.this.tree.getSelectionPath() == null) { return; } JDirectoryChooser.this.fileSelected = true; JDirectoryChooser.this.dialog.setVisible(false); } }); this.cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JDirectoryChooser.this.fileSelected = false; JDirectoryChooser.this.dialog.setVisible(false); } }); this.dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JDirectoryChooser.this.fileSelected = false; JDirectoryChooser.this.dialog.dispose(); } }); } private void createDriveTree(File parentFile, DefaultMutableTreeNode parentNode) { File[] childFiles = parentFile.listFiles(); if (childFiles == null) { return; } Arrays.sort(childFiles); if (childFiles == null) { return; } for (File childFile : childFiles) { if (!(childFile.isDirectory())) { continue; } if (this.showHidden) { parentNode.add(new DefaultMutableTreeNode(childFile.getName())); } else { if (childFile.isHidden()) { continue; } parentNode.add(new DefaultMutableTreeNode(childFile.getName())); } } } public boolean showDirectoryDialog() { this.dialog.setVisible(true); this.dialog.dispose(); return this.fileSelected; } public File getSelectedFolder() { return this.selectedFolder; } public void setTitle(String title) { this.dialog.setTitle(title); } public void setMessage(String message) { this.messageLabel.setText(message); } public void setApproveButtonText(String text) { this.select.setText(text); } public void setCancelButtonText(String text) { this.cancel.setText(text); } public void setApproveButtonMnemonic(char c) { this.select.setMnemonic(c); } public void setCancelButtonMnemonic(char c) { this.cancel.setMnemonic(c); } public void showHiddenFolders(boolean showHidden) { this.showHidden = showHidden; } }