|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.java.swing.plaf.motif; |
|
|
|
import javax.swing.*; |
|
import javax.swing.filechooser.*; |
|
import javax.swing.event.*; |
|
import javax.swing.plaf.*; |
|
import javax.swing.plaf.basic.*; |
|
import java.awt.*; |
|
import java.awt.event.MouseAdapter; |
|
import java.awt.event.MouseEvent; |
|
import java.beans.*; |
|
import java.io.File; |
|
import java.io.IOException; |
|
import java.util.*; |
|
import sun.awt.shell.ShellFolder; |
|
import sun.swing.SwingUtilities2; |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class MotifFileChooserUI extends BasicFileChooserUI { |
|
|
|
private FilterComboBoxModel filterComboBoxModel; |
|
|
|
protected JList<File> directoryList = null; |
|
protected JList<File> fileList = null; |
|
|
|
protected JTextField pathField = null; |
|
protected JComboBox<FileFilter> filterComboBox = null; |
|
protected JTextField filenameTextField = null; |
|
|
|
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 WITH_ACCELERATOR_PREF_SIZE = new Dimension(650, 450); |
|
private static Dimension PREF_SIZE = new Dimension(350, 450); |
|
private static final int MIN_WIDTH = 200; |
|
private static final int MIN_HEIGHT = 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 JPanel bottomPanel; |
|
|
|
protected JButton approveButton; |
|
|
|
private String enterFolderNameLabelText = null; |
|
private int enterFolderNameLabelMnemonic = 0; |
|
private String enterFileNameLabelText = null; |
|
private int enterFileNameLabelMnemonic = 0; |
|
|
|
private String filesLabelText = null; |
|
private int filesLabelMnemonic = 0; |
|
|
|
private String foldersLabelText = null; |
|
private int foldersLabelMnemonic = 0; |
|
|
|
private String pathLabelText = null; |
|
private int pathLabelMnemonic = 0; |
|
|
|
private String filterLabelText = null; |
|
private int filterLabelMnemonic = 0; |
|
|
|
private JLabel fileNameLabel; |
|
|
|
private void populateFileNameLabel() { |
|
if (getFileChooser().getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY) { |
|
fileNameLabel.setText(enterFolderNameLabelText); |
|
fileNameLabel.setDisplayedMnemonic(enterFolderNameLabelMnemonic); |
|
} else { |
|
fileNameLabel.setText(enterFileNameLabelText); |
|
fileNameLabel.setDisplayedMnemonic(enterFileNameLabelMnemonic); |
|
} |
|
} |
|
|
|
private String fileNameString(File file) { |
|
if (file == null) { |
|
return null; |
|
} else { |
|
JFileChooser fc = getFileChooser(); |
|
if (fc.isDirectorySelectionEnabled() && !fc.isFileSelectionEnabled()) { |
|
return file.getPath(); |
|
} else { |
|
return file.getName(); |
|
} |
|
} |
|
} |
|
|
|
private String fileNameString(File[] files) { |
|
StringBuffer buf = new StringBuffer(); |
|
for (int i = 0; files != null && i < files.length; i++) { |
|
if (i > 0) { |
|
buf.append(" "); |
|
} |
|
if (files.length > 1) { |
|
buf.append("\""); |
|
} |
|
buf.append(fileNameString(files[i])); |
|
if (files.length > 1) { |
|
buf.append("\""); |
|
} |
|
} |
|
return buf.toString(); |
|
} |
|
|
|
public MotifFileChooserUI(JFileChooser filechooser) { |
|
super(filechooser); |
|
} |
|
|
|
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(jeff) |
|
} |
|
|
|
public void rescanCurrentDirectory(JFileChooser fc) { |
|
getModel().validateFileCache(); |
|
} |
|
|
|
public PropertyChangeListener createPropertyChangeListener(JFileChooser fc) { |
|
return new PropertyChangeListener() { |
|
public void propertyChange(PropertyChangeEvent e) { |
|
String prop = e.getPropertyName(); |
|
if(prop.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) { |
|
File f = (File) e.getNewValue(); |
|
if(f != null) { |
|
setFileName(getFileChooser().getName(f)); |
|
} |
|
} else if (prop.equals(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY)) { |
|
File[] files = (File[]) e.getNewValue(); |
|
JFileChooser fc = getFileChooser(); |
|
if (files != null && files.length > 0 && (files.length > 1 || fc.isDirectorySelectionEnabled() |
|
|| !files[0].isDirectory())) { |
|
setFileName(fileNameString(files)); |
|
} |
|
} else if (prop.equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) { |
|
fileList.clearSelection(); |
|
} else if(prop.equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) { |
|
directoryList.clearSelection(); |
|
ListSelectionModel sm = directoryList.getSelectionModel(); |
|
if (sm instanceof DefaultListSelectionModel) { |
|
((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); |
|
sm.setAnchorSelectionIndex(0); |
|
} |
|
fileList.clearSelection(); |
|
sm = fileList.getSelectionModel(); |
|
if (sm instanceof DefaultListSelectionModel) { |
|
((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); |
|
sm.setAnchorSelectionIndex(0); |
|
} |
|
File currentDirectory = getFileChooser().getCurrentDirectory(); |
|
if(currentDirectory != null) { |
|
try { |
|
setDirectoryName(ShellFolder.getNormalizedFile((File)e.getNewValue()).getPath()); |
|
} catch (IOException ioe) { |
|
setDirectoryName(((File)e.getNewValue()).getAbsolutePath()); |
|
} |
|
if ((getFileChooser().getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY) && !getFileChooser().isMultiSelectionEnabled()) { |
|
setFileName(getDirectoryName()); |
|
} |
|
} |
|
} else if(prop.equals(JFileChooser.FILE_SELECTION_MODE_CHANGED_PROPERTY)) { |
|
if (fileNameLabel != null) { |
|
populateFileNameLabel(); |
|
} |
|
directoryList.clearSelection(); |
|
} else if (prop.equals(JFileChooser.MULTI_SELECTION_ENABLED_CHANGED_PROPERTY)) { |
|
if(getFileChooser().isMultiSelectionEnabled()) { |
|
fileList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
|
} else { |
|
fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
|
fileList.clearSelection(); |
|
getFileChooser().setSelectedFiles(null); |
|
} |
|
} else if (prop.equals(JFileChooser.ACCESSORY_CHANGED_PROPERTY)) { |
|
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(PREF_ACC_SIZE); |
|
getAccessoryPanel().setMaximumSize(MAX_SIZE); |
|
} else { |
|
getAccessoryPanel().setPreferredSize(ZERO_ACC_SIZE); |
|
getAccessoryPanel().setMaximumSize(ZERO_ACC_SIZE); |
|
} |
|
} |
|
} else if (prop.equals(JFileChooser.APPROVE_BUTTON_TEXT_CHANGED_PROPERTY) || |
|
prop.equals(JFileChooser.APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY) || |
|
prop.equals(JFileChooser.DIALOG_TYPE_CHANGED_PROPERTY)) { |
|
approveButton.setText(getApproveButtonText(getFileChooser())); |
|
approveButton.setToolTipText(getApproveButtonToolTipText(getFileChooser())); |
|
} else if (prop.equals(JFileChooser.CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY)) { |
|
doControlButtonsChanged(e); |
|
} else if (prop.equals("componentOrientation")) { |
|
ComponentOrientation o = (ComponentOrientation)e.getNewValue(); |
|
JFileChooser cc = (JFileChooser)e.getSource(); |
|
if (o != (ComponentOrientation)e.getOldValue()) { |
|
cc.applyComponentOrientation(o); |
|
} |
|
} |
|
} |
|
}; |
|
} |
|
|
|
// |
|
// ComponentUI Interface Implementation methods |
|
|
|
public static ComponentUI createUI(JComponent c) { |
|
return new MotifFileChooserUI((JFileChooser)c); |
|
} |
|
|
|
public void installUI(JComponent c) { |
|
super.installUI(c); |
|
} |
|
|
|
public void uninstallUI(JComponent c) { |
|
c.removePropertyChangeListener(filterComboBoxModel); |
|
approveButton.removeActionListener(getApproveSelectionAction()); |
|
filenameTextField.removeActionListener(getApproveSelectionAction()); |
|
super.uninstallUI(c); |
|
} |
|
|
|
public void installComponents(JFileChooser fc) { |
|
fc.setLayout(new BorderLayout(10, 10)); |
|
fc.setAlignmentX(JComponent.CENTER_ALIGNMENT); |
|
|
|
JPanel interior = new JPanel() { |
|
public Insets getInsets() { |
|
return insets; |
|
} |
|
}; |
|
interior.setInheritsPopupMenu(true); |
|
align(interior); |
|
interior.setLayout(new BoxLayout(interior, BoxLayout.PAGE_AXIS)); |
|
|
|
fc.add(interior, BorderLayout.CENTER); |
|
|
|
|
|
JLabel l = new JLabel(pathLabelText); |
|
l.setDisplayedMnemonic(pathLabelMnemonic); |
|
align(l); |
|
interior.add(l); |
|
|
|
File currentDirectory = fc.getCurrentDirectory(); |
|
String curDirName = null; |
|
if(currentDirectory != null) { |
|
curDirName = currentDirectory.getPath(); |
|
} |
|
pathField = new JTextField(curDirName) { |
|
public Dimension getMaximumSize() { |
|
Dimension d = super.getMaximumSize(); |
|
d.height = getPreferredSize().height; |
|
return d; |
|
} |
|
}; |
|
pathField.setInheritsPopupMenu(true); |
|
l.setLabelFor(pathField); |
|
align(pathField); |
|
|
|
|
|
pathField.addActionListener(getUpdateAction()); |
|
interior.add(pathField); |
|
|
|
interior.add(Box.createRigidArea(vstrut10)); |
|
|
|
|
|
|
|
JPanel centerPanel = new JPanel(); |
|
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.LINE_AXIS)); |
|
align(centerPanel); |
|
|
|
|
|
JPanel leftPanel = new JPanel(); |
|
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS)); |
|
align(leftPanel); |
|
|
|
|
|
l = new JLabel(filterLabelText); |
|
l.setDisplayedMnemonic(filterLabelMnemonic); |
|
align(l); |
|
leftPanel.add(l); |
|
|
|
filterComboBox = new JComboBox<FileFilter>() { |
|
public Dimension getMaximumSize() { |
|
Dimension d = super.getMaximumSize(); |
|
d.height = getPreferredSize().height; |
|
return d; |
|
} |
|
}; |
|
filterComboBox.setInheritsPopupMenu(true); |
|
l.setLabelFor(filterComboBox); |
|
filterComboBoxModel = createFilterComboBoxModel(); |
|
filterComboBox.setModel(filterComboBoxModel); |
|
filterComboBox.setRenderer(createFilterComboBoxRenderer()); |
|
fc.addPropertyChangeListener(filterComboBoxModel); |
|
align(filterComboBox); |
|
leftPanel.add(filterComboBox); |
|
|
|
// leftPanel.add(Box.createRigidArea(vstrut10)); |
|
|
|
|
|
l = new JLabel(foldersLabelText); |
|
l.setDisplayedMnemonic(foldersLabelMnemonic); |
|
align(l); |
|
leftPanel.add(l); |
|
JScrollPane sp = createDirectoryList(); |
|
sp.getVerticalScrollBar().setFocusable(false); |
|
sp.getHorizontalScrollBar().setFocusable(false); |
|
sp.setInheritsPopupMenu(true); |
|
l.setLabelFor(sp.getViewport().getView()); |
|
leftPanel.add(sp); |
|
leftPanel.setInheritsPopupMenu(true); |
|
|
|
|
|
|
|
JPanel rightPanel = new JPanel(); |
|
align(rightPanel); |
|
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS)); |
|
rightPanel.setInheritsPopupMenu(true); |
|
|
|
l = new JLabel(filesLabelText); |
|
l.setDisplayedMnemonic(filesLabelMnemonic); |
|
align(l); |
|
rightPanel.add(l); |
|
sp = createFilesList(); |
|
l.setLabelFor(sp.getViewport().getView()); |
|
rightPanel.add(sp); |
|
sp.setInheritsPopupMenu(true); |
|
|
|
centerPanel.add(leftPanel); |
|
centerPanel.add(Box.createRigidArea(hstrut10)); |
|
centerPanel.add(rightPanel); |
|
centerPanel.setInheritsPopupMenu(true); |
|
|
|
JComponent accessoryPanel = getAccessoryPanel(); |
|
JComponent accessory = fc.getAccessory(); |
|
if(accessoryPanel != null) { |
|
if(accessory == null) { |
|
accessoryPanel.setPreferredSize(ZERO_ACC_SIZE); |
|
accessoryPanel.setMaximumSize(ZERO_ACC_SIZE); |
|
} else { |
|
getAccessoryPanel().add(accessory, BorderLayout.CENTER); |
|
accessoryPanel.setPreferredSize(PREF_ACC_SIZE); |
|
accessoryPanel.setMaximumSize(MAX_SIZE); |
|
} |
|
align(accessoryPanel); |
|
centerPanel.add(accessoryPanel); |
|
accessoryPanel.setInheritsPopupMenu(true); |
|
} |
|
interior.add(centerPanel); |
|
interior.add(Box.createRigidArea(vstrut10)); |
|
|
|
|
|
fileNameLabel = new JLabel(); |
|
populateFileNameLabel(); |
|
align(fileNameLabel); |
|
interior.add(fileNameLabel); |
|
|
|
filenameTextField = new JTextField() { |
|
public Dimension getMaximumSize() { |
|
Dimension d = super.getMaximumSize(); |
|
d.height = getPreferredSize().height; |
|
return d; |
|
} |
|
}; |
|
filenameTextField.setInheritsPopupMenu(true); |
|
fileNameLabel.setLabelFor(filenameTextField); |
|
filenameTextField.addActionListener(getApproveSelectionAction()); |
|
align(filenameTextField); |
|
filenameTextField.setAlignmentX(JComponent.LEFT_ALIGNMENT); |
|
interior.add(filenameTextField); |
|
|
|
bottomPanel = getBottomPanel(); |
|
bottomPanel.add(new JSeparator(), BorderLayout.NORTH); |
|
|
|
|
|
JPanel buttonPanel = new JPanel(); |
|
align(buttonPanel); |
|
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS)); |
|
buttonPanel.add(Box.createGlue()); |
|
|
|
approveButton = new JButton(getApproveButtonText(fc)) { |
|
public Dimension getMaximumSize() { |
|
return new Dimension(MAX_SIZE.width, this.getPreferredSize().height); |
|
} |
|
}; |
|
approveButton.setMnemonic(getApproveButtonMnemonic(fc)); |
|
approveButton.setToolTipText(getApproveButtonToolTipText(fc)); |
|
approveButton.setInheritsPopupMenu(true); |
|
align(approveButton); |
|
approveButton.setMargin(buttonMargin); |
|
approveButton.addActionListener(getApproveSelectionAction()); |
|
buttonPanel.add(approveButton); |
|
buttonPanel.add(Box.createGlue()); |
|
|
|
JButton updateButton = new JButton(updateButtonText) { |
|
public Dimension getMaximumSize() { |
|
return new Dimension(MAX_SIZE.width, this.getPreferredSize().height); |
|
} |
|
}; |
|
updateButton.setMnemonic(updateButtonMnemonic); |
|
updateButton.setToolTipText(updateButtonToolTipText); |
|
updateButton.setInheritsPopupMenu(true); |
|
align(updateButton); |
|
updateButton.setMargin(buttonMargin); |
|
updateButton.addActionListener(getUpdateAction()); |
|
buttonPanel.add(updateButton); |
|
buttonPanel.add(Box.createGlue()); |
|
|
|
JButton cancelButton = new JButton(cancelButtonText) { |
|
public Dimension getMaximumSize() { |
|
return new Dimension(MAX_SIZE.width, this.getPreferredSize().height); |
|
} |
|
}; |
|
cancelButton.setMnemonic(cancelButtonMnemonic); |
|
cancelButton.setToolTipText(cancelButtonToolTipText); |
|
cancelButton.setInheritsPopupMenu(true); |
|
align(cancelButton); |
|
cancelButton.setMargin(buttonMargin); |
|
cancelButton.addActionListener(getCancelSelectionAction()); |
|
buttonPanel.add(cancelButton); |
|
buttonPanel.add(Box.createGlue()); |
|
|
|
JButton helpButton = new JButton(helpButtonText) { |
|
public Dimension getMaximumSize() { |
|
return new Dimension(MAX_SIZE.width, this.getPreferredSize().height); |
|
} |
|
}; |
|
helpButton.setMnemonic(helpButtonMnemonic); |
|
helpButton.setToolTipText(helpButtonToolTipText); |
|
align(helpButton); |
|
helpButton.setMargin(buttonMargin); |
|
helpButton.setEnabled(false); |
|
helpButton.setInheritsPopupMenu(true); |
|
buttonPanel.add(helpButton); |
|
buttonPanel.add(Box.createGlue()); |
|
buttonPanel.setInheritsPopupMenu(true); |
|
|
|
bottomPanel.add(buttonPanel, BorderLayout.SOUTH); |
|
bottomPanel.setInheritsPopupMenu(true); |
|
if (fc.getControlButtonsAreShown()) { |
|
fc.add(bottomPanel, BorderLayout.SOUTH); |
|
} |
|
} |
|
|
|
protected JPanel getBottomPanel() { |
|
if (bottomPanel == null) { |
|
bottomPanel = new JPanel(new BorderLayout(0, 4)); |
|
} |
|
return bottomPanel; |
|
} |
|
|
|
private void doControlButtonsChanged(PropertyChangeEvent e) { |
|
if (getFileChooser().getControlButtonsAreShown()) { |
|
getFileChooser().add(bottomPanel,BorderLayout.SOUTH); |
|
} else { |
|
getFileChooser().remove(getBottomPanel()); |
|
} |
|
} |
|
|
|
public void uninstallComponents(JFileChooser fc) { |
|
fc.removeAll(); |
|
bottomPanel = null; |
|
if (filterComboBoxModel != null) { |
|
fc.removePropertyChangeListener(filterComboBoxModel); |
|
} |
|
} |
|
|
|
protected void installStrings(JFileChooser fc) { |
|
super.installStrings(fc); |
|
|
|
Locale l = fc.getLocale(); |
|
|
|
enterFolderNameLabelText = UIManager.getString("FileChooser.enterFolderNameLabelText",l); |
|
enterFolderNameLabelMnemonic = getMnemonic("FileChooser.enterFolderNameLabelMnemonic", l); |
|
enterFileNameLabelText = UIManager.getString("FileChooser.enterFileNameLabelText",l); |
|
enterFileNameLabelMnemonic = getMnemonic("FileChooser.enterFileNameLabelMnemonic", l); |
|
|
|
filesLabelText = UIManager.getString("FileChooser.filesLabelText",l); |
|
filesLabelMnemonic = getMnemonic("FileChooser.filesLabelMnemonic", l); |
|
|
|
foldersLabelText = UIManager.getString("FileChooser.foldersLabelText",l); |
|
foldersLabelMnemonic = getMnemonic("FileChooser.foldersLabelMnemonic", l); |
|
|
|
pathLabelText = UIManager.getString("FileChooser.pathLabelText",l); |
|
pathLabelMnemonic = getMnemonic("FileChooser.pathLabelMnemonic", l); |
|
|
|
filterLabelText = UIManager.getString("FileChooser.filterLabelText",l); |
|
filterLabelMnemonic = getMnemonic("FileChooser.filterLabelMnemonic", l); |
|
} |
|
|
|
private Integer getMnemonic(String key, Locale l) { |
|
return SwingUtilities2.getUIDefaultsInt(key, l); |
|
} |
|
|
|
protected void installIcons(JFileChooser fc) { |
|
// Since motif doesn't have button icons, leave this empty |
|
// which overrides the supertype icon loading |
|
} |
|
|
|
protected void uninstallIcons(JFileChooser fc) { |
|
// Since motif doesn't have button icons, leave this empty |
|
// which overrides the supertype icon loading |
|
} |
|
|
|
protected JScrollPane createFilesList() { |
|
fileList = new JList<File>(); |
|
|
|
if(getFileChooser().isMultiSelectionEnabled()) { |
|
fileList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
|
} else { |
|
fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
|
} |
|
|
|
fileList.setModel(new MotifFileListModel()); |
|
fileList.getSelectionModel().removeSelectionInterval(0, 0); |
|
fileList.setCellRenderer(new FileCellRenderer()); |
|
fileList.addListSelectionListener(createListSelectionListener(getFileChooser())); |
|
fileList.addMouseListener(createDoubleClickListener(getFileChooser(), fileList)); |
|
fileList.addMouseListener(new MouseAdapter() { |
|
public void mouseClicked(MouseEvent e) { |
|
JFileChooser chooser = getFileChooser(); |
|
if (SwingUtilities.isLeftMouseButton(e) && !chooser.isMultiSelectionEnabled()) { |
|
int index = SwingUtilities2.loc2IndexFileList(fileList, e.getPoint()); |
|
if (index >= 0) { |
|
File file = fileList.getModel().getElementAt(index); |
|
setFileName(chooser.getName(file)); |
|
} |
|
} |
|
} |
|
}); |
|
align(fileList); |
|
JScrollPane scrollpane = new JScrollPane(fileList); |
|
scrollpane.setPreferredSize(prefListSize); |
|
scrollpane.setMaximumSize(MAX_SIZE); |
|
align(scrollpane); |
|
fileList.setInheritsPopupMenu(true); |
|
scrollpane.setInheritsPopupMenu(true); |
|
return scrollpane; |
|
} |
|
|
|
protected JScrollPane createDirectoryList() { |
|
directoryList = new JList<File>(); |
|
align(directoryList); |
|
|
|
directoryList.setCellRenderer(new DirectoryCellRenderer()); |
|
directoryList.setModel(new MotifDirectoryListModel()); |
|
directoryList.getSelectionModel().removeSelectionInterval(0, 0); |
|
directoryList.addMouseListener(createDoubleClickListener(getFileChooser(), directoryList)); |
|
directoryList.addListSelectionListener(createListSelectionListener(getFileChooser())); |
|
directoryList.setInheritsPopupMenu(true); |
|
|
|
JScrollPane scrollpane = new JScrollPane(directoryList); |
|
scrollpane.setMaximumSize(MAX_SIZE); |
|
scrollpane.setPreferredSize(prefListSize); |
|
scrollpane.setInheritsPopupMenu(true); |
|
align(scrollpane); |
|
return scrollpane; |
|
} |
|
|
|
@Override |
|
public Dimension getPreferredSize(JComponent c) { |
|
Dimension prefSize = |
|
(getFileChooser().getAccessory() != null) ? WITH_ACCELERATOR_PREF_SIZE : PREF_SIZE; |
|
Dimension d = c.getLayout().preferredLayoutSize(c); |
|
if (d != null) { |
|
return new Dimension(d.width < prefSize.width ? prefSize.width : d.width, |
|
d.height < prefSize.height ? prefSize.height : d.height); |
|
} else { |
|
return prefSize; |
|
} |
|
} |
|
|
|
@Override |
|
public Dimension getMinimumSize(JComponent x) { |
|
return new Dimension(MIN_WIDTH, MIN_HEIGHT); |
|
} |
|
|
|
@Override |
|
public Dimension getMaximumSize(JComponent x) { |
|
return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); |
|
} |
|
|
|
protected void align(JComponent c) { |
|
c.setAlignmentX(JComponent.LEFT_ALIGNMENT); |
|
c.setAlignmentY(JComponent.TOP_ALIGNMENT); |
|
} |
|
|
|
protected class FileCellRenderer extends DefaultListCellRenderer { |
|
public Component getListCellRendererComponent(JList list, Object value, int index, |
|
boolean isSelected, boolean cellHasFocus) { |
|
|
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
|
setText(getFileChooser().getName((File) value)); |
|
setInheritsPopupMenu(true); |
|
return this; |
|
} |
|
} |
|
|
|
protected class DirectoryCellRenderer extends DefaultListCellRenderer { |
|
public Component getListCellRendererComponent(JList list, Object value, int index, |
|
boolean isSelected, boolean cellHasFocus) { |
|
|
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
|
setText(getFileChooser().getName((File) value)); |
|
setInheritsPopupMenu(true); |
|
return this; |
|
} |
|
} |
|
|
|
protected class MotifDirectoryListModel extends AbstractListModel<File> implements ListDataListener { |
|
public MotifDirectoryListModel() { |
|
getModel().addListDataListener(this); |
|
} |
|
|
|
public int getSize() { |
|
return getModel().getDirectories().size(); |
|
} |
|
|
|
public File getElementAt(int index) { |
|
return getModel().getDirectories().elementAt(index); |
|
} |
|
|
|
public void intervalAdded(ListDataEvent e) { |
|
fireIntervalAdded(this, e.getIndex0(), e.getIndex1()); |
|
} |
|
|
|
public void intervalRemoved(ListDataEvent e) { |
|
fireIntervalRemoved(this, e.getIndex0(), e.getIndex1()); |
|
} |
|
|
|
// PENDING(jeff) - this is inefficient - should sent out |
|
// incremental adjustment values instead of saying that the |
|
|
|
public void fireContentsChanged() { |
|
fireContentsChanged(this, 0, getModel().getDirectories().size()-1); |
|
} |
|
|
|
// PENDING(jeff) - fire the correct interval changed - currently sending |
|
|
|
public void contentsChanged(ListDataEvent e) { |
|
fireContentsChanged(); |
|
} |
|
|
|
} |
|
|
|
protected class MotifFileListModel extends AbstractListModel<File> implements ListDataListener { |
|
public MotifFileListModel() { |
|
getModel().addListDataListener(this); |
|
} |
|
|
|
public int getSize() { |
|
return getModel().getFiles().size(); |
|
} |
|
|
|
public boolean contains(Object o) { |
|
return getModel().getFiles().contains(o); |
|
} |
|
|
|
public int indexOf(Object o) { |
|
return getModel().getFiles().indexOf(o); |
|
} |
|
|
|
public File getElementAt(int index) { |
|
return getModel().getFiles().elementAt(index); |
|
} |
|
|
|
public void intervalAdded(ListDataEvent e) { |
|
fireIntervalAdded(this, e.getIndex0(), e.getIndex1()); |
|
} |
|
|
|
public void intervalRemoved(ListDataEvent e) { |
|
fireIntervalRemoved(this, e.getIndex0(), e.getIndex1()); |
|
} |
|
|
|
// PENDING(jeff) - this is inefficient - should sent out |
|
// incremental adjustment values instead of saying that the |
|
|
|
public void fireContentsChanged() { |
|
fireContentsChanged(this, 0, getModel().getFiles().size()-1); |
|
} |
|
|
|
|
|
public void contentsChanged(ListDataEvent e) { |
|
fireContentsChanged(); |
|
} |
|
|
|
} |
|
|
|
// |
|
// DataModel for Types Comboxbox |
|
|
|
protected FilterComboBoxModel createFilterComboBoxModel() { |
|
return new FilterComboBoxModel(); |
|
} |
|
|
|
// |
|
// Renderer for Types ComboBox |
|
|
|
protected FilterComboBoxRenderer createFilterComboBoxRenderer() { |
|
return new FilterComboBoxRenderer(); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
public class FilterComboBoxRenderer extends DefaultListCellRenderer { |
|
public Component getListCellRendererComponent(JList list, |
|
Object value, int index, boolean isSelected, |
|
boolean cellHasFocus) { |
|
|
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
|
|
|
if (value != null && value instanceof FileFilter) { |
|
setText(((FileFilter)value).getDescription()); |
|
} |
|
|
|
return this; |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
protected class FilterComboBoxModel extends AbstractListModel<FileFilter> implements ComboBoxModel<FileFilter>, |
|
PropertyChangeListener { |
|
protected FileFilter[] filters; |
|
protected FilterComboBoxModel() { |
|
super(); |
|
filters = getFileChooser().getChoosableFileFilters(); |
|
} |
|
|
|
public void propertyChange(PropertyChangeEvent e) { |
|
String prop = e.getPropertyName(); |
|
if(prop.equals(JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY)) { |
|
filters = (FileFilter[]) e.getNewValue(); |
|
fireContentsChanged(this, -1, -1); |
|
} else if (prop.equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) { |
|
fireContentsChanged(this, -1, -1); |
|
} |
|
} |
|
|
|
public void setSelectedItem(Object filter) { |
|
if(filter != null) { |
|
getFileChooser().setFileFilter((FileFilter) filter); |
|
fireContentsChanged(this, -1, -1); |
|
} |
|
} |
|
|
|
public Object getSelectedItem() { |
|
// Ensure that the current filter is in the list. |
|
// NOTE: we shouldnt' have to do this, since JFileChooser adds |
|
// the filter to the choosable filters list when the filter |
|
// is set. Lets be paranoid just in case someone overrides |
|
|
|
FileFilter currentFilter = getFileChooser().getFileFilter(); |
|
boolean found = false; |
|
if(currentFilter != null) { |
|
for (FileFilter filter : filters) { |
|
if (filter == currentFilter) { |
|
found = true; |
|
} |
|
} |
|
if (!found) { |
|
getFileChooser().addChoosableFileFilter(currentFilter); |
|
} |
|
} |
|
return getFileChooser().getFileFilter(); |
|
} |
|
|
|
public int getSize() { |
|
if(filters != null) { |
|
return filters.length; |
|
} else { |
|
return 0; |
|
} |
|
} |
|
|
|
public FileFilter getElementAt(int index) { |
|
if(index > getSize() - 1) { |
|
|
|
return getFileChooser().getFileFilter(); |
|
} |
|
if(filters != null) { |
|
return filters[index]; |
|
} else { |
|
return null; |
|
} |
|
} |
|
} |
|
|
|
protected JButton getApproveButton(JFileChooser fc) { |
|
return approveButton; |
|
} |
|
|
|
} |