1. /*
  2. * @(#)AbstractSpinnerModel.java 1.5 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing;
  8. import java.util.*;
  9. import javax.swing.event.*;
  10. /**
  11. * This class provides the ChangeListener part of the
  12. * SpinnerModel interface that should be suitable for most concrete SpinnerModel
  13. * implementations. Subclasses must provide an implementation of the
  14. * minimum, maximum, and value properties and the getNextValue
  15. * and getPreviousValue methods.
  16. *
  17. * @see JSpinner
  18. * @see SpinnerModel
  19. * @see SpinnerListModel
  20. * @see SpinnerNumberModel
  21. * @see SpinnerDateModel
  22. *
  23. * @version 1.5 01/23/03
  24. * @author Hans Muller
  25. * @since 1.4
  26. */
  27. public abstract class AbstractSpinnerModel implements SpinnerModel
  28. {
  29. /**
  30. * Only one ChangeEvent is needed per model instance since the
  31. * event's only (read-only) state is the source property. The source
  32. * of events generated here is always "this".
  33. */
  34. private transient ChangeEvent changeEvent = null;
  35. /**
  36. * The list of ChangeListeners for this model. Subclasses may
  37. * store their own listeners here.
  38. */
  39. protected EventListenerList listenerList = new EventListenerList();
  40. /**
  41. * Adds a ChangeListener to the model's listener list. The
  42. * ChangeListeners must be notified when the models value changes.
  43. *
  44. * @param l the ChangeListener to add
  45. * @see #removeChangeListener
  46. * @see SpinnerModel#addChangeListener
  47. */
  48. public void addChangeListener(ChangeListener l) {
  49. listenerList.add(ChangeListener.class, l);
  50. }
  51. /**
  52. * Removes a ChangeListener from the model's listener list.
  53. *
  54. * @param l the ChangeListener to remove
  55. * @see #addChangeListener
  56. * @see SpinnerModel#removeChangeListener
  57. */
  58. public void removeChangeListener(ChangeListener l) {
  59. listenerList.remove(ChangeListener.class, l);
  60. }
  61. /**
  62. * Returns an array of all the <code>ChangeListener</code>s added
  63. * to this AbstractSpinnerModel with addChangeListener().
  64. *
  65. * @return all of the <code>ChangeListener</code>s added or an empty
  66. * array if no listeners have been added
  67. * @since 1.4
  68. */
  69. public ChangeListener[] getChangeListeners() {
  70. return (ChangeListener[])listenerList.getListeners(
  71. ChangeListener.class);
  72. }
  73. /**
  74. * Run each ChangeListeners stateChanged() method.
  75. *
  76. * @see #setValue
  77. * @see EventListenerList
  78. */
  79. protected void fireStateChanged()
  80. {
  81. Object[] listeners = listenerList.getListenerList();
  82. for (int i = listeners.length - 2; i >= 0; i -=2 ) {
  83. if (listeners[i] == ChangeListener.class) {
  84. if (changeEvent == null) {
  85. changeEvent = new ChangeEvent(this);
  86. }
  87. ((ChangeListener)listeners[i+1]).stateChanged(changeEvent);
  88. }
  89. }
  90. }
  91. /**
  92. * Return an array of all the listeners of the given type that
  93. * were added to this model. For example to find all of the
  94. * ChangeListeners added to this model:
  95. * <pre>
  96. * myAbstractSpinnerModel.getListeners(ChangeListener.class);
  97. * </pre>
  98. *
  99. * @param listenerType the type of listeners to return, e.g. ChangeListener.class
  100. * @return all of the objects receiving <em>listenerType</em> notifications
  101. * from this model
  102. */
  103. public EventListener[] getListeners(Class listenerType) {
  104. return listenerList.getListeners(listenerType);
  105. }
  106. }