package arcade.view.forms;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ResourceBundle;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import arcade.controller.Controller;
import arcade.exceptions.LoginErrorException;
import arcade.view.TextKeywords;
/**
* The initial view when the arcade is launched. Allows a user to login
* or create a new account.
*
* @author David Liu, Ellango
*
*/
@SuppressWarnings({ "unused", "serial" })
public class LoginView extends Account {
private static final String LOGO_FILENAME = "../../resources/images/VoogaLogo.png";
private static final int WINDOW_WIDTH = 260;
private static final int WINDOW_HEIGHT = 240;
/**
* Constructs the LoginView with a Controller and ResourceBundle
*
* @param controller to authenticate the login information
* @param resources to display text of appropriate language on screen
*/
public LoginView (Controller controller, ResourceBundle resources) {
super(controller, resources);
setPasswordFieldListener(new KeyAdapter() {
@Override
public void keyPressed (KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
login();
}
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
setLocationRelativeTo(null);
}
/**
* create the main logo and center it.
*/
private JComponent createLogo () {
JPanel panel = new JPanel();
ImageIcon headIcon = new ImageIcon(this.getClass().getResource(LOGO_FILENAME));
JLabel head = new JLabel(headIcon);
panel.add(head);
return panel;
}
/**
* Create the login and register buttons.
*
* @return
*/
private JComponent createButtons () {
JPanel buttonPanel = new JPanel();
JButton login = new JButton(getResources().getString(TextKeywords.LOGIN));
login.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent arg0) {
login();
}
});
buttonPanel.add(login);
JButton register = new JButton(getResources().getString(TextKeywords.REGISTER));
register.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent arg0) {
new RegisterView(getController(), getResources(), getUsername(), getPassword());
dispose();
}
});
buttonPanel.add(register);
resizeComponentWidths(buttonPanel);
return buttonPanel;
}
/**
* Finds the maximum preferred width for all components in a container,
* and then resizes all components to match that width.
*
* @param container
*/
private void resizeComponentWidths (Container container) {
int max = 0;
for (Component c : container.getComponents()) {
int width = c.getPreferredSize().width;
if (width > max) {
max = width;
}
}
for (Component c : container.getComponents()) {
c.setPreferredSize(new Dimension(max, c.getPreferredSize().height));
}
}
/**
* Sends the inputs to the controller to try logging in.
*/
private void login () {
String usernameInput = getUsername();
String passwordInput = getPassword();
clearUsername();
clearPassword();
try {
getController().authenticate(usernameInput, passwordInput);
}
catch (LoginErrorException e) {
sendMessage(getResources().getString(e.getLocalizedMessage()));
}
}
}