1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
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
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 }