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