1 /* |
|
2 * CDDL HEADER START |
|
3 * |
|
4 * The contents of this file are subject to the terms of the |
|
5 * Common Development and Distribution License (the "License"). |
|
6 * You may not use this file except in compliance with the License. |
|
7 * |
|
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
9 * or http://www.opensolaris.org/os/licensing. |
|
10 * See the License for the specific language governing permissions |
|
11 * and limitations under the License. |
|
12 * |
|
13 * When distributing Covered Code, include this CDDL HEADER in each |
|
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
15 * If applicable, add the following below this CDDL HEADER, with the |
|
16 * fields enclosed by brackets "[]" replaced with your own identifying |
|
17 * information: Portions Copyright [yyyy] [name of copyright owner] |
|
18 * |
|
19 * CDDL HEADER END |
|
20 */ |
|
21 |
|
22 /* |
|
23 * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. |
|
24 */ |
|
25 |
|
26 package com.oracle.solaris.vp.panel.swing.view; |
|
27 |
|
28 import java.awt.*; |
|
29 import java.awt.event.*; |
|
30 import java.util.*; |
|
31 import java.util.List; |
|
32 import javax.swing.*; |
|
33 import javax.swing.event.*; |
|
34 import javax.swing.table.*; |
|
35 import com.oracle.solaris.vp.panel.common.model.ManagedObject; |
|
36 import com.oracle.solaris.vp.util.swing.*; |
|
37 import com.oracle.solaris.vp.util.swing.tree.*; |
|
38 |
|
39 @SuppressWarnings({"serial"}) |
|
40 public class ManagedObjectTreeTable extends TreeTable { |
|
41 // |
|
42 // Instance data |
|
43 // |
|
44 |
|
45 private JPopupMenu popup; |
|
46 |
|
47 // |
|
48 // Constructors |
|
49 // |
|
50 |
|
51 public ManagedObjectTreeTable(ManagedObjectTreeTableModel model, |
|
52 JPopupMenu popup, final Action dAction) { |
|
53 |
|
54 super(model); |
|
55 |
|
56 this.popup = popup; |
|
57 |
|
58 ListSelectionModel tsModel = new ExtListSelectionModel(); |
|
59 setSelectionModel(tsModel); |
|
60 tsModel.setSelectionMode( |
|
61 ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
|
62 |
|
63 for (int i = 0, n = model.getColumnCount(); i < n; i++) { |
|
64 setCustomRendererEditor(i); |
|
65 } |
|
66 |
|
67 getColumnModel().addColumnModelListener( |
|
68 new TableColumnModelListener() { |
|
69 @Override |
|
70 public void columnAdded(TableColumnModelEvent e) { |
|
71 setCustomRendererEditor(e.getToIndex()); |
|
72 } |
|
73 |
|
74 @Override |
|
75 public void columnMarginChanged(ChangeEvent e) { |
|
76 } |
|
77 |
|
78 @Override |
|
79 public void columnMoved(TableColumnModelEvent e) { |
|
80 } |
|
81 |
|
82 @Override |
|
83 public void columnRemoved(TableColumnModelEvent e) { |
|
84 } |
|
85 |
|
86 @Override |
|
87 public void columnSelectionChanged(ListSelectionEvent e) { |
|
88 } |
|
89 }); |
|
90 |
|
91 addMouseListener( |
|
92 new MouseAdapter() { |
|
93 // |
|
94 // MouseListener methods |
|
95 // |
|
96 |
|
97 @Override |
|
98 public void mouseClicked(MouseEvent e) { |
|
99 // Invoke default action (if non-null) on double-click |
|
100 if (dAction != null && GUIUtil.isUnmodifiedClick(e, 2) && |
|
101 dAction.isEnabled()) { |
|
102 |
|
103 EventQueue.invokeLater( |
|
104 new Runnable() { |
|
105 @Override |
|
106 public void run() { |
|
107 ActionEvent ae = new ActionEvent( |
|
108 ManagedObjectTreeTable.this, |
|
109 ActionEvent.ACTION_PERFORMED, |
|
110 "default"); |
|
111 dAction.actionPerformed(ae); |
|
112 } |
|
113 }); |
|
114 } |
|
115 } |
|
116 |
|
117 @Override |
|
118 public void mousePressed(final MouseEvent e) { |
|
119 if (e.isPopupTrigger()) { |
|
120 // By default, the JTable doesn't select on |
|
121 // right-clicks. If right-clicks are a popup trigger, |
|
122 // modify selection before popping up the menu. |
|
123 if (e.getButton() == MouseEvent.BUTTON3) { |
|
124 int index = rowAtPoint(e.getPoint()); |
|
125 if (index >= 0) { |
|
126 ListSelectionModel model = getSelectionModel(); |
|
127 if (!model.isSelectedIndex(index)) { |
|
128 model.clearSelection(); |
|
129 model.setSelectionInterval(index, index); |
|
130 }; |
|
131 } |
|
132 } |
|
133 |
|
134 // Invoke later so that events resulting from any |
|
135 // change in selection above can be processed before the |
|
136 // popup is shown. |
|
137 EventQueue.invokeLater( |
|
138 new Runnable() { |
|
139 @Override |
|
140 public void run() { |
|
141 showPopup(e.getX(), e.getY()); |
|
142 } |
|
143 }); |
|
144 } |
|
145 } |
|
146 |
|
147 @Override |
|
148 public void mouseReleased(final MouseEvent e) { |
|
149 if (e.isPopupTrigger()) { |
|
150 EventQueue.invokeLater( |
|
151 new Runnable() { |
|
152 @Override |
|
153 public void run() { |
|
154 showPopup(e.getX(), e.getY()); |
|
155 } |
|
156 }); |
|
157 } |
|
158 } |
|
159 }); |
|
160 |
|
161 setAutoFitColumns(ColumnWidthPolicy.PREFERRED); |
|
162 } |
|
163 |
|
164 // |
|
165 // JTable methods |
|
166 // |
|
167 |
|
168 @Override |
|
169 public Component prepareRenderer(TableCellRenderer renderer, int vRow, |
|
170 int vCol) { |
|
171 |
|
172 Component c = super.prepareRenderer(renderer, vRow, vCol); |
|
173 |
|
174 boolean enabled = isCellSelected(vRow, vCol); |
|
175 if (!enabled) { |
|
176 TreeTableModelAdapter adapter = getModel(); |
|
177 |
|
178 int mRow = convertRowIndexToModel(vRow); |
|
179 int mCol = convertColumnIndexToModel(vCol); |
|
180 |
|
181 ManagedObjectTreeNode node = |
|
182 (ManagedObjectTreeNode)adapter.getTreeNode(mRow); |
|
183 |
|
184 ManagedObjectTreeTableModel model = |
|
185 (ManagedObjectTreeTableModel)adapter.getTreeTableModel(); |
|
186 |
|
187 enabled = model.isCellEnabled(node, mCol); |
|
188 } |
|
189 |
|
190 c.setEnabled(enabled); |
|
191 |
|
192 return c; |
|
193 } |
|
194 |
|
195 // |
|
196 // ManagedObjectTreeTable methods |
|
197 // |
|
198 |
|
199 public List<ManagedObject> getSelectedObjects() { |
|
200 TreeTableModelAdapter adapter = getModel(); |
|
201 int[] sRows = getSelectedRows(); |
|
202 |
|
203 List<ManagedObject> objects = |
|
204 new ArrayList<ManagedObject>(sRows.length); |
|
205 |
|
206 for (int i = 0; i < sRows.length; i++) { |
|
207 int index = convertRowIndexToModel(sRows[i]); |
|
208 ManagedObjectTreeNode node = |
|
209 (ManagedObjectTreeNode)adapter.getTreeNode(index); |
|
210 objects.add(node.getUserObject()); |
|
211 } |
|
212 |
|
213 return objects; |
|
214 } |
|
215 |
|
216 public JPopupMenu getPopupMenu() { |
|
217 return popup; |
|
218 } |
|
219 |
|
220 public void showPopup(int x, int y) { |
|
221 JPopupMenu popup = getPopupMenu(); |
|
222 if (popup != null) { |
|
223 popup.show(this, x, y); |
|
224 } |
|
225 } |
|
226 |
|
227 // |
|
228 // Private methods |
|
229 // |
|
230 |
|
231 private void setCustomRendererEditor(int col) { |
|
232 ManagedObjectTreeTableModel model = |
|
233 (ManagedObjectTreeTableModel)getModel().getTreeTableModel(); |
|
234 TableColumnModel cModel = getColumnModel(); |
|
235 |
|
236 TableCellEditor editor = model.getTableCellEditor(col); |
|
237 if (editor != null) { |
|
238 cModel.getColumn(col).setCellEditor(editor); |
|
239 } |
|
240 |
|
241 TableCellRenderer renderer = model.getTableCellRenderer(col); |
|
242 if (renderer != null) { |
|
243 cModel.getColumn(col).setCellRenderer(renderer); |
|
244 } |
|
245 } |
|
246 } |
|