View Javadoc

1   /*
2    * Copyright (c) 2005, The K-Wf Grid Consortium
3    * Fraunhofer Institute for Computer Architecture and Software Technology
4    * See http://www.kwfgrid.eu and http://www.first.fraunhofer.de for more details.
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 }