1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 import java.awt.*;
7 import java.awt.event.*;
8 import java.text.*;
9 import java.util.*;
10
11 /*
12 * This class creates a dialog box that helps the user select encryption types
13 * with some mouse clicks. The dialog box need only be created
14 * once. The Ok and Cancel buttons merely call setVisible with an
15 * argument of false.
16 */
17
18 // The layout will consist of 2 panels:
19 // topPanel contains the dynamic list of encryption type check boxes.
20 // bottomPanel contains the buttons ok, clear, cancel, and help.
21 // The two panels are separated by a LineSeparator.
22
23 public class EncListDialog extends Dialog {
24
25 private boolean save;
26
27 private int i;
28
29 private Frame parent;
30
31 private Button ok;
32 private Button clear;
33 private Button cancel;
34 private Button help;
35
36 private HelpDialog hd = null;
37
38 private Panel topPanel;
39 private Panel bottomPanel;
40
41 private static Toolkit toolkit = Toolkit.getDefaultToolkit();
42
43 private Kadmin kadmin;
44 private Checkbox cb[];
45 private Integer grp_num[];
46 private String encList = "";
47
48 // For I18N
49 private static ResourceBundle rb =
50 ResourceBundle.getBundle("GuiResource" /* NOI18N */);
51 private static ResourceBundle hrb =
52 ResourceBundle.getBundle("HelpData" /* NOI18N */);
53
54 /*
55 * Constructor that lays out the components and sets the different
56 * event handlers.
57 */
58 public EncListDialog(Frame parent, Color background, Color foreground,
59 Kadmin session) {
60 super(parent, getString("SEAM Encryption Type List Helper"),
61 true);
62
63 this.parent = parent;
64
65 this.kadmin = session;
66
67 setLayout(new GridBagLayout());
68 addCheckboxes();
69
70 addButtons();
71 setSize(250, 300);
72 setResizable(true);
73
74 addWindowListener(new DCWindowListener());
75 }
76
77 /*
78 * Adds the check boxes only
79 */
80 private void addCheckboxes() {
81
82 GridBagConstraints gbc = new GridBagConstraints();
83
84 gbc.weighty = 1;
85
86 topPanel = new Panel();
87 topPanel.setLayout(new GridBagLayout());
88 gbc.gridwidth = GridBagConstraints.REMAINDER;
89 gbc.fill = GridBagConstraints.BOTH;
90 gbc.anchor = GridBagConstraints.CENTER;
91 gbc.gridx = 0;
92 gbc.gridy = 0;
93 add(topPanel, gbc);
94
95 gbc.fill = GridBagConstraints.NONE;
96 gbc.anchor = GridBagConstraints.WEST;
97 gbc.gridx = 0;
98 gbc.gridwidth = 1;
99
100 String et[] = kadmin.getEncList();
101
102 cb = new Checkbox[et.length];
103 grp_num = new Integer[et.length];
104
105 for (int i = 0; i < et.length; i++) {
106 String[] grp_enc = et[i].split(" ");
107 cb[i] = new Checkbox(grp_enc[1]);
108 CBListener cbl = new CBListener();
109 cb[i].addItemListener(cbl);
110 grp_num[i] = new Integer(grp_enc[0]);
111 gbc.gridy = i;
112 topPanel.add(cb[i], gbc);
113 }
114 }
115
116 // Adds all the buttons
117 private void addButtons() {
118
119 GridBagConstraints gbc = new GridBagConstraints();
120 gbc.weighty = 1;
121
122 gbc.gridwidth = GridBagConstraints.REMAINDER;
123 gbc.gridheight = 1;
124 gbc.fill = GridBagConstraints.BOTH;
125 gbc.gridx = 0;
126 gbc.gridy = 2;
127 add(new LineSeparator(), gbc);
128
129 bottomPanel = new Panel();
130 ok = new Button(getString("OK"));
131 clear = new Button(getString("Clear"));
132 cancel = new Button(getString("Cancel"));
133 help = new Button(getString("Help"));
134 bottomPanel.add(ok);
135 bottomPanel.add(clear);
136 bottomPanel.add(cancel);
137 bottomPanel.add(help);
138 gbc.fill = GridBagConstraints.HORIZONTAL;
139 gbc.gridwidth = GridBagConstraints.REMAINDER;
140 gbc.gridx = 0;
141 gbc.gridy = 3;
142 add(bottomPanel, gbc);
143
144 DCButtonListener bl = new DCButtonListener();
145 ok.addActionListener(bl);
146 clear.addActionListener(bl);
147 cancel.addActionListener(bl);
148 help.addActionListener(bl);
149 }
150
151 /*
152 * Closes (hides) the dialog box when the user is done
153 * @param save true if the box is being dismissed by clicking on
154 * "ok" and the user wants to retain the modified value, false
155 * otherwise.
156 */
157 private void encListDialogClose(boolean save) {
158 this.save = save;
159 setVisible(false);
160 }
161
162 /*
163 * Checks if the user requested that the value in this
164 * EncListDialog be used e.g., by clicking on "Ok" instead of
165 * "Cancel."
166 * @return true if the user wants to save the value in the
167 * EncListDialog, false otherwise.
168 */
169
170 public boolean isSaved() {
171 return save;
172 }
173 /*
174 * Sets the current enc list for the principal during modification.
175 * @param enc types of current principal.
176 */
177 public void setEncTypes(String e_str) {
178
179 if (e_str.compareTo("") == 0)
180 return;
181
182 String[] e_list = e_str.split(" ");
183
184 for (int i = 0; i < e_list.length; i++) {
185 for (int j = 0; j < cb.length; j++) {
186 if (cb[j].getLabel().compareTo(e_list[i])
187 == 0) {
188 cb[j].setState(true);
189 break;
190 }
191 }
192 }
193 }
194
195 // ***********************************************
196 // I N N E R C L A S S E S F O L L O W
197 // ***********************************************
198
199 /*
200 * Listener for an annoying work around in deselection of a check box
201 * in case the user doesn't want any items in a grouped list.
202 */
203 private class CBListener implements ItemListener {
204
205 public void itemStateChanged(ItemEvent e) {
206 Checkbox c = (Checkbox) e.getItemSelectable();
207
208 if (e.getStateChange() == e.DESELECTED) {
209 c.setState(false);
210 } else if (e.getStateChange() == e.SELECTED) {
211 for (int i = 0; i < cb.length; i++) {
212 if (c == cb[i]) {
213 for (int j = 0; j < cb.length; j++) {
214 if (grp_num[j].equals(grp_num[i])
215 == true) {
216 cb[j].setState(false);
217 }
218 }
219 break;
220 }
221 }
222 c.setState(true);
223 // else what else is there
224 }
225 }
226 }
227
228 /*
229 * Listener for closing the dialog box through the window close
230 * menu.
231 */
232 private class DCWindowListener extends WindowAdapter {
233
234 public void windowClosing(WindowEvent e) {
235 encListDialogClose(false);
236 }
237 }
238
239 /*
240 * Listener for all the buttons. The listener is shared for the sake
241 * of reducing the number of overall listeners.
242 * TBD: I18N the help
243 */
244 private class DCButtonListener implements ActionListener {
245
246 public void actionPerformed(ActionEvent e) {
247 if (e.getSource() == ok) {
248 EncListDialog.this.encListDialogClose(true);
249 } else if (e.getSource() == cancel) {
250 EncListDialog.this.encListDialogClose(false);
251 } else if (e.getSource() == clear) {
252 for (int i = 0; i < cb.length; i++) {
253 cb[i].setState(false);
254 }
255 } else if (e.getSource() == help) {
256 if (hd != null)
257 hd.setVisible(true);
258 else {
259 hd = new HelpDialog(
260 EncListDialog.this.parent,
261 getString(
262 "Help for Encryption Type Dialog"),
263 false);
264 hd.setVisible(true);
265 hd.setText(getString(hrb,
266 "EncryptionTypeDialogHelp"));
267 }
268 }
269 } // actionPerformed
270 }
271
272 /*
273 * The string representation of the dialog box.
274 * @return a String which contians the encryption type list
275 */
276 public String toString() {
277
278 for (int i = 0; i < cb.length; i++) {
279 if (cb[i].getState() == true)
280 encList = encList.concat(cb[i].getLabel() +
281 " ");
282 }
283 return encList;
284 }
285
286 /*
287 * Call rb.getString(), but catch exception and return English
288 * key so that small spelling errors don't cripple the GUI
289 */
290 private static final String getString(String key) {
291 return (getString(rb, key));
292 }
293
294 private static final String getString(ResourceBundle rb, String key) {
295 try {
296 String res = rb.getString(key);
297 return res;
298 } catch (MissingResourceException e) {
299 System.out.println("Missing resource "+key+
300 ", using English.");
301 return key;
302 }
303 }
304 }