1 /*********************************************************************************
2 * *
3 * Raptor - Rapid prototyping of Swing GUIs based on JavaBeans like Java objects *
4 * Copyright (C) 2003 XCOM AG *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of the GNU Lesser General Public *
8 * License as published by the Free Software Foundation; either *
9 * version 2.1 of the License, or (at your option) any later version. *
10 * *
11 * This library 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 GNU *
14 * Lesser General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU Lesser General Public *
17 * License along with this library; if not, write to the Free Software *
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
19 * *
20 *********************************************************************************/
21 package net.sf.raptor.ui.panels;
22
23 import java.awt.Dialog;
24 import java.awt.Frame;
25 import java.awt.Window;
26 import java.awt.event.ActionListener;
27 import java.beans.BeanInfo;
28
29 import javax.swing.AbstractAction;
30 import javax.swing.JTable;
31 import javax.swing.SwingUtilities;
32 import javax.swing.table.TableColumnModel;
33
34 import net.sf.raptor.logging.Trace;
35 import net.sf.raptor.ui;
36 import net.sf.raptor.ui.DefaultObjectFactory;
37 import net.sf.raptor.ui.ObjectFactory;
38 import net.sf.raptor.ui.WindowUtils;
39 import net.sf.raptor.ui.dialog.OKCancelDialog;
40 import net.sf.raptor.ui.tables.AbstractSortableTableModel;
41 import net.sf.raptor.ui.tables.ListTableModel;
42
43 import org.apache.commons.beanutils.ConstructorUtils;
44
45 /**
46 * ListTablePanel class
47 *
48 * @author XCOM AG
49 */
50 public class ListTablePanel extends TablePanel {
51
52 public class ChooseListEntryDialog extends OKCancelDialog {
53 /**
54 *
55 */
56 public ChooseListEntryDialog() {
57 super();
58 }
59 /**
60 * @param owner
61 */
62 public ChooseListEntryDialog(Frame owner) {
63 super(owner);
64 }
65 /**
66 * @param owner
67 */
68 public ChooseListEntryDialog(Dialog owner) {
69 super(owner);
70 }
71 /* (non-Javadoc)
72 * @see net.sf.raptor.ui.dialog.OKDialog#doOkAction()
73 */
74 public void doOkAction() {
75 returnValue = getSelectedObject();
76 hide();
77 }
78 }
79
80 /* beanInfo instanz fuer die detaildarstellung eines tabelleneintrages */
81 private BeanInfo detailBeanInfo;
82
83 /* Class, die von BeanEditPanel abgeleitet sein muss und die zum darstellen der details verwendet werden soll */
84 private Class detailPanelClazz;
85
86 /* factory, die fuer das instatiieren der detail-objekte zust?ndig ist */
87 private ObjectFactory objectFactory;
88
89 /**
90 * constructor
91 *
92 * @param table
93 * @param showButtons
94 */
95 public ListTablePanel(JTable table, boolean showButtons) {
96 super(table, showButtons);
97
98 checkTableModel(table);
99 initialize();
100 }
101
102 /**
103 * hilfsmethode, die ?berpr?ft, ob das TableModel
104 * eine Instanz von ListTableModel ist
105 *
106 * @param table die Tabelle mit dem zu pr?fenden Model
107 */
108 private void checkTableModel(JTable table) {
109 if (!(table.getModel() instanceof ListTableModel)) {
110 throw new IllegalArgumentException("TableModel is not an instance of ListTableModel");
111 }
112 }
113
114 /**
115 *
116 * @since 16.12.2003 14:29:05
117 */
118 public void doDeleteRowsAction() {
119 deleteSelectedRows();
120 }
121
122 /**
123 *
124 * @since 16.12.2003 14:29:10
125 */
126 public void doAddRowAction() {
127 addRow();
128 }
129
130 /**
131 *
132 * @since 16.12.2003 15:43:13
133 */
134 public void doEditRowAction() {
135 showSelectionInDetailPanel();
136 }
137
138 /**
139 * addRow
140 *
141 * f?gt ein neues Objekt (Zeile) der Tabelle hinzu
142 * Adds a new object into the table.
143 */
144 public void addRow() {
145
146 try {
147
148 if (objectFactory == null) {
149 ListTableModel model = (ListTableModel) getTable().getModel();
150 objectFactory =
151 new DefaultObjectFactory(model.getContentClazz());
152 }
153
154 Object newObject = objectFactory.createObject();
155
156 BeanEditPanel detailPanel = createDetailPanel(newObject);
157 newObject = detailPanel.doModalInDialog();
158 if (newObject != null) {
159 ((ListTableModel) getTable().getModel()).appendRow(newObject);
160 }
161 } catch (InstantiationException e) {
162 Trace.error(e);
163 } catch (IllegalAccessException e) {
164 Trace.error(e);
165 }
166 }
167
168 /**
169 * doDeleteSelectedRowsAction
170 *
171 * l?scht alle ausgew?hlten zeilen
172 */
173 public void deleteSelectedRows() {
174 ListTableModel model = (ListTableModel) getTable().getModel();
175 int[] selectedRows = getTable().getSelectedRows();
176 model.deleteRows(selectedRows);
177 }
178
179 /**
180 * showModelTableDialog
181 *
182 * @param model
183 * @param columnModel
184 * @todo evtl wieder private?
185 * @deprecated @see net.sf.raptor.ui.PanelUtils#showModelTableDialog(ListTableModel, TableColumnModel)
186 */
187 public static void showModelTableDialog(
188 ListTableModel model,
189 TableColumnModel columnModel) {
190 PanelUtils.showModelTableDialog(model, columnModel);
191 }
192
193 /**
194 * showSelectionInDetailPanel
195 */
196 public void showSelectionInDetailPanel() {
197 int selectedRow = getTable().getSelectedRow();
198 int index = getSelectedRowDataIndex();
199 if (index == -1)
200 return;
201 BeanEditPanel detailPanel = createDetailPanel(index);
202 detailPanel.doModalInDialog();
203 (
204 (AbstractSortableTableModel) getTable()
205 .getModel())
206 .fireTableRowsUpdated(
207 selectedRow,
208 selectedRow);
209 }
210
211 public int getSelectedRowDataIndex() {
212 int selectedRow = getTable().getSelectedRow();
213 if (selectedRow < 0)
214 return -1;
215
216 return (
217 (AbstractSortableTableModel) getTable()
218 .getModel())
219 .getDataRowIndex(
220 selectedRow);
221 }
222
223 public Object getObjectAtDataRow(int index) {
224 return ((ListTableModel) getTable().getModel()).getObjectAtRow(index);
225 }
226
227 public Object getSelectedObject() {
228 int index = getSelectedRowDataIndex();
229 if (index == -1)
230 return null;
231 return getObjectAtDataRow(index);
232 }
233
234 /**
235 * createDetailPanel
236 *
237 * @param rowIndex
238 * @return
239 */
240 protected BeanEditPanel createDetailPanel(int rowIndex) {
241 /**
242 * @todo das mu? anders werden: z.B. interface f?r tableModels, die ein Object als zeile haben definieren, dahinein die getObjectAtRow
243 */
244 return createDetailPanel(getObjectAtDataRow(rowIndex));
245 }
246
247 /**
248 * createDetailPanel zum Neuanlegen eines Objektes
249 * @param rowObject
250 * @return
251 */
252 protected BeanEditPanel createDetailPanel(Object rowObject) {
253 BeanEditPanel detailPanel = null;
254 if (detailPanelClazz == null) {
255 detailPanel = new BeanEditPanel(rowObject, detailBeanInfo);
256 } else {
257
258 Object[] args = null;
259 if (detailBeanInfo != null) {
260 args = new Object[] { rowObject, detailBeanInfo };
261 } else {
262 args = new Object[] { rowObject };
263 }
264
265 try {
266 detailPanel =
267 (BeanEditPanel) ConstructorUtils.invokeConstructor(
268 detailPanelClazz,
269 args);
270 } catch (Exception e) {
271 // TODO warning erzeugen, dass nicht das gew?nschte panel erzeugt werden konnte
272 e.printStackTrace();
273 detailPanel = new BeanEditPanel(rowObject, detailBeanInfo);
274 }
275 }
276 Window rootWindow = SwingUtilities.getWindowAncestor(this);
277 if (rootWindow instanceof Dialog) {
278 detailPanel.setParentDialog((Dialog) rootWindow);
279 } else if (rootWindow instanceof Frame) {
280 detailPanel.setParentFrame((Frame) rootWindow);
281 }
282 detailPanel.updateUI();
283 return detailPanel;
284 }
285
286 /**
287 * setTable
288 */
289 public void setTable(JTable tableValue) {
290 checkTableModel(tableValue);
291 setTable(tableValue);
292 }
293
294 /**
295 * @return
296 */
297 public BeanInfo getDetailBeanInfo() {
298 return detailBeanInfo;
299 }
300
301 /**
302 * @param info
303 */
304 public void setDetailBeanInfo(BeanInfo info) {
305 detailBeanInfo = info;
306 }
307
308 /**
309 * @return
310 */
311 public Class getDetailPanelClass() {
312 return detailPanelClazz;
313 }
314
315 /**
316 * @param class1
317 */
318 public void setDetailPanelClass(Class class1) {
319 detailPanelClazz = class1;
320 }
321
322 /**
323 * @return
324 */
325 public ObjectFactory getObjectFactory() {
326 return objectFactory;
327 }
328
329 /**
330 * @param factory
331 */
332 public void setObjectFactory(ObjectFactory factory) {
333 objectFactory = factory;
334 }
335
336 public Object doListEntrySelectionInDialog() {
337 ChooseListEntryDialog dialog;
338 if (parentDialog != null) {
339 dialog = new ChooseListEntryDialog(parentDialog);
340 } else if (parentFrame != null) {
341 dialog = new ChooseListEntryDialog(parentFrame);
342 } else {
343 Frame defaultFrame = WindowUtils.getDefaultParentFrame();
344 dialog =
345 defaultFrame == null
346 ? new ChooseListEntryDialog()
347 : new ChooseListEntryDialog(defaultFrame);
348 }
349 return WindowUtils.wrapInDialog(this, dialog);
350 }
351
352 }
353
354 /**
355 * ViewAction class
356 *
357 * @author XCOM AG
358 */
359 class ViewAction extends AbstractAction implements ActionListener {
360
361 TablePanel panel;
362
363 public ViewAction(TablePanel p) {
364 super("Detail");
365 panel = p;
366 }
367
368 public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
369 ((ListTablePanel) panel).showSelectionInDetailPanel();
370 }
371 }