package com.towel.login; import java.awt.Component; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import com.towel.role.RoleManager; import com.towel.swing.ModalWindow; import com.towel.util.Pair; @SuppressWarnings("unused") public class LoginScreen { private JDialog screen; private JTextField username; private JPasswordField password; @com.towel.awt.ann.Action(method = "login") private JButton login; @com.towel.awt.ann.Action(method = "close") private JButton close; private LoginListener listener; private List<Pair<Manager, Object>> list; private WindowListener wListener = new WindowAdapter() { @Override public void windowClosed(WindowEvent arg0) { listener.close(); } @Override public void windowClosing(WindowEvent arg0) { listener.close(); } }; public LoginScreen(Component parent) { list = new ArrayList<Pair<Manager, Object>>(); screen = ModalWindow.createDialog(parent, "Login"); JPanel content = new JPanel(new GridLayout(3, 2)); content.add(new JLabel("Username:")); content.add(username = new JTextField(12)); content.add(new JLabel("Password:")); content.add(password = new JPasswordField(12)); content.add(login = new JButton("Login")); content.add(close = new JButton("Close")); screen.setContentPane(content); screen.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); screen.pack(); screen.getRootPane().setDefaultButton(login); new com.towel.awt.ann.ActionManager(this); screen.addWindowListener(wListener); } public void whenLogin(Manager manager, Object instance) { list.add(new Pair<Manager, Object>(manager, instance)); } public void showDialog() { screen.setLocationRelativeTo(screen.getParent()); screen.setVisible(true); } public void setLoginListener(LoginListener listener) { this.listener = listener; } private void close() { listener.close(); } private void login() { if (listener == null) return; try { User user = listener.login(username.getText(), new String(password.getPassword())); RoleManager manager = new RoleManager(user); for (Pair<Manager, Object> pair : list) pair.getFirst().manage(manager, pair.getSecond()); screen.removeWindowListener(wListener); screen.dispose(); } catch (CannotLoginException e) { JOptionPane.showMessageDialog(screen, e.getMessage()); } } public enum Manager { Annotated { public void manage(RoleManager manager, Object instance) { manager.manageAnnotated(instance); } }, NamedComps { public void manage(RoleManager manager, Object instance) { manager.manageNamedComps((Container) instance); } }; public abstract void manage(RoleManager manager, Object instance); } }