/*
* DBConnectDialog.java
*
* Created on October 2, 2007, 10:39 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package net.sf.jabref.sql;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JOptionPane;
import net.sf.jabref.Globals;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
* Dialog box for collecting database connection strings from the user
*
* @author pattonlk
*/
public class DBConnectDialog extends JDialog {
// labels
JLabel lblServerType = new JLabel();
JLabel lblServerHostname = new JLabel();
JLabel lblDatabase = new JLabel();
JLabel lblUsername = new JLabel();
JLabel lblPassword = new JLabel();
// input fields
JComboBox cmbServerType = new JComboBox();
JTextField txtServerHostname = new JTextField(40);
JTextField txtDatabase = new JTextField(40);
JTextField txtUsername = new JTextField(40);
JPasswordField pwdPassword = new JPasswordField(40);
JButton btnConnect = new JButton();
JButton btnCancel = new JButton();
// array for holding components on left-hand and right-hand sides
ArrayList<JLabel> lhs = new ArrayList<JLabel>();
ArrayList<JComponent> rhs = new ArrayList<JComponent>();
DBStrings dbStrings = new DBStrings();
private boolean connectToDB = false;
/** Creates a new instance of DBConnectDialog */
public DBConnectDialog( JFrame parent, DBStrings dbs) {
super(parent, Globals.lang("Connect to SQL Database"), true);
this.setResizable(false);
this.setLocationRelativeTo(parent);
dbStrings = dbs;
// build collections of components
lhs.add(lblServerType);
lhs.add(lblServerHostname);
lhs.add(lblDatabase);
lhs.add(lblUsername);
lhs.add(lblPassword);
rhs.add(cmbServerType);
rhs.add(txtServerHostname);
rhs.add(txtDatabase);
rhs.add(txtUsername);
rhs.add(pwdPassword);
// setup label text
lblServerType.setText(Globals.lang("Server Type :"));
lblServerHostname.setText(Globals.lang("Server Hostname :"));
lblDatabase.setText(Globals.lang("Database :"));
lblUsername.setText(Globals.lang("Username :"));
lblPassword.setText(Globals.lang("Password :"));
// set label text alignment
for (JLabel label : lhs){
label.setHorizontalAlignment(JLabel.RIGHT);
}
// set button text
btnConnect.setText(Globals.lang("Connect"));
btnCancel.setText(Globals.lang("Cancel"));
// init input fields to current DB strings
String[] srv = dbStrings.getServerTypes();
for (int i=0; i<srv.length; i++) {
cmbServerType.addItem(srv[i]);
}
txtServerHostname.setText(dbStrings.getServerHostname());
txtDatabase.setText(dbStrings.getDatabase());
txtUsername.setText(dbStrings.getUsername());
pwdPassword.setText(dbStrings.getPassword());
// construct dialog
DefaultFormBuilder builder = new DefaultFormBuilder(new
FormLayout("right:pref, 4dlu, fill:pref", ""));
builder.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
// add labels and input fields
builder.append(lblServerType);
builder.append(cmbServerType);
builder.nextLine();
builder.append(lblServerHostname);
builder.append(txtServerHostname);
builder.nextLine();
builder.append(lblDatabase);
builder.append(txtDatabase);
builder.nextLine();
builder.append(lblUsername);
builder.append(txtUsername);
builder.nextLine();
builder.append(lblPassword);
builder.append(pwdPassword);
builder.nextLine();
// add the panel to the CENTER of your dialog:
getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
// add buttons are added in a similar way:
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
bb.addGridded(btnConnect);
bb.addGridded(btnCancel);
bb.addGlue();
// add the buttons to the SOUTH of your dialog:
getContentPane().add(bb.getPanel(), BorderLayout.SOUTH);
pack();
ActionListener connectAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String errorMessage = checkInput();
if ( errorMessage==null) {
storeSettings();
setVisible(false);
setConnectToDB(true);
} else {
JOptionPane.showMessageDialog(null, errorMessage,
"Input Error", JOptionPane.ERROR_MESSAGE);
}
}
};
btnConnect.addActionListener(connectAction);
txtDatabase.addActionListener(connectAction);
txtServerHostname.addActionListener(connectAction);
txtUsername.addActionListener(connectAction);
pwdPassword.addActionListener(connectAction);
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
dispose();
setConnectToDB(false);
}
});
}
/**
* Checks the user input, and ensures that required fields have entries
*
* @return
* Appropriate error message to be displayed to user
*/
private String checkInput () {
String[] fields = {"Server Hostname", "Database", "Username"};
String[] errors = new String[fields.length];
int cnt = 0;
if (txtServerHostname.getText().trim().equals("")) {
errors[cnt] = fields[0];
cnt++;
}
if (txtDatabase.getText().trim().equals("")) {
errors[cnt] = fields[1];
cnt++;
}
if (txtUsername.getText().trim().equals("")) {
errors[cnt] = fields[2];
cnt++;
}
String errMsg = Globals.lang("Please specify the ");
switch (cnt) {
case 0:
errMsg = null;
break;
case 1:
errMsg = errMsg + errors[0] + ".";
break;
case 2:
errMsg = errMsg + errors[0] + " and " + errors[1] + ".";
break;
case 3:
errMsg = errMsg + errors[0] + ", " + errors[1]
+ ", and " + errors[2] + ".";
break;
default:
}
return errMsg;
}
/**
* Save user input.
*/
private void storeSettings () {
dbStrings.setServerType(cmbServerType.getSelectedItem().toString());
dbStrings.setServerHostname(txtServerHostname.getText());
dbStrings.setDatabase(txtDatabase.getText());
dbStrings.setUsername(txtUsername.getText());
char[] pwd = pwdPassword.getPassword();
String tmp = "";
for (int i=0; i<pwd.length; i++) {
tmp = tmp + pwd[i];
}
dbStrings.setPassword(tmp);
tmp = "";
Arrays.fill(pwd, '0');
}
public DBStrings getDBStrings() {
return dbStrings;
}
public void setDBStrings(DBStrings dbStrings) {
this.dbStrings = dbStrings;
}
public boolean getConnectToDB() {
return connectToDB;
}
public void setConnectToDB(boolean connectToDB) {
this.connectToDB = connectToDB;
}
}