/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* ListModelsPanel.java
* Copyright (C) 2006 Robert Jung
*
*/
package weka.gui.ensembleLibraryEditor;
import weka.classifiers.EnsembleLibrary;
import weka.classifiers.EnsembleLibraryModel;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Iterator;
import java.util.TreeSet;
/**
* This class is responsible for creating the main panel in the library editor
* gui. It is responsible for displaying the entire list of models currently in
* the list. It is also responsible for allowing the user to save/load this list
* as a flat file and choosing the working directory for the library.
*
* @author Robert Jung (mrbobjung@gmail.com)
* @version $Revision: 1.2 $
*/
public class ListModelsPanel
extends JPanel
implements ActionListener {
/** for serialization */
private static final long serialVersionUID = -1986253077944432252L;
/** The library being edited */
private EnsembleLibrary m_Library;
/** The button for removing selected models */
private JButton m_RemoveSelectedButton;
/** The button for opening a model list from a file */
private JButton m_OpenModelFileButton;
/** The button for saving a model list to a file */
private JButton m_SaveModelFileButton;
/** The ModelList object that displays all currently selected models */
private ModelList m_ModelList;
/** The file chooser for the user to select model list files to save and load */
private JFileChooser m_modelListChooser = new JFileChooser(new File(
System.getProperty("user.dir")));
/**
* Constructor to initialize library object and GUI
*
* @param library the library to use
*/
public ListModelsPanel(EnsembleLibrary library) {
m_Library = library;
createListModelsPanel();
}
/**
* this is necessay to set the Library object after initiialization
*
* @param library the library to use
*/
public void setLibrary(EnsembleLibrary library) {
m_Library = library;
}
/**
* Builds the GUI.
*/
private void createListModelsPanel() {
GridBagConstraints gbc = new GridBagConstraints();
setLayout(new GridBagLayout());
JPanel modelListPanel = new JPanel();
modelListPanel.setBorder(
BorderFactory.createTitledBorder("Currently Chosen Library Models"));
m_ModelList = new ModelList();
m_ModelList.getInputMap().put(
KeyStroke.getKeyStroke("released DELETE"), "deleteSelected");
m_ModelList.getActionMap().put("deleteSelected",
new AbstractAction("deleteSelected") {
private static final long serialVersionUID = 8178827388328307805L;
public void actionPerformed(ActionEvent evt) {
Object[] currentModels = m_ModelList.getSelectedValues();
for (int i = 0; i < currentModels.length; i++) {
removeModel((EnsembleLibraryModel) currentModels[i]);
}
// Shrink the selected range to the first index that was
// selected
int selected[] = new int[1];
selected[0] = m_ModelList.getSelectedIndices()[0];
m_ModelList.setSelectedIndices(selected);
}
});
m_ModelList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
m_ModelList.setVisibleRowCount(-1);
m_ModelList.setLayoutOrientation(JList.VERTICAL);
JScrollPane listScroller = new JScrollPane(m_ModelList);
listScroller.setPreferredSize(new Dimension(150, 50));
modelListPanel.setLayout(new BorderLayout());
modelListPanel.add(listScroller, BorderLayout.CENTER);
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = 3;
add(modelListPanel, gbc);
m_RemoveSelectedButton = new JButton("Remove Selected");
m_RemoveSelectedButton.addActionListener(this);
m_RemoveSelectedButton.setToolTipText(
"Remove all currently selected models from the above list");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.weightx = 1;
gbc.weighty = 0;
gbc.gridwidth = 1;
add(m_RemoveSelectedButton, gbc);
m_modelListChooser.setAcceptAllFileFilterUsed(false);
XMLModelFileFilter xmlFilter = new XMLModelFileFilter();
m_modelListChooser.addChoosableFileFilter(xmlFilter);
m_modelListChooser.addChoosableFileFilter(new FlatModelFileFilter());
// set up the file chooser
m_modelListChooser.setFileFilter(xmlFilter);
m_modelListChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
// create the buttons + field
m_OpenModelFileButton = new JButton("Open...");
m_OpenModelFileButton.addActionListener(this);
m_OpenModelFileButton.setToolTipText(
"Import a model list file from the file system");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = 1;
gbc.weightx = 1;
gbc.weighty = 0;
add(m_OpenModelFileButton, gbc);
m_SaveModelFileButton = new JButton("Save...");
m_SaveModelFileButton.addActionListener(this);
m_SaveModelFileButton.setToolTipText(
"Save the current list of models to a file");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 2;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = 1;
gbc.weightx = 1;
gbc.weighty = 0;
add(m_SaveModelFileButton, gbc);
}
/**
* returns the current library
*
* @return the current library
*/
public EnsembleLibrary getLibrary() {
return m_Library;
}
/**
* This handles all of the button events. Specifically the buttons
* associated with saving/loading model lists as well as removing models
* from the currently displayed list.
*
* @param e
* the action event that occured
*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == m_OpenModelFileButton) {
int returnVal = m_modelListChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
clearAll();
File selectedFile = m_modelListChooser.getSelectedFile();
// add .mlf extension if that was the file filter used
if ((m_modelListChooser.getFileFilter() instanceof FlatModelFileFilter)) {
if (!selectedFile.getName().endsWith(
EnsembleLibrary.FLAT_FILE_EXTENSION)) {
selectedFile = new File(selectedFile.getPath()
+ EnsembleLibrary.FLAT_FILE_EXTENSION);
}
// otherwise use .model.xml file extension by default
} else {
if (!selectedFile.getName().endsWith(
EnsembleLibrary.XML_FILE_EXTENSION)) {
selectedFile = new File(selectedFile.getPath()
+ EnsembleLibrary.XML_FILE_EXTENSION);
}
}
EnsembleLibrary.loadLibrary(selectedFile, this, m_Library);
ModelList.SortedListModel dataModel = ((ModelList.SortedListModel) m_ModelList.getModel());
TreeSet models = m_Library.getModels();
for (Iterator it = models.iterator(); it.hasNext();) {
addModel((EnsembleLibraryModel) it.next());
// dataModel.add(it.next());
}
}
} else if (e.getSource() == m_SaveModelFileButton) {
int returnVal = m_modelListChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File selectedFile = m_modelListChooser.getSelectedFile();
// add .mlf extension if that was the file filter used
if ((m_modelListChooser.getFileFilter() instanceof FlatModelFileFilter)) {
if (!selectedFile.getName().endsWith(
EnsembleLibrary.FLAT_FILE_EXTENSION)) {
selectedFile = new File(selectedFile.getPath()
+ EnsembleLibrary.FLAT_FILE_EXTENSION);
}
// otherwise use .model.xml file extension by default
} else {
if (!selectedFile.getName().endsWith(
EnsembleLibrary.XML_FILE_EXTENSION)) {
selectedFile = new File(selectedFile.getPath()
+ EnsembleLibrary.XML_FILE_EXTENSION);
}
}
EnsembleLibrary.saveLibrary(selectedFile, m_Library, this);
}
} else if (e.getSource() == m_RemoveSelectedButton) {
// here we simply get the list of models that are
// currently selected and ten remove them from the list
// ModelList.SortedListModel dataModel =
// ((ModelList.SortedListModel)m_ModelList.getModel());
Object[] currentModels = m_ModelList.getSelectedValues();
for (int i = 0; i < currentModels.length; i++) {
removeModel((EnsembleLibraryModel) currentModels[i]);
}
// Shrink the selected range to the first index that was selected
if (m_ModelList.getSelectedIndices().length > 0) {
int selected[] = new int[1];
selected[0] = m_ModelList.getSelectedIndices()[0];
m_ModelList.setSelectedIndices(selected);
}
}
}
/**
* This removes all the models from the current list in the GUI
*/
public void clearAll() {
((ModelList.SortedListModel) m_ModelList.getModel()).clear();
m_Library.clearModels();
}
/**
* Adds a model to the current library
*
* @param model the model to add
*/
public void addModel(EnsembleLibraryModel model) {
((ModelList.SortedListModel) m_ModelList.getModel()).add(model);
m_Library.addModel(model);
}
/**
* Removes a model to the current library
*
* @param model the model to remove
*/
public void removeModel(EnsembleLibraryModel model) {
((ModelList.SortedListModel) m_ModelList.getModel())
.removeElement(model);
m_Library.removeModel(model);
}
/**
* A helper class for filtering xml model files
*/
class XMLModelFileFilter
extends FileFilter {
/**
* Whether the given file is accepted by this filter.
*
* @param file the file to check
* @return true if the file got accepted
*/
public boolean accept(File file) {
String filename = file.getName();
return (filename.endsWith(EnsembleLibrary.XML_FILE_EXTENSION) || file
.isDirectory());
}
/**
* The description of this filter.
*
* @return the description
*/
public String getDescription() {
return "XML Library Files (*.model.xml)";
}
}
/**
* A helper class for filtering flat model files
*
*/
class FlatModelFileFilter
extends FileFilter {
/**
* Whether the given file is accepted by this filter.
*
* @param file the file to check
* @return true if the file got accepted
*/
public boolean accept(File file) {
String filename = file.getName();
return (filename.endsWith(EnsembleLibrary.FLAT_FILE_EXTENSION) || file
.isDirectory());
}
/**
* The description of this filter.
*
* @return the description
*/
public String getDescription() {
return "Model List Files (*.mlf)";
}
}
}