/* * 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. */ /* * ModelList.java * Copyright (C) 2006 Robert Jung * */ package weka.gui.ensembleLibraryEditor; import weka.classifiers.EnsembleLibraryModel; import weka.classifiers.EnsembleLibraryModelComparator; import javax.swing.*; import java.awt.*; import java.util.*; /** * This class is basically a customization of the JList class to allow it * to display LibraryModel objects. It has two nested helper classes that * respectively take care of rendering and modelling the List of models. * * @author Robert Jung (mrbobjung@gmail.com) */ public class ModelList extends JList { /** for serialization */ private static final long serialVersionUID = -421567241792939539L; /** * The constructor simply initializes the model and the renderer. */ public ModelList() { super(); this.setModel(new SortedListModel()); this.setCellRenderer(new ModelListRenderer()); } /** * This nested helper class is responsible for rendering each Library * Model object. */ public class ModelListRenderer extends DefaultListCellRenderer { /** for serialization */ private static final long serialVersionUID = -7061163240718897794L; /** * This is the only method necessary to overload. All we have to * do is print the String value of the model along with its index * in the ModelList data structure. * * @param list the JList * @param value the value * @param index the index of the value * @param isSelected if true the item is selected * @param cellHasFocus whether it has the focus * @return the rendering component */ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component modelComponent = null; if (value instanceof EnsembleLibraryModel) { EnsembleLibraryModel model = ((EnsembleLibraryModel) value); String modelString = index + ": " + model.getStringRepresentation().replaceAll( "weka.classifiers.", ""); modelComponent = super.getListCellRendererComponent(list, modelString, index, isSelected, cellHasFocus); if (!model.getOptionsWereValid()) { modelComponent.setBackground(Color.pink); } ((JComponent) modelComponent).setToolTipText(model .getDescriptionText()); } return modelComponent; } } /** * * This is a helper class that creates a custom list model for the ModelList class. * It basically ensures that all model entries are 1) unique - so that no duplicate * entries can find their way in, and 2) sorted alphabetically. It also numbers * them. * <p/> * This nested class was adapted from code found in a freely available tutorial on * sorting JList entries by John Zukowski - wait a sec, he's the guy who wrote the * other tutorial I cited in the AddModelsPanel. wow, different web site even. * This guy is really in to writing tutorials. Anyway, it was very helpful, if * you would like to know more about implementing swing MVC stuff. * <p/> * Anyway, John Zukowski's tutorial can be found at: <br/> * <a href="http://www.jguru.com/faq/view.jsp?EID=15245" target="_blank">http://www.jguru.com/faq/view.jsp?EID=15245</a> */ public class SortedListModel extends AbstractListModel { /** for serialization */ private static final long serialVersionUID = -8334675481243839371L; /** Define a SortedSet */ SortedSet m_Models; /** * default constructor */ public SortedListModel() { // Create a TreeSet // Store it in SortedSet variable m_Models = new TreeSet(new EnsembleLibraryModelComparator()); } // ListModel methods public int getSize() { // Return the model size return m_Models.size(); } public Object getElementAt(int index) { // Return the appropriate element return m_Models.toArray()[index]; } // Other methods public void add(Object element) { if (m_Models.add(element)) { fireContentsChanged(this, 0, getSize()); } } public void addAll(Object elements[]) { Collection c = Arrays.asList(elements); m_Models.addAll(c); fireContentsChanged(this, 0, getSize()); } public void clear() { m_Models.clear(); fireContentsChanged(this, 0, getSize()); } public boolean contains(Object element) { return m_Models.contains(element); } public Object firstElement() { // Return the appropriate element return m_Models.first(); } public Iterator iterator() { return m_Models.iterator(); } public Object lastElement() { // Return the appropriate element return m_Models.last(); } public boolean removeElement(Object element) { boolean removed = m_Models.remove(element); if (removed) { fireContentsChanged(this, 0, getSize()); } return removed; } } }