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