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 	 */
EncListDialog(Frame parent, Color background, Color foreground, Kadmin session)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 	 */
addCheckboxes()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
addButtons()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 	 */
encListDialogClose(boolean save)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 
isSaved()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 	 */
setEncTypes(String e_str)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 
itemStateChanged(ItemEvent e)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 
windowClosing(WindowEvent e)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 
actionPerformed(ActionEvent e)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 	 */
toString()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 	 */
getString(String key)292 	private static final String getString(String key) {
293 		return (getString(rb, key));
294 	}
295 
getString(ResourceBundle rb, String key)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 }
307