View Javadoc

1   /*
2    * Copyright (c) 2003-2008 by Cosylab d. d.
3    *
4    * This file is part of CosyBeans-Common.
5    *
6    * CosyBeans-Common is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10   *
11   * CosyBeans-Common is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with CosyBeans-Common.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  
20  package com.cosylab.gui.components.introspection;
21  
22  import java.util.HashMap;
23  import java.util.Map;
24  
25  import javax.swing.JTable;
26  import javax.swing.table.JTableHeader;
27  import javax.swing.table.TableCellEditor;
28  import javax.swing.table.TableCellRenderer;
29  
30  
31  /**
32   * <code>DefaultPropertiesTable</code> displays various properties in 
33   * a two column table.
34   * 
35   * @author <a href="mailto:miha.kadunc@cosylab.com">Miha Kadunc</a>
36   * @version $id$
37   */
38  public class DefaultPropertiesTable extends JTable {
39  
40  	private static final long serialVersionUID = 1L;
41  	private Map<Class, TableCellEditor> editors=new HashMap<Class, TableCellEditor>();
42  	private Map<Class, TableCellRenderer> renderers=new HashMap<Class, TableCellRenderer>();
43  
44  	/**
45  	 * ParametersTable constructor comment.
46  	 */
47  	public DefaultPropertiesTable() {
48  		super();
49  		initialize();
50  	}
51  	
52  	
53  	/**
54  	 * Initialize the class.
55  	 */
56  	private void initialize() {
57  		setName("ParametersTable");
58  		PropertiesTableModel parametersModel = new PropertiesTableModel();
59  		setModel(parametersModel);
60  		createDefaultColumnsFromModel();
61  		setTableHeader(new JTableHeader(getColumnModel()));
62  		getTableHeader().setVisible(true);
63  		setRowHeight(20);
64  		/* Ike commented out. This looks like workaroud, seting value when editing is cancled, ccccc
65  		 addPropertyChangeListener("tableCellEditor",new PropertyChangeListener() {
66  			public void propertyChange(PropertyChangeEvent evt) {
67  				if (evt.getNewValue()==null && evt.getOldValue()!=null) {
68  					Thread.dumpStack();
69  					System.out.println(evt);
70  					TableCellEditor tce=(TableCellEditor)evt.getOldValue();
71  					if (!tce.stopCellEditing()) {
72  						tce.cancelCellEditing();
73  					}
74  					setValueAt(tce.getCellEditorValue(),getEditingRow(),getEditingColumn());
75  				}
76  			}
77  		});*/
78  		/* Ike: another workaround from Miha, let's try without it
79  		addFocusListener(new FocusAdapter(){
80  			public void focusLost(FocusEvent e) {
81  				super.focusLost(e);
82  				if (e.getOppositeComponent()==null || !SwingUtilities.isDescendingFrom(e.getOppositeComponent(),DefaultPropertiesTable.this)){
83  					if (isEditing()) {
84  						if (!getCellEditor().stopCellEditing()) {
85  							getCellEditor().cancelCellEditing();
86  						}
87  					}
88  				}
89  			}
90  		});*/
91  //		setSurrendersFocusOnKeystroke(true);
92  		setColumnSelectionAllowed(false);
93  		setRowSelectionAllowed(true);
94  		putClientProperty("terminateEditOnFocusLost",Boolean.TRUE);
95  	}
96  	/**
97  	 * @param row int
98  	 * @param column int
99  	 * @return TableCellEditor
100 	 * @see JTable#getCellEditor(int, int)
101 	 */
102 	public TableCellEditor getCellEditor(int row, int column) {
103 		TableCellEditor ed=null;
104 		if (getModel() instanceof PropertiesTableModel) {
105 			PropertiesTableModel ptm=(PropertiesTableModel)getModel();
106 			if (column==ptm.valCol) {
107 				ed=retrieveCellEditor(ptm,row);
108 			}
109 		}
110 		if (ed==null) {
111 			ed=super.getCellEditor(row, column);
112 		}
113 		return ed;
114 	}
115 	
116 	private TableCellEditor retrieveCellEditor(PropertiesTableModel model,int row) {
117 		
118 		Class dataType=model.getTypeForRow(row);
119 		if (!editors.containsKey(dataType)) {
120 			TableCellEditor edt=EditorsHelper.getTableCellEditorForClass(dataType);
121 			if (edt==null) {
122 				return null;
123 			}
124 			editors.put(dataType,edt);
125 		}
126 		return editors.get(dataType);
127 	}
128 	
129 	/**
130 	 * @param row int
131 	 * @param column int
132 	 * @return TableCellRenderer
133 	 * @see JTable#getCellRenderer(int, int)
134 	 */
135 	public TableCellRenderer getCellRenderer(int row, int column) {
136 		if (getModel() instanceof PropertiesTableModel){
137 			PropertiesTableModel ptm=(PropertiesTableModel)getModel();
138 			if (column==ptm.valCol) {
139 				TableCellRenderer tcr= retrieveCellRenderer(ptm,row);
140 				if (tcr!=null) {
141 					return tcr;
142 				}
143 			}
144 		}
145 		return super.getCellRenderer(row, column);
146 	}
147 	
148 	private TableCellRenderer retrieveCellRenderer(PropertiesTableModel model, int row) {
149 				Class dataType=model.getTypeForRow(row);
150 				if (!renderers.containsKey(dataType)) {
151 					TableCellRenderer rnd=EditorsHelper.getTableCellRendererForClass(dataType);
152 					if (rnd==null) {
153 						return null;
154 					}
155 					renderers.put(dataType,rnd);
156 				}
157 				return renderers.get(dataType);
158 	}
159 	
160 }