/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/*
* Created by JFormDesigner on Thu Jul 05 13:43:44 EDT 2012
*/
package org.broad.igv.dev.db;
import org.broad.igv.feature.tribble.CodecFactory;
import org.broad.igv.ui.util.MessageUtils;
import org.broad.igv.util.Utilities;
import org.w3c.dom.Document;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.xml.bind.Marshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Dialog for creating/editing a profile for reading data from a SQL database
* TODO Bind beans the easy way instead of manually
* @author jacob
*/
public class DBProfileEditor extends JDialog {
private DBProfile profile = new DBProfile();
private String profilePath = null;
private Map<String, DBProfile.DBTable> allTableNames = new LinkedHashMap<String, DBProfile.DBTable>();
public DBProfileEditor(Frame owner, String initProfilePath) {
super(owner);
initComponents();
postInit(initProfilePath);
}
public DBProfileEditor(Dialog owner, String initProfilePath) {
super(owner);
initComponents();
postInit(initProfilePath);
}
private void postInit(String initProfilePath) {
tableFields = new JComponent[]{chromField, posStartField, posEndField, startColField, endColField, binColField, dataType};
assert initProfilePath != null;
//TODO Remember to add "." before extension when calling CodecFactory.getCodec
DefaultComboBoxModel model = new DefaultComboBoxModel(CodecFactory.validExtensions.toArray(new String[0]));
dataType.setModel(model);
this.profilePath = initProfilePath;
DBProfile.DBTable initTable = null;
File initProfileFile = new File(initProfilePath);
if (initProfileFile.exists()) {
//Editing existing profile
profile = DBProfile.parseProfile(initProfilePath);
DBSubprotocol.setSelectedItem(profile.getSubprotocol());
DBName.setText(profile.getName());
DBHost.setText(profile.getHost());
DBPath.setText(profile.getPath());
port.setText(profile.getPort());
username.setText(profile.getUsername());
password.setText(profile.getPassword());
initTableNameList();
initTable = profile.getTableList().get(0);
}else{
//Creating new profile
profile = new DBProfile();
this.profilePath = initProfilePath;
if (!this.profilePath.endsWith(".dbxml")) {
this.profilePath += ".dbxml";
initTable = null;
}
}
populateTableFieldValues(initTable);
attachTableFieldListeners();
}
/**
* Fill in the combo box of table names
*/
private void initTableNameList() {
List<DBProfile.DBTable> tableList = profile.getTableList();
for(DBProfile.DBTable table: tableList){
allTableNames.put(table.getName(), table);
}
tableName.setModel(new VetoableComboBoxModel(allTableNames.keySet().toArray(new String[tableList.size()])));
// tableName.addItemListener(new ItemListener() {
// @Override
// public void itemStateChanged(ItemEvent e) {
// //If selected table not done, don't let user change
// if(e.getStateChange() == ItemEvent.DESELECTED){
// String tabName = (String) e.getItem();
// if(!checkTableAndWarn(tabName)){
// tableName.setSelectedItem(tabName);
// populateTableFieldValues(allTableNames.get(tabName));
// }
// }
// }
// });
}
/**
* Save text inputs to {@link #profile}
* Doesn't write to disk
*/
private void saveDBInputs(){
profile.setSubprotocol(DBSubprotocol.getSelectedItem().toString());
profile.setName(DBName.getText());
profile.setHost(DBHost.getText());
profile.setPath(DBPath.getText());
profile.setPort(port.getText());
profile.setUsername(username.getText());
char[] cpw = password.getPassword();
if(cpw != null && cpw.length > 0){
String spw = new String(cpw);
profile.setPassword(spw);
spw = null;
Arrays.fill(cpw, (char) 0);
}
}
private DBProfile.DBTable getSelectedTable(){
String selectedTableName = (String) this.tableName.getSelectedItem();
return allTableNames.get(selectedTableName);
}
/**
* Save text inputs to the appropriate table
* Doesn't write to disk
* @param table
* @return true if data saved
*/
private boolean saveTableInput(DBProfile.DBTable table){
if(table == null) return false;
int startColIndex = -1;
int endColIndex = -1;
try{
startColIndex = Integer.parseInt(startColField.getText());
endColIndex = Integer.parseInt(endColField.getText());
}catch (NumberFormatException e){
MessageUtils.showErrorMessage("Entry must be a valid integer: " + e.getMessage(), e);
return false;
}
table.setStartColIndex(startColIndex);
table.setEndColIndex(endColIndex);
table.setChromoColName(chromField.getText());
table.setPosStartColName(posStartField.getText());
table.setPosEndColName(posEndField.getText());
table.setBinColName(binColField.getText());
table.setFormat((String) dataType.getSelectedItem());
return true;
}
/**
* We save the text field inputs to the relevant {@link #profile#table}
* whenever focus is lost.
*/
private void attachTableFieldListeners(){
FocusListener tableFocusListener = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
//saveTableInput(getSelectedTable());
}
@Override
public void focusLost(FocusEvent e) {
saveTableInput(getSelectedTable());
}
};
for(JComponent tableField: tableFields){
tableField.addFocusListener(tableFocusListener);
}
}
private void populateTableFieldValues(DBProfile.DBTable table){
boolean enabled = table != null;
for(JComponent tableField: tableFields){
tableField.setEnabled(enabled);
}
if(table == null) return;
chromField.setText(table.getChromoColName());
posStartField.setText(table.getPosStartColName());
posEndField.setText(table.getPosEndColName());
startColField.setText("" + table.getStartColIndex());
endColField.setText("" + table.getEndColIndex());
binColField.setText(table.getBinColName());
dataType.setSelectedItem(table.getFormat());
}
private void cancelButtonActionPerformed(ActionEvent e) {
setVisible(false);
}
private void tableNameActionPerformed(ActionEvent e) {
populateTableFieldValues(getSelectedTable());
}
private void saveButtonActionPerformed(ActionEvent e) {
saveDBInputs();
if(!checkDBInputs()){
return;
}
//Save to disk
FileWriter fileWriter = null;
try {
// Create a DOM document
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.newDocument();
document.setStrictErrorChecking(false);
Marshaller m = DBProfile.getJAXBContext().createMarshaller();
m.marshal(profile, document);
String xmlString = Utilities.getString(document);
fileWriter = new FileWriter(this.profilePath);
fileWriter.write(xmlString);
this.setVisible(false);
}catch(Exception ex){
ex.printStackTrace();
}finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* Checks that all fields have been filled out,
* and if not, warns the user
* @return true if all required fields have been filled out, else false
*/
private boolean checkDBInputs() {
List<String> missingDBFields = this.profile.checkMissingValues();
if(missingDBFields.size() > 0){
String msg = String.format("Please fill in all required database fields");
MessageUtils.showMessage(msg);
return false;
}
List<DBProfile.DBTable> tables = this.profile.getTableList();
if(tables.size() == 0){
MessageUtils.showMessage("You must add at least one table");
return false;
}
for(DBProfile.DBTable table: tables){
if(!checkTableAndWarn(table.getName())){
return false;
}
}
return true;
}
private void addNewTableButtonActionPerformed(ActionEvent e) {
saveDBInputs();
if(!checkTableAndWarn((String) tableName.getSelectedItem())){
return;
}
String strTableName = newTableNameField.getText();
if(strTableName.length() == 0){
MessageUtils.showMessage("Please enter a table name");
return;
}
DBProfile.DBTable newTable = new DBProfile.DBTable(profile.getDBLocator(), strTableName);
profile.addTable(newTable);
initTableNameList();
tableName.setSelectedItem(strTableName);
newTableNameField.setText("");
}
/**
* Verify that all fields for the table
* have been filled out. If the specified {@code tableName} is null,
* return true
* @return
*/
private boolean checkTable(String tableName) {
if(tableName == null) return true;
DBProfile.DBTable table = allTableNames.get(tableName);
List<String> missingFields = table.checkMissingValues();
return missingFields.size() == 0;
}
private boolean checkTableAndWarn(String tableName){
if(!checkTable(tableName)){
MessageUtils.showMessage("Please fill in all required table fields in table " + tableName);
return false;
}
return true;
}
/**
* ComboBoxModel which doesn't change if fields don't pass verification
*/
private class VetoableComboBoxModel extends DefaultComboBoxModel{
private VetoableComboBoxModel(Object[] objects){
super(objects);
}
@Override
public void setSelectedItem(Object anItem) {
Object oldItem = getSelectedItem();
if(!checkTableAndWarn((String) oldItem)){
return;
}
super.setSelectedItem(anItem);
}
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
// Generated using JFormDesigner non-commercial license
dialogPane = new JPanel();
contentPanel = new JPanel();
panel16 = new JPanel();
label16 = new JLabel();
DBSubprotocol = new JComboBox();
panel4 = new JPanel();
label4 = new JLabel();
DBName = new JTextField();
panel1 = new JPanel();
label1 = new JLabel();
DBHost = new JTextField();
panel6 = new JPanel();
label6 = new JLabel();
DBPath = new JTextField();
panel5 = new JPanel();
label5 = new JLabel();
port = new JTextField();
panel2 = new JPanel();
label2 = new JLabel();
username = new JTextField();
panel3 = new JPanel();
label3 = new JLabel();
password = new JPasswordField();
checkBox1 = new JCheckBox();
separator1 = new JSeparator();
panel15 = new JPanel();
label15 = new JLabel();
newTableNameField = new JTextField();
addNewTableButton = new JButton();
separator2 = new JSeparator();
panel7 = new JPanel();
label7 = new JLabel();
tableName = new JComboBox();
panel8 = new JPanel();
label8 = new JLabel();
dataType = new JComboBox();
panel9 = new JPanel();
label9 = new JLabel();
chromField = new JTextField();
panel10 = new JPanel();
label10 = new JLabel();
posStartField = new JTextField();
panel13 = new JPanel();
label13 = new JLabel();
posEndField = new JTextField();
panel11 = new JPanel();
label11 = new JLabel();
startColField = new JTextField();
panel12 = new JPanel();
label12 = new JLabel();
endColField = new JTextField();
panel14 = new JPanel();
label14 = new JLabel();
binColField = new JTextField();
buttonBar = new JPanel();
saveButton = new JButton();
okButton = new JButton();
cancelButton = new JButton();
//======== this ========
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
//======== dialogPane ========
{
dialogPane.setBorder(new EmptyBorder(12, 12, 12, 12));
dialogPane.setPreferredSize(new Dimension(367, 550));
dialogPane.setLayout(new BorderLayout());
//======== contentPanel ========
{
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
//======== panel16 ========
{
panel16.setLayout(new BoxLayout(panel16, BoxLayout.X_AXIS));
//---- label16 ----
label16.setText("Subprotocol:");
label16.setHorizontalAlignment(SwingConstants.LEFT);
label16.setMaximumSize(new Dimension(80, 16));
panel16.add(label16);
//---- DBSubprotocol ----
DBSubprotocol.setMaximumSize(new Dimension(250, 28));
DBSubprotocol.setPreferredSize(new Dimension(250, 28));
DBSubprotocol.setModel(new DefaultComboBoxModel(new String[] {
"mysql",
"sqlite"
}));
DBSubprotocol.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tableNameActionPerformed(e);
}
});
panel16.add(DBSubprotocol);
}
contentPanel.add(panel16);
//======== panel4 ========
{
panel4.setMaximumSize(new Dimension(330, 28));
panel4.setLayout(new BoxLayout(panel4, BoxLayout.X_AXIS));
//---- label4 ----
label4.setText("Name:");
label4.setHorizontalAlignment(SwingConstants.LEFT);
label4.setMaximumSize(new Dimension(80, 16));
panel4.add(label4);
//---- DBName ----
DBName.setEditable(true);
panel4.add(DBName);
}
contentPanel.add(panel4);
//======== panel1 ========
{
panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS));
//---- label1 ----
label1.setText("Host:");
label1.setHorizontalAlignment(SwingConstants.LEFT);
label1.setMaximumSize(new Dimension(80, 16));
panel1.add(label1);
//---- DBHost ----
DBHost.setMaximumSize(new Dimension(250, 28));
DBHost.setPreferredSize(new Dimension(250, 28));
DBHost.setToolTipText("my.awesomedb.com");
panel1.add(DBHost);
}
contentPanel.add(panel1);
//======== panel6 ========
{
panel6.setLayout(new BoxLayout(panel6, BoxLayout.X_AXIS));
//---- label6 ----
label6.setText("Path:");
label6.setHorizontalAlignment(SwingConstants.LEFT);
label6.setMaximumSize(new Dimension(80, 16));
panel6.add(label6);
//---- DBPath ----
DBPath.setMaximumSize(new Dimension(250, 28));
DBPath.setPreferredSize(new Dimension(250, 28));
DBPath.setToolTipText("myfolder");
panel6.add(DBPath);
}
contentPanel.add(panel6);
//======== panel5 ========
{
panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXIS));
//---- label5 ----
label5.setText("Port (optional):");
label5.setHorizontalAlignment(SwingConstants.LEFT);
label5.setMaximumSize(new Dimension(80, 16));
panel5.add(label5);
//---- port ----
port.setMaximumSize(new Dimension(250, 28));
port.setPreferredSize(new Dimension(250, 28));
port.setToolTipText("my.awesomedb.com");
panel5.add(port);
}
contentPanel.add(panel5);
//======== panel2 ========
{
panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS));
//---- label2 ----
label2.setText("Username:");
label2.setHorizontalAlignment(SwingConstants.LEFT);
label2.setMaximumSize(new Dimension(80, 16));
label2.setMinimumSize(new Dimension(66, 16));
label2.setPreferredSize(new Dimension(80, 16));
panel2.add(label2);
//---- username ----
username.setMaximumSize(new Dimension(150, 28));
username.setPreferredSize(new Dimension(150, 28));
panel2.add(username);
}
contentPanel.add(panel2);
//======== panel3 ========
{
panel3.setMaximumSize(new Dimension(400, 28));
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS));
//---- label3 ----
label3.setText("Password (opt.):");
label3.setMaximumSize(new Dimension(120, 16));
label3.setMinimumSize(new Dimension(66, 16));
label3.setPreferredSize(new Dimension(80, 16));
label3.setHorizontalAlignment(SwingConstants.LEFT);
panel3.add(label3);
//---- password ----
password.setMaximumSize(new Dimension(150, 28));
password.setPreferredSize(new Dimension(150, 28));
password.setEnabled(false);
panel3.add(password);
//---- checkBox1 ----
checkBox1.setText("Save");
panel3.add(checkBox1);
}
contentPanel.add(panel3);
//---- separator1 ----
separator1.setPreferredSize(new Dimension(0, 1));
contentPanel.add(separator1);
//======== panel15 ========
{
panel15.setLayout(new BoxLayout(panel15, BoxLayout.X_AXIS));
//---- label15 ----
label15.setText("New Table Name:");
panel15.add(label15);
//---- newTableNameField ----
newTableNameField.setToolTipText("Name for new table");
newTableNameField.setMaximumSize(new Dimension(250, 28));
panel15.add(newTableNameField);
//---- addNewTableButton ----
addNewTableButton.setText("Add");
addNewTableButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addNewTableButtonActionPerformed(e);
}
});
panel15.add(addNewTableButton);
}
contentPanel.add(panel15);
//---- separator2 ----
separator2.setPreferredSize(new Dimension(0, 1));
contentPanel.add(separator2);
//======== panel7 ========
{
panel7.setLayout(new BoxLayout(panel7, BoxLayout.X_AXIS));
//---- label7 ----
label7.setText("Table Name:");
label7.setHorizontalAlignment(SwingConstants.LEFT);
label7.setMaximumSize(new Dimension(80, 16));
panel7.add(label7);
//---- tableName ----
tableName.setMaximumSize(new Dimension(250, 28));
tableName.setPreferredSize(new Dimension(250, 28));
tableName.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tableNameActionPerformed(e);
}
});
panel7.add(tableName);
}
contentPanel.add(panel7);
//======== panel8 ========
{
panel8.setLayout(new BoxLayout(panel8, BoxLayout.X_AXIS));
//---- label8 ----
label8.setText("Format:");
label8.setHorizontalAlignment(SwingConstants.LEFT);
label8.setMaximumSize(new Dimension(80, 16));
panel8.add(label8);
//---- dataType ----
dataType.setMaximumSize(new Dimension(250, 28));
dataType.setMinimumSize(new Dimension(96, 28));
panel8.add(dataType);
}
contentPanel.add(panel8);
//======== panel9 ========
{
panel9.setLayout(new BoxLayout(panel9, BoxLayout.X_AXIS));
//---- label9 ----
label9.setText("Chromosome Column Name:");
label9.setHorizontalAlignment(SwingConstants.LEFT);
label9.setMaximumSize(new Dimension(80, 16));
panel9.add(label9);
//---- chromField ----
chromField.setMaximumSize(new Dimension(250, 28));
chromField.setPreferredSize(new Dimension(250, 28));
panel9.add(chromField);
}
contentPanel.add(panel9);
//======== panel10 ========
{
panel10.setLayout(new BoxLayout(panel10, BoxLayout.X_AXIS));
//---- label10 ----
label10.setText("Position Start Column Name:");
label10.setHorizontalAlignment(SwingConstants.LEFT);
label10.setMaximumSize(new Dimension(80, 16));
panel10.add(label10);
//---- posStartField ----
posStartField.setMaximumSize(new Dimension(250, 28));
posStartField.setPreferredSize(new Dimension(250, 28));
panel10.add(posStartField);
}
contentPanel.add(panel10);
//======== panel13 ========
{
panel13.setLayout(new BoxLayout(panel13, BoxLayout.X_AXIS));
//---- label13 ----
label13.setText("Position End Column Name:");
label13.setHorizontalAlignment(SwingConstants.LEFT);
label13.setMaximumSize(new Dimension(80, 16));
panel13.add(label13);
//---- posEndField ----
posEndField.setMaximumSize(new Dimension(250, 28));
posEndField.setPreferredSize(new Dimension(250, 28));
panel13.add(posEndField);
}
contentPanel.add(panel13);
//======== panel11 ========
{
panel11.setLayout(new BoxLayout(panel11, BoxLayout.X_AXIS));
//---- label11 ----
label11.setText("Data start column index:");
label11.setHorizontalAlignment(SwingConstants.LEFT);
label11.setMaximumSize(new Dimension(80, 16));
panel11.add(label11);
//---- startColField ----
startColField.setMaximumSize(new Dimension(250, 28));
startColField.setPreferredSize(new Dimension(250, 28));
startColField.setToolTipText("Starting column index from which to read data (1-based)");
startColField.setText("1");
panel11.add(startColField);
}
contentPanel.add(panel11);
//======== panel12 ========
{
panel12.setLayout(new BoxLayout(panel12, BoxLayout.X_AXIS));
//---- label12 ----
label12.setText("Data end column index:");
label12.setHorizontalAlignment(SwingConstants.LEFT);
label12.setMaximumSize(new Dimension(80, 16));
panel12.add(label12);
//---- endColField ----
endColField.setMaximumSize(new Dimension(250, 28));
endColField.setPreferredSize(new Dimension(250, 28));
endColField.setToolTipText("Last column (1-based, inclusive end) from which to read data");
endColField.setText("2147483646");
panel12.add(endColField);
}
contentPanel.add(panel12);
//======== panel14 ========
{
panel14.setLayout(new BoxLayout(panel14, BoxLayout.X_AXIS));
//---- label14 ----
label14.setText("Bin column Name (opt.):");
label14.setHorizontalAlignment(SwingConstants.LEFT);
label14.setMaximumSize(new Dimension(80, 16));
panel14.add(label14);
//---- binColField ----
binColField.setMaximumSize(new Dimension(250, 28));
binColField.setPreferredSize(new Dimension(250, 28));
binColField.setToolTipText("Some databases use binning to speed up querying");
panel14.add(binColField);
}
contentPanel.add(panel14);
}
dialogPane.add(contentPanel, BorderLayout.CENTER);
//======== buttonBar ========
{
buttonBar.setBorder(new EmptyBorder(12, 0, 0, 0));
buttonBar.setLayout(new GridBagLayout());
((GridBagLayout)buttonBar.getLayout()).columnWidths = new int[] {0, 85, 80};
((GridBagLayout)buttonBar.getLayout()).columnWeights = new double[] {1.0, 0.0, 0.0};
//---- saveButton ----
saveButton.setText("Save Profile");
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveButtonActionPerformed(e);
}
});
buttonBar.add(saveButton, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
//---- okButton ----
okButton.setText("Load Data");
okButton.setVisible(false);
buttonBar.add(okButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
//---- cancelButton ----
cancelButton.setText("Cancel");
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cancelButtonActionPerformed(e);
}
});
buttonBar.add(cancelButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
dialogPane.add(buttonBar, BorderLayout.SOUTH);
}
contentPane.add(dialogPane, BorderLayout.CENTER);
pack();
setLocationRelativeTo(getOwner());
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// Generated using JFormDesigner non-commercial license
private JPanel dialogPane;
private JPanel contentPanel;
private JPanel panel16;
private JLabel label16;
private JComboBox DBSubprotocol;
private JPanel panel4;
private JLabel label4;
private JTextField DBName;
private JPanel panel1;
private JLabel label1;
private JTextField DBHost;
private JPanel panel6;
private JLabel label6;
private JTextField DBPath;
private JPanel panel5;
private JLabel label5;
private JTextField port;
private JPanel panel2;
private JLabel label2;
private JTextField username;
private JPanel panel3;
private JLabel label3;
private JPasswordField password;
private JCheckBox checkBox1;
private JSeparator separator1;
private JPanel panel15;
private JLabel label15;
private JTextField newTableNameField;
private JButton addNewTableButton;
private JSeparator separator2;
private JPanel panel7;
private JLabel label7;
private JComboBox tableName;
private JPanel panel8;
private JLabel label8;
private JComboBox dataType;
private JPanel panel9;
private JLabel label9;
private JTextField chromField;
private JPanel panel10;
private JLabel label10;
private JTextField posStartField;
private JPanel panel13;
private JLabel label13;
private JTextField posEndField;
private JPanel panel11;
private JLabel label11;
private JTextField startColField;
private JPanel panel12;
private JLabel label12;
private JTextField endColField;
private JPanel panel14;
private JLabel label14;
private JTextField binColField;
private JPanel buttonBar;
private JButton saveButton;
private JButton okButton;
private JButton cancelButton;
// JFormDesigner - End of variables declaration //GEN-END:variables
private JComponent[] tableFields;
}