blob: 3f55c8288da84f29c154ee477b1ef50f5f1650a4 [file] [log] [blame]
/* Copyright (c) 2001-2010, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hsqldb.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
// sqlbob@users 20020325 - patch 1.7.0 - enhancements
// sqlbob@users 20020407 - patch 1.7.0 - reengineering
// weconsultants@users 20041109 - patch 1.8.0 - enhancements:
// Added CommonSwing.errorMessage() to handle error messages
// for errors so eliminated the mError JLable field and Status HorizontalBox.
// Changed dispose on cancel to exit. If "Dup", "Restore" or Transer" needed ust
// Press <OK> Conform toprogramming standards
// Added spaces to "OK" button to make same size buttons
// Added ":" to all labels as in databaseManager.java
// Added: Added code from DatabaseManager to store connection settings
/**
* Opens a connection to a database
*
* New class based on Hypersonic original
*
* @author dmarshall@users
* @version 1.7.2
* @since 1.7.0
*/
class ConnectionDialogSwing extends JDialog
implements ActionListener, ItemListener {
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 1L;
private Connection mConnection;
private JTextField mName, mDriver, mURL, mUser;
private JPasswordField mPassword;
private String[][] connTypes;
private Hashtable settings;
private JButton okCancel, clear;
private JComboBox mSettingName =
new JComboBox(loadRecentConnectionSettings());
private static ConnectionSetting currentConnectionSetting = null;
public static void setConnectionSetting(
ConnectionSetting connectionSetting) {
currentConnectionSetting = connectionSetting;
}
public static Connection createConnection(String driver, String url,
String user, String password) throws Exception {
Class.forName(driver).newInstance();
return DriverManager.getConnection(url, user, password);
}
ConnectionDialogSwing(JFrame owner, String title) {
super(owner, title, true);
}
private void create() {
Box main = Box.createHorizontalBox();
Box labels = Box.createVerticalBox();
Box controls = Box.createVerticalBox();
Box buttons = Box.createHorizontalBox();
Box whole = Box.createVerticalBox();
// (weconsultants@users) New code
Box extra = Box.createHorizontalBox();
main.add(Box.createHorizontalStrut(10));
main.add(Box.createHorizontalGlue());
main.add(labels);
main.add(Box.createHorizontalStrut(10));
main.add(Box.createHorizontalGlue());
main.add(controls);
main.add(Box.createHorizontalStrut(10));
main.add(Box.createVerticalGlue());
main.add(extra);
main.add(Box.createVerticalGlue());
whole.add(Box.createVerticalGlue());
whole.add(Box.createVerticalStrut(10));
whole.add(main);
whole.add(Box.createVerticalGlue());
whole.add(Box.createVerticalStrut(10));
whole.add(buttons);
whole.add(Box.createVerticalGlue());
whole.add(Box.createVerticalStrut(10));
whole.add(Box.createVerticalGlue());
labels.add(createLabel("Recent Setting:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("Setting Name:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("Type:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("Driver:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("URL:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("User:"));
labels.add(Box.createVerticalGlue());
labels.add(createLabel("Password:"));
labels.add(Box.createVerticalGlue());
labels.add(Box.createVerticalStrut(10));
controls.add(Box.createVerticalGlue());
// (weconsultants@users) New code
mSettingName.setActionCommand("Select Setting");
mSettingName.addActionListener(this);
controls.add(mSettingName);
controls.add(Box.createHorizontalGlue());
// (weconsultants@users) New code
mName = new JTextField();
mName.addActionListener(this);
controls.add(mName);
// (weconsultants@users) New code
clear = new JButton("Clear Names");
clear.setActionCommand("Clear");
clear.addActionListener(this);
buttons.add(clear);
buttons.add(Box.createHorizontalGlue());
buttons.add(Box.createHorizontalStrut(10));
JComboBox types = new JComboBox();
connTypes = ConnectionDialogCommon.getTypes();
for (int i = 0; i < connTypes.length; i++) {
types.addItem(connTypes[i][0]);
}
types.addItemListener(this);
controls.add(types);
controls.add(Box.createVerticalGlue());
mDriver = new JTextField(connTypes[0][1]);
mDriver.addActionListener(this);
controls.add(mDriver);
mURL = new JTextField(connTypes[0][2]);
mURL.addActionListener(this);
controls.add(mURL);
controls.add(Box.createVerticalGlue());
mUser = new JTextField("SA");
mUser.addActionListener(this);
controls.add(mUser);
controls.add(Box.createVerticalGlue());
mPassword = new JPasswordField("");
mPassword.addActionListener(this);
controls.add(mPassword);
controls.add(Box.createVerticalGlue());
controls.add(Box.createVerticalStrut(10));
// The button bar
buttons.add(Box.createHorizontalGlue());
buttons.add(Box.createHorizontalStrut(10));
okCancel = new JButton(" Ok ");
okCancel.setActionCommand("ConnectOk");
okCancel.addActionListener(this);
buttons.add(okCancel);
getRootPane().setDefaultButton(okCancel);
buttons.add(Box.createHorizontalGlue());
buttons.add(Box.createHorizontalStrut(20));
okCancel = new JButton(" Cancel ");
okCancel.setActionCommand("ConnectCancel");
okCancel.addActionListener(this);
buttons.add(okCancel);
buttons.add(Box.createHorizontalGlue());
buttons.add(Box.createHorizontalStrut(10));
JPanel jPanel = new JPanel();
jPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
jPanel.add("Center", whole);
getContentPane().add("Center", jPanel);
doLayout();
pack();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
Dimension size = getSize();
if (currentConnectionSetting != null) {
mName.setText(currentConnectionSetting.getName());
mDriver.setText(currentConnectionSetting.getDriver());
mURL.setText(currentConnectionSetting.getUrl());
mUser.setText(currentConnectionSetting.getUser());
mPassword.setText(currentConnectionSetting.getPassword());
}
// (ulrivo): full size on screen with less than 640 width
if (d.width >= 640) {
setLocation((d.width - size.width) / 2,
(d.height - size.height) / 2);
} else {
setLocation(0, 0);
setSize(d);
}
setVisible(true);
}
public static Connection createConnection(JFrame owner, String title) {
ConnectionDialogSwing dialog = new ConnectionDialogSwing(owner,
title);
// Added: (weconsultants@users) Default LAF of Native
try {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(dialog);
} catch (Exception e) {
CommonSwing.errorMessage(e);
}
dialog.create();
return dialog.mConnection;
}
private static JLabel createLabel(String s) {
JLabel l = new JLabel(s);
return l;
}
// (weconsultants@users) New code
public Vector loadRecentConnectionSettings() {
Vector passSettings = new Vector();
settings = new Hashtable();
try {
settings = ConnectionDialogCommon.loadRecentConnectionSettings();
Iterator it = settings.values().iterator();
passSettings.add(ConnectionDialogCommon.emptySettingName);
while (it.hasNext()) {
passSettings.add(((ConnectionSetting) it.next()).getName());
}
} catch (java.io.IOException ioe) {
CommonSwing.errorMessage(ioe);
}
return (passSettings);
}
public void actionPerformed(ActionEvent ev) {
String s = ev.getActionCommand();
if (s.equals("ConnectOk") || (ev.getSource() instanceof JTextField)) {
try {
if (mURL.getText().indexOf('\u00AB') >= 0) {
throw new Exception("please specify db path");
}
mConnection =
createConnection(mDriver.getText(), mURL.getText(),
mUser.getText(),
new String(mPassword.getPassword()));
// (weconsultants@users) New code
if (mName.getText() != null
&& mName.getText().trim().length() != 0) {
ConnectionSetting newSetting = new ConnectionSetting(
mName.getText(), mDriver.getText(), mURL.getText(),
mUser.getText(), new String(mPassword.getPassword()));
ConnectionDialogCommon.addToRecentConnectionSettings(
settings, newSetting);
}
dispose();
} catch (SQLException e) {
mConnection = null;
CommonSwing.errorMessage(e, true);
} catch (Exception e) {
// Added: (weconsultants@users)
CommonSwing.errorMessage(e);
}
// (weconsultants@users) New code
} else if (s.equals("Select Setting")) {
String s2 = (String) mSettingName.getSelectedItem();
ConnectionSetting setting = (ConnectionSetting) settings.get(s2);
if (setting != null) {
mName.setText(setting.getName());
mDriver.setText(setting.getDriver());
mURL.setText(setting.getUrl());
mUser.setText(setting.getUser());
mPassword.setText(setting.getPassword());
}
} else if (s.equals("ConnectCancel")) {
dispose();
// (weconsultants@users) New code
} else if (s.equals("Clear")) {
ConnectionDialogCommon.deleteRecentConnectionSettings();
settings = new Hashtable();
mSettingName.removeAllItems();
mSettingName.addItem(ConnectionDialogCommon.emptySettingName);
mName.setText(null);
}
}
public void itemStateChanged(ItemEvent e) {
String s = (String) e.getItem();
for (int i = 0; i < connTypes.length; i++) {
if (s.equals(connTypes[i][0])) {
mDriver.setText(connTypes[i][1]);
mURL.setText(connTypes[i][2]);
}
}
}
}