package org.wordcorr.gui; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.wordcorr.db.DatabaseException; import org.wordcorr.db.WordCollection; import org.wordcorr.db.Setting; import org.wordcorr.db.View; /** * Panel for choosing a view. This panel loads the last selected view * by the current user, and stores the user's preference when choosing * a new view. * @author Keith Hamasaki, Jim Shiba **/ public class ViewChooser extends JPanel { /** * Constructor. **/ public ViewChooser(final WordCollection collection) throws DatabaseException { this(collection, null); } /** * Constructor. * List excludeViews - list of view names to exclude from list. **/ public ViewChooser(final WordCollection collection, List excludeViews) throws DatabaseException { super(new FlowLayout(FlowLayout.LEFT)); _collection = collection; _excludeViews = excludeViews; BasicListModel model = new BasicListModel(); _list.setModel(model); model.setData(getViews()); this.add(new JLabel(AppPrefs.getInstance().getMessages().getString("lblChooseView"))); this.add(_list); _list.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { _view = (View) _list.getSelectedItem(); if (_view != null) { Setting setting = collection.getDatabase().getCurrentSetting(); setting.setViewID(_view.getID()); setting.save(); } } catch (DatabaseException e) { Dialogs.genericError(e); } fireChangeEvent(); } }); } /** * Get views. **/ private List getViews() throws DatabaseException { // filter out list List views = new ArrayList(_collection.getViews()); if (_excludeViews != null) { for (Iterator it = _excludeViews.iterator(); it.hasNext();) { String exclude = (String)it.next(); for (Iterator itv = views.iterator(); itv.hasNext();) { View vw = (View)itv.next(); if (vw.getName().equalsIgnoreCase(exclude)) { // Note: WordCollection.getViews() needs to retrieve collection's list for this to work, // not new list. Currently will not work but ViewChooser no longer in use. views.remove(vw); break; } } } } return views; } /** * Refresh list. **/ public void refresh() throws DatabaseException { ((BasicListModel )_list.getModel()).setData(getViews()); } /** * Initialize with the user's choice. **/ public void selectDefault() throws DatabaseException { Setting setting = _collection.getDatabase().getCurrentSetting(); boolean viewSelected = false; for (int i = 0; i < _list.getModel().getSize(); i++) { View view = (View) _list.getModel().getElementAt(i); if (setting.getViewID() == view.getID()) { _list.setSelectedItem(view); viewSelected = true; break; } } if (!viewSelected) _list.setSelectedItem(null); } /** * Add a change listener to this object. **/ public void addChangeListener(ChangeListener listener) { listenerList.add(ChangeListener.class, listener); } /** * Remove a change listener from this object. **/ public void removeChangeListener(ChangeListener listener) { listenerList.remove(ChangeListener.class, listener); } /** * Notify all listeners that have registered interest for * change events. **/ protected void fireChangeEvent() { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ChangeListener.class) { ((ChangeListener) listeners[i+1]).stateChanged(_event); } } } /** * Get the currently selected view. **/ public View getSelectedView() { return _view; } private View _view; private final WordCollection _collection; private final ChangeEvent _event = new ChangeEvent(this); private final List _excludeViews; private final JComboBox _list = new JComboBox(); }