--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/DefaultCellEditor.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,378 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package javax.swing;
+
+import java.awt.Component;
+import java.awt.event.*;
+import java.beans.ConstructorProperties;
+import java.lang.Boolean;
+import javax.swing.table.*;
+import javax.swing.event.*;
+import java.util.EventObject;
+import javax.swing.tree.*;
+import java.io.Serializable;
+
+/**
+ * The default editor for table and tree cells.
+ * <p>
+ * <strong>Warning:</strong>
+ * Serialized objects of this class will not be compatible with
+ * future Swing releases. The current serialization support is
+ * appropriate for short term storage or RMI between applications running
+ * the same version of Swing. As of 1.4, support for long term storage
+ * of all JavaBeans<sup><font size="-2">TM</font></sup>
+ * has been added to the <code>java.beans</code> package.
+ * Please see {@link java.beans.XMLEncoder}.
+ *
+ * @author Alan Chung
+ * @author Philip Milne
+ */
+
+public class DefaultCellEditor extends AbstractCellEditor
+ implements TableCellEditor, TreeCellEditor {
+
+//
+// Instance Variables
+//
+
+ /** The Swing component being edited. */
+ protected JComponent editorComponent;
+ /**
+ * The delegate class which handles all methods sent from the
+ * <code>CellEditor</code>.
+ */
+ protected EditorDelegate delegate;
+ /**
+ * An integer specifying the number of clicks needed to start editing.
+ * Even if <code>clickCountToStart</code> is defined as zero, it
+ * will not initiate until a click occurs.
+ */
+ protected int clickCountToStart = 1;
+
+//
+// Constructors
+//
+
+ /**
+ * Constructs a <code>DefaultCellEditor</code> that uses a text field.
+ *
+ * @param textField a <code>JTextField</code> object
+ */
+ @ConstructorProperties({"component"})
+ public DefaultCellEditor(final JTextField textField) {
+ editorComponent = textField;
+ this.clickCountToStart = 2;
+ delegate = new EditorDelegate() {
+ public void setValue(Object value) {
+ textField.setText((value != null) ? value.toString() : "");
+ }
+
+ public Object getCellEditorValue() {
+ return textField.getText();
+ }
+ };
+ textField.addActionListener(delegate);
+ }
+
+ /**
+ * Constructs a <code>DefaultCellEditor</code> object that uses a check box.
+ *
+ * @param checkBox a <code>JCheckBox</code> object
+ */
+ public DefaultCellEditor(final JCheckBox checkBox) {
+ editorComponent = checkBox;
+ delegate = new EditorDelegate() {
+ public void setValue(Object value) {
+ boolean selected = false;
+ if (value instanceof Boolean) {
+ selected = ((Boolean)value).booleanValue();
+ }
+ else if (value instanceof String) {
+ selected = value.equals("true");
+ }
+ checkBox.setSelected(selected);
+ }
+
+ public Object getCellEditorValue() {
+ return Boolean.valueOf(checkBox.isSelected());
+ }
+ };
+ checkBox.addActionListener(delegate);
+ checkBox.setRequestFocusEnabled(false);
+ }
+
+ /**
+ * Constructs a <code>DefaultCellEditor</code> object that uses a
+ * combo box.
+ *
+ * @param comboBox a <code>JComboBox</code> object
+ */
+ public DefaultCellEditor(final JComboBox comboBox) {
+ editorComponent = comboBox;
+ comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
+ delegate = new EditorDelegate() {
+ public void setValue(Object value) {
+ comboBox.setSelectedItem(value);
+ }
+
+ public Object getCellEditorValue() {
+ return comboBox.getSelectedItem();
+ }
+
+ public boolean shouldSelectCell(EventObject anEvent) {
+ if (anEvent instanceof MouseEvent) {
+ MouseEvent e = (MouseEvent)anEvent;
+ return e.getID() != MouseEvent.MOUSE_DRAGGED;
+ }
+ return true;
+ }
+ public boolean stopCellEditing() {
+ if (comboBox.isEditable()) {
+ // Commit edited value.
+ comboBox.actionPerformed(new ActionEvent(
+ DefaultCellEditor.this, 0, ""));
+ }
+ return super.stopCellEditing();
+ }
+ };
+ comboBox.addActionListener(delegate);
+ }
+
+ /**
+ * Returns a reference to the editor component.
+ *
+ * @return the editor <code>Component</code>
+ */
+ public Component getComponent() {
+ return editorComponent;
+ }
+
+//
+// Modifying
+//
+
+ /**
+ * Specifies the number of clicks needed to start editing.
+ *
+ * @param count an int specifying the number of clicks needed to start editing
+ * @see #getClickCountToStart
+ */
+ public void setClickCountToStart(int count) {
+ clickCountToStart = count;
+ }
+
+ /**
+ * Returns the number of clicks needed to start editing.
+ * @return the number of clicks needed to start editing
+ */
+ public int getClickCountToStart() {
+ return clickCountToStart;
+ }
+
+//
+// Override the implementations of the superclass, forwarding all methods
+// from the CellEditor interface to our delegate.
+//
+
+ /**
+ * Forwards the message from the <code>CellEditor</code> to
+ * the <code>delegate</code>.
+ * @see EditorDelegate#getCellEditorValue
+ */
+ public Object getCellEditorValue() {
+ return delegate.getCellEditorValue();
+ }
+
+ /**
+ * Forwards the message from the <code>CellEditor</code> to
+ * the <code>delegate</code>.
+ * @see EditorDelegate#isCellEditable(EventObject)
+ */
+ public boolean isCellEditable(EventObject anEvent) {
+ return delegate.isCellEditable(anEvent);
+ }
+
+ /**
+ * Forwards the message from the <code>CellEditor</code> to
+ * the <code>delegate</code>.
+ * @see EditorDelegate#shouldSelectCell(EventObject)
+ */
+ public boolean shouldSelectCell(EventObject anEvent) {
+ return delegate.shouldSelectCell(anEvent);
+ }
+
+ /**
+ * Forwards the message from the <code>CellEditor</code> to
+ * the <code>delegate</code>.
+ * @see EditorDelegate#stopCellEditing
+ */
+ public boolean stopCellEditing() {
+ return delegate.stopCellEditing();
+ }
+
+ /**
+ * Forwards the message from the <code>CellEditor</code> to
+ * the <code>delegate</code>.
+ * @see EditorDelegate#cancelCellEditing
+ */
+ public void cancelCellEditing() {
+ delegate.cancelCellEditing();
+ }
+
+//
+// Implementing the TreeCellEditor Interface
+//
+
+ /** Implements the <code>TreeCellEditor</code> interface. */
+ public Component getTreeCellEditorComponent(JTree tree, Object value,
+ boolean isSelected,
+ boolean expanded,
+ boolean leaf, int row) {
+ String stringValue = tree.convertValueToText(value, isSelected,
+ expanded, leaf, row, false);
+
+ delegate.setValue(stringValue);
+ return editorComponent;
+ }
+
+//
+// Implementing the CellEditor Interface
+//
+ /** Implements the <code>TableCellEditor</code> interface. */
+ public Component getTableCellEditorComponent(JTable table, Object value,
+ boolean isSelected,
+ int row, int column) {
+ delegate.setValue(value);
+ return editorComponent;
+ }
+
+
+//
+// Protected EditorDelegate class
+//
+
+ /**
+ * The protected <code>EditorDelegate</code> class.
+ */
+ protected class EditorDelegate implements ActionListener, ItemListener, Serializable {
+
+ /** The value of this cell. */
+ protected Object value;
+
+ /**
+ * Returns the value of this cell.
+ * @return the value of this cell
+ */
+ public Object getCellEditorValue() {
+ return value;
+ }
+
+ /**
+ * Sets the value of this cell.
+ * @param value the new value of this cell
+ */
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+ /**
+ * Returns true if <code>anEvent</code> is <b>not</b> a
+ * <code>MouseEvent</code>. Otherwise, it returns true
+ * if the necessary number of clicks have occurred, and
+ * returns false otherwise.
+ *
+ * @param anEvent the event
+ * @return true if cell is ready for editing, false otherwise
+ * @see #setClickCountToStart
+ * @see #shouldSelectCell
+ */
+ public boolean isCellEditable(EventObject anEvent) {
+ if (anEvent instanceof MouseEvent) {
+ return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
+ }
+ return true;
+ }
+
+ /**
+ * Returns true to indicate that the editing cell may
+ * be selected.
+ *
+ * @param anEvent the event
+ * @return true
+ * @see #isCellEditable
+ */
+ public boolean shouldSelectCell(EventObject anEvent) {
+ return true;
+ }
+
+ /**
+ * Returns true to indicate that editing has begun.
+ *
+ * @param anEvent the event
+ */
+ public boolean startCellEditing(EventObject anEvent) {
+ return true;
+ }
+
+ /**
+ * Stops editing and
+ * returns true to indicate that editing has stopped.
+ * This method calls <code>fireEditingStopped</code>.
+ *
+ * @return true
+ */
+ public boolean stopCellEditing() {
+ fireEditingStopped();
+ return true;
+ }
+
+ /**
+ * Cancels editing. This method calls <code>fireEditingCanceled</code>.
+ */
+ public void cancelCellEditing() {
+ fireEditingCanceled();
+ }
+
+ /**
+ * When an action is performed, editing is ended.
+ * @param e the action event
+ * @see #stopCellEditing
+ */
+ public void actionPerformed(ActionEvent e) {
+ DefaultCellEditor.this.stopCellEditing();
+ }
+
+ /**
+ * When an item's state changes, editing is ended.
+ * @param e the action event
+ * @see #stopCellEditing
+ */
+ public void itemStateChanged(ItemEvent e) {
+ DefaultCellEditor.this.stopCellEditing();
+ }
+ }
+
+} // End of class JCellEditor