001: package org.gui4j.core.swing;
002:
003: import java.awt.Component;
004: import java.awt.EventQueue;
005: import java.awt.event.FocusEvent;
006: import java.util.Map;
007:
008: import javax.swing.CellEditor;
009: import javax.swing.DefaultCellEditor;
010: import javax.swing.JCheckBox;
011: import javax.swing.JTable;
012: import javax.swing.table.AbstractTableModel;
013: import javax.swing.table.TableCellEditor;
014: import javax.swing.table.TableCellRenderer;
015: import javax.swing.table.TableColumn;
016: import javax.swing.table.TableModel;
017:
018: import org.gui4j.Gui4jCallBase;
019: import org.gui4j.Gui4jGetValue;
020: import org.gui4j.core.Gui4jComponentInstance;
021:
022: public class Gui4jJTable extends JTable {
023: private final Gui4jTableListener mGui4jTableListener;
024: private final Gui4jGetValue mAutomaticRefresh;
025:
026: /**
027: * Constructor for Gui4jJTable.
028: *
029: * @param dm
030: * @param gui4jTableListener
031: */
032: public Gui4jJTable(TableModel dm,
033: Gui4jTableListener gui4jTableListener) {
034: super (dm);
035: mGui4jTableListener = gui4jTableListener;
036: mAutomaticRefresh = new Gui4jGetValue() {
037: public Object getValue(Gui4jCallBase gui4jController,
038: Map paramMap, Object defaultValue) {
039: TableModel tableModel = getModel();
040: if (tableModel instanceof AbstractTableModel) {
041: // follow Swing's single thread rule when updating components
042: final AbstractTableModel abstractTableModel = (AbstractTableModel) tableModel;
043: EventQueue.invokeLater(new Runnable() {
044: public void run() {
045: abstractTableModel.fireTableDataChanged();
046: }
047: });
048: }
049: return null;
050: }
051:
052: public Object getValueNoErrorChecking(
053: Gui4jCallBase gui4jController, Map paramMap,
054: Gui4jComponentInstance componentInstance) {
055: return getValue(gui4jController, paramMap, null);
056: }
057:
058: public String toString() {
059: return AbstractTableModel.class.getName()
060: + ".fireTableDataChanged()";
061: }
062:
063: };
064: }
065:
066: public Gui4jGetValue getAutomaticRefreshAction() {
067: return mAutomaticRefresh;
068: }
069:
070: protected void processFocusEvent(FocusEvent e) {
071: boolean ok = e.getID() == FocusEvent.FOCUS_LOST
072: && cellEditor != null;
073: Component c = e.getOppositeComponent();
074: if (ok && c instanceof Gui4jCellEditor.CellEditorTextField) {
075: Gui4jCellEditor.CellEditorTextField textField = (Gui4jCellEditor.CellEditorTextField) c;
076: ok = textField.getCellEditor() != getCellEditor();
077: }
078: if (ok && c instanceof ComboBoxHorizontalScroll) {
079: ComboBoxHorizontalScroll comboBoxHorizontalScroll = (ComboBoxHorizontalScroll) c;
080: ok = comboBoxHorizontalScroll.getCellEditor() != getCellEditor();
081: }
082: if (ok && c instanceof JCheckBox) {
083: CellEditor lCellEditor = getDefaultEditor(Boolean.class);
084: if (lCellEditor instanceof DefaultCellEditor) {
085: DefaultCellEditor defaultCellEditor = (DefaultCellEditor) lCellEditor;
086: ok = defaultCellEditor.getComponent() != c;
087: }
088: }
089: if (ok) {
090: cellEditor.stopCellEditing();
091: }
092: super .processFocusEvent(e);
093: }
094:
095: public void endCellEditing() {
096: TableCellEditor lCellEditor = getCellEditor();
097: if (lCellEditor != null) {
098: lCellEditor.stopCellEditing();
099: }
100: }
101:
102: /**
103: * @see javax.swing.JTable#getCellEditor(int, int)
104: */
105: public TableCellEditor getCellEditor(int row, int column) {
106: TableColumn tableColumn = getColumnModel().getColumn(column);
107: TableCellEditor editor = tableColumn.getCellEditor();
108: if (editor == null) {
109: Class c = getColumnClass(column);
110: if (c.equals(Object.class)) {
111: Object o = getValueAt(row, column);
112: if (o != null) {
113: c = getValueAt(row, column).getClass();
114: }
115: }
116: editor = getDefaultEditor(c);
117: }
118: return mGui4jTableListener.getCellEditor(editor, row, column);
119: }
120:
121: /*
122: * (non-Javadoc comment)
123: *
124: * @see javax.swing.JTable#getCellRenderer(int, int)
125: */
126: public TableCellRenderer getCellRenderer(int row, int column) {
127: TableColumn tableColumn = getColumnModel().getColumn(column);
128: TableCellRenderer renderer = tableColumn.getCellRenderer();
129: if (renderer == null) {
130: Class c = getColumnClass(column);
131: if (c.equals(Object.class)) {
132: Object o = getValueAt(row, column);
133: if (o != null) {
134: c = o.getClass();
135: }
136: }
137: renderer = getDefaultRenderer(c);
138: }
139: return mGui4jTableListener.getCellRenderer(renderer, row,
140: column);
141: }
142:
143: /**
144: * @see javax.swing.JTable#prepareEditor(TableCellEditor, int, int)
145: */
146: public Component prepareEditor(TableCellEditor editor, int row,
147: int column) {
148: Component component = super.prepareEditor(editor, row, column);
149: mGui4jTableListener.prepareEditor(editor, row, column);
150: return component;
151: }
152:
153: }
|