1 /*
   2  * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javax.swing;
  27 
  28 import javax.swing.event.*;
  29 import java.util.EventObject;
  30 import java.io.Serializable;
  31 
  32 /**
  33  *
  34  * A base class for <code>CellEditors</code>, providing default
  35  * implementations for the methods in the <code>CellEditor</code>
  36  * interface except <code>getCellEditorValue()</code>.
  37  * Like the other abstract implementations in Swing, also manages a list
  38  * of listeners.
  39  *
  40  * <p>
  41  * <strong>Warning:</strong>
  42  * Serialized objects of this class will not be compatible with
  43  * future Swing releases. The current serialization support is
  44  * appropriate for short term storage or RMI between applications running
  45  * the same version of Swing.  As of 1.4, support for long term storage
  46  * of all JavaBeans&trade;
  47  * has been added to the <code>java.beans</code> package.
  48  * Please see {@link java.beans.XMLEncoder}.
  49  *
  50  * @author Philip Milne
  51  * @since 1.3
  52  */
  53 @SuppressWarnings("serial") // Same-version serialization only
  54 public abstract class AbstractCellEditor implements CellEditor, Serializable {
  55 
  56     /**
  57      * The list of listeners.
  58      */
  59     protected EventListenerList listenerList = new EventListenerList();
  60     /**
  61      * The change event.
  62      */
  63     protected transient ChangeEvent changeEvent = null;
  64 
  65     // Force this to be implemented.
  66     // public Object  getCellEditorValue()
  67 
  68     /**
  69      * Returns true.
  70      * @param e  an event object
  71      * @return true
  72      */
  73     public boolean isCellEditable(EventObject e) {
  74         return true;
  75     }
  76 
  77     /**
  78      * Returns true.
  79      * @param anEvent  an event object
  80      * @return true
  81      */
  82     public boolean shouldSelectCell(EventObject anEvent) {
  83         return true;
  84     }
  85 
  86     /**
  87      * Calls <code>fireEditingStopped</code> and returns true.
  88      * @return true
  89      */
  90     public boolean stopCellEditing() {
  91         fireEditingStopped();
  92         return true;
  93     }
  94 
  95     /**
  96      * Calls <code>fireEditingCanceled</code>.
  97      */
  98     public void  cancelCellEditing() {
  99         fireEditingCanceled();
 100     }
 101 
 102     /**
 103      * Adds a <code>CellEditorListener</code> to the listener list.
 104      * @param l  the new listener to be added
 105      */
 106     public void addCellEditorListener(CellEditorListener l) {
 107         listenerList.add(CellEditorListener.class, l);
 108     }
 109 
 110     /**
 111      * Removes a <code>CellEditorListener</code> from the listener list.
 112      * @param l  the listener to be removed
 113      */
 114     public void removeCellEditorListener(CellEditorListener l) {
 115         listenerList.remove(CellEditorListener.class, l);
 116     }
 117 
 118     /**
 119      * Returns an array of all the <code>CellEditorListener</code>s added
 120      * to this AbstractCellEditor with addCellEditorListener().
 121      *
 122      * @return all of the <code>CellEditorListener</code>s added or an empty
 123      *         array if no listeners have been added
 124      * @since 1.4
 125      */
 126     public CellEditorListener[] getCellEditorListeners() {
 127         return listenerList.getListeners(CellEditorListener.class);
 128     }
 129 
 130     /**
 131      * Notifies all listeners that have registered interest for
 132      * notification on this event type.  The event instance
 133      * is created lazily.
 134      *
 135      * @see EventListenerList
 136      */
 137     protected void fireEditingStopped() {
 138         // Guaranteed to return a non-null array
 139         Object[] listeners = listenerList.getListenerList();
 140         // Process the listeners last to first, notifying
 141         // those that are interested in this event
 142         for (int i = listeners.length-2; i>=0; i-=2) {
 143             if (listeners[i]==CellEditorListener.class) {
 144                 // Lazily create the event:
 145                 if (changeEvent == null)
 146                     changeEvent = new ChangeEvent(this);
 147                 ((CellEditorListener)listeners[i+1]).editingStopped(changeEvent);
 148             }
 149         }
 150     }
 151 
 152     /**
 153      * Notifies all listeners that have registered interest for
 154      * notification on this event type.  The event instance
 155      * is created lazily.
 156      *
 157      * @see EventListenerList
 158      */
 159     protected void fireEditingCanceled() {
 160         // Guaranteed to return a non-null array
 161         Object[] listeners = listenerList.getListenerList();
 162         // Process the listeners last to first, notifying
 163         // those that are interested in this event
 164         for (int i = listeners.length-2; i>=0; i-=2) {
 165             if (listeners[i]==CellEditorListener.class) {
 166                 // Lazily create the event:
 167                 if (changeEvent == null)
 168                     changeEvent = new ChangeEvent(this);
 169                 ((CellEditorListener)listeners[i+1]).editingCanceled(changeEvent);
 170             }
 171         }
 172     }
 173 }