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