# HG changeset patch # User Matthias Bläsing # Date 1362834565 -3600 # Branch dataview-rework-2 # Node ID c5b0d24b38cb44bfbb481efe0773f1082ad48282 # Parent 82fa335219e5372fce61ad3b8aa689337add96cd NumberFieldEditor should return Numbers,not strings: - Check inputted value with Verifier - Convert string value to "real" value before returning diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/NumberFieldEditor.java b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/NumberFieldEditor.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/NumberFieldEditor.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/NumberFieldEditor.java @@ -42,25 +42,104 @@ package org.netbeans.modules.db.dataview.table.celleditor; import java.awt.Component; +import java.lang.ref.WeakReference; import javax.swing.BorderFactory; +import javax.swing.InputVerifier; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.JTextField; +import javax.swing.table.TableModel; +import javax.swing.text.JTextComponent; +import org.netbeans.modules.db.dataview.meta.DBColumn; +import org.netbeans.modules.db.dataview.meta.DBException; import org.netbeans.modules.db.dataview.table.ResultSetTableCellEditor; +import org.netbeans.modules.db.dataview.table.ResultSetTableModel; +import org.netbeans.modules.db.dataview.util.DBReadWriteHelper; +import org.openide.util.Exceptions; public class NumberFieldEditor extends ResultSetTableCellEditor { + private final JTextField textField; + private DBColumn dbColumn; + private Object oldValue; + private InputVerifier verifier = new InputVerifier() { + @Override + public boolean verify(JComponent input) { + if(dbColumn != null && input instanceof JTextComponent) { + String inputText = ((JTextComponent) input).getText(); + try { + DBReadWriteHelper.validate(inputText, dbColumn); + } catch (DBException ex) { + return false; + } + return true; + } else { + return true; + } + } + }; + public NumberFieldEditor(final JTextField textField) { super(textField); + this.textField = textField; ((JTextField) getComponent()).setHorizontalAlignment(JTextField.RIGHT); } @Override public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, int row, int column) { + oldValue = value; + int modelColumn = table.convertColumnIndexToModel(column); + TableModel tm = table.getModel(); + dbColumn = null; + if(tm instanceof ResultSetTableModel) { + textField.setInputVerifier(verifier); + dbColumn = ((ResultSetTableModel) tm).getColumn(modelColumn); + } else { + textField.setInputVerifier(null); + } Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column); if (suppressEditorBorder && c instanceof JComponent) { ((JComponent) c).setBorder(BorderFactory.createEmptyBorder()); } return c; } + + /** + * Override getCellEditorValue to build + */ + @Override + public Object getCellEditorValue() { + try { + Object superVal = super.getCellEditorValue(); + if (dbColumn != null) { + try { + return DBReadWriteHelper.validate(superVal, dbColumn); + } catch (DBException ex) { + Exceptions.printStackTrace(ex); + return oldValue; } + } else { + return superVal; + } + } finally { + oldValue = null; + } + } + + @Override + public boolean stopCellEditing() { + try { + Object value = super.getCellEditorValue(); + DBReadWriteHelper.validate(value, dbColumn); + return super.stopCellEditing(); + } catch (DBException ex) { + return false; + } + } + + @Override + public void cancelCellEditing() { + oldValue = null; + super.cancelCellEditing(); + } +}