001 package users.stdforms; 002 003 import users.*; 004 import users.swing.*; 005 006 import sale.*; 007 008 import javax.swing.*; 009 import javax.swing.event.*; 010 011 import java.awt.*; 012 import java.awt.event.*; 013 014 import java.util.*; 015 016 /** 017 * FormSheet that can be used for log on procedures. The FormSheet will contain a 018 * {@link javax.swing.JComboBox} allowing to select from a range of user names and optionally a password 019 * input line. 020 * 021 * When the user clicks the "OK" button, the FormSheet checks if the password entered equals the 022 * password of the user selected. Prior to this, the password will be garbled using 023 * {@link User#garblePassWD the current global password garbler}. If the checking was successful, 024 * {@link #getResult} will return the selected user, otherwise it will return <code>null</code>.<p> 025 * 026 * <p>A typical use sequence would look something like that:</p> 027 * 028 * <pre> 029 * 030 * ... 031 * <b>LogOnForm lof = new LogOnForm ("Please log on", 032 * "Select your user name:", 033 * "Enter your password:", 034 * true, 035 * {@link UserManager#getGlobalUM UserManager.getGlobalUM()}, 036 * null, 037 * null);</b> 038 * 039 * ...setFormSheet (lof); 040 * 041 * if (<b>lof.getResult() != null</b>) { 042 * // do log on of user lof.getResult 043 * } 044 * ... 045 * 046 * </pre> 047 * 048 * @author Steffen Zschaler 049 * @version 2.0 28/07/1999 050 * @since v2.0 051 */ 052 public class LogOnForm extends FormSheet { 053 054 /** 055 * ID for serialization. 056 */ 057 private static final long serialVersionUID = 562705348163092614L; 058 059 /** 060 * The current user 061 * 062 * @serial 063 */ 064 private User m_uCurrent; 065 066 /** 067 * The current password. 068 * 069 * @serial 070 */ 071 private char[] m_sPassword; 072 073 /** 074 * True, if we asked a password. 075 * 076 * @serial 077 */ 078 private boolean m_fAskPassWd; 079 080 /** 081 * Resulting user. 082 * 083 * @serial 084 */ 085 private User m_uLogOnUser; 086 087 /** 088 * Converst a String to char[]-Array 089 * @param strValue the String to be converted 090 * @return the converted value as char[]-Array 091 */ 092 public static char[] getCharFromString(String strValue) { 093 char[] chReturn = new char[strValue.length()]; 094 int i; 095 for(i=0;i<strValue.length();i++) { 096 chReturn[i] = strValue.charAt(i); 097 } 098 return chReturn; 099 } 100 101 /** 102 * Create a new LogOnForm. Uses a {@link FormSheetContentCreator}. 103 * 104 * @param sCaption the caption of the {@link FormSheet}. 105 * @param sUserPrompt a string prompting the user to select his/her user name. 106 * @param sPassWdPrompt a string prompting the user to enter his/her password. May be <code>null</code> 107 * only if <i>fAskPassWd</i> is false. 108 * @param fAskPassWd if false no password is needed and selection of the user name is sufficient. 109 * @param um the UserManager that manages the users to select from. Normally the 110 * {@link UserManager#getGlobalUM global UserManager}. 111 * @param cmp a comparator that defines the order in which the user names appear. If <code>null</code>, 112 * users will be ordered by their names. 113 * @param uf a filter that allows only a subset of the users to be selected from. If <code>null</code>, 114 * no filtering will occur. 115 */ 116 public LogOnForm(String sCaption, final String sUserPrompt, final String sPassWdPrompt, 117 boolean fAskPassWd, final UserManager um, final Comparator<User> cmp, final UserFilter uf) { 118 super(sCaption, (JComponent)null, true); 119 120 m_fAskPassWd = fAskPassWd; 121 122 addContentCreator(new FormSheetContentCreator() { 123 private static final long serialVersionUID = -7167963803488450869L; 124 125 protected void createFormSheetContent(FormSheet fs) { 126 //JPanel jpForm = new JPanel(new GridLayout(((m_fAskPassWd) ? (2) : (1)), 2)); 127 JPanel jpForm = new JPanel(); 128 JPanel jpCaption = new JPanel(new GridLayout(((m_fAskPassWd) ? (2) : (1)), 1, 5, 5)); 129 JPanel jpBoxes = new JPanel(new GridLayout(((m_fAskPassWd) ? (2) : (1)), 1, 5, 5)); 130 jpForm.add(jpCaption); 131 jpForm.add(jpBoxes); 132 jpBoxes.setPreferredSize(new Dimension(100,50)); 133 //jpForm.add(new JLabel(sUserPrompt)); 134 jpCaption.add(new JLabel(sUserPrompt)); 135 136 UserComboBoxModel ucbmModel = new UserComboBoxModel(um, uf, cmp); 137 138 JComboBox jcb = new JComboBox(ucbmModel); 139 jcb.setRenderer(new JUserList.UserListCellRenderer()); 140 jcb.addItemListener(new ItemListener() { 141 public void itemStateChanged(ItemEvent e) { 142 if (e.getStateChange() == ItemEvent.SELECTED) { 143 m_uCurrent = (User)e.getItem(); 144 } else { 145 m_uCurrent = null; 146 } 147 } 148 }); 149 150 jpBoxes.add(jcb); 151 152 if (m_fAskPassWd) { 153 jpCaption.add(new JLabel(sPassWdPrompt)); 154 155 JTextField jtf = new JPasswordField(); 156 jtf.getDocument().addDocumentListener(new DocumentListener() { 157 public void changedUpdate(DocumentEvent e) { 158 try { 159 m_sPassword = getCharFromString(e.getDocument().getText(0, e.getDocument().getLength())); 160 } 161 catch (javax.swing.text.BadLocationException ex) {} 162 } 163 164 public void insertUpdate(DocumentEvent e) { 165 try { 166 m_sPassword = getCharFromString(e.getDocument().getText(0, e.getDocument().getLength())); 167 } 168 catch (javax.swing.text.BadLocationException ex) {} 169 } 170 171 public void removeUpdate(DocumentEvent e) { 172 try { 173 m_sPassword = getCharFromString(e.getDocument().getText(0, e.getDocument().getLength())); 174 } 175 catch (javax.swing.text.BadLocationException ex) {} 176 } 177 }); 178 179 jpBoxes.add(jtf); 180 } 181 182 fs.setComponent(jpForm); 183 } 184 }); 185 } 186 187 /** 188 * Return the user that was selected if any. Return <code>null</code> if no user was selected, the password 189 * was wrong or the FormSheet was cancelled. The value is only valid after the FormSheet was closed! 190 * 191 * @override Never 192 */ 193 public User getResult() { 194 return m_uLogOnUser; 195 } 196 197 /** 198 * Overridden to check the password input and make sure the selected user can be returned by 199 * {@link #getResult}. 200 * 201 * @override Never 202 */ 203 public void ok() { 204 if (m_uCurrent != null) { 205 // If no input occurred, the password string is null. We don't want to run into a 206 // NullPointerException, so we come up with a dummy password. 207 if (m_sPassword == null) { 208 m_sPassword = new char[0]; 209 } 210 if ((!m_fAskPassWd) || (m_uCurrent.isPassWd(User.garblePassWD(m_sPassword)))) { 211 m_uLogOnUser = m_uCurrent; 212 } 213 } 214 215 super.ok(); 216 } 217 }