001         package com.croftsoft.core.gui;
002    
003         import java.awt.*;
004         import java.awt.event.*;
005         import javax.swing.*;
006    
007         import com.croftsoft.core.lang.StringLib;
008         import com.croftsoft.core.security.Authentication;
009         import com.croftsoft.core.security.Identifier;
010    
011         /*********************************************************************
012         * Prompts the user for a username/password pair.
013         *
014         * <p />
015         *
016         * @version
017         *   2001-08-16
018         * @since
019         *   2001-07-30
020         * @author
021         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
022         *********************************************************************/
023    
024         public final class  IdentifierDialog
025           extends JDialog
026           implements ActionListener, Identifier, KeyListener, Runnable
027         //////////////////////////////////////////////////////////////////////
028         //////////////////////////////////////////////////////////////////////
029         {
030    
031         private static final int  FIELD_WIDTH = 10;
032    
033         //
034    
035         private JTextField      usernameField;
036    
037         private JPasswordField  passwordField;
038    
039         private final JButton   okButton;
040    
041         private boolean         isOk;
042    
043         //////////////////////////////////////////////////////////////////////
044         //////////////////////////////////////////////////////////////////////
045    
046         public static void  main ( String [ ]  args )
047         //////////////////////////////////////////////////////////////////////
048         {
049           JFrame  jFrame = new JFrame ( "frame" );
050    
051           WindowLib.centerOnScreen ( jFrame, 0.8 );
052    
053           jFrame.setVisible ( true );
054    
055           IdentifierDialog  identifierDialog = new IdentifierDialog (
056             jFrame,
057             "title",
058             "",
059             null,
060             null );
061    
062           System.out.println ( identifierDialog.getAuthentication ( ) );
063    
064           System.exit ( 0 );
065         }
066    
067         //////////////////////////////////////////////////////////////////////
068         //////////////////////////////////////////////////////////////////////
069    
070         public  IdentifierDialog (
071           Frame   frame,
072           String  title,
073           String  username,
074           Color   panelBackgroundColor,
075           Color   textFieldBackgroundColor )
076         //////////////////////////////////////////////////////////////////////
077         {
078           super ( frame, title, true ); // modal
079    
080           if ( panelBackgroundColor != null )
081           {
082             setBackground ( panelBackgroundColor );
083           }
084    
085           Container  contentPane = getContentPane ( );
086    
087           contentPane.setLayout ( new GridBagLayout ( ) );
088    
089           GridBagConstraints  gridBagConstraints = new GridBagConstraints ( );
090    
091           gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
092    
093    //     gridBagConstraints.ipadx = 10;
094    
095    //     gridBagConstraints.ipady = 10;
096    
097           gridBagConstraints.insets = new Insets ( 10, 10, 10, 10 );
098    
099           //
100    
101           if ( StringLib.trimToNull ( username ) == null )
102           {
103             addUsernameField ( username,
104               contentPane, gridBagConstraints, textFieldBackgroundColor );
105    
106             addPasswordField (
107               contentPane, gridBagConstraints, textFieldBackgroundColor );
108           }
109           else
110           {
111             addPasswordField (
112               contentPane, gridBagConstraints, textFieldBackgroundColor );
113    
114             addUsernameField ( username,
115               contentPane, gridBagConstraints, textFieldBackgroundColor );
116           }
117    
118           //
119    
120           gridBagConstraints.gridx = 0;
121    
122           gridBagConstraints.gridy = 2;
123    
124           gridBagConstraints.weightx = 0.0;
125    
126           JButton  cancelButton = new JButton ( "Cancel" );
127    
128           cancelButton.addActionListener ( this );
129    
130           contentPane.add ( cancelButton, gridBagConstraints );
131    
132           gridBagConstraints.gridx = 1;
133    
134           gridBagConstraints.gridy = 2;
135    
136           okButton = new JButton ( "OK" );
137    
138           okButton.addActionListener ( this );
139    
140           contentPane.add ( okButton, gridBagConstraints );
141    
142           //
143    
144           pack ( );
145         }
146    
147         //////////////////////////////////////////////////////////////////////
148         //////////////////////////////////////////////////////////////////////
149    
150         public Authentication  getAuthentication ( )
151         //////////////////////////////////////////////////////////////////////
152         {
153           WindowLib.centerAboveParent ( this );
154    
155           okButton.setEnabled ( false );
156    
157           isOk = false;
158           
159           passwordField.setText ( "" );
160    
161           setVisible ( true );
162    
163           if ( !isOk )
164           {
165             return null;
166           }
167    
168           String  username = usernameField.getText ( );
169    
170           char [ ]  chars = passwordField.getPassword ( );
171    
172           String  password = new String ( chars );
173    
174           passwordField.setText ( "" );
175    
176           for ( int  i = 0; i < chars.length; i++ )
177           {
178             chars [ i ] = 0;
179           }
180    
181           return new Authentication ( username, password );
182         }
183    
184         public void  actionPerformed ( ActionEvent  actionEvent )
185         //////////////////////////////////////////////////////////////////////
186         {
187           Object  source = actionEvent.getSource ( );
188    
189           if ( source == okButton )
190           {
191             isOk = true;
192           }
193    
194           SwingUtilities.invokeLater ( this );
195         }
196    
197         public void  run ( )
198         //////////////////////////////////////////////////////////////////////
199         {
200           setVisible ( false );
201         }
202    
203         //////////////////////////////////////////////////////////////////////
204         //////////////////////////////////////////////////////////////////////
205    
206         public void  keyPressed ( KeyEvent  keyEvent )
207         //////////////////////////////////////////////////////////////////////
208         {
209         }
210    
211         public void  keyReleased ( KeyEvent  keyEvent )
212         //////////////////////////////////////////////////////////////////////
213         {
214         }
215    
216         public synchronized void  keyTyped ( KeyEvent  keyEvent )
217         //////////////////////////////////////////////////////////////////////
218         {
219           SwingUtilities.invokeLater (
220             new Runnable ( )
221             {
222               public void  run ( ) { checkFields ( ); }
223             } );
224         }
225    
226         //////////////////////////////////////////////////////////////////////
227         //////////////////////////////////////////////////////////////////////
228    
229         private void  addUsernameField (
230           String              username,
231           Container           contentPane,
232           GridBagConstraints  gridBagConstraints,
233           Color               textFieldBackgroundColor )
234         //////////////////////////////////////////////////////////////////////
235         {
236           gridBagConstraints.gridx   = 0;
237    
238           gridBagConstraints.gridy   = 0;
239    
240           gridBagConstraints.weightx = 0.0;
241    
242           gridBagConstraints.fill    = GridBagConstraints.NONE;
243    
244           contentPane.add ( new JLabel ( "Username" ), gridBagConstraints );
245    
246           usernameField = new JTextField ( FIELD_WIDTH );
247    
248           usernameField.addKeyListener ( this );
249    
250           if ( username != null )
251           {
252             usernameField.setText ( username );
253           }
254    
255           gridBagConstraints.gridx   = 1;
256    
257           gridBagConstraints.weightx = 1.0;
258    
259           gridBagConstraints.fill    = GridBagConstraints.HORIZONTAL;
260    
261           if ( textFieldBackgroundColor != null )
262           {
263             usernameField.setBackground ( textFieldBackgroundColor );
264           }
265    
266           contentPane.add ( usernameField, gridBagConstraints );
267         }
268    
269         private void  addPasswordField (
270           Container           contentPane,
271           GridBagConstraints  gridBagConstraints,
272           Color               textFieldBackgroundColor )
273         //////////////////////////////////////////////////////////////////////
274         {
275           gridBagConstraints.gridx   = 0;
276    
277           gridBagConstraints.gridy   = 1;
278    
279           gridBagConstraints.weightx = 0.0;
280    
281           gridBagConstraints.fill    = GridBagConstraints.NONE;
282    
283           contentPane.add ( new JLabel ( "Password" ), gridBagConstraints );
284    
285           passwordField = new JPasswordField ( FIELD_WIDTH );
286    
287           passwordField.addKeyListener ( this );
288    
289           gridBagConstraints.gridx   = 1;
290    
291           gridBagConstraints.weightx = 1.0;
292    
293           gridBagConstraints.fill    = GridBagConstraints.HORIZONTAL;
294    
295           if ( textFieldBackgroundColor != null )
296           {
297             passwordField.setBackground ( textFieldBackgroundColor );
298           }
299    
300           contentPane.add ( passwordField, gridBagConstraints );
301         }
302    
303         private synchronized void  checkFields ( )
304         //////////////////////////////////////////////////////////////////////
305         {
306           String  username = usernameField.getText ( );
307    
308           char [ ]  password = passwordField.getPassword ( );
309    
310           okButton.setEnabled (
311                ( username != null )
312             && !"".equals ( username.trim ( ) )
313             && ( password != null )
314             && ( password.length > 0 ) );
315         }
316    
317         //////////////////////////////////////////////////////////////////////
318         //////////////////////////////////////////////////////////////////////
319         }