package com.limegroup.gnutella.gui.library;
import javax.swing.table.TableCellEditor;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.event.*;
import com.limegroup.gnutella.gui.tables.LimeJTable;
import com.limegroup.gnutella.gui.LimeTextField;
import java.util.EventObject;
import java.awt.event.*;
import java.awt.Component;
/**
* An editor for a table cell in the library.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
final class LibraryTableCellEditor implements TableCellEditor {
private JTextField _textField;
private LibraryTableMediator _libraryTable;
private CellEditorListener _cellEditorListener;
/**
* An event to use when signalling that the editing was
* programatically started.
*/
static final EventObject EVENT = new EventObject(new Object());
/**
* Constructs a new <tt>LibraryTableCellEditor</tt> instance.
*
* @param libraryTable a reference to the <tt>LibraryTable</tt> instance
* that this is a cell editor for
*/
LibraryTableCellEditor(LibraryTableMediator libraryTable) {
_libraryTable = libraryTable;
}
/**
* returns the Object value (a String) of the text field
* cell editor.
* implements javax.swing.CellEditor.
*/
public Object getCellEditorValue() {
String newName = _textField.getText();
return _libraryTable.handleNameChange(newName);
}
/**
* returns a value determining whether or not the
* cell is editable.
* implements javax.swing.CellEditor.
*
* @param anEvent An <code>EventObject</code> instance containing
* information about the event
*
* @return <code>true</code> if the event is a mouse event, the mouse has
* been clicked once, and the cell is editable
*/
public boolean isCellEditable(EventObject event) {
if (event instanceof MouseEvent) {
MouseEvent me = (MouseEvent)event;
LimeJTable table = (LimeJTable)_libraryTable.getTable();
return me.getClickCount() == 1 && table.isPointSelected(me.getPoint());
} else {
return event == EVENT;
}
}
/**
* returns a boolean determining whether or not the
* cell should be selected.
* implements javax.swing.CellEditor.
*
* @param anEvent An <code>EventObject</code> instance containing
* information about the event
*
* @return Always returns <code>true</code>, as in this case the cell
* should always be selectable
*/
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
/**
* stops cell editing and returns a boolean indicating
* that the editing has stopped.
* implements javax.swing.CellEditor.
*
* @return Always returns <code>true</code>, as in this case cell editing
* should always be stopped
*/
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
/**
* cancels the editing of the current cell.
* implements javax.swing.CellEditor.
*/
public void cancelCellEditing() {
fireEditingCanceled();
}
/**
* Sets the CellEditorListener to be the passed in listener.
* implements javax.swing.CellEditor.
*
* @param listener The <code>CellEditorListener</code> to set as this
* instance's listener.
*/
public void addCellEditorListener(CellEditorListener listener) {
_cellEditorListener = listener;
}
/**
* sets the CellEditorListener to null.
* implements javax.swing.CellEditor.
*
* @param listener Not used at all in this implementation of CellEditor
*/
public void removeCellEditorListener(CellEditorListener listener) {
_cellEditorListener = null;
}
/**
* notify all listeners that have registered interest for
* notification on this event type. The event instance
* is lazily created using the parameters passed into
* the fire method.
*/
void fireEditingStopped() {
if(_cellEditorListener != null)
_cellEditorListener.editingStopped(new ChangeEvent(this));
}
/**
* notify all listeners that have registered interest for
* notification on this event type. The event instance
* is lazily created using the parameters passed into
* the fire method.
*/
void fireEditingCanceled() {
if(_cellEditorListener != null)
_cellEditorListener.editingCanceled(new ChangeEvent(this));
}
/**
* method implementing the TableCellEditor interface that
* returns the text field editing component.
*/
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
JTextField field = new LimeTextField();
field.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
field.setText(value != null ? value.toString() : "");
field.selectAll();
field.setCaretPosition(0);
field.requestFocus();
_textField = field;
return field;
}
}