package org.hwo.ui; import java.awt.Container; import java.awt.Rectangle; import java.util.LinkedList; import java.util.List; import javax.swing.JTextField; import org.hwo.ui.treetable.TreeTable; public class DefaultCellEditor implements CellEditor { private List editorListeners; private JTextField textField; private TreeTable treeTable; private Object value; public DefaultCellEditor() { editorListeners = new LinkedList(); } @Override public void addCellEditorListener(CellEditorListener listener) { editorListeners.add(listener); } @Override public void removeCellEditorListener(CellEditorListener listener) { editorListeners.remove(listener); } private void fireEditBegin() { CellEditorArgs args = new CellEditorArgs(this, value, treeTable); for (CellEditorListener listener: editorListeners) listener.editBegin(args); } private void fireEditFinish() { CellEditorArgs args = new CellEditorArgs(this, value, treeTable); for (CellEditorListener listener: editorListeners) listener.editFinished(args); } private void fireEditCancel() { CellEditorArgs args = new CellEditorArgs(this, value, treeTable); for (CellEditorListener listener: editorListeners) listener.editCanceled(args); } private void destroyTextField() { textField.setVisible(false); Container parent = textField.getParent(); parent.remove(textField); textField = null; } @Override public boolean editBegin(TreeTable treeTable, Rectangle rect, Object value) { if (textField != null) editCancel(); this.treeTable = treeTable; this.value = value; this.textField = new JTextField(); treeTable.add(textField); textField.setBounds(rect); textField.requestFocusInWindow(); textField.repaint(); fireEditBegin(); return true; } @Override public void editCancel() { if (textField != null) { destroyTextField(); fireEditCancel(); } } @Override public void editFinish() { if (this.textField != null) { this.value = this.textField.getText(); destroyTextField(); fireEditFinish(); } } }