package com.pugh.sockso.gui;
import com.pugh.sockso.Validater;
import com.pugh.sockso.ValidationException;
import com.pugh.sockso.db.Database;
import com.pugh.sockso.resources.Resources;
import com.pugh.sockso.resources.Locale;
import com.pugh.sockso.web.User;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.text.JTextComponent;
import javax.swing.JCheckBox;
import java.sql.SQLException;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import org.apache.log4j.Logger;
import com.google.inject.Inject;
public class CreateUserDialog extends JDialog {
private static Logger log = Logger.getLogger( CreateUserDialog.class );
private final Database db;
private final Resources r;
private final UsersPanel usersPanel;
private final Locale locale;
private JTextField txtName, txtEmail;
private JPasswordField txtPass1, txtPass2;
private JCheckBox isAdmin;
@Inject
public CreateUserDialog( final JFrame parent, final Database db, final Resources r,
final UsersPanel usersPanel, final Locale locale ) {
super( parent, locale.getString("gui.title.creatingUser") );
this.db = db;
this.r = r;
this.usersPanel = usersPanel;
this.locale = locale;
createComponents();
setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
setBounds( 30,30, 400,300 );
setLocationRelativeTo( null );
setResizable( false );
// setup layout
setLayout( new BorderLayout() );
add( getMainPane(), BorderLayout.CENTER );
add( getButtonPane(), BorderLayout.SOUTH );
pack();
// show!
setVisible( true );
}
/**
* creates the components that are used on the form
*
*/
private void createComponents() {
txtName = new JTextField();
txtEmail = new JTextField();
txtPass1 = new JPasswordField();
txtPass2 = new JPasswordField();
isAdmin = new JCheckBox();
}
/**
* returns the main pane with all the input fields
*
* @return input fields panel
*
*/
private JPanel getMainPane() {
FormLayout layout = new FormLayout(
" right:max(40dlu;pref), 3dlu, 150dlu, 7dlu "
);
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
builder.append( locale.getString("gui.label.username"), txtName );
builder.nextLine();
builder.append( locale.getString("gui.label.password"), txtPass1 );
builder.nextLine();
builder.append( locale.getString("gui.label.passwordRepeat"), txtPass2 );
builder.nextLine();
builder.append( locale.getString("gui.label.email"), txtEmail );
builder.nextLine();
builder.append( locale.getString("gui.label.isAdmin"), isAdmin );
builder.nextLine();
return builder.getPanel();
}
/**
* returns the pane at the bottom of the dialog with the buttons on
*
* @return panel with buttons
*
*/
private JPanel getButtonPane() {
JButton create = new JButton( locale.getString("gui.label.createUser"), new ImageIcon(r.getImage("icons/22x22/ok.png")) );
create.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent evt ) {
createUser();
}
});
JButton cancel = new JButton( locale.getString("gui.label.cancel"), new ImageIcon(r.getImage("icons/22x22/cancel.png")) );
cancel.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent evt ) {
close();
}
});
JPanel p = new JPanel();
p.setLayout( new FlowLayout(FlowLayout.RIGHT) );
p.add( cancel );
p.add( create );
return p;
}
/**
* closes the dialog
*
*/
private void close() {
setVisible( false );
dispose();
}
/**
* checks if the data the user has input is valid for
* creating a new user. if something bad is found then
* a validation error is thrown.
*
*/
private void validateInputFields() throws ValidationException {
final Validater v = new Validater( db );
if ( !v.checkRequiredFields( new JTextComponent[] { txtName, txtPass1, txtEmail }) )
throw new ValidationException( locale.getString("gui.error.missingField") );
if ( !v.isValidEmail(txtEmail.getText()) )
throw new ValidationException( locale.getString("gui.error.invalidEmail") );
String pass1 = new String( txtPass1.getPassword() );
String pass2 = new String( txtPass2.getPassword() );
if ( !pass1.equals(pass2) )
throw new ValidationException( locale.getString("gui.error.passwordsDontMatch") );
if ( v.usernameExists(txtName.getText()) )
throw new ValidationException( locale.getString("gui.error.duplicateUsername") );
if ( v.emailExists(txtEmail.getText()) )
throw new ValidationException( locale.getString("gui.error.duplicateEmail") );
}
/**
* tries to create a new user with the values from the
* fields on the form
*
*/
private void createUser() {
try {
validateInputFields();
final User newUser = new User(
txtName.getText(),
new String(txtPass1.getPassword()),
txtEmail.getText(),
isAdmin.isSelected()
);
newUser.save( db );
usersPanel.refreshUsers();
close();
}
catch ( final SQLException e ) {
JOptionPane.showMessageDialog( this, e.getMessage() );
}
catch ( ValidationException e ) {
JOptionPane.showMessageDialog( this, e.getMessage() );
}
}
}