package net.sourceforge.squirrel_sql.client.gui.db; import net.sourceforge.squirrel_sql.fw.gui.SortedListModel; import net.sourceforge.squirrel_sql.client.ApplicationListener; import net.sourceforge.squirrel_sql.client.IApplication; import javax.swing.*; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import java.awt.*; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.prefs.Preferences; public abstract class BaseList implements IBaseList { private ArrayList<ListDataListener> _listeners = new ArrayList<ListDataListener>(); private JList _list = new JList() { public String getToolTipText(MouseEvent event) { return BaseList.this.getToolTipText(event); } }; private JScrollPane _comp = new JScrollPane(_list); public BaseList(SortedListModel sortedListModel, IApplication app) { _list.setModel(sortedListModel); getList().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // Add listener to listen for items added/removed from list. _list.getModel().addListDataListener(new ListDataListener() { public void intervalAdded(ListDataEvent evt) { onIntervalAdded(evt); } public void intervalRemoved(ListDataEvent evt) { onIntervalRemoved(evt); } public void contentsChanged(ListDataEvent evt) { onContentsChanged(evt); } }); _comp.setPreferredSize(new Dimension(100, 100)); app.addApplicationListener(new ApplicationListener() { public void saveApplicationState() { onSaveApplicationState(); } }); setSelIxFromPrefs(); } private void setSelIxFromPrefs() { int selIx = Preferences.userRoot().getInt(getSelIndexPrefKey(), 0); if(selIx >= 0 && selIx < _list.getModel().getSize()) { _list.setSelectedIndex(selIx); } } private void onSaveApplicationState() { Preferences.userRoot().putInt(getSelIndexPrefKey(), getList().getSelectedIndex()); } protected JList getList() { return _list; } protected abstract String getToolTipText(MouseEvent event); private void onContentsChanged(ListDataEvent evt) { for (ListDataListener listener : _listeners.toArray(new ListDataListener[0])) { listener.contentsChanged(evt); } } private void onIntervalRemoved(ListDataEvent evt) { int nextIdx = evt.getIndex0(); int lastIdx = _list.getModel().getSize() - 1; if (nextIdx > lastIdx) { nextIdx = lastIdx; } _list.setSelectedIndex(nextIdx); for (ListDataListener listener : _listeners.toArray(new ListDataListener[0])) { listener.intervalRemoved(evt); } } private void onIntervalAdded(ListDataEvent evt) { _list.setSelectedIndex(evt.getIndex0()); // select the one just added. for (ListDataListener listener : _listeners.toArray(new ListDataListener[0])) { listener.intervalAdded(evt); } } public JComponent getComponent() { return _comp; } public void selectListEntryAtPoint(Point point) { int selectEventListIndex = _list.locationToIndex(point); if (_list.getSelectionMode() == ListSelectionModel.SINGLE_SELECTION) { // Only a single selection can be made at a time. int selectedIndex = _list.getSelectedIndex(); if (selectedIndex != selectEventListIndex) { _list.setSelectedIndex(selectEventListIndex); } } else { // More than one selection is allowed - check to see if we should change the selection int[] selectedIndices = _list.getSelectedIndices(); boolean alreadySelected = false; for (int selectedIndex : selectedIndices) { if (selectedIndex == selectEventListIndex) { alreadySelected = true; } } if (!alreadySelected) { _list.setSelectedIndex(selectEventListIndex); } } } public void addMouseListener(MouseListener mouseListener) { _list.addMouseListener(mouseListener); } public void removeMouseListener(MouseListener mouseListener) { _list.removeMouseListener(mouseListener); } public abstract String getSelIndexPrefKey(); }