package com.ibm.nmon.gui.file;
import java.awt.Component;
import java.awt.HeadlessException;
import java.io.File;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.ibm.nmon.gui.main.NMONVisualizerGui;
/**
* Base class for file selection dialogs. Supports the notion of a default file name that can be
* used when the user has not entered a file name.
*/
public class GUIFileChooser extends JFileChooser {
private static final long serialVersionUID = 3483905864541979923L;
protected final NMONVisualizerGui gui;
private String defaultFileName;
public GUIFileChooser(NMONVisualizerGui gui, String title) {
this(gui, title, null);
}
public GUIFileChooser(NMONVisualizerGui gui, String title, String filename) {
super();
this.gui = gui;
this.defaultFileName = filename;
setDialogTitle(title);
// these must be set _before_ setting the selected file or the selection will be lost!
setMultiSelectionEnabled(false);
setFileSelectionMode(JFileChooser.FILES_ONLY);
String directory = gui.getPreferences().get("lastSaveDirectory", null);
if (defaultFileName != null) {
setSelectedFile(new File(directory, defaultFileName));
}
else if (directory != null) {
setCurrentDirectory(new File(directory));
}
}
@Override
public int showDialog(Component parent, String approveButtonText) throws HeadlessException {
int toReturn = super.showDialog(parent, approveButtonText);
saveLastSaveLocation();
return toReturn;
}
@Override
public int showOpenDialog(Component parent) throws HeadlessException {
int toReturn = super.showOpenDialog(parent);
saveLastSaveLocation();
return toReturn;
}
@Override
public int showSaveDialog(Component parent) throws HeadlessException {
int toReturn = super.showSaveDialog(parent);
saveLastSaveLocation();
return toReturn;
}
private final void saveLastSaveLocation() {
if (getSelectedFile() != null) {
File parent = getSelectedFile();
if (!parent.isDirectory()) {
parent = parent.getParentFile();
}
if (parent != null) {
gui.getPreferences().put("lastSaveDirectory", parent.getAbsolutePath());
}
}
}
protected static void addComponentToChooser(JFileChooser chooser, String toLabel, JComponent toAdd) {
// huge hack that only works with the Nimbus look and feel
// get the bottom panel and add the new component after the file type drop down
JPanel bottom = ((JPanel) chooser.getComponent(chooser.getComponentCount() - 1));
JPanel newPanel = new JPanel();
newPanel.setLayout(new BoxLayout(newPanel, BoxLayout.LINE_AXIS));
if (toLabel != null) {
// use the formatting of the combo box label in the component being added
// count - 1 => buttons
// count - 2 => filter filter combo box
JPanel filterPanel = (JPanel) bottom.getComponent(bottom.getComponentCount() - 2);
// count - 1 => combo box
// count - 2 => label
JLabel filterLabel = (JLabel) filterPanel.getComponent(filterPanel.getComponentCount() - 2);
JLabel label = new JLabel(toLabel);
label.setFont(filterLabel.getFont());
label.setBorder(filterLabel.getBorder());
label.setPreferredSize(filterLabel.getPreferredSize());
newPanel.add(label);
}
newPanel.add(toAdd);
bottom.add(newPanel, bottom.getComponentCount() - 1);
}
}