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