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