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.Dimension;
24 import java.awt.GridLayout;
25 import java.awt.event.ActionEvent;
26 import java.awt.event.ActionListener;
27 import java.awt.event.ComponentAdapter;
28 import java.awt.event.ComponentEvent;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.HashMap;
33 import java.util.Iterator;
34 import java.util.Map;
35
36 import javax.swing.AbstractButton;
37 import javax.swing.ButtonGroup;
38 import javax.swing.JCheckBox;
39 import javax.swing.JPanel;
40
41 import coras.structure.ViewpointEnum;
42
43 /***
44 * @author fvr
45 *
46 * TODO To change the template for this generated type comment go to
47 * Window - Preferences - Java - Code Style - Code Templates
48 */
49 public class ViewpointPanel extends JPanel {
50
51 public static final String SELECTED_VIEWPOINTS = "selectedViewpoints";
52
53 private ButtonGroup buttonGroup = new ButtonGroup();
54 private Map buttonMap = new HashMap();
55 private boolean allowMultipleViewpoints = true;
56 private boolean editable = true;
57
58 private int minWidth = 0;
59 private int minHeight = 0;
60 private int numButtons = ViewpointEnum.VALUES.size();
61 private GridLayout layout = new GridLayout(numButtons, 1);
62 /***
63 * This is the default constructor
64 */
65 public ViewpointPanel() {
66 super();
67 initialize();
68 }
69
70
71
72
73 public Dimension getMinimumSize() {
74 Dimension d = super.getMinimumSize();
75 d.width = minWidth + 2 * layout.getHgap();
76 return d;
77 }
78
79 public ViewpointEnum[] getViewpoints() {
80 Collection result = new ArrayList();
81 for (Iterator i = buttonMap.keySet().iterator(); i.hasNext(); ) {
82 ViewpointEnum viewpoint = (ViewpointEnum) i.next();
83 AbstractButton button = (AbstractButton) buttonMap.get(viewpoint);
84 if (button.isSelected()) {
85 result.add(viewpoint);
86 }
87 }
88 return (ViewpointEnum[]) result.toArray(new ViewpointEnum[0]);
89 }
90
91 public ViewpointEnum getViewpoint() {
92 ViewpointEnum[] viewpoints = getViewpoints();
93 if (viewpoints.length == 0) {
94 return null;
95 } else {
96
97 return viewpoints[0];
98 }
99 }
100
101 /***
102 * @param viewpointArray
103 */
104 public void setViewpoints(ViewpointEnum[] viewpointArray) {
105 if (viewpointArray == null) {
106 viewpointArray = new ViewpointEnum[0];
107 }
108 Collection viewpoints = Arrays.asList(viewpointArray);
109 for (Iterator i = buttonMap.keySet().iterator(); i.hasNext();) {
110 ViewpointEnum viewpoint = (ViewpointEnum) i.next();
111 AbstractButton button = (AbstractButton) buttonMap.get(viewpoint);
112 button.setSelected(viewpoints.contains(viewpoint));
113 }
114 }
115
116 public boolean isEditable() {
117 return editable;
118 }
119
120 /***
121 * @param editable
122 */
123 public synchronized void setEditable(boolean editable) {
124 if (this.editable == editable) {
125 return;
126 }
127 this.editable = editable;
128 for (Iterator i = buttonMap.values().iterator(); i.hasNext();) {
129 AbstractButton button = (AbstractButton) i.next();
130 button.setEnabled(editable);
131 }
132 }
133
134 public boolean isAllowMultipleViewpoints() {
135 return allowMultipleViewpoints = false;
136 }
137
138 public synchronized void setAllowMultipleViewpoints(boolean enable) {
139 if (allowMultipleViewpoints == enable) {
140 return;
141 }
142 allowMultipleViewpoints = enable;
143 for (Iterator i = buttonMap.values().iterator(); i.hasNext();) {
144 AbstractButton button = (AbstractButton) i.next();
145 if (allowMultipleViewpoints) {
146 buttonGroup.remove(button);
147 } else {
148 buttonGroup.add(button);
149 }
150 }
151 }
152
153 private void recalculateSize() {
154 Dimension size = getSize();
155 int width = Math.max(size.width, minWidth + 2 * layout.getHgap());
156 int cols = (width - layout.getHgap()) / (minWidth + layout.getHgap());
157 int rows = ((numButtons - 1) / cols) + 1;
158 if (layout.getColumns() != cols || layout.getRows() != rows) {
159 layout.setColumns(cols);
160 layout.setRows(rows);
161 this.revalidate();
162 }
163 }
164
165 /***
166 * This method initializes this
167 *
168 * @return void
169 */
170 private void initialize() {
171 this.setLayout(layout);
172 this.setSize(300, 200);
173 for (Iterator i = ViewpointEnum.VALUES.iterator(); i.hasNext();) {
174 ViewpointEnum viewpoint = (ViewpointEnum) i.next();
175 AbstractButton button = new JCheckBox();
176 button.setEnabled(editable);
177 button.setText(viewpoint.toString());
178 buttonMap.put(viewpoint, button);
179 add(button);
180
181 Dimension size = button.getMinimumSize();
182 if (size.width > minWidth) {
183 minWidth = size.width;
184 }
185 if (size.height > minHeight) {
186 minHeight = size.height;
187 }
188
189 button.addActionListener(new ActionListener() {
190 public void actionPerformed(ActionEvent e) {
191
192 firePropertyChange(SELECTED_VIEWPOINTS, null, getViewpoints());
193 }
194 });
195 }
196 this.addComponentListener(new ComponentAdapter() {
197 public void componentResized(ComponentEvent e) {
198 recalculateSize();
199 }
200 });
201 }
202
203 }