/* * Copyright (c) 2008, 2009, 2010 Denis Tulskiy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. */ package com.tulskiy.musique.gui.dialogs; import com.tulskiy.musique.images.Images; import com.tulskiy.musique.system.Application; import com.tulskiy.musique.system.configuration.Configuration; import com.tulskiy.musique.util.Util; import javax.swing.*; import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Arrays; /** * Author: Denis Tulskiy * Date: 12/2/10 */ public class TreeFileChooser extends JDialog { private Application app = Application.getInstance(); private boolean allowFiles; private File[] selectedFiles; private DirectoryChooser directoryChooser; private JTextField pathField; public TreeFileChooser(JComponent owner, String title, boolean allowFiles) { super(SwingUtilities.windowForComponent(owner), title, ModalityType.APPLICATION_MODAL); this.allowFiles = allowFiles; setDefaultCloseOperation(DISPOSE_ON_CLOSE); setSize(400, 500); setLocationRelativeTo(null); initComponents(); initListeners(); } public void setSelectionMode(int mode) { directoryChooser.getSelectionModel().setSelectionMode(mode); } private void initListeners() { pathField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { File dir = new File(pathField.getText()); if (dir.exists() && dir.isDirectory()) directoryChooser.setSelectedFile(dir); directoryChooser.requestFocus(); } }); directoryChooser.addPropertyChangeListener("selectedDirectory", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { File[] files = directoryChooser.getSelectedFiles(); if (files.length > 0) pathField.setText(files[0].getAbsolutePath()); } }); addWindowFocusListener(new WindowAdapter() { public void windowGainedFocus(WindowEvent e) { directoryChooser.requestFocusInWindow(); } }); } private void initComponents() { directoryChooser = new DirectoryChooser(allowFiles); JPanel panel = new JPanel(new BorderLayout()); setContentPane(panel); final JButton okButton = new JButton(" OK "); final JButton cancelButton = new JButton(" Cancel "); getRootPane().setDefaultButton(okButton); JPanel top = new JPanel(new BorderLayout()); JLabel label = new JLabel(getTitle()); label.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(5, 5, 5, 5) )); label.setVerticalAlignment(JLabel.TOP); label.setFont(label.getFont().deriveFont(Font.BOLD, 13f)); label.setPreferredSize(new Dimension(10, 45)); top.add(label, BorderLayout.CENTER); top.add(initToolbar(), BorderLayout.PAGE_END); panel.add(top, BorderLayout.PAGE_START); panel.add(new JScrollPane(directoryChooser), BorderLayout.CENTER); Box buttonBox = Box.createHorizontalBox(); buttonBox.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); buttonBox.add(Box.createHorizontalGlue()); buttonBox.add(okButton); buttonBox.add(Box.createHorizontalStrut(5)); buttonBox.add(cancelButton); panel.add(buttonBox, BorderLayout.SOUTH); final ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { Object c = e.getSource(); if (c == okButton || c == directoryChooser) { selectedFiles = directoryChooser.getSelectedFiles(); } setVisible(false); } }; okButton.addActionListener(actionListener); cancelButton.addActionListener(actionListener); directoryChooser.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath path = directoryChooser.getPathForLocation(e.getX(), e.getY()); if (path != null && path.equals(directoryChooser.getSelectionPath()) && directoryChooser.getSelectedFiles().length > 0) { TreeNode o = (TreeNode) path.getLastPathComponent(); if (o.isLeaf() || !o.children().hasMoreElements()) actionListener.actionPerformed(new ActionEvent(directoryChooser, 0, null)); } } } }); directoryChooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent ev) { if (ev.getPropertyName().equals("selectedDirectory")) { okButton.setEnabled(directoryChooser.getSelectedFiles() != null); } } }); directoryChooser.setFocusCycleRoot(true); directoryChooser.requestFocusInWindow(); } private Container initToolbar() { Box toolBar = Box.createHorizontalBox(); toolBar.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5)); JButton home = new JButton(Images.loadIcon("home.png")); home.setFocusable(false); home.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { directoryChooser.setSelectedFile(null); } }); JButton refresh = new JButton(Images.loadIcon("refresh.png")); refresh.setFocusable(false); refresh.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreePath selectionPath = directoryChooser.getSelectionPath(); Object o = selectionPath.getLastPathComponent(); if (o instanceof DirectoryChooser.DirectoryNode) { DirectoryChooser.DirectoryNode node = (DirectoryChooser.DirectoryNode) o; node.reload(); } ((DefaultTreeModel) directoryChooser.getModel()).reload(); directoryChooser.setSelectionPath(selectionPath); directoryChooser.expandPath(selectionPath); } }); Dimension size = new Dimension(30, 24); refresh.setPreferredSize(size); home.setPreferredSize(size); if (Util.isGTKLaF()) { home.setBorderPainted(false); refresh.setBorderPainted(false); } pathField = new JTextField(); pathField.setFocusCycleRoot(false); pathField.setText(directoryChooser.getSelectedFiles()[0].getAbsolutePath()); toolBar.add(home); toolBar.add(refresh); toolBar.add(Box.createHorizontalStrut(5)); toolBar.add(pathField); return toolBar; } public File[] showOpenDialog() { Configuration config = app.getConfiguration(); String path = config.getString("playlists.lastDir", null); if (path != null) { File file = new File(path); if (file.exists()) directoryChooser.setSelectedFile(file); } setVisible(true); dispose(); File[] files = directoryChooser.getSelectedFiles(); if (files.length > 0) { File dir = files[0]; while (dir != null && !dir.isDirectory()) { dir = dir.getParentFile(); } if (dir != null) { config.setString("playlists.lastDir", dir.getAbsolutePath()); } } return selectedFiles; } public static void main(String[] args) { try { UIManager.setLookAndFeel(new MetalLookAndFeel()); } catch (UnsupportedLookAndFeelException ignored) { } Application app = Application.getInstance(); app.load(); TreeFileChooser fileChooser = new TreeFileChooser(new JLabel(), "Select files", true); File[] files = fileChooser.showOpenDialog(); if (files != null) { System.out.println(Arrays.toString(files)); } app.exit(); } }