/* * VirtualChoice.java * (FScape) * * Copyright (c) 2001-2016 Hanns Holger Rutz. All rights reserved. * * This software is published under the GNU General Public License v3+ * * * For further information, please contact Hanns Holger Rutz at * contact@sciss.de */ package de.sciss.fscape.gui; import javax.swing.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Vector; /** * JComboBox subclass that remembers "impossible" * selection, i.e. those with item indices * beyond the current item list which may become * available in the future. */ public class VirtualChoice extends JComboBox { // -------- private variables -------- protected int virtualIndex; protected Vector<ItemListener> listeners; // -------- public methods -------- public VirtualChoice() { super(); virtualIndex = super.getSelectedIndex(); listeners = new Vector<ItemListener>(); } // XXX // public void addItem( String item ) // { // addItem( item ); // } /** * Wenn der virtuelle Index nach dem Add-Vorgang * real als Item existiert, so wird dieses angewaehlt */ public void addItem( String item ) { super.addItem( item ); if( (getItemCount() - 1) == virtualIndex ) { try { super.setSelectedIndex( virtualIndex ); } catch( IllegalArgumentException ignored) {} } } public void insertItemAt( String item, int index ) throws IllegalArgumentException { super.insertItemAt( item, index ); if( (getItemCount() - 1) == virtualIndex ) { super.setSelectedIndex( virtualIndex ); } } public int getSelectedIndex() { return virtualIndex; } /** * defacto wird keine Exception ausgeloest; * falls der Index groesser als die Zahl der Items * ist, wird er intern gespeichert * * Eingetragene spezielle ItemListener werden benachrichtigt */ public void setSelectedIndex( int pos ) throws IllegalArgumentException { if( pos >= 0 ) { virtualIndex = pos; // System.out.println( "select "+virtualIndex ); if( getItemCount() > virtualIndex ) { super.setSelectedIndex( pos ); } } synchronized( listeners ) { int size = listeners.size(); if( size > 0 ) { Object[] obj= getSelectedObjects(); ItemEvent e = new ItemEvent( this, ItemEvent.ITEM_STATE_CHANGED, ((obj != null) && (obj.length > 0)) ? obj : null, ItemEvent.SELECTED ); for( int i = 0; i < size; i++ ) { listeners.elementAt( i ).itemStateChanged( e ); } } } } // public void removeAll() // { // int pos = virtualIndex; // super.removeAll(); // virtualIndex = pos; //System.out.println( "removedAll "+virtualIndex ); // } // public void remove( int pos ) // { // int pos2 = virtualIndex; // super.remove( pos ); // virtualIndex = pos2; //System.out.println( "removed; "+virtualIndex ); // } public void addSpecialItemListener( ItemListener l ) { synchronized( listeners ) { listeners.addElement( l ); } } public void removeSpecialItemListener( ItemListener l ) { synchronized( listeners ) { listeners.removeElement( l ); } } }