View Javadoc

1   /*
2    *  Copyright (C) 2003-2005 SINTEF
3    *  Author:  Fredrik Vraalsen (fredrik dot vraalsen at sintef dot no)
4    *  Webpage: http://coras.sourceforge.net/
5    *
6    *  This program is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public License
8    *  as published by the Free Software Foundation; either version 2.1
9    *  of the License, or (at your option) any later version.
10   *
11   *  This program 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 program; if not, write to the Free
18   *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   *  02111-1307 USA
20   */
21  package coras.client.ui;
22  
23  import java.awt.Color;
24  import java.awt.Component;
25  import java.awt.event.ActionEvent;
26  import java.awt.event.ActionListener;
27  import java.awt.event.MouseAdapter;
28  import java.awt.event.MouseEvent;
29  import java.util.Iterator;
30  import java.util.List;
31  
32  import javax.swing.JMenu;
33  import javax.swing.JMenuItem;
34  import javax.swing.JOptionPane;
35  import javax.swing.JPanel;
36  import javax.swing.JPopupMenu;
37  import javax.swing.table.JTableHeader;
38  
39  import coras.table.CorasTable;
40  import coras.table.CorasTableModel;
41  import coras.table.jaxb.ColumnDefType;
42  /***
43   * @author fvr
44   *
45   * To change the template for this generated type comment go to
46   * Window - Preferences - Java - Code Generation - Code and Comments
47   */
48  public class TableEditorPanel extends JPanel {
49  	
50  	private javax.swing.JScrollPane jScrollPane = null;
51  	private coras.table.CorasTable table = null;
52  
53  	private javax.swing.JPanel buttonPanel = null;  //
54  	private javax.swing.JButton deleteRowButton = null;  //
55  	private javax.swing.JButton insertAboveButton = null;  //
56  	private javax.swing.JButton insertBelowButton = null;  //
57  	private JPopupMenu headerMenu = null;  //  @jve:decl-index=0:visual-constraint="465,230"
58  	private JMenuItem hideColumnMenuItem = null;
59  	private JMenuItem deleteColumnMenuItem = null;
60  	private JMenu showColumnMenu = null;
61  	private JMenuItem addColumnLeftMenuItem = null;
62  	private JMenuItem addColumnRightMenuItem = null;
63  	private int selectedColumn = -1;
64  	private boolean fixedStructure = false;
65  	
66  	/***
67  	 * This is the default constructor
68  	 */
69  	public TableEditorPanel() {
70  		this(null);
71  	}
72  	
73  	public TableEditorPanel(final CorasTableModel tableModel) {
74  		super();
75  		fixedStructure = tableModel != null && tableModel.isFixedStructure();
76  		initialize();
77  		getTable().setTableModel(tableModel);
78  		getButtonPanel().setVisible(!fixedStructure);
79  		getJScrollPane().revalidate();
80  		getJScrollPane().repaint();
81  		final JTableHeader header = getTable().getTableHeader();
82  		header.addMouseListener(new MouseAdapter() {
83  			public void mousePressed(MouseEvent e) {
84  				maybeShowPopup(e);
85  			}
86  			public void mouseReleased(MouseEvent e) {
87  				maybeShowPopup(e);
88  			}
89  			private void maybeShowPopup(MouseEvent e) {
90  				if (getTable().isEnabled() && e.isPopupTrigger()) {
91  					selectedColumn = header.columnAtPoint(e.getPoint());
92  					getHideColumnMenuItem().setEnabled(tableModel.canHideColumn(selectedColumn));
93  					updateShowMenu();
94  					JPopupMenu menu = getHeaderMenu();
95  					menu.show(e.getComponent(), e.getX(), e.getY());
96  				}
97  			}
98  		});
99  	}
100 	
101 	/***
102 	 * 
103 	 */
104 	private void updateShowMenu() {
105 		final CorasTableModel model = (CorasTableModel) table.getModel();
106 		List cols = model.getHiddenColumnDefs();
107 		JMenu menu = getShowColumnMenu();
108 		menu.removeAll();
109 		for (Iterator i = cols.iterator(); i.hasNext();) {
110 			final ColumnDefType col = (ColumnDefType) i.next();
111 			JMenuItem menuItem = new JMenuItem(col.getName());
112 			menuItem.addActionListener(new ActionListener() {
113 				public void actionPerformed(ActionEvent e) {
114 					model.showColumn(col.getId());
115 				}
116 			});
117 			menu.add(menuItem);
118 		}
119 		menu.setEnabled(cols.size() != 0);
120 	}
121 
122 	/***
123 	 * This method initializes this
124 	 * 
125 	 * @return void
126 	 */
127 	private  void initialize() {
128 		this.setLayout(new java.awt.BorderLayout());
129 		this.add(getJScrollPane(), java.awt.BorderLayout.CENTER);
130 		this.add(getButtonPanel(), java.awt.BorderLayout.SOUTH);
131 		this.setSize(400, 300);
132 	}
133 
134 	/***
135 	 * This method initializes jScrollPane	
136 	 * 	
137 	 * @return javax.swing.JScrollPane	
138 	 */    
139 	private javax.swing.JScrollPane getJScrollPane() {
140 		if (jScrollPane == null) {
141 			jScrollPane = new javax.swing.JScrollPane();
142 			jScrollPane.setViewportView(getTable());
143 			jScrollPane.getViewport().setBackground(Color.WHITE);
144 			// jScrollPane.setRowHeaderView();
145 			jScrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
146 			jScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
147 		}
148 		return jScrollPane;
149 	}
150 
151 	/***
152 	 * This method initializes corasTable	
153 	 * 	
154 	 * @return coras.table.CorasTable	
155 	 */    
156 	private coras.table.CorasTable getTable() {
157 		if (table == null) {
158 			table = new CorasTable();
159 		}
160 		return table;
161 	}
162 
163 	/***
164 	 * This method initializes jPanel	
165 	 * 	
166 	 * @return javax.swing.JPanel	
167 	 */    
168 	private javax.swing.JPanel getButtonPanel() {
169 		if (buttonPanel == null) {
170 			buttonPanel = new javax.swing.JPanel();
171 			buttonPanel.add(getInsertAboveButton(), null);
172 			buttonPanel.add(getInsertBelowButton(), null);
173 			buttonPanel.add(getDeleteRowButton(), null);
174 		}
175 		return buttonPanel;
176 	}
177 
178 	/***
179 	 * This method initializes jButton1	
180 	 * 	
181 	 * @return javax.swing.JButton	
182 	 */    
183 	private javax.swing.JButton getDeleteRowButton() {
184 		if (deleteRowButton == null) {
185 			deleteRowButton = new javax.swing.JButton();
186 			deleteRowButton.setText("Delete Row");
187 			deleteRowButton.setMnemonic(java.awt.event.KeyEvent.VK_D);
188 			deleteRowButton.addActionListener(new java.awt.event.ActionListener() { 
189 				public void actionPerformed(java.awt.event.ActionEvent e) {
190 					table.deleteSelectedRow();
191 					updateDeleteRowButton();
192 				}
193 			});
194 
195 		}
196 		return deleteRowButton;
197 	}
198 
199 	/***
200 
201 	 * This method initializes jButton	
202 
203 	 * 	
204 
205 	 * @return javax.swing.JButton	
206 
207 	 */    
208 	private javax.swing.JButton getInsertAboveButton() {
209 		if (insertAboveButton == null) {
210 			insertAboveButton = new javax.swing.JButton();
211 			insertAboveButton.setText("Insert Row Above");
212 			insertAboveButton.setMnemonic(java.awt.event.KeyEvent.VK_A);
213 			insertAboveButton.addActionListener(new java.awt.event.ActionListener() { 
214 				public void actionPerformed(java.awt.event.ActionEvent e) {    
215 					table.insertRowAboveSelectedRow();
216 					updateDeleteRowButton();
217 				}
218 			});
219 
220 		}
221 		return insertAboveButton;
222 	}
223 
224 	/***
225 
226 	 * This method initializes jButton1	
227 
228 	 * 	
229 
230 	 * @return javax.swing.JButton	
231 
232 	 */    
233 	private javax.swing.JButton getInsertBelowButton() {
234 		if (insertBelowButton == null) {
235 			insertBelowButton = new javax.swing.JButton();
236 			insertBelowButton.setText("Insert Row Below");
237 			insertBelowButton.setMnemonic(java.awt.event.KeyEvent.VK_B);
238 			insertBelowButton.addActionListener(new java.awt.event.ActionListener() { 
239 				public void actionPerformed(java.awt.event.ActionEvent e) {    
240 					table.insertRowBelowSelectedRow();
241 					updateDeleteRowButton();
242 				}
243 			});
244 
245 		}
246 		return insertBelowButton;
247 	}
248 
249     /***
250      * @param b
251      */
252     public void setEditable(boolean editable) {
253         getTable().setEnabled(editable);
254         getInsertAboveButton().setEnabled(editable);
255         getInsertBelowButton().setEnabled(editable);
256         updateDeleteRowButton();
257     }
258 
259 	private void updateDeleteRowButton() {
260 		getDeleteRowButton().setEnabled(getTable().isEnabled() && getTable().getRowCount() > 1);
261 	}
262 	
263 	/***
264 	 * This method initializes jPopupMenu	
265 	 * 	
266 	 * @return javax.swing.JPopupMenu	
267 	 */    
268 	private JPopupMenu getHeaderMenu() {
269 		if (headerMenu == null) {
270 			headerMenu = new JPopupMenu();
271 			headerMenu.add(getHideColumnMenuItem());
272 			headerMenu.add(getShowColumnMenu());
273 			if (!fixedStructure) {
274 				headerMenu.add(getAddColumnLeftMenuItem());
275 				headerMenu.add(getAddColumnRightMenuItem());
276 				headerMenu.add(getDeleteColumnMenuItem());
277 			}
278 		}
279 		return headerMenu;
280 	}
281 	/***
282 	 * This method initializes jMenuItem	
283 	 * 	
284 	 * @return javax.swing.JMenuItem	
285 	 */    
286 	private JMenuItem getHideColumnMenuItem() {
287 		if (hideColumnMenuItem == null) {
288 			hideColumnMenuItem = new JMenuItem();
289 			hideColumnMenuItem.setText("Hide column");
290 			hideColumnMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_H);
291 			hideColumnMenuItem.addActionListener(new java.awt.event.ActionListener() { 
292 				public void actionPerformed(java.awt.event.ActionEvent e) {
293 					CorasTableModel model = (CorasTableModel) table.getModel();
294 					model.hideColumn(selectedColumn);
295 				}
296 			});
297 		}
298 		return hideColumnMenuItem;
299 	}
300 	/***
301 	 * This method initializes jMenuItem	
302 	 * 	
303 	 * @return javax.swing.JMenuItem	
304 	 */    
305 	private JMenuItem getDeleteColumnMenuItem() {
306 		if (deleteColumnMenuItem == null) {
307 			deleteColumnMenuItem = new JMenuItem();
308 			deleteColumnMenuItem.setText("Delete column");
309 			deleteColumnMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_D);
310 			final Component c = this;
311 			deleteColumnMenuItem.addActionListener(new java.awt.event.ActionListener() { 
312 				public void actionPerformed(java.awt.event.ActionEvent e) {
313 					CorasTableModel model = (CorasTableModel) table.getModel();
314 					String name = model.getColumnName(selectedColumn);
315 					int result = JOptionPane.showConfirmDialog(c, "Are you sure you wish to delete the column \"" + name + "\"?", "Delete column \"" + name + "\"", JOptionPane.YES_NO_OPTION);
316 					if (result == JOptionPane.YES_OPTION) {
317 						model.deleteColumn(selectedColumn);
318 					}
319 				}
320 			});
321 		}
322 		return deleteColumnMenuItem;
323 	}
324 	/***
325 	 * This method initializes jMenu	
326 	 * 	
327 	 * @return javax.swing.JMenu	
328 	 */    
329 	private JMenu getShowColumnMenu() {
330 		if (showColumnMenu == null) {
331 			showColumnMenu = new JMenu();
332 			showColumnMenu.setText("Show column");
333 			showColumnMenu.setEnabled(false);
334 		}
335 		return showColumnMenu;
336 	}
337 	/***
338 	 * This method initializes jMenuItem	
339 	 * 	
340 	 * @return javax.swing.JMenuItem	
341 	 */    
342 	private JMenuItem getAddColumnLeftMenuItem() {
343 		if (addColumnLeftMenuItem == null) {
344 			addColumnLeftMenuItem = new JMenuItem();
345 			addColumnLeftMenuItem.setText("Add column to the left");
346 			addColumnLeftMenuItem.addActionListener(new java.awt.event.ActionListener() { 
347 				public void actionPerformed(java.awt.event.ActionEvent e) {    
348 					addColumn(selectedColumn);
349 				}
350 			});
351 		}
352 		return addColumnLeftMenuItem;
353 	}
354 	/***
355 	 * This method initializes jMenuItem	
356 	 * 	
357 	 * @return javax.swing.JMenuItem	
358 	 */    
359 	private JMenuItem getAddColumnRightMenuItem() {
360 		if (addColumnRightMenuItem == null) {
361 			addColumnRightMenuItem = new JMenuItem();
362 			addColumnRightMenuItem.setText("Add column to the right");
363 			addColumnRightMenuItem.addActionListener(new java.awt.event.ActionListener() { 
364 				public void actionPerformed(java.awt.event.ActionEvent e) {    
365 					addColumn(selectedColumn + 1);
366 				}
367 			});
368 		}
369 		return addColumnRightMenuItem;
370 	}
371 
372 	private void addColumn(int column) {
373 		String name = JOptionPane.showInputDialog(this, "Column name", "New column");
374 		if (name == null) {
375 			return;
376 		}
377 		CorasTableModel model = (CorasTableModel) table.getModel();
378 		model.addColumn(column, name);
379 	}
380 
381 }