View Javadoc

1   /*
2    * joey and its relative products are published under the terms
3    * of the Apache Software License.
4    * 
5    * Created on 2004/06/07 2:52:52
6    */
7   package org.asyrinx.joey.gui.swing;
8   
9   import java.awt.Component;
10  import java.awt.Window;
11  import java.awt.event.KeyAdapter;
12  import java.awt.event.KeyEvent;
13  import java.awt.event.KeyListener;
14  import java.awt.event.MouseAdapter;
15  import java.awt.event.MouseEvent;
16  import java.awt.event.MouseListener;
17  import java.io.Serializable;
18  import java.util.Iterator;
19  import java.util.List;
20  
21  import javax.swing.JOptionPane;
22  import javax.swing.JTable;
23  import javax.swing.ListSelectionModel;
24  import javax.swing.SwingUtilities;
25  
26  import org.asyrinx.brownie.core.lang.ClassUtils;
27  import org.asyrinx.brownie.swing.table.ListViewTable;
28  import org.asyrinx.joey.gui.EntityGuiRuntimeException;
29  import org.asyrinx.joey.gui.EntityListView;
30  import org.asyrinx.joey.gui.EntityPointer;
31  import org.asyrinx.joey.gui.EntityViewManager;
32  import org.asyrinx.joey.gui.swing.listview.DefaultEntityListViewTableActionKit;
33  import org.asyrinx.joey.gui.swing.listview.EntityListViewTableActionKit;
34  import org.asyrinx.joey.om.Entity;
35  import org.asyrinx.joey.om.EntityInitializer;
36  import org.asyrinx.joey.om.EntityService;
37  import org.asyrinx.joey.om.SearchCondition;
38  
39  /***
40   * @author akima
41   */
42  public abstract class EntityListViewTable extends ListViewTable implements
43  		EntityListView {
44  
45  	/***
46  	 *  
47  	 */
48  	public EntityListViewTable() {
49  		super();
50  	}
51  
52  	/***
53  	 * @param arg0
54  	 * @param arg1
55  	 */
56  	public EntityListViewTable(int arg0, int arg1) {
57  		super(arg0, arg1);
58  	}
59  
60  	/***
61  	 * @param arg0
62  	 */
63  	public EntityListViewTable(Component arg0) {
64  		super(arg0);
65  	}
66  
67  	/***
68  	 * @param arg0
69  	 * @param arg1
70  	 * @param arg2
71  	 */
72  	public EntityListViewTable(Component arg0, int arg1, int arg2) {
73  		super(arg0, arg1, arg2);
74  	}
75  
76  	/*
77  	 * (non-Javadoc)
78  	 * 
79  	 * @see org.asyrinx.brownie.swing.table.ListViewTable#initialize()
80  	 */
81  	protected void initialize() {
82  		super.initialize();
83  		this.addMouseListener(getMouseListener());
84  		this.addKeyListener(getKeyListener());
85  	}
86  
87  	/*
88  	 * (non-Javadoc)
89  	 * 
90  	 * @see org.asyrinx.brownie.swing.table.ListViewTable#initTable(javax.swing.JTable)
91  	 */
92  	protected void initTable(JTable table) {
93  		super.initTable(table);
94  		table.addMouseListener(getMouseListener());
95  		table.addKeyListener(getKeyListener());
96  	}
97  
98  	/***
99  	 * @return
100 	 */
101 	public KeyListener getKeyListener() {
102 		if (keyListener == null) {
103 			keyListener = new KeyAdapter() {
104 				public void keyTyped(KeyEvent e) {
105 					switch (e.getKeyCode()) {
106 					case KeyEvent.VK_ENTER:
107 						notifySelectionToInvoker();
108 						break;
109 					}
110 				}
111 			};
112 		}
113 		return keyListener;
114 	}
115 
116 	/***
117 	 * @return
118 	 */
119 	public MouseListener getMouseListener() {
120 		if (mouseListener == null) {
121 			mouseListener = new MouseAdapter() {
122 				public void mouseClicked(MouseEvent e) {
123 					switch (e.getButton()) {
124 					case MouseEvent.BUTTON1:
125 						switch (e.getClickCount()) {
126 						case 1:
127 							break;
128 						case 2:
129 							if (getInvoker() instanceof EntityPointer) {
130 								notifySelectionToInvoker();
131 								closeWinfow();
132 							} else {
133 								showDetail();
134 							}
135 							break;
136 						}
137 						break;
138 					case MouseEvent.BUTTON3:
139 						final int row = getTable().rowAtPoint(e.getPoint());
140 						final ListSelectionModel selectionModel = getTable()
141 								.getSelectionModel();
142 						selectionModel.setLeadSelectionIndex(row);
143 						selectionModel.setAnchorSelectionIndex(row);
144 						showPopupMenu(e);
145 						break;
146 					}
147 				}
148 			};
149 		}
150 		return mouseListener;
151 	}
152 
153 	private MouseListener mouseListener = null;
154 
155 	private KeyListener keyListener = null;
156 
157 	private EntityViewManager entityViewManager = null;
158 
159 	/*
160 	 * (non-Javadoc)
161 	 * 
162 	 * @see org.asyrinx.joey.gui.EntityView#getEntityViewManager()
163 	 */
164 	public EntityViewManager getEntityViewManager() {
165 		return entityViewManager;
166 	}
167 
168 	/*
169 	 * (non-Javadoc)
170 	 * 
171 	 * @see org.asyrinx.joey.gui.EntityView#
172 	 *        setEntityViewManager(org.asyrinx.joey.gui.EntityViewManager)
173 	 */
174 	public void setEntityViewManager(EntityViewManager entityViewManager) {
175 		this.entityViewManager = entityViewManager;
176 	}
177 
178 	private Object invoker = null;
179 
180 	/***
181 	 * @return
182 	 */
183 	public Object getInvoker() {
184 		return invoker;
185 	}
186 
187 	/***
188 	 * @param object
189 	 */
190 	public void setInvoker(Object object) {
191 		invoker = object;
192 	}
193 
194 	private static final int COL_INDEX_INVISIBLE_PRIMARY_KEY = 0;
195 
196 	protected int getInvisibleColumnIndex() {
197 		return COL_INDEX_INVISIBLE_PRIMARY_KEY;
198 	}
199 
200 	protected int getInvisibleColumnCount() {
201 		return 1;
202 	}
203 
204 	public Serializable getKey(int tableRow) {
205 		final int origianlRow = getSortableModel()
206 				.getOriginalRowIndex(tableRow);
207 		Object object = getModel().getValueAt(origianlRow,
208 				COL_INDEX_INVISIBLE_PRIMARY_KEY);
209 		return (Serializable) object;
210 	}
211 
212 	/*
213 	 * (non-Javadoc)
214 	 * 
215 	 * @see org.asyrinx.joey.gui.EntityPointer#getPointedKey()
216 	 */
217 	public Serializable getPointedKey() {
218 		int tableRow = getTable().getSelectedRow();
219 		return getKey(tableRow);
220 	}
221 
222 	/*
223 	 * (non-Javadoc)
224 	 *  
225 	 */
226 	public void setPointedEntity(Entity entity) {
227 		if (entity == null)
228 			setPointedKey(null);
229 		else
230 			setPointedKey(entity.getPrimaryKey());
231 	}
232 
233 	/*
234 	 * (non-Javadoc)
235 	 *  
236 	 */
237 	public void setPointedKey(Serializable key) {
238 		if (key == null)
239 			return;
240 		for (int row = 0; row < getTable().getRowCount(); row++) {
241 			final Serializable rowKey = getKey(row);
242 			if (key.equals(rowKey))
243 				getTable().getSelectionModel().setLeadSelectionIndex(row);
244 		}
245 	}
246 
247 	/***
248 	 * @return
249 	 */
250 	public abstract Class getEntityClass();
251 
252 	private javax.swing.JPopupMenu popupMenu = null;
253 
254 	public javax.swing.JPopupMenu getPopupMenu() {
255 		if (popupMenu == null) {
256 			popupMenu = new javax.swing.JPopupMenu();
257 			getActionKit().preparePopupMenu(this, popupMenu);
258 		}
259 		return popupMenu;
260 	}
261 
262 	private EntityListViewTableActionKit actionKit;
263 
264 	/***
265 	 * @return
266 	 */
267 	public EntityListViewTableActionKit getActionKit() {
268 		if (actionKit == null) {
269 			actionKit = new DefaultEntityListViewTableActionKit();
270 		}
271 		return actionKit;
272 	}
273 
274 	/***
275 	 * @param kit
276 	 */
277 	public void setActionKit(EntityListViewTableActionKit kit) {
278 		if (kit == null) {
279 			this.actionKit = EntityListViewTableActionKit.NULL;
280 		} else {
281 			actionKit = kit;
282 		}
283 	}
284 
285 	/***
286 	 *  
287 	 */
288 	protected void showPopupMenu(MouseEvent e) {
289 		getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
290 	}
291 
292 	public void notifySelectionToInvoker() {
293 		final Serializable key = getPointedKey();
294 		if (key == null)
295 			return;
296 		if (getInvoker() instanceof EntityPointer) {
297 			final EntityPointer pointer = (EntityPointer) getInvoker();
298 			pointer.setPointedKey(getPointedKey());
299 		}
300 	}
301 
302 	public void closeWinfow() {
303 		final Window window = SwingUtilities.getWindowAncestor(this);
304 		window.setVisible(false);
305 	}
306 
307 	public void showDetail() {
308 		final Serializable key = getPointedKey();
309 		if (key == null)
310 			return;
311 		getEntityViewManager().showDetailEditView(this, getEntityClass(),
312 				getPointedKey());
313 	}
314 
315 	private EntityInitializer entityInitializer = EntityInitializer.NULL;
316 
317 	/***
318 	 * @return
319 	 */
320 	public EntityInitializer getEntityInitializer() {
321 		return entityInitializer;
322 	}
323 
324 	/***
325 	 * @param initializer
326 	 */
327 	public void setEntityInitializer(EntityInitializer initializer) {
328 		entityInitializer = initializer;
329 	}
330 
331 	/***
332 	 *  
333 	 */
334 	public void insertNewRow() {
335 		final Entity entity;
336 		try {
337 			entity = (Entity) ClassUtils.newObject(getEntityClass(),
338 					Entity.class);
339 		} catch (InstantiationException e) {
340 			throw new EntityGuiRuntimeException(e);
341 		}
342 		getEntityInitializer().initialize(entity);
343 		getEntityViewManager().showDetailEditView(this, entity);
344 		refresh();
345 	}
346 
347 	public void load(List entities) {
348 		clearList();
349 		for (Iterator iter = entities.iterator(); iter.hasNext();) {
350 			final Entity obj = (Entity) iter.next();
351 			loadEntity(obj);
352 		}
353 	}
354 
355 	public abstract void loadEntity(Entity obj);
356 
357 	/***
358 	 *  
359 	 */
360 	public void deleteSelections() {
361 		if (getPointedKey() == null)
362 			return;
363 		final int deleteConfirm = JOptionPane.showConfirmDialog(this,
364 				"選択した行を削除してもよろしいですか?", "削除確認", JOptionPane.OK_CANCEL_OPTION);
365 		if (deleteConfirm != JOptionPane.OK_OPTION)
366 			return;
367 		try {
368 			getEntityViewManager().getEntityServiceManager().deleteEntity(
369 					getEntityClass(), getPointedKey());
370 			JOptionPane.showMessageDialog(this, "削除しました");
371 			refresh();
372 		} catch (Throwable e) {
373 			e.printStackTrace();
374 			JOptionPane.showMessageDialog(this, "削除できませんでした", "エラー",
375 					JOptionPane.ERROR);
376 		}
377 	}
378 
379 	/*
380 	 * (non-Javadoc)
381 	 * 
382 	 * @see org.asyrinx.joey.gui.EntityListView#clearList()
383 	 */
384 	public void clearList() {
385 		getModel().setRowCount(0);
386 	}
387 
388 	private SearchCondition condition = null;
389 
390 	/*
391 	 * (non-Javadoc)
392 	 * 
393 	 * @see org.asyrinx.joey.gui.EntityListView#getCondition()
394 	 */
395 	public SearchCondition getCondition() {
396 		return condition;
397 	}
398 
399 	/*
400 	 * (non-Javadoc)
401 	 * 
402 	 * @see org.asyrinx.joey.gui.EntityListView#setCondition(org.asyrinx.joey.om.SearchCondition)
403 	 */
404 	public void setCondition(SearchCondition condition) {
405 		this.condition = condition;
406 	}
407 
408 	private EntityService service = null;
409 
410 	/*
411 	 * (non-Javadoc)
412 	 * 
413 	 * @see org.asyrinx.joey.gui.EntityView#getService()
414 	 */
415 	public EntityService getService() {
416 		if (service == null) {
417 			service = getEntityViewManager().getEntityServiceManager()
418 					.getEntityService(getEntityClass());
419 		}
420 		return service;
421 	}
422 
423 	/*
424 	 * (non-Javadoc)
425 	 * 
426 	 * @see org.asyrinx.joey.gui.EntityView#setService(org.asyrinx.joey.om.EntityService)
427 	 */
428 	public void setService(EntityService service) {
429 		this.service = service;
430 	}
431 
432 	/*
433 	 * (non-Javadoc)
434 	 * 
435 	 * @see org.asyrinx.joey.gui.EntityView#refresh()
436 	 */
437 	public void refresh() {
438 		final EntityService entityService = getService();
439 		if (entityService != null) {
440 			this.clearList();
441 			final List list = entityService.select(getCondition());
442 			load(list);
443 		}
444 	}
445 
446 	/*
447 	 * (non-Javadoc)
448 	 * 
449 	 * @see org.asyrinx.joey.gui.EntityView#beforeShow()
450 	 */
451 	public void beforeShow() {
452 	}
453 
454 	/*
455 	 * (non-Javadoc)
456 	 * 
457 	 * @see org.asyrinx.joey.gui.EntityView#afterShow()
458 	 */
459 	public void afterShow() {
460 	}
461 
462 	/*
463 	 * (non-Javadoc)
464 	 * 
465 	 * @see org.asyrinx.joey.gui.EntityView#beforeHide()
466 	 */
467 	public void beforeHide() {
468 	}
469 
470 	/*
471 	 * (non-Javadoc)
472 	 * 
473 	 * @see org.asyrinx.joey.gui.EntityView#afterHide()
474 	 */
475 	public void afterHide() {
476 	}
477 }