1
2
3
4
5
6 package net.kwfgrid.gwui.gui;
7
8 import net.kwfgrid.gworkflowdl.structure.Owls;
9
10 import java.awt.*;
11 import java.awt.event.*;
12 import javax.swing.*;
13 import javax.swing.event.TableModelListener;
14 import javax.swing.event.TableModelEvent;
15 import javax.swing.table.*;
16
17 /***
18 A model and toolkit for a JTable for displaying and simple editing a set of rows.
19 */
20 public class SimpleEditTableModel implements TableModel {
21 public interface Controller {
22 /***
23 Notify the controller that the user has added a row to the table.
24 */
25 void rowAdded(Object[] row);
26 /***
27 */
28 void rowsDeleted(int[] rows);
29 }
30
31 private class DeleteKeyHandler extends KeyAdapter {
32 boolean _deleteontyped;
33 JTable _table;
34
35 public DeleteKeyHandler(JTable table) {
36 _table = table;
37 _deleteontyped = false;
38 }
39
40 public void keyPressed(KeyEvent e) {
41 _deleteontyped = (e.getKeyCode() == KeyEvent.VK_BACK_SPACE ||
42 e.getKeyCode() == KeyEvent.VK_DELETE);
43 }
44
45 public void keyTyped(KeyEvent e) {
46 if (_deleteontyped) {
47 int[] selection = _table.getSelectedRows();
48 int[] deletion = new int[selection.length - 1];
49 boolean usedeletion = false;
50 int j = 0;
51 for (int i=0; i<selection.length; i++) {
52 if (j == deletion.length && !usedeletion) {
53 usedeletion = (selection[i] == _table.getRowCount()-1);
54 break;
55 } else if (j == deletion.length) {
56 break;
57 } else if (selection[i] != _table.getRowCount() - 1) {
58 deletion[j] = selection[i];
59 j++;
60 } else {
61 usedeletion = true;
62 }
63 }
64 _controller.rowsDeleted(usedeletion?deletion:selection);
65 }
66 }
67 }
68
69 private static TableCellRenderer STRING_CELL_RENDERER = new DefaultTableCellRenderer() {
70 private Font _defaultfont = null;
71 private Font _italicfont = null;
72
73 public Component getTableCellRendererComponent(JTable table,
74 Object value,
75 boolean selected,
76 boolean focus,
77 int row,
78 int col) {
79 JLabel comp = (JLabel)super.getTableCellRendererComponent(table, value, selected, focus, row, col);
80
81 if (_defaultfont == null) {
82 _defaultfont = comp.getFont();
83 _italicfont = _defaultfont.deriveFont(Font.ITALIC);
84 }
85
86 if (row == table.getRowCount()-1) {
87 comp.setFont(_italicfont);
88 } else {
89 comp.setFont(_defaultfont);
90 }
91 return comp;
92 }
93 };
94
95 private static TableCellEditor STRING_CELL_EDITOR = new DefaultCellEditor(new JTextField()) {
96 private Font _defaultfont = null;
97 private Font _italicfont = null;
98
99 public Component getTableCellEditorComponent(JTable table,
100 Object value,
101 boolean selected,
102 int row,
103 int col) {
104 JTextField comp = (JTextField)super.getTableCellEditorComponent(table, value, selected, row, col);
105
106 if (_defaultfont == null) {
107 _defaultfont = comp.getFont();
108 _italicfont = _defaultfont.deriveFont(Font.ITALIC);
109 }
110
111 if (row == table.getRowCount()-1) {
112 comp.setFont(_italicfont);
113 } else {
114 comp.setFont(_defaultfont);
115 }
116 return comp;
117 }
118 };
119
120 private TableModel _delegate;
121 private Object[] _newrow;
122 private Controller _controller;
123 private int _promptcolumn;
124 private String _prompt;
125
126 public SimpleEditTableModel(TableModel delegate, Controller controller, int promptcolumn, String prompt) {
127 _delegate = delegate;
128 _controller = controller;
129 _promptcolumn = promptcolumn;
130 _prompt = prompt;
131 _newrow = new Object[_delegate.getColumnCount()];
132 _newrow[_promptcolumn] = _prompt;
133 }
134
135 public void addTableModelListener(TableModelListener l) {
136 _delegate.addTableModelListener(l);
137 }
138
139 public void removeTableModelListener(TableModelListener l) {
140 _delegate.removeTableModelListener(l);
141 }
142
143 public int getRowCount() {
144 return _delegate.getRowCount() + 1;
145 }
146
147 public int getColumnCount() {
148 return _delegate.getColumnCount();
149 }
150
151 public String getColumnName(int col) {
152 return _delegate.getColumnName(col);
153 }
154
155 public Class getColumnClass(int col) {
156 return _delegate.getColumnClass(col);
157 }
158
159 public Object getValueAt(int row, int column) {
160 if (row == getRowCount()-1) {
161 return _newrow[column];
162 } else {
163 return _delegate.getValueAt(row, column);
164 }
165 }
166
167 public void setValueAt(Object value, int row, int column) {
168 if (row == getRowCount()-1) {
169 if (column == _promptcolumn) {
170 Object[] newrow = new Object[_newrow.length];
171 newrow[column] = value;
172 _controller.rowAdded(newrow);
173 }
174 } else {
175 _delegate.setValueAt(value, row, column);
176 }
177 }
178
179 public boolean isCellEditable(int row, int column) {
180 return ((row < getRowCount()-1 && _delegate.isCellEditable(row, column)) ||
181 (row == getRowCount()-1 && column == _promptcolumn));
182 }
183
184 public KeyListener getDeleteKeyHandler(JTable table) {
185 return new DeleteKeyHandler(table);
186 }
187
188 public static TableCellRenderer getCellRendererForString() {
189 return STRING_CELL_RENDERER;
190 }
191
192 public static TableCellEditor getCellEditorForString() {
193 return STRING_CELL_EDITOR;
194 }
195 }