1 /*
   2  * Copyright (c) 1999, 2006, 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<sup><font size="-2">TM</font></sup>
  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 
  54 public abstract class AbstractCellEditor implements CellEditor, Serializable {
  55 
  56     protected EventListenerList listenerList = new EventListenerList();
  57     transient protected ChangeEvent changeEvent = null;
  58 
  59     // Force this to be implemented.
  60     // public Object  getCellEditorValue()
  61 
  62     /**
  63      * Returns true.
  64      * @param e  an event object
  65      * @return true
  66      */
  67     public boolean isCellEditable(EventObject e) {
  68         return true;
  69     }
  70 
  71     /**
  72      * Returns true.
  73      * @param anEvent  an event object
  74      * @return true
  75      */
  76     public boolean shouldSelectCell(EventObject anEvent) {
  77         return true;
  78     }
  79 
  80     /**
  81      * Calls <code>fireEditingStopped</code> and returns true.
  82      * @return true
  83      */
  84     public boolean stopCellEditing() {
  85         fireEditingStopped();
  86         return true;
  87     }
  88 
  89     /**
  90      * Calls <code>fireEditingCanceled</code>.
  91      */
  92     public void  cancelCellEditing() {
  93         fireEditingCanceled();
  94     }
  95 
  96     /**
  97      * Adds a <code>CellEditorListener</code> to the listener list.
  98      * @param l  the new listener to be added
  99      */
 100     public void addCellEditorListener(CellEditorListener l) {
 101         listenerList.add(CellEditorListener.class, l);
 102     }
 103 
 104     /**
 105      * Removes a <code>CellEditorListener</code> from the listener list.
 106      * @param l  the listener to be removed
 107      */
 108     public void removeCellEditorListener(CellEditorListener l) {
 109         listenerList.remove(CellEditorListener.class, l);
 110     }
 111 
 112     /**
 113      * Returns an array of all the <code>CellEditorListener</code>s added
 114      * to this AbstractCellEditor with addCellEditorListener().
 115      *
 116      * @return all of the <code>CellEditorListener</code>s added or an empty
 117      *         array if no listeners have been added
 118      * @since 1.4
 119      */
 120     public CellEditorListener[] getCellEditorListeners() {
 121         return (CellEditorListener[])listenerList.getListeners(
 122                 CellEditorListener.class);
 123     }
 124 
 125     /**
 126      * Notifies all listeners that have registered interest for
 127      * notification on this event type.  The event instance
 128      * is created lazily.
 129      *
 130      * @see EventListenerList
 131      */
 132     protected void fireEditingStopped() {
 133         // Guaranteed to return a non-null array
 134         Object[] listeners = listenerList.getListenerList();
 135         // Process the listeners last to first, notifying
 136         // those that are interested in this event
 137         for (int i = listeners.length-2; i>=0; i-=2) {
 138             if (listeners[i]==CellEditorListener.class) {
 139                 // Lazily create the event:
 140                 if (changeEvent == null)
 141                     changeEvent = new ChangeEvent(this);
 142                 ((CellEditorListener)listeners[i+1]).editingStopped(changeEvent);
 143             }
 144         }
 145     }
 146 
 147     /**
 148      * Notifies all listeners that have registered interest for
 149      * notification on this event type.  The event instance
 150      * is created lazily.
 151      *
 152      * @see EventListenerList
 153      */
 154     protected void fireEditingCanceled() {
 155         // Guaranteed to return a non-null array
 156         Object[] listeners = listenerList.getListenerList();
 157         // Process the listeners last to first, notifying
 158         // those that are interested in this event
 159         for (int i = listeners.length-2; i>=0; i-=2) {
 160             if (listeners[i]==CellEditorListener.class) {
 161                 // Lazily create the event:
 162                 if (changeEvent == null)
 163                     changeEvent = new ChangeEvent(this);
 164                 ((CellEditorListener)listeners[i+1]).editingCanceled(changeEvent);
 165             }
 166         }
 167     }
 168 }