package com.ibm.nmon.gui.file;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFileChooser;
import com.ibm.nmon.file.CombinedFileFilter;
import com.ibm.nmon.file.SwingAndIOFileFilter;
import com.ibm.nmon.gui.main.NMONVisualizerGui;
import com.ibm.nmon.gui.util.TimeZoneComboBox;
import com.ibm.nmon.util.FileHelper;
import java.io.File;
import java.util.List;
/**
* Creates a JFileChooser so the user can select files to parse. Delegates actual parsing to
* {@link ParserRunner}. Directory selection is supported as is recursion into a directory
* structure.
*/
public final class FileLoadAction implements ActionListener {
private final JFileChooser chooser;
private final NMONVisualizerGui gui;
private final TimeZoneComboBox timeZones;
public FileLoadAction(NMONVisualizerGui gui) {
this.gui = gui;
String directory = gui.getPreferences().get("lastDirectory", null);
chooser = new JFileChooser(directory);
chooser.setAcceptAllFileFilterUsed(true);
chooser.setMultiSelectionEnabled(true);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.setDialogTitle("Select Files to Parse");
for (SwingAndIOFileFilter filter : CombinedFileFilter.getInstance(true).getFilters()) {
chooser.addChoosableFileFilter(filter);
}
chooser.setFileFilter(chooser.getAcceptAllFileFilter());
timeZones = new TimeZoneComboBox(gui.getDisplayTimeZone());
GUIFileChooser.addComponentToChooser(chooser, "Time Zone:", timeZones);
}
public void actionPerformed(ActionEvent event) {
if (chooser.showDialog(gui.getMainFrame(), "Parse") != JFileChooser.APPROVE_OPTION) {
return;
}
File[] selectedFiles = chooser.getSelectedFiles();
if (selectedFiles.length == 0) {
return;
}
gui.getPreferences().put("lastDirectory", selectedFiles[0].getParentFile().getAbsolutePath());
List<String> toParse = new java.util.ArrayList<String>(selectedFiles.length);
java.io.FileFilter filter = null;
// user selected All Files => select all files filtered by all filters
// user selected a single file type => select all files filtered by a single filter
if (chooser.getFileFilter() == chooser.getAcceptAllFileFilter()) {
filter = CombinedFileFilter.getInstance(false);
}
else {
filter = ((SwingAndIOFileFilter) chooser.getFileFilter()).getFilter();
}
FileHelper.recurseDirectories(selectedFiles, filter, toParse);
if (!toParse.isEmpty()) {
// parse files outside of the Swing event thread
new Thread(new ParserRunner(gui, toParse, timeZones.getSelectedTimeZone()), getClass().getName()
+ " Parser").start();
}
}
}