1 package org.jdesktop.swing.auth; 2 3 9 10 import java.awt.BorderLayout ; 11 import java.awt.Cursor ; 12 import java.awt.Frame ; 13 import java.awt.GridBagConstraints ; 14 import java.awt.GridBagLayout ; 15 import java.awt.GridLayout ; 16 import java.awt.Insets ; 17 import java.awt.event.ActionEvent ; 18 import java.awt.event.ActionListener ; 19 import java.awt.event.FocusEvent ; 20 import java.awt.event.FocusListener ; 21 import java.util.Enumeration ; 22 import java.util.EventObject ; 23 import java.util.HashMap ; 24 import java.util.MissingResourceException ; 25 import java.util.ResourceBundle ; 26 import javax.swing.JButton ; 27 import javax.swing.JCheckBox ; 28 import javax.swing.JComboBox ; 29 import javax.swing.JComponent ; 30 import javax.swing.JDialog ; 31 import javax.swing.JFrame ; 32 import javax.swing.JLabel ; 33 import javax.swing.JOptionPane ; 34 import javax.swing.JPanel ; 35 import javax.swing.JPasswordField ; 36 import javax.swing.JProgressBar ; 37 import javax.swing.UIManager ; 38 39 58 59 public class JXLoginPanel extends JPanel { 60 61 64 private static final long serialVersionUID = 3544949969896288564L; 65 66 private JLabel nameLabel; 67 68 private JLabel passwordLabel; 69 70 private JComboBox nameField; 71 72 private String username; 73 74 private JPasswordField passwordField; 75 76 private JCheckBox save; 77 78 private JComponent header; 79 80 private JComponent label; 81 82 private static JButton okButton; 83 84 private static JButton cancelButton; 86 87 private JPanel loginPanel; 88 89 private JPanel savePanel; 90 91 private JPanel headerPanel; 92 93 private LoginService loginService; 94 95 private PasswordStore passwordStore; 96 97 private UsernameStore usernameStore; 98 99 private Handler handler = new Handler(); 100 101 private static HashMap <String , Object > _resources; 103 104 107 private int saveMode; 108 109 112 public static final int SAVE_NONE = 0; 113 114 117 public static final int SAVE_PASSWORD = 1; 118 119 122 public static final int SAVE_USERNAME = 2; 123 124 127 128 static { 129 130 133 String keys[] = { "okString", "okString.mnemonic", 134 "cancelString", "cancelString.mnemonic", 135 "nameString", "loginString", 136 "passwordString","rememberUserString", 137 "rememberPasswordString", "loggingInString", }; 138 139 String className = JXLoginPanel.class.getCanonicalName(); 140 String lookup; 141 for (String key : keys) { 142 lookup = className + "." + key; 143 if (UIManager.getString(lookup) == null) { 144 UIManager.put(lookup, getResourceAsObject(key)); 145 } 146 } 147 } 148 149 public JXLoginPanel() { 150 this(null, null, null, null, null, null); 151 } 152 153 161 public JXLoginPanel(String name, String password, LoginService service, 162 PasswordStore store) { 163 this(name, password, service, store, null, null); 164 } 165 166 176 public JXLoginPanel(String name, String password, LoginService service, 177 PasswordStore store, JComponent header, JComponent label) { 178 loginService = service; 179 passwordStore = store; 180 this.username = name; 181 this.header = header; 182 this.label = label; 183 service.addLoginListener(new SaveListener()); 184 init(name, password); 185 } 186 187 void init(String nameStr, String passwordStr) { 188 usernameStore = UsernameStore.getUsernameStore(); 189 if (username != null) { 190 usernameStore.addUsername(username); 191 } 192 setLayout(new BorderLayout (5, 5)); 193 createLoginPanel(nameStr, passwordStr); 194 add(loginPanel, BorderLayout.CENTER); 195 add(headerPanel, BorderLayout.NORTH); 196 } 197 198 void createLoginPanel(String nameStr, String passwordStr) { 199 200 String className = JXLoginPanel.class.getCanonicalName(); 201 202 nameLabel = new JLabel (UIManager.getString(className + "." + "nameString")); 203 passwordLabel = new JLabel (UIManager.getString(className + "." + "passwordString")); 204 205 loginPanel = new JPanel (); 206 207 savePanel = new JPanel (); 208 savePanel.setLayout(new GridBagLayout ()); 209 headerPanel = new JPanel (); 210 211 headerPanel.setLayout(new GridBagLayout ()); 212 213 GridBagConstraints gbc = new GridBagConstraints (); 214 nameField = new JComboBox (usernameStore.getUsernames()); nameField.setEditable(true); 216 nameField.addActionListener(handler); 217 nameField.addFocusListener(handler); 218 219 passwordField = new JPasswordField (passwordStr, 15); 220 221 gbc.gridx = 0; 222 gbc.gridy = 0; 223 gbc.fill = GridBagConstraints.NONE; 224 gbc.insets = new Insets (12, 12, 5, 12); 225 gbc.anchor = GridBagConstraints.WEST; 226 loginPanel.setLayout(new GridBagLayout ()); 227 loginPanel.add(nameLabel, gbc); 228 229 gbc.gridx = 1; 230 gbc.insets = new Insets (12, 0, 5, 11); 231 gbc.anchor = GridBagConstraints.WEST; 232 gbc.fill = GridBagConstraints.HORIZONTAL; 233 loginPanel.add(nameField, gbc); 234 235 gbc.gridy++; 236 gbc.gridx = 0; 237 gbc.insets = new Insets (0, 12, 6, 12); 238 gbc.anchor = GridBagConstraints.WEST; 239 gbc.fill = GridBagConstraints.NONE; 240 loginPanel.add(passwordLabel, gbc); 241 242 gbc.gridx = 1; 243 gbc.insets = new Insets (0, 0, 5, 11); 244 gbc.anchor = GridBagConstraints.WEST; 245 gbc.fill = GridBagConstraints.HORIZONTAL; 246 loginPanel.add(passwordField, gbc); 247 248 gbc.gridy++; 249 gbc.gridx = 1; 250 gbc.fill = GridBagConstraints.NONE; 251 loginPanel.add(savePanel, gbc); 252 253 gbc.gridx = 0; 254 gbc.gridy = 0; 255 if (header != null) { 256 gbc.insets = new Insets (0, 0, 0, 0); 257 gbc.anchor = GridBagConstraints.WEST; 258 gbc.fill = GridBagConstraints.HORIZONTAL; 259 headerPanel.add(header, gbc); 260 gbc.gridy++; 261 } 262 if (label != null) { 263 gbc.insets = new Insets (12, 12, 0, 0); 264 headerPanel.add(label, gbc); 265 } 266 267 } 268 269 274 class SaveListener implements LoginListener { 275 public void loginFailed(EventObject source) { 276 } 277 278 public void loginSucceeded(EventObject source) { 279 if (getSaveMode() == SAVE_PASSWORD) { 280 savePassword(); 281 } else if (getSaveMode() == SAVE_USERNAME) { 282 usernameStore.addUsername(username); 283 usernameStore.saveUsernames(); 284 } 285 } 286 287 public void loginStarted(EventObject source) { 288 } 289 290 public void loginCanceled(EventObject source) { 291 } 292 } 293 294 void savePassword() { 295 if (passwordStore != null) { 296 passwordStore.set(getUserName(),getLoginService().getServer(),getPassword()); 297 } 298 } 299 300 private class Handler implements ActionListener , FocusListener { 301 public void actionPerformed(ActionEvent ae) { 302 if (ae.getSource() == nameField) { 303 username = (String ) nameField.getSelectedItem(); 304 } 305 } 306 307 public void focusGained(FocusEvent e) { 308 309 } 310 311 public void focusLost(FocusEvent e) { 312 if (e.getSource() == nameField) { 313 username = (String ) nameField.getSelectedItem(); 314 } 315 } 316 } 317 318 private static class DialogHelper implements LoginListener, ActionListener { 319 JDialog dialog; 320 321 JXLoginPanel loginPanel; 322 323 JPanel buttonPanel; 324 325 JPanel mainPanel; 326 327 LoginService service; 328 329 private JPanel progressPanel; 330 331 private JProgressBar progressBar; 332 333 private JButton loginCancelButton; 334 335 private boolean cancelled; 336 337 DialogHelper(Frame frame, JXLoginPanel panel, LoginService service) { 338 String className = JXLoginPanel.class.getCanonicalName(); 339 this.loginPanel = panel; 340 this.service = service; 341 progressPanel = createProgressPanel(); 342 dialog = new JDialog (frame, UIManager.getString(className + "." + "loginString")); 343 service.addLoginListener(this); 344 okButton = new JButton (UIManager.getString(className + "." + "okString")); 345 okButton.setMnemonic(UIManager.getInt(className + "." + "okString.mnemonic")); 346 okButton.addActionListener(this); 347 cancelButton = new JButton (UIManager.getString(className + "." + "cancelString")); 348 cancelButton.setMnemonic(UIManager.getInt(className + "." + "cancelString.mnemonic")); 349 cancelButton.addActionListener(this); 350 buttonPanel = new JPanel (); 351 JPanel innerPanel = new JPanel (); 352 innerPanel.setLayout(new GridLayout (1,2)); 353 buttonPanel.setLayout(new java.awt.GridBagLayout ()); 354 355 GridBagConstraints gridBagConstraints = new GridBagConstraints (); 356 gridBagConstraints.gridx = 1; 357 gridBagConstraints.gridy = 0; 358 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 359 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 360 gridBagConstraints.insets = new java.awt.Insets (17, 5, 11, 11); 361 innerPanel.add(okButton); 362 innerPanel.add(cancelButton); 363 buttonPanel.add(innerPanel, gridBagConstraints); 364 365 gridBagConstraints.gridx = 0; 366 gridBagConstraints.gridy = 0; 367 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 368 gridBagConstraints.weightx = 1.0; 369 buttonPanel.add(new JLabel (), gridBagConstraints); 370 371 mainPanel = new JPanel (); 372 mainPanel.setLayout(new BorderLayout ()); 373 mainPanel.add(loginPanel, BorderLayout.CENTER); 374 mainPanel.add(buttonPanel, BorderLayout.SOUTH); 375 dialog.add(mainPanel); 376 377 dialog.getRootPane().setDefaultButton(okButton); 378 dialog.pack(); 379 dialog.setModal(true); 380 dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 381 } 382 383 JPanel createProgressPanel() { 384 String className = JXLoginPanel.class.getCanonicalName(); 385 JPanel panel = new JPanel (); 386 panel.setLayout(new GridBagLayout ()); 387 GridBagConstraints gbc = new GridBagConstraints (); 388 gbc.insets = new Insets (8, 8, 8, 8); 389 gbc.gridx = 0; 390 gbc.gridy = 0; 391 progressBar = new JProgressBar (); 392 panel.add(new JLabel (UIManager.getString(className + "." +"loggingInString")), gbc); 393 gbc.gridy = 1; 394 panel.add(progressBar, gbc); 395 gbc.gridy = 2; 396 loginCancelButton = new JButton (UIManager.getString(className + "." + "cancelString")); 397 loginCancelButton.addActionListener(this); 398 panel.add(loginCancelButton, gbc); 399 return panel; 400 } 401 402 public void show() { 403 dialog.setVisible(true); 404 } 405 406 public void loginFailed(EventObject source) { 407 finishedLogin(false); 408 JOptionPane.showMessageDialog(dialog, "Login failed !"); 409 410 } 411 412 public void loginSucceeded(EventObject source) { 413 finishedLogin(true); 414 JOptionPane.showMessageDialog(dialog, "Login Succeeded !"); 415 dialog.dispose(); 416 } 417 418 public void loginStarted(EventObject source) { 419 420 } 421 422 425 void startLogin() { 426 cancelled = false; 427 dialog.remove(mainPanel); 428 progressBar.setIndeterminate(true); 429 dialog.add(progressPanel); 430 loginPanel.setCursor(new Cursor (Cursor.WAIT_CURSOR)); 431 dialog.pack(); 432 String name = loginPanel.getUserName(); 433 char[] password = loginPanel.getPassword(); 434 service.startAuthentication(name, password, null); 435 } 436 437 void finishedLogin(boolean result) { 438 progressBar.setIndeterminate(false); 439 dialog.remove(progressPanel); 440 dialog.add(mainPanel); 441 dialog.pack(); 442 loginPanel.setCursor(new Cursor (Cursor.DEFAULT_CURSOR)); 443 } 444 445 void cancelAuthentication() { 446 service.cancelAuthentication(); 447 progressBar.setIndeterminate(false); 448 dialog.remove(progressPanel); 449 dialog.add(mainPanel); 450 dialog.pack(); 451 loginPanel.setCursor(new Cursor (Cursor.DEFAULT_CURSOR)); 452 } 453 454 public void loginCanceled(EventObject source) { 455 cancelled = true; 456 } 457 458 public void actionPerformed(ActionEvent ae) { 459 Object source = ae.getSource(); 460 if (source == okButton) { 461 startLogin(); 462 } else if (source == loginCancelButton) { 463 cancelAuthentication(); 464 } else if (source == cancelButton) { 465 dialog.dispose(); 466 } 467 } 468 } 469 470 480 public static void showLoginDialog(Frame frame, String name, 481 String password, LoginService service, PasswordStore store, 482 int saveMode) { 483 showLoginDialog(frame, name, password, service, store, null, null, 484 saveMode); 485 } 486 487 499 public static void showLoginDialog(Frame frame, String name, 500 String password, LoginService service, PasswordStore store, 501 JComponent header, JComponent label, int saveMode) { 502 JXLoginPanel loginPanel = new JXLoginPanel(name, password, service, 503 store, header, label); 504 loginPanel.setSaveMode(saveMode); 505 DialogHelper helper = new DialogHelper(frame, loginPanel, service); 506 helper.show(); 507 } 508 509 517 518 519 static String getResourceBundleName() { 520 Package package1 = JXLoginPanel.class.getPackage(); 521 return package1 == null ? "resources.Resources" : package1.getName() 522 + ".resources.Resources"; 523 } 524 525 static String getResourceAsString(String key) { 526 Object value = getResourceAsObject(key); 527 return value.toString(); 528 } 529 530 static int getResourceAsInt(String key) throws NumberFormatException { 531 Object value = getResourceAsObject(key); 532 if (value instanceof Integer ) { 533 return ((Integer ) value).intValue(); 534 } 535 return Integer.parseInt(value.toString()); 536 } 537 538 static Object getResourceAsObject(String key) 539 throws MissingResourceException { 540 synchronized (JXLoginPanel.class) { 541 if (_resources == null) { 542 _resources = new HashMap <String , Object >(); 543 ResourceBundle bundle = ResourceBundle 544 .getBundle(getResourceBundleName()); 545 Enumeration bundleKeys = bundle.getKeys(); 546 while (bundleKeys.hasMoreElements()) { 547 String resourceKey = (String ) bundleKeys.nextElement(); 548 _resources.put(resourceKey, bundle.getObject(resourceKey)); 549 } 550 } 551 } 552 return _resources.get(key); 553 } 554 555 558 public int getSaveMode() { 559 return saveMode; 560 } 561 562 565 public void setSaveMode(int saveMode) { 566 this.saveMode = saveMode; 567 savePanel.removeAll(); 568 String className = JXLoginPanel.class.getCanonicalName(); 569 if (saveMode == SAVE_PASSWORD) { 570 save = new JCheckBox (UIManager.getString(className + "." + "rememberPasswordString"), 571 passwordStore != null ? true : false); 572 savePanel.add(save); 573 } else { 574 save = new JCheckBox (UIManager.getString(className + "." +"rememberUserString"), 575 passwordStore != null ? true : false); 576 savePanel.add(save); 577 } 578 579 } 580 581 586 public void setLoginService(LoginService service) { 587 loginService = service; 588 } 589 590 595 public LoginService getLoginService() { 596 return loginService; 597 } 598 599 604 public void setPasswordStore(PasswordStore store) { 605 passwordStore = store; 606 } 607 608 613 public PasswordStore getPasswordStore() { 614 return passwordStore; 615 } 616 617 622 public void setUserName(String username) { 623 nameField.setSelectedItem(username); 624 } 625 626 631 public String getUserName() { 632 if (username == null) { 633 username = (String ) nameField.getSelectedItem(); 634 } 635 return username; 636 } 637 638 643 public void setPassword(char[] password) { 644 passwordField.setText(new String (password)); 645 } 646 647 652 public char[] getPassword() { 653 return passwordField.getPassword(); 654 } 655 656 } | Popular Tags |