1281 lines · 46.5 KB · Java
RawDownload
/* * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.swing.plaf.metal; import javax.swing.*;import javax.swing.border.EmptyBorder;import javax.swing.filechooser.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.plaf.basic.*;import java.awt.*;import java.awt.event.*;import java.beans.*;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.*;import java.security.AccessController;import java.security.PrivilegedAction;import javax.accessibility.*; import sun.awt.shell.ShellFolder;import sun.swing.*; /** * Metal L&F implementation of a FileChooser. * * @author Jeff Dinkins */public class MetalFileChooserUI extends BasicFileChooserUI {     // Much of the Metal UI for JFilechooser is just a copy of    // the windows implementation, but using Metal themed buttons, lists,    // icons, etc. We are planning a complete rewrite, and hence we've    // made most things in this class private.     private JLabel lookInLabel;    private JComboBox directoryComboBox;    private DirectoryComboBoxModel directoryComboBoxModel;    private Action directoryComboBoxAction = new DirectoryComboBoxAction();     private FilterComboBoxModel filterComboBoxModel;     private JTextField fileNameTextField;     private FilePane filePane;    private JToggleButton listViewButton;    private JToggleButton detailsViewButton;     private JButton approveButton;    private JButton cancelButton;     private JPanel buttonPanel;    private JPanel bottomPanel;     private JComboBox filterComboBox;     private static final Dimension hstrut5 = new Dimension(5, 1);    private static final Dimension hstrut11 = new Dimension(11, 1);     private static final Dimension vstrut5  = new Dimension(1, 5);     private static final Insets shrinkwrap = new Insets(0,0,0,0);     // Preferred and Minimum sizes for the dialog box    private static int PREF_WIDTH = 500;    private static int PREF_HEIGHT = 326;    private static Dimension PREF_SIZE = new Dimension(PREF_WIDTH, PREF_HEIGHT);     private static int MIN_WIDTH = 500;    private static int MIN_HEIGHT = 326;    private static Dimension MIN_SIZE = new Dimension(MIN_WIDTH, MIN_HEIGHT);     private static int LIST_PREF_WIDTH = 405;    private static int LIST_PREF_HEIGHT = 135;    private static Dimension LIST_PREF_SIZE = new Dimension(LIST_PREF_WIDTH, LIST_PREF_HEIGHT);     // Labels, mnemonics, and tooltips (oh my!)    private int    lookInLabelMnemonic = 0;    private String lookInLabelText = null;    private String saveInLabelText = null;     private int    fileNameLabelMnemonic = 0;    private String fileNameLabelText = null;    private int    folderNameLabelMnemonic = 0;    private String folderNameLabelText = null;     private int    filesOfTypeLabelMnemonic = 0;    private String filesOfTypeLabelText = null;     private String upFolderToolTipText = null;    private String upFolderAccessibleName = null;     private String homeFolderToolTipText = null;    private String homeFolderAccessibleName = null;     private String newFolderToolTipText = null;    private String newFolderAccessibleName = null;     private String listViewButtonToolTipText = null;    private String listViewButtonAccessibleName = null;     private String detailsViewButtonToolTipText = null;    private String detailsViewButtonAccessibleName = null;     private AlignedLabel fileNameLabel;     private void populateFileNameLabel() {        if (getFileChooser().getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY) {            fileNameLabel.setText(folderNameLabelText);            fileNameLabel.setDisplayedMnemonic(folderNameLabelMnemonic);        } else {            fileNameLabel.setText(fileNameLabelText);            fileNameLabel.setDisplayedMnemonic(fileNameLabelMnemonic);        }    }     //    // ComponentUI Interface Implementation methods    //    public static ComponentUI createUI(JComponent c) {        return new MetalFileChooserUI((JFileChooser) c);    }     public MetalFileChooserUI(JFileChooser filechooser) {        super(filechooser);    }     public void installUI(JComponent c) {        super.installUI(c);    }     public void uninstallComponents(JFileChooser fc) {        fc.removeAll();        bottomPanel = null;        buttonPanel = null;    }     private class MetalFileChooserUIAccessor implements FilePane.FileChooserUIAccessor {        public JFileChooser getFileChooser() {            return MetalFileChooserUI.this.getFileChooser();        }         public BasicDirectoryModel getModel() {            return MetalFileChooserUI.this.getModel();        }         public JPanel createList() {            return MetalFileChooserUI.this.createList(getFileChooser());        }         public JPanel createDetailsView() {            return MetalFileChooserUI.this.createDetailsView(getFileChooser());        }         public boolean isDirectorySelected() {            return MetalFileChooserUI.this.isDirectorySelected();        }         public File getDirectory() {            return MetalFileChooserUI.this.getDirectory();        }         public Action getChangeToParentDirectoryAction() {            return MetalFileChooserUI.this.getChangeToParentDirectoryAction();        }         public Action getApproveSelectionAction() {            return MetalFileChooserUI.this.getApproveSelectionAction();        }         public Action getNewFolderAction() {            return MetalFileChooserUI.this.getNewFolderAction();        }         public MouseListener createDoubleClickListener(JList list) {            return MetalFileChooserUI.this.createDoubleClickListener(getFileChooser(),                                                                     list);        }         public ListSelectionListener createListSelectionListener() {            return MetalFileChooserUI.this.createListSelectionListener(getFileChooser());        }    }     public void installComponents(JFileChooser fc) {        FileSystemView fsv = fc.getFileSystemView();         fc.setBorder(new EmptyBorder(12, 12, 11, 11));        fc.setLayout(new BorderLayout(0, 11));         filePane = new FilePane(new MetalFileChooserUIAccessor());        fc.addPropertyChangeListener(filePane);         // ********************************* //        // **** Construct the top panel **** //        // ********************************* //         // Directory manipulation buttons        JPanel topPanel = new JPanel(new BorderLayout(11, 0));        JPanel topButtonPanel = new JPanel();        topButtonPanel.setLayout(new BoxLayout(topButtonPanel, BoxLayout.LINE_AXIS));        topPanel.add(topButtonPanel, BorderLayout.AFTER_LINE_ENDS);         // Add the top panel to the fileChooser        fc.add(topPanel, BorderLayout.NORTH);         // ComboBox Label        lookInLabel = new JLabel(lookInLabelText);        lookInLabel.setDisplayedMnemonic(lookInLabelMnemonic);        topPanel.add(lookInLabel, BorderLayout.BEFORE_LINE_BEGINS);         // CurrentDir ComboBox        directoryComboBox = new JComboBox() {            public Dimension getPreferredSize() {                Dimension d = super.getPreferredSize();                // Must be small enough to not affect total width.                d.width = 150;                return d;            }        };        directoryComboBox.putClientProperty(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY,                                            lookInLabelText);        directoryComboBox.putClientProperty( "JComboBox.isTableCellEditor", Boolean.TRUE );        lookInLabel.setLabelFor(directoryComboBox);        directoryComboBoxModel = createDirectoryComboBoxModel(fc);        directoryComboBox.setModel(directoryComboBoxModel);        directoryComboBox.addActionListener(directoryComboBoxAction);        directoryComboBox.setRenderer(createDirectoryComboBoxRenderer(fc));        directoryComboBox.setAlignmentX(JComponent.LEFT_ALIGNMENT);        directoryComboBox.setAlignmentY(JComponent.TOP_ALIGNMENT);        directoryComboBox.setMaximumRowCount(8);         topPanel.add(directoryComboBox, BorderLayout.CENTER);         // Up Button        JButton upFolderButton = new JButton(getChangeToParentDirectoryAction());        upFolderButton.setText(null);        upFolderButton.setIcon(upFolderIcon);        upFolderButton.setToolTipText(upFolderToolTipText);        upFolderButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,                                         upFolderAccessibleName);        upFolderButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);        upFolderButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);        upFolderButton.setMargin(shrinkwrap);         topButtonPanel.add(upFolderButton);        topButtonPanel.add(Box.createRigidArea(hstrut5));         // Home Button        File homeDir = fsv.getHomeDirectory();        String toolTipText = homeFolderToolTipText;        if (fsv.isRoot(homeDir)) {            toolTipText = getFileView(fc).getName(homeDir); // Probably "Desktop".        }            JButton b = new JButton(homeFolderIcon);        b.setToolTipText(toolTipText);        b.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,                            homeFolderAccessibleName);        b.setAlignmentX(JComponent.LEFT_ALIGNMENT);        b.setAlignmentY(JComponent.CENTER_ALIGNMENT);        b.setMargin(shrinkwrap);         b.addActionListener(getGoHomeAction());        topButtonPanel.add(b);        topButtonPanel.add(Box.createRigidArea(hstrut5));         // New Directory Button        if (!UIManager.getBoolean("FileChooser.readOnly")) {            b = new JButton(filePane.getNewFolderAction());            b.setText(null);            b.setIcon(newFolderIcon);            b.setToolTipText(newFolderToolTipText);            b.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,                                newFolderAccessibleName);            b.setAlignmentX(JComponent.LEFT_ALIGNMENT);            b.setAlignmentY(JComponent.CENTER_ALIGNMENT);            b.setMargin(shrinkwrap);        }        topButtonPanel.add(b);        topButtonPanel.add(Box.createRigidArea(hstrut5));         // View button group        ButtonGroup viewButtonGroup = new ButtonGroup();         // List Button        listViewButton = new JToggleButton(listViewIcon);        listViewButton.setToolTipText(listViewButtonToolTipText);        listViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,                                         listViewButtonAccessibleName);        listViewButton.setSelected(true);        listViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);        listViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);        listViewButton.setMargin(shrinkwrap);        listViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_LIST));        topButtonPanel.add(listViewButton);        viewButtonGroup.add(listViewButton);         // Details Button        detailsViewButton = new JToggleButton(detailsViewIcon);        detailsViewButton.setToolTipText(detailsViewButtonToolTipText);        detailsViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,                                            detailsViewButtonAccessibleName);        detailsViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);        detailsViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);        detailsViewButton.setMargin(shrinkwrap);        detailsViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_DETAILS));        topButtonPanel.add(detailsViewButton);        viewButtonGroup.add(detailsViewButton);         filePane.addPropertyChangeListener(new PropertyChangeListener() {            public void propertyChange(PropertyChangeEvent e) {                if ("viewType".equals(e.getPropertyName())) {                    int viewType = filePane.getViewType();                    switch (viewType) {                      case FilePane.VIEWTYPE_LIST:                        listViewButton.setSelected(true);                        break;                       case FilePane.VIEWTYPE_DETAILS:                        detailsViewButton.setSelected(true);                        break;                    }                }            }        });         // ************************************** //        // ******* Add the directory pane ******* //        // ************************************** //        fc.add(getAccessoryPanel(), BorderLayout.AFTER_LINE_ENDS);        JComponent accessory = fc.getAccessory();        if(accessory != null) {            getAccessoryPanel().add(accessory);        }        filePane.setPreferredSize(LIST_PREF_SIZE);        fc.add(filePane, BorderLayout.CENTER);         // ********************************** //        // **** Construct the bottom panel ** //        // ********************************** //        JPanel bottomPanel = getBottomPanel();        bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS));        fc.add(bottomPanel, BorderLayout.SOUTH);         // FileName label and textfield        JPanel fileNamePanel = new JPanel();        fileNamePanel.setLayout(new BoxLayout(fileNamePanel, BoxLayout.LINE_AXIS));        bottomPanel.add(fileNamePanel);        bottomPanel.add(Box.createRigidArea(vstrut5));         fileNameLabel = new AlignedLabel();        populateFileNameLabel();        fileNamePanel.add(fileNameLabel);         fileNameTextField = new JTextField(35) {            public Dimension getMaximumSize() {                return new Dimension(Short.MAX_VALUE, super.getPreferredSize().height);            }        };        fileNamePanel.add(fileNameTextField);        fileNameLabel.setLabelFor(fileNameTextField);        fileNameTextField.addFocusListener(            new FocusAdapter() {                public void focusGained(FocusEvent e) {                    if (!getFileChooser().isMultiSelectionEnabled()) {                        filePane.clearSelection();                    }                }            }        );        if (fc.isMultiSelectionEnabled()) {            setFileName(fileNameString(fc.getSelectedFiles()));        } else {            setFileName(fileNameString(fc.getSelectedFile()));        }          // Filetype label and combobox        JPanel filesOfTypePanel = new JPanel();        filesOfTypePanel.setLayout(new BoxLayout(filesOfTypePanel, BoxLayout.LINE_AXIS));        bottomPanel.add(filesOfTypePanel);         AlignedLabel filesOfTypeLabel = new AlignedLabel(filesOfTypeLabelText);        filesOfTypeLabel.setDisplayedMnemonic(filesOfTypeLabelMnemonic);        filesOfTypePanel.add(filesOfTypeLabel);         filterComboBoxModel = createFilterComboBoxModel();        fc.addPropertyChangeListener(filterComboBoxModel);        filterComboBox = new JComboBox(filterComboBoxModel);        filterComboBox.putClientProperty(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY,                                         filesOfTypeLabelText);        filesOfTypeLabel.setLabelFor(filterComboBox);        filterComboBox.setRenderer(createFilterComboBoxRenderer());        filesOfTypePanel.add(filterComboBox);         // buttons        getButtonPanel().setLayout(new ButtonAreaLayout());         approveButton = new JButton(getApproveButtonText(fc));        // Note: Metal does not use mnemonics for approve and cancel        approveButton.addActionListener(getApproveSelectionAction());        approveButton.setToolTipText(getApproveButtonToolTipText(fc));        getButtonPanel().add(approveButton);         cancelButton = new JButton(cancelButtonText);        cancelButton.setToolTipText(cancelButtonToolTipText);        cancelButton.addActionListener(getCancelSelectionAction());        getButtonPanel().add(cancelButton);         if(fc.getControlButtonsAreShown()) {            addControlButtons();        }         groupLabels(new AlignedLabel[] { fileNameLabel, filesOfTypeLabel });    }     protected JPanel getButtonPanel() {        if (buttonPanel == null) {            buttonPanel = new JPanel();        }        return buttonPanel;    }     protected JPanel getBottomPanel() {        if(bottomPanel == null) {            bottomPanel = new JPanel();        }        return bottomPanel;    }     protected void installStrings(JFileChooser fc) {        super.installStrings(fc);         Locale l = fc.getLocale();         lookInLabelMnemonic = UIManager.getInt("FileChooser.lookInLabelMnemonic");        lookInLabelText = UIManager.getString("FileChooser.lookInLabelText",l);        saveInLabelText = UIManager.getString("FileChooser.saveInLabelText",l);         fileNameLabelMnemonic = UIManager.getInt("FileChooser.fileNameLabelMnemonic");        fileNameLabelText = UIManager.getString("FileChooser.fileNameLabelText",l);        folderNameLabelMnemonic = UIManager.getInt("FileChooser.folderNameLabelMnemonic");        folderNameLabelText = UIManager.getString("FileChooser.folderNameLabelText",l);         filesOfTypeLabelMnemonic = UIManager.getInt("FileChooser.filesOfTypeLabelMnemonic");        filesOfTypeLabelText = UIManager.getString("FileChooser.filesOfTypeLabelText",l);         upFolderToolTipText =  UIManager.getString("FileChooser.upFolderToolTipText",l);        upFolderAccessibleName = UIManager.getString("FileChooser.upFolderAccessibleName",l);         homeFolderToolTipText =  UIManager.getString("FileChooser.homeFolderToolTipText",l);        homeFolderAccessibleName = UIManager.getString("FileChooser.homeFolderAccessibleName",l);         newFolderToolTipText = UIManager.getString("FileChooser.newFolderToolTipText",l);        newFolderAccessibleName = UIManager.getString("FileChooser.newFolderAccessibleName",l);         listViewButtonToolTipText = UIManager.getString("FileChooser.listViewButtonToolTipText",l);        listViewButtonAccessibleName = UIManager.getString("FileChooser.listViewButtonAccessibleName",l);         detailsViewButtonToolTipText = UIManager.getString("FileChooser.detailsViewButtonToolTipText",l);        detailsViewButtonAccessibleName = UIManager.getString("FileChooser.detailsViewButtonAccessibleName",l);    }     protected void installListeners(JFileChooser fc) {        super.installListeners(fc);        ActionMap actionMap = getActionMap();        SwingUtilities.replaceUIActionMap(fc, actionMap);    }     protected ActionMap getActionMap() {        return createActionMap();    }

Lines 1–500 of 1281.