package ddddbb.gen; import java.awt.CardLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.AbstractButton; import javax.swing.ComboBoxModel; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRadioButtonMenuItem; import javax.swing.event.ListDataListener; /** This class represents a fixed length list (array) of type T, * in which one element is changeably selected. * Also an array of associated names (String) is maintained. * * @author bo198214 */ public class IntModel<T> extends Model implements ComboBoxModel, SelArray<T> { protected int selDefault; protected int sel = -1; protected T[] items; protected String[] names; protected Vector<Vector<AbstractButton>> buttons = new Vector<Vector<AbstractButton>>(); protected boolean enabled = true; // public IntModel() {} // protected IntModel(int _value) { // value = _value; // defaultValue = value; // } protected IntModel() {} protected void init(int _value,String[] _names,T[] _items) { assert 0 <= _value && _value < _items.length; assert _names == null || _names.length == _items.length; selDefault = _value; sel = _value; // items = arr2Vec(_items); names = _names; items = _items; if (names==null) names = new String[items.length]; for (int i=0;i<_items.length;i++) { if ( _names == null ) { names[i]=items[i].toString(); } buttons.add(i,new Vector<AbstractButton>()); } // if (_names == null) { names = namesOf(items); } // else { names = arr2Vec(_names); } } public IntModel(T _selectedItem,T[] _values) { init(_selectedItem,_values); } protected void init(T _selectedItem,T[] _values) { init(indexOf(_selectedItem,_values),null,_values); } public IntModel(int i,T[] _values) { this(i,null,_values); } public IntModel(T[] _values) { this(0,null,_values); } public IntModel(int _value,String[] _names,T[] _items) { init(_value,_names,_items); } public IntModel(T initial, String[] _names, T[] _items) { init(initial,_names,_items); } protected void init(T initial, String[] _names, T[] _items) { int i=0; for (;i<_items.length;i++) { if (_items[i]==initial) { break; } } init(i,_names,_items); } public void setToDefault() { setSelInt(selDefault); } // public static <X> Vector<X> arr2Vec(X[] a) { // if (a==null) { return null; } // Vector<X> res = new Vector<X>(); // for (int i=0;i<a.length;i++) { // res.add(i,a[i]); // } // return res; // } // public void setNames(String[] _names) { // names = arr2Vec(_names); // } // // public void setObjects(T[] _objects) { // items = arr2Vec(_objects); // } /* (non-Javadoc) * @see ddddbb.gen.SelArray#selInt() */ public int selInt() { return sel; } /* (non-Javadoc) * @see ddddbb.gen.SelArray#setSelInt(int) */ public void setSelInt(int i) { //if (i==value) { return; } int n=items.length; if (i<n) { sel = i; } else { sel = n-1; } if (i<0) { sel = 0; } changed(); } public ActionListener nextAction = new ActionListener() { public void actionPerformed(ActionEvent e) { setSelInt(selInt()+1); } }; public ActionListener prevAction = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setSelInt(selInt()-1); } }; public ActionListener cyclicNextAction = new ActionListener() { public void actionPerformed(ActionEvent e) { setSelInt((selInt()+1)%items.length); } }; public ActionListener cyclicPrevAction = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setSelInt((selInt()-1)%items.length); } }; /* (non-Javadoc) * @see ddddbb.gen.SelArray#addButton(int, javax.swing.AbstractButton) */ public void addButton(final int index,AbstractButton b) { buttons.get(index).add(b); if (b.getText() == null | b.getText().length() == 0) { b.setText(names[index]); } if (index==sel) b.setSelected(true); else b.setSelected(false); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setSelInt(index); } }); } /* (non-Javadoc) * @see ddddbb.gen.SelArray#addButton(T, javax.swing.AbstractButton) */ public void addButton(final T item,AbstractButton b) { int i; for (i=0;i<items.length;i++) if (items[i]==item) break; addButton(i,b); } public static <S> int indexOf(S item,S[] items) { int i; for (i=0;i<items.length;i++) if (item==items[i]) break; return i; } public static <S> int indexEqualOf(S item, S[] items) { int i; for (i=0;i<items.length;i++) if (item.equals(items[i])) break; return i; } /** * This selects the first item with its name equal to object.toString(). */ public void setSelectedItem(Object object) { setSelInt(indexEqualOf(object.toString(),names)); } /* (non-Javadoc) * @see ddddbb.gen.SelArray#setSel(T) */ public void setSel(T anObject) { setSelInt(indexOf(anObject,items)); } /** * Returns the name of the selected item. */ public String getSelectedItem() { if ( sel == -1 ) { return null; } return names[sel]; } public int getSize() { return items.length; } public String getElementAt(int index) { if (sel == -1) { return null; } return names[index]; } public void addListDataListener(ListDataListener l) { // items is fixed } public void removeListDataListener(ListDataListener l) { // items is fixed } /* (non-Javadoc) * @see ddddbb.gen.SelArray#sel() */ public T sel() { if (sel == -1) { return null; } return items[sel]; } public T[] getItems() { return items; } public String[] getNames() { return names; } public void addAsRadioButtonMenuItems(Container c) { JRadioButtonMenuItem[] menuItems = new JRadioButtonMenuItem[getSize()]; for (int i=0;i<getSize();i++) { menuItems[i] = new JRadioButtonMenuItem(names[i]); addButton(i,menuItems[i]); c.add(menuItems[i]); } } public void addAsMenuItems(Container c) { JMenuItem[] menuItems = new JMenuItem[getSize()]; for (int i=0;i<getSize();i++) { menuItems[i] = new JMenuItem(names[i]); addButton(i,menuItems[i]); c.add(menuItems[i]); } } public void addAsRadioButtons(Container c) { JRadioButton[] menuItems = new JRadioButton[getSize()]; for (int i=0;i<getSize();i++) { menuItems[i] = new JRadioButton(names[i]); addButton(i,menuItems[i]); c.add(menuItems[i]); } } public void addAsCheckBoxMenuItems(Container c) { JCheckBoxMenuItem[] menuItems = new JCheckBoxMenuItem[getSize()]; for (int i=0;i<getSize();i++) { menuItems[i] = new JCheckBoxMenuItem(names[i]); addButton(i,menuItems[i]); c.add(menuItems[i]); } } public JComboBox addAsComboBox(Container c) { JComboBox cb = new JComboBox(this); c.add(cb); return cb; } public void addAsCards(final Container c, final CardLayout l) { for (int i=0;i<getSize();i++) { c.add((JPanel)items[i],names[i]); } new AChangeListener() { public void stateChanged() { l.show(c,names[sel]); } }.addTo(this); } public void setEnabled(boolean _enabled) { enabled = _enabled; propagateEnabled(); } public void propagateEnabled() { for (Vector<AbstractButton> bs:buttons) for (AbstractButton b:bs) { b.setEnabled(enabled); } } public void updateButtonStates() { for (Vector<AbstractButton> bs:buttons) for (AbstractButton b:bs) { b.setSelected(false); //triggers no action event } if (-1 < sel && sel < buttons.size()) { //does not fire actionEvent for (AbstractButton b:buttons.get(sel)) { b.setSelected(true); //triggers no action event } } propagateEnabled(); } public void changed() { super.changed(); updateButtonStates(); } // protected String nameOf(T o) { // return o.toString(); // } // protected Vector<String> namesOf(Collection<T> c) { // Vector<String> res = new Vector<String>(); // for (T t:c) { // res.add(nameOf(t)); // } // return res; // } }