gtkfilechooserui.java
来自「java jdk 1.4的源码」· Java 代码 · 共 882 行 · 第 1/2 页
JAVA
882 行
/* * @(#)GTKFileChooserUI.java 1.10 03/05/05 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing.plaf.gtk;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 javax.swing.*;import javax.swing.border.*;import javax.swing.filechooser.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.table.*;/** * GTK FileChooserUI. * * @version 1.36 08/21/02 * @author Leif Samuelsson * @author Jeff Dinkins */class GTKFileChooserUI extends SynthFileChooserUI { // The accessoryPanel is a container to place the JFileChooser accessory component private JPanel accessoryPanel = null; private String newFolderButtonText = null; private String deleteFileButtonText = null; private String renameFileButtonText = null; private String newFolderButtonToolTipText = null; private String deleteFileButtonToolTipText = null; private String renameFileButtonToolTipText = null; private int newFolderButtonMnemonic = 0; private int deleteFileButtonMnemonic = 0; private int renameFileButtonMnemonic = 0; // From Motif private JPanel rightPanel; private JList directoryList; private JList fileList; private JLabel pathField; private JTextField fileNameTextField; private static final Dimension hstrut10 = new Dimension(10, 1); private static final Dimension vstrut10 = new Dimension(1, 10); private static final Insets insets = new Insets(10, 10, 10, 10); private static Dimension prefListSize = new Dimension(75, 150); private static Dimension PREF_SIZE = new Dimension(435, 360); private static Dimension MIN_SIZE = new Dimension(200, 300); private static Dimension PREF_ACC_SIZE = new Dimension(10, 10); private static Dimension ZERO_ACC_SIZE = new Dimension(1, 1); private static Dimension MAX_SIZE = new Dimension(Short.MAX_VALUE, Short.MAX_VALUE); private static final Insets buttonMargin = new Insets(3, 3, 3, 3); private String filesLabelText = null; private String foldersLabelText = null; private String pathLabelText = null; private int pathLabelMnemonic = 0; private JComboBox directoryComboBox; private DirectoryComboBoxModel directoryComboBoxModel; private Action directoryComboBoxAction = new DirectoryComboBoxAction(); private JPanel bottomButtonPanel; public String getFileName() { if (fileNameTextField != null) { return fileNameTextField.getText(); } else { return null; } } public void setFileName(String fileName) { if (fileNameTextField != null) { fileNameTextField.setText(fileName); } }// public String getDirectoryName() {// return pathField.getText();// } public void setDirectoryName(String dirname) { pathField.setText(dirname); } public void ensureFileIsVisible(JFileChooser fc, File f) { // PENDING } public void rescanCurrentDirectory(JFileChooser fc) { // PENDING } protected JPanel getAccessoryPanel() { return accessoryPanel; } private void updateDefaultButton() { JFileChooser filechooser = getFileChooser(); JRootPane root = SwingUtilities.getRootPane(filechooser); if (root == null) { return; } if (filechooser.getControlButtonsAreShown()) { if (root.getDefaultButton() == null) { root.setDefaultButton(getApproveButton(filechooser)); getCancelButton(filechooser).setDefaultCapable(false); } } else { if (root.getDefaultButton() == getApproveButton(filechooser)) { root.setDefaultButton(null); } } } protected void doSelectedFileChanged(PropertyChangeEvent e) { super.doSelectedFileChanged(e); File f = (File) e.getNewValue(); if (f != null) { setFileName(getFileChooser().getName(f)); } } protected void doDirectoryChanged(PropertyChangeEvent e) { directoryList.clearSelection(); fileList.clearSelection(); File currentDirectory = getFileChooser().getCurrentDirectory(); if (currentDirectory != null) { try { setDirectoryName(((File)e.getNewValue()).getCanonicalPath()); } catch (IOException ioe) { setDirectoryName(((File)e.getNewValue()).getAbsolutePath()); } directoryComboBoxModel.addItem(currentDirectory); } super.doDirectoryChanged(e); } protected void doAccessoryChanged(PropertyChangeEvent e) { if (getAccessoryPanel() != null) { if (e.getOldValue() != null) { getAccessoryPanel().remove((JComponent)e.getOldValue()); } JComponent accessory = (JComponent)e.getNewValue(); if (accessory != null) { getAccessoryPanel().add(accessory, BorderLayout.CENTER); getAccessoryPanel().setPreferredSize(accessory.getPreferredSize()); getAccessoryPanel().setMaximumSize(MAX_SIZE); } else { getAccessoryPanel().setPreferredSize(ZERO_ACC_SIZE); getAccessoryPanel().setMaximumSize(ZERO_ACC_SIZE); } } } protected void doFileSelectionModeChanged(PropertyChangeEvent e) { directoryList.clearSelection(); rightPanel.setVisible(((Integer)e.getNewValue()).intValue() != JFileChooser.DIRECTORIES_ONLY); super.doFileSelectionModeChanged(e); } protected void doMultiSelectionChanged(PropertyChangeEvent e) { if (getFileChooser().isMultiSelectionEnabled()) { fileList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } else { fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileList.clearSelection(); } super.doMultiSelectionChanged(e); } protected void doControlButtonsChanged(PropertyChangeEvent e) { super.doControlButtonsChanged(e); JFileChooser filechooser = getFileChooser(); if (filechooser.getControlButtonsAreShown()) { filechooser.add(bottomButtonPanel, BorderLayout.SOUTH); } else { filechooser.remove(bottomButtonPanel); } updateDefaultButton(); } protected void doAncestorChanged(PropertyChangeEvent e) { if (e.getOldValue() == null && e.getNewValue() != null) { // Ancestor was added, set initial focus fileNameTextField.selectAll(); fileNameTextField.requestFocus(); updateDefaultButton(); } super.doAncestorChanged(e); } // ******************************************** // ************ Create Listeners ************** // ******************************************** public ListSelectionListener createListSelectionListener(JFileChooser fc) { return new SelectionListener(); } class DoubleClickListener extends MouseAdapter { JList list; public DoubleClickListener(JList list) { this.list = list; } public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) { int index = list.locationToIndex(e.getPoint()); if (index >= 0) { File f = (File) list.getModel().getElementAt(index); try { // Strip trailing ".." f = f.getCanonicalFile(); } catch (IOException ex) { // That's ok, we'll use f as is } if (getFileChooser().isTraversable(f)) { list.clearSelection(); getFileChooser().setCurrentDirectory(f); } else { getFileChooser().approveSelection(); } } } } } protected MouseListener createDoubleClickListener(JFileChooser fc, JList list) { return new DoubleClickListener(list); } protected class SelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { JFileChooser chooser = getFileChooser(); JList list = (JList) e.getSource(); if (chooser.isMultiSelectionEnabled()) { File[] files = null; Object[] objects = list.getSelectedValues(); if (objects != null) { if (objects.length == 1 && ((File)objects[0]).isDirectory() && chooser.isTraversable(((File)objects[0])) && (chooser.getFileSelectionMode() != chooser.DIRECTORIES_ONLY || !chooser.getFileSystemView().isFileSystem(((File)objects[0])))) { setDirectorySelected(true); setDirectory(((File)objects[0])); } else { ArrayList fList = new ArrayList(objects.length); for (int i = 0; i < objects.length; i++) { File f = (File)objects[i]; if ((chooser.isFileSelectionEnabled() && f.isFile()) || (chooser.isDirectorySelectionEnabled() && f.isDirectory())) { fList.add(f); } } if (fList.size() > 0) { files = (File[])fList.toArray(new File[fList.size()]); } setDirectorySelected(false); } } chooser.setSelectedFiles(files); } else { File file = (File)list.getSelectedValue(); if (file != null && file.isDirectory() && chooser.isTraversable(file) && (chooser.getFileSelectionMode() != chooser.DIRECTORIES_ONLY || !chooser.getFileSystemView().isFileSystem(file))) { setDirectorySelected(true); setDirectory(file); } else { setDirectorySelected(false); if (file != null) { chooser.setSelectedFile(file); } } } } } } // // ComponentUI Interface Implementation methods // public static ComponentUI createUI(JComponent c) { return new GTKFileChooserUI(); } public void installUI(JComponent c) { accessoryPanel = new JPanel(new BorderLayout(10, 10)); accessoryPanel.setName("GTKFileChooser.accessoryPanel"); super.installUI(c); } public void uninstallUI(JComponent c) { super.uninstallUI(c); if (accessoryPanel != null) { accessoryPanel.removeAll(); } accessoryPanel = null; getFileChooser().removeAll(); } public void installComponents(JFileChooser fc) { super.installComponents(fc); boolean leftToRight = fc.getComponentOrientation().isLeftToRight(); fc.setLayout(new BorderLayout()); fc.setAlignmentX(JComponent.CENTER_ALIGNMENT); // Top row of buttons JPanel topButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); topButtonPanel.setBorder(new EmptyBorder(10, 10, 0, 10)); topButtonPanel.setName("GTKFileChooser.topButtonPanel"); JButton newFolderButton = new JButton(getNewFolderAction()); newFolderButton.setName("GTKFileChooser.newFolderButton"); newFolderButton.setMnemonic(newFolderButtonMnemonic); newFolderButton.setToolTipText(newFolderButtonToolTipText); newFolderButton.setText(newFolderButtonText); topButtonPanel.add(newFolderButton); JButton deleteFileButton = new JButton(deleteFileButtonText); deleteFileButton.setName("GTKFileChooser.deleteFileButton"); deleteFileButton.setMnemonic(deleteFileButtonMnemonic); deleteFileButton.setToolTipText(deleteFileButtonToolTipText); deleteFileButton.setEnabled(false); topButtonPanel.add(deleteFileButton); JButton renameFileButton = new JButton(renameFileButtonText); renameFileButton.setName("GTKFileChooser.renameFileButton"); renameFileButton.setMnemonic(renameFileButtonMnemonic); renameFileButton.setToolTipText(renameFileButtonToolTipText); topButtonPanel.add(renameFileButton); fc.add(topButtonPanel, BorderLayout.NORTH); JPanel interior = new JPanel(); interior.setBorder(new EmptyBorder(0, 10, 10, 10)); interior.setName("GTKFileChooser.interiorPanel"); align(interior); interior.setLayout(new BoxLayout(interior, BoxLayout.PAGE_AXIS)); fc.add(interior, BorderLayout.CENTER); JPanel comboBoxPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0) { public void layoutContainer(Container target) { super.layoutContainer(target); JComboBox comboBox = directoryComboBox; if (comboBox.getWidth() > target.getWidth()) { comboBox.setBounds(0, comboBox.getY(), target.getWidth(), comboBox.getHeight()); } } }); comboBoxPanel.setBorder(new EmptyBorder(0, 0, 4, 0)); comboBoxPanel.setName("GTKFileChooser.directoryComboBoxPanel"); // CurrentDir ComboBox directoryComboBoxModel = createDirectoryComboBoxModel(fc); directoryComboBox = new JComboBox(directoryComboBoxModel); directoryComboBox.setName("GTKFileChooser.directoryComboBox"); directoryComboBox.putClientProperty( "JComboBox.lightweightKeyboardNavigation", "Lightweight" ); directoryComboBox.addActionListener(directoryComboBoxAction); directoryComboBox.setRenderer(createDirectoryComboBoxRenderer(fc)); directoryComboBox.setMaximumRowCount(8); comboBoxPanel.add(directoryComboBox); interior.add(comboBoxPanel); // interior.add(Box.createRigidArea(vstrut10)); // CENTER: left, right, accessory JPanel centerPanel = new JPanel(new BorderLayout()); centerPanel.setName("GTKFileChooser.centerPanel"); // SPLIT PANEL: left, right JSplitPane splitPanel = new JSplitPane(); splitPanel.setName("GTKFileChooser.splitPanel"); splitPanel.setDividerLocation((PREF_SIZE.width-8)/2); // left panel - Filter & directoryList JPanel leftPanel = new JPanel(new GridBagLayout()); leftPanel.setName("GTKFileChooser.directoryListPanel"); // Add the Directory List // Create a label that looks like button (should be a table header) TableCellRenderer headerRenderer = new JTableHeader().getDefaultRenderer(); JComponent directoryListLabel = (JComponent)headerRenderer.getTableCellRendererComponent(null, foldersLabelText, false, false, 0, 0); directoryListLabel.setName("GTKFileChooser.directoryListLabel"); leftPanel.add(directoryListLabel, new GridBagConstraints( 0, 0, 1, 1, 1, 0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?