/*
 * SchemaSpyGUIApp.java
 *
 * Created on 07.01.2009, 22:21:15
 */

package schemaspygui;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
import java.util.Set;
import java.util.Properties;


/**
 *
 * @author Joachim Uhl
 */
public class SchemaSpyGUIApp extends javax.swing.JFrame {

    /** Creates new form SchemaSpyGUIApp */
    public SchemaSpyGUIApp() {
        setLookandFeel();
        initParams();
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBar = new javax.swing.JToolBar();
        exitButton = new javax.swing.JButton();
        quickSaveButton = new javax.swing.JButton();
        quickLoadButton = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        saveParamFileButton = new javax.swing.JButton();
        loadParamFileButton = new javax.swing.JButton();
        clearFieldsButton = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        startSchemaSpyButton = new javax.swing.JButton();
        showOutputButton = new javax.swing.JButton();
        jTabbedPane = new javax.swing.JTabbedPane();
        reqParamPanel = new javax.swing.JPanel();
        lbl_DBType = new javax.swing.JLabel();
        dbTypeCBox = new javax.swing.JComboBox();
        lbl_PathtoDBdrvr = new javax.swing.JLabel();
        lbl_DBName = new javax.swing.JLabel();
        lbl_DBHost = new javax.swing.JLabel();
        lbl_DBPort = new javax.swing.JLabel();
        lbl_DBUser = new javax.swing.JLabel();
        lbl_DBPwd = new javax.swing.JLabel();
        lbl_PathSchemSpy = new javax.swing.JLabel();
        dbPwdField = new javax.swing.JPasswordField();
        dbUserTField = new javax.swing.JTextField();
        dbNameTField = new javax.swing.JTextField();
        dbHostTField = new javax.swing.JTextField();
        dbPortTField = new javax.swing.JTextField();
        dbDriverPTField = new javax.swing.JTextField();
        driverButton = new javax.swing.JButton();
        sSpyPathTField = new javax.swing.JTextField();
        sSpyPathButton = new javax.swing.JButton();
        lbl_PropertiePath = new javax.swing.JLabel();
        propertiePathTField = new javax.swing.JTextField();
        propertiePathButton = new javax.swing.JButton();
        propertiesTField = new javax.swing.JTextField();
        lbl_prop = new javax.swing.JLabel();
        flagsPanel = new javax.swing.JPanel();
        aHTMLCBox = new javax.swing.JCheckBox();
        noHTMLCBox = new javax.swing.JCheckBox();
        dincFKCBox = new javax.swing.JCheckBox();
        noAdsCBox = new javax.swing.JCheckBox();
        noLogoCBox = new javax.swing.JCheckBox();
        noRowsBox = new javax.swing.JCheckBox();
        railsCBox = new javax.swing.JCheckBox();
        qualityPanel = new javax.swing.JPanel();
        highQuCBox = new javax.swing.JCheckBox();
        lowQuCBox = new javax.swing.JCheckBox();
        singleSignCBox = new javax.swing.JCheckBox();
        showFinishCBox = new javax.swing.JCheckBox();
        savePassCBox = new javax.swing.JCheckBox();
        outputOptionsPanel = new javax.swing.JPanel();
        lbl_OutDir = new javax.swing.JLabel();
        pathOutputTField = new javax.swing.JTextField();
        outDirButton = new javax.swing.JButton();
        allSchemasCBox = new javax.swing.JCheckBox();
        schemaTField = new javax.swing.JTextField();
        lbl_Schema = new javax.swing.JLabel();
        lbl_Desc = new javax.swing.JLabel();
        descTAreaScrollPane = new javax.swing.JScrollPane();
        descTArea = new javax.swing.JTextArea();
        lbl_TableRegEx = new javax.swing.JLabel();
        tNameRExTField = new javax.swing.JTextField();
        lbl_TableExRegEx = new javax.swing.JLabel();
        tNameExRExTField = new javax.swing.JTextField();
        lbl_ColumnRegEx = new javax.swing.JLabel();
        cNameRExTField = new javax.swing.JTextField();
        colExRelCBox = new javax.swing.JCheckBox();
        stylePanel = new javax.swing.JPanel();
        charsetComBox = new javax.swing.JComboBox();
        lbl_Charset = new javax.swing.JLabel();
        lbl_Font = new javax.swing.JLabel();
        fontNameTField = new javax.swing.JTextField();
        lbl_fontSize = new javax.swing.JLabel();
        fontSizeTField = new javax.swing.JTextField();
        lbl_css = new javax.swing.JLabel();
        cssPathTField = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        metaFilePathButton = new javax.swing.JButton();
        metaFilePathTField = new javax.swing.JTextField();
        lbl_OutDir1 = new javax.swing.JLabel();
        outputPanel = new javax.swing.JPanel();
        sSpyOutTAreaScrollPane = new javax.swing.JScrollPane();
        sSpyOutTArea = new javax.swing.JTextArea();
        mainMenuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        sParamMenuItem = new javax.swing.JMenuItem();
        lParamMenuItem = new javax.swing.JMenuItem();
        exitMenuItem = new javax.swing.JMenuItem();
        infoMenu = new javax.swing.JMenu();
        helpMenueAboutItem = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("schemaspygui/resources/ReleaseText"); // NOI18N
        setTitle(bundle.getString("ProgramName")); // NOI18N
        setName("SchemaSpyGUIAppMainFrame"); // NOI18N

        jToolBar.setRollover(true);

        exitButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/door_out.png"))); // NOI18N
        exitButton.setText("Exit");
        exitButton.setFocusable(false);
        exitButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        exitButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        exitButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitButtonActionPerformed(evt);
            }
        });
        jToolBar.add(exitButton);

        quickSaveButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/disk.png"))); // NOI18N
        quickSaveButton.setText("Quick Save");
        quickSaveButton.setToolTipText("<html>Saves your settings in a default xml file</html>");
        quickSaveButton.setFocusable(false);
        quickSaveButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        quickSaveButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        quickSaveButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                quickSaveButtonActionPerformed(evt);
            }
        });
        jToolBar.add(quickSaveButton);

        quickLoadButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/folder_page_white.png"))); // NOI18N
        quickLoadButton.setText("Quick Load");
        quickLoadButton.setToolTipText("<html>Loads your settings out of the default xml file</html>");
        quickLoadButton.setFocusable(false);
        quickLoadButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        quickLoadButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        quickLoadButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                quickLoadButtonActionPerformed(evt);
            }
        });
        jToolBar.add(quickLoadButton);
        jToolBar.add(jSeparator2);

        saveParamFileButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/disk_multiple.png"))); // NOI18N
        saveParamFileButton.setText("Save File");
        saveParamFileButton.setToolTipText("<html>Save your settings with a filename (xml format) you can choose</html>");
        saveParamFileButton.setFocusable(false);
        saveParamFileButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        saveParamFileButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        saveParamFileButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveParamFileButtonActionPerformed(evt);
            }
        });
        jToolBar.add(saveParamFileButton);

        loadParamFileButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/folder_explore.png"))); // NOI18N
        loadParamFileButton.setText("Load File");
        loadParamFileButton.setToolTipText("<html>Load your settings.<br>Choose freely which xml config file you need</html>");
        loadParamFileButton.setFocusable(false);
        loadParamFileButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        loadParamFileButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        loadParamFileButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                loadParamFileButtonActionPerformed(evt);
            }
        });
        jToolBar.add(loadParamFileButton);

        clearFieldsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/cross.png"))); // NOI18N
        clearFieldsButton.setText("Clear Fields");
        clearFieldsButton.setFocusable(false);
        clearFieldsButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        clearFieldsButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        clearFieldsButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearFieldsButtonActionPerformed(evt);
            }
        });
        jToolBar.add(clearFieldsButton);
        jToolBar.add(jSeparator1);

        startSchemaSpyButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/database_connect.png"))); // NOI18N
        startSchemaSpyButton.setText("Start SchemaSpy");
        startSchemaSpyButton.setFocusable(false);
        startSchemaSpyButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        startSchemaSpyButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        startSchemaSpyButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startSchemaSpyButtonActionPerformed(evt);
            }
        });
        jToolBar.add(startSchemaSpyButton);

        showOutputButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/schemaspygui/resources/database_go.png"))); // NOI18N
        showOutputButton.setText("Show Output");
        showOutputButton.setFocusable(false);
        showOutputButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        showOutputButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        showOutputButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                showOutputButtonActionPerformed(evt);
            }
        });
        jToolBar.add(showOutputButton);

        jTabbedPane.setToolTipText("");

        reqParamPanel.setToolTipText("");

        lbl_DBType.setFont(lbl_DBType.getFont());
        lbl_DBType.setText("DB Type:"); // NOI18N

        dbTypeCBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { " ", "db2", "db2net", "derby", "derbynet", "firebird", "hsqldb", "informix", "maxdb", "mssql", "mssql05", "mssql-jtds", "mssql05-jtds", "mysql", "ora", "orathin", "pgsql", "sybase", "sybase2", "udbt4" }));
        dbTypeCBox.setToolTipText("Choose your type of database (-t)");
        dbTypeCBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dbTypeCBoxActionPerformed(evt);
            }
        });

        lbl_PathtoDBdrvr.setText("Path to DB driver:"); // NOI18N

        lbl_DBName.setText("DB name:"); // NOI18N

        lbl_DBHost.setText("DB Host:"); // NOI18N

        lbl_DBPort.setText("DB Port:"); // NOI18N

        lbl_DBUser.setText("DB User:"); // NOI18N

        lbl_DBPwd.setText("Password:"); // NOI18N

        lbl_PathSchemSpy.setText("Path to SchemaSpy:"); // NOI18N

        dbPwdField.setToolTipText("<html>Enter the User Password (-p)<br>It's not displayed in the SchemaSpy Output,<br>but be careful with the \"Save User Password\" option.<br> Currently the PWD is stored in clear text.\n</html>");

        dbUserTField.setToolTipText("Enter the User name (-u)");

        dbNameTField.setToolTipText("Enter the Database Name to connect to (-db)");

        dbHostTField.setToolTipText("Enter your DB Host (-host)");

        dbPortTField.setToolTipText("Enter the port for the DB (-port)");

        dbDriverPTField.setToolTipText("The path to your DB driver");

        driverButton.setText("Choose"); // NOI18N
        driverButton.setToolTipText("Click to choose the path to database driver file (-dp)"); // NOI18N
        driverButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                driverButtonActionPerformed(evt);
            }
        });

        sSpyPathTField.setToolTipText("The path to the schemaSpy.jar file (executable)");

        sSpyPathButton.setText("Choose"); // NOI18N
        sSpyPathButton.setToolTipText("Click to choose the path to SchemaSpy"); // NOI18N
        sSpyPathButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sSpyPathButtonActionPerformed(evt);
            }
        });

        lbl_PropertiePath.setText("Path propertie file:"); // NOI18N

        propertiePathTField.setToolTipText("<html>Specifies additional properties to be used when connecting to the database.<br> Specify a .properties file with key=value entries.<br>\nHave a look at the .propertie Files in the subdirectory /properties in your SchemaSpyGUI folder.</html>");

        propertiePathButton.setText("Choose"); // NOI18N
        propertiePathButton.setToolTipText("Click to choose the path to your database specific propertie file"); // NOI18N
        propertiePathButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                propertiePathButtonActionPerformed(evt);
            }
        });

        propertiesTField.setToolTipText("Specify the entries directly, escaping the ='s with \\= and separating each key\\=value pair with a ;.");

        lbl_prop.setText("Properties directly:");

        flagsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(" Flags "));

        aHTMLCBox.setText("Allow HTML in comments"); // NOI18N
        aHTMLCBox.setToolTipText("<html>Any HTML embedded in comments normally gets encoded so that it's rendered as text.<br> This option allows it to be rendered as HTML. (-ahic)</html>");

        noHTMLCBox.setText("No HTML"); // NOI18N
        noHTMLCBox.setToolTipText("<html>Only generate files needed for insertion/deletion of data (e.g. for scripts)<br> and an XML representation of the schema. (-nohtml)</html>");

        dincFKCBox.setText("Don't include foreign key"); // NOI18N
        dincFKCBox.setToolTipText("Don't include implied foreign key relationships. (-noimplied)");

        noAdsCBox.setText("No Ads");
        noAdsCBox.setToolTipText("Don't show ads (-noads)");
        noAdsCBox.setEnabled(false);

        noLogoCBox.setText("No Logo");
        noLogoCBox.setToolTipText("Don't show Sourceforge.net image logo. (-nologo)");

        noRowsBox.setText("Don't query or display row counts");
        noRowsBox.setToolTipText("(-norows)");

        railsCBox.setText("Ruby on Rails-based database");
        railsCBox.setToolTipText("(-rails)");

        qualityPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Quality Image Diagrams:"));
        qualityPanel.setToolTipText("Generate either higher or lower-quality diagrams. Depends Graphviz istallation.");

        highQuCBox.setText("High Quality");
        highQuCBox.setToolTipText("(-hq)");

        lowQuCBox.setText("Low Quality");
        lowQuCBox.setToolTipText("(-lq)");

        org.jdesktop.layout.GroupLayout qualityPanelLayout = new org.jdesktop.layout.GroupLayout(qualityPanel);
        qualityPanel.setLayout(qualityPanelLayout);
        qualityPanelLayout.setHorizontalGroup(
            qualityPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(qualityPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(qualityPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(highQuCBox)
                    .add(lowQuCBox))
                .addContainerGap(37, Short.MAX_VALUE))
        );
        qualityPanelLayout.setVerticalGroup(
            qualityPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(qualityPanelLayout.createSequentialGroup()
                .add(highQuCBox)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(lowQuCBox))
        );

        singleSignCBox.setText("Single Sign-On");
        singleSignCBox.setToolTipText("Don't require a user to be specified with -u to simplify configuration when running in a single sign-on environment (-sso)");
        singleSignCBox.setEnabled(false);

        showFinishCBox.setText("Show Output when finished");

        org.jdesktop.layout.GroupLayout flagsPanelLayout = new org.jdesktop.layout.GroupLayout(flagsPanel);
        flagsPanel.setLayout(flagsPanelLayout);
        flagsPanelLayout.setHorizontalGroup(
            flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(flagsPanelLayout.createSequentialGroup()
                .add(44, 44, 44)
                .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(aHTMLCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(46, 46, 46))
                    .add(noRowsBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(railsCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(16, 16, 16))
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(qualityPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(49, 49, 49)))
                .add(17, 17, 17)
                .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(dincFKCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(flagsPanelLayout.createSequentialGroup()
                                .add(noHTMLCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .add(76, 76, 76)))
                        .add(9, 9, 9)
                        .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(flagsPanelLayout.createSequentialGroup()
                                .add(noAdsCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .add(6, 6, 6))
                            .add(noLogoCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(showFinishCBox)
                        .add(60, 60, 60))
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(singleSignCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(122, 122, 122)))
                .add(77, 77, 77))
        );
        flagsPanelLayout.setVerticalGroup(
            flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, flagsPanelLayout.createSequentialGroup()
                .addContainerGap(11, Short.MAX_VALUE)
                .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(flagsPanelLayout.createSequentialGroup()
                        .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(flagsPanelLayout.createSequentialGroup()
                                .add(flagsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                    .add(flagsPanelLayout.createSequentialGroup()
                                        .add(aHTMLCBox)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(noRowsBox)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(railsCBox))
                                    .add(flagsPanelLayout.createSequentialGroup()
                                        .add(noHTMLCBox)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(dincFKCBox)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(singleSignCBox)))
                                .add(18, 18, 18)
                                .add(showFinishCBox))
                            .add(flagsPanelLayout.createSequentialGroup()
                                .add(noLogoCBox)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(noAdsCBox)))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 43, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, flagsPanelLayout.createSequentialGroup()
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 80, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(qualityPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        savePassCBox.setText("Save User Password");
        savePassCBox.setToolTipText("<html><b>WARNING:</b> Saves DB User Password as plain text!</html>");

        org.jdesktop.layout.GroupLayout reqParamPanelLayout = new org.jdesktop.layout.GroupLayout(reqParamPanel);
        reqParamPanel.setLayout(reqParamPanelLayout);
        reqParamPanelLayout.setHorizontalGroup(
            reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(reqParamPanelLayout.createSequentialGroup()
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(reqParamPanelLayout.createSequentialGroup()
                        .add(28, 28, 28)
                        .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                            .add(reqParamPanelLayout.createSequentialGroup()
                                .add(51, 51, 51)
                                .add(lbl_DBName, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                            .add(reqParamPanelLayout.createSequentialGroup()
                                .add(53, 53, 53)
                                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(lbl_DBType)
                                    .add(reqParamPanelLayout.createSequentialGroup()
                                        .add(lbl_DBHost, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .add(2, 2, 2))))
                            .add(reqParamPanelLayout.createSequentialGroup()
                                .add(55, 55, 55)
                                .add(lbl_DBUser, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                            .add(lbl_PathtoDBdrvr)
                            .add(lbl_PathSchemSpy)
                            .add(lbl_PropertiePath)
                            .add(lbl_prop))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(propertiesTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 381, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(reqParamPanelLayout.createSequentialGroup()
                                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                    .add(org.jdesktop.layout.GroupLayout.LEADING, dbDriverPTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 306, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(org.jdesktop.layout.GroupLayout.LEADING, sSpyPathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 306, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(org.jdesktop.layout.GroupLayout.LEADING, propertiePathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 306, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(propertiePathButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .add(sSpyPathButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .add(driverButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .add(reqParamPanelLayout.createSequentialGroup()
                                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(dbTypeCBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 122, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(dbNameTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(dbUserTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(dbHostTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(savePassCBox)
                                    .add(reqParamPanelLayout.createSequentialGroup()
                                        .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(lbl_DBPwd, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 66, Short.MAX_VALUE)
                                            .add(reqParamPanelLayout.createSequentialGroup()
                                                .add(8, 8, 8)
                                                .add(lbl_DBPort, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .add(18, 18, 18)))
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(dbPortTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 89, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                            .add(dbPwdField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 89, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
                                .add(41, 41, 41)))
                        .add(54, 54, 54))
                    .add(reqParamPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .add(flagsPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        reqParamPanelLayout.setVerticalGroup(
            reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, reqParamPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(dbTypeCBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_DBType))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(dbHostTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_DBHost)
                    .add(dbPortTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_DBPort))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(dbNameTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_DBName))
                .add(6, 6, 6)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(dbUserTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(dbPwdField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_DBPwd)
                    .add(lbl_DBUser))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(savePassCBox)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 15, Short.MAX_VALUE)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(dbDriverPTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(driverButton)
                    .add(lbl_PathtoDBdrvr))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(sSpyPathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(sSpyPathButton)
                    .add(lbl_PathSchemSpy))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(propertiePathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(propertiePathButton)
                    .add(lbl_PropertiePath))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(reqParamPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(propertiesTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_prop))
                .add(18, 18, 18)
                .add(flagsPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jTabbedPane.addTab("Parameters/Flags", reqParamPanel);

        outputOptionsPanel.setToolTipText("");

        lbl_OutDir.setText("Output directory:"); // NOI18N

        pathOutputTField.setToolTipText("Choose the path to your SchemaSpy output dir (-o)");

        outDirButton.setText("Choose"); // NOI18N
        outDirButton.setToolTipText("Click to choose the path to your SchemaSpy output dir (-o). You can leave this blank. SchemaSpyGUI will generate a path out of your db-name, db-user and db-schema name"); // NOI18N
        outDirButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                outDirButtonActionPerformed(evt);
            }
        });

        allSchemasCBox.setText("All Schemas");
        allSchemasCBox.setToolTipText("Evaluate all schemas in a database (-all)");
        allSchemasCBox.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                allSchemasCBoxStateChanged(evt);
            }
        });

        schemaTField.setToolTipText("<html>Database schema (optional if the same as user or isn't supported by your database)(-s).<br> Evaluate specified schemas.(-schemas \"s1,s2\")</html>");

        lbl_Schema.setText("Schema/s to explore:"); // NOI18N
        lbl_Schema.setToolTipText("Schemas coma separated");

        lbl_Desc.setText("Description on summary page:"); // NOI18N

        descTArea.setColumns(20);
        descTArea.setRows(4);
        descTArea.setToolTipText("Displays the specified textual description on summary pages (-desc).\nFor example: <a href\\='http://schemaspy.sourceforge.net'>SchemaSpy</a>");
        descTAreaScrollPane.setViewportView(descTArea);

        lbl_TableRegEx.setText("Table name RegExp:"); // NOI18N

        tNameRExTField.setToolTipText("<html>This is a regular expression that's used to determine which tables/views to include (-i).<br> For example: (.*book.*)|(library.*)</html>");

        lbl_TableExRegEx.setText("Table Exclusion RegExp:");

        tNameExRExTField.setToolTipText("This is a regular expression that's used to determine which tables/views to exclude (-I).");

        lbl_ColumnRegEx.setText("Column Exclusion RegExp:"); // NOI18N

        cNameRExTField.setToolTipText("<html>Exclude matching columns from relationship analysis to simplify the generated graphs (-x).<br>For example: (book.isbn)|(borrower.address)</html>");

        colExRelCBox.setText("Excluded relationships");
        colExRelCBox.setToolTipText("<html>Set the columns to exclude from relationship diagrams where<br>the specified columns aren't directly referenced by the focal table. (-X)</html>");

        stylePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(" Style: (Modify the .css to specify HTML fonts) "));
        stylePanel.setToolTipText("Modify the .css to specify HTML fonts.");

        charsetComBox.setEditable(true);
        charsetComBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "", "UTF-8", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "ISO-8859-12", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15" }));
        charsetComBox.setToolTipText("Default by SchemaSpy: ISO-8859-1 (-charset)");

        lbl_Charset.setText("Charset:");

        lbl_Font.setText("Font Name:");

        fontNameTField.setToolTipText("Default font: \"Helvetica\" (-font). Use the file font name instead of Real name, ej. times or timesb instead of \"Times New Roman\" or \"Times New Roman Bold\"");

        lbl_fontSize.setText("Font size:");

        fontSizeTField.setToolTipText("Fontsize default: 11 (-fontsize)");

        lbl_css.setText("Style css file:");

        cssPathTField.setToolTipText("css file default: schemaSpy.css (-css)");

        jButton1.setText("Choose");
        jButton1.setToolTipText("Click to choose the path to css file (-css)");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout stylePanelLayout = new org.jdesktop.layout.GroupLayout(stylePanel);
        stylePanel.setLayout(stylePanelLayout);
        stylePanelLayout.setHorizontalGroup(
            stylePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(stylePanelLayout.createSequentialGroup()
                .add(stylePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(stylePanelLayout.createSequentialGroup()
                        .add(lbl_Charset)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(charsetComBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 136, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(lbl_Font)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(fontNameTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 136, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(lbl_fontSize)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(fontSizeTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 39, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(stylePanelLayout.createSequentialGroup()
                        .add(lbl_css)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(cssPathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jButton1)))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        stylePanelLayout.setVerticalGroup(
            stylePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(stylePanelLayout.createSequentialGroup()
                .add(stylePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(lbl_Charset)
                    .add(charsetComBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_Font)
                    .add(fontNameTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_fontSize)
                    .add(fontSizeTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(stylePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(lbl_css)
                    .add(cssPathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jButton1)))
        );

        metaFilePathButton.setText("Choose"); // NOI18N
        metaFilePathButton.setToolTipText("Click to choose the path to your Metafile (-meta). You can leave this blank."); // NOI18N
        metaFilePathButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                metaFilePathButtonActionPerformed(evt);
            }
        });

        metaFilePathTField.setToolTipText("Choose the path to your Metafile (-meta)");

        lbl_OutDir1.setText("Metafile Path:"); // NOI18N

        org.jdesktop.layout.GroupLayout outputOptionsPanelLayout = new org.jdesktop.layout.GroupLayout(outputOptionsPanel);
        outputOptionsPanel.setLayout(outputOptionsPanelLayout);
        outputOptionsPanelLayout.setHorizontalGroup(
            outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(outputOptionsPanelLayout.createSequentialGroup()
                .add(38, 38, 38)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(lbl_Desc)
                    .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                        .add(org.jdesktop.layout.GroupLayout.LEADING, descTAreaScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE)
                        .add(org.jdesktop.layout.GroupLayout.LEADING, outputOptionsPanelLayout.createSequentialGroup()
                            .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                                .add(org.jdesktop.layout.GroupLayout.TRAILING, lbl_ColumnRegEx)
                                .add(org.jdesktop.layout.GroupLayout.TRAILING, lbl_TableExRegEx)
                                .add(org.jdesktop.layout.GroupLayout.TRAILING, lbl_TableRegEx))
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                            .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                                .add(tNameRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 387, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .add(tNameExRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 387, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .add(cNameRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 387, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .add(colExRelCBox))))
                    .add(stylePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(19, 19, 19))
            .add(outputOptionsPanelLayout.createSequentialGroup()
                .add(29, 29, 29)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(lbl_Schema)
                    .add(lbl_OutDir)
                    .add(lbl_OutDir1))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(metaFilePathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 309, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(schemaTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 309, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(pathOutputTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 309, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(metaFilePathButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 96, Short.MAX_VALUE)
                    .add(outDirButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 96, Short.MAX_VALUE)
                    .add(allSchemasCBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 96, Short.MAX_VALUE))
                .add(28, 28, 28))
        );
        outputOptionsPanelLayout.setVerticalGroup(
            outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(outputOptionsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(pathOutputTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_OutDir)
                    .add(outDirButton))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(schemaTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(lbl_Schema)
                    .add(allSchemasCBox))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(metaFilePathTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(metaFilePathButton)
                    .add(lbl_OutDir1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 14, Short.MAX_VALUE))
                .add(29, 29, 29)
                .add(lbl_Desc)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(descTAreaScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
                .add(18, 18, 18)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(lbl_TableRegEx)
                    .add(tNameRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(lbl_TableExRegEx)
                    .add(tNameExRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(outputOptionsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(lbl_ColumnRegEx)
                    .add(cNameRExTField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(colExRelCBox)
                .add(18, 18, 18)
                .add(stylePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jTabbedPane.addTab("Ouput Options", outputOptionsPanel);

        outputPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));

        sSpyOutTArea.setEditable(false);
        sSpyOutTArea.setLineWrap(true);
        sSpyOutTArea.setWrapStyleWord(true);
        sSpyOutTAreaScrollPane.setViewportView(sSpyOutTArea);

        org.jdesktop.layout.GroupLayout outputPanelLayout = new org.jdesktop.layout.GroupLayout(outputPanel);
        outputPanel.setLayout(outputPanelLayout);
        outputPanelLayout.setHorizontalGroup(
            outputPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(outputPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(sSpyOutTAreaScrollPane)
                .addContainerGap())
        );
        outputPanelLayout.setVerticalGroup(
            outputPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, outputPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(sSpyOutTAreaScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane.addTab("SchemaSpy Output", outputPanel);

        fileMenu.setText("File"); // NOI18N

        sParamMenuItem.setText("Save Parameters ..."); // NOI18N
        sParamMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sParamMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(sParamMenuItem);

        lParamMenuItem.setText("Load Parameters ..."); // NOI18N
        lParamMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                lParamMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(lParamMenuItem);

        exitMenuItem.setText("Exit"); // NOI18N
        exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitMenuItem);

        mainMenuBar.add(fileMenu);

        infoMenu.setText("Help"); // NOI18N

        helpMenueAboutItem.setText("About"); // NOI18N
        helpMenueAboutItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenueAboutItemActionPerformed(evt);
            }
        });
        infoMenu.add(helpMenueAboutItem);

        mainMenuBar.add(infoMenu);

        setJMenuBar(mainMenuBar);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jToolBar, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 579, Short.MAX_VALUE)
            .add(jTabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 579, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(jToolBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jTabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 504, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void sParamMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sParamMenuItemActionPerformed
        operations.saveParam("Menu");
}//GEN-LAST:event_sParamMenuItemActionPerformed

    private void lParamMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lParamMenuItemActionPerformed
        operations.loadParam("Menu");
}//GEN-LAST:event_lParamMenuItemActionPerformed

    private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        operations.systemEnd();
}//GEN-LAST:event_exitMenuItemActionPerformed

    private void helpMenueAboutItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenueAboutItemActionPerformed
        operations.showAbout(this);
}//GEN-LAST:event_helpMenueAboutItemActionPerformed

    private void quickLoadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quickLoadButtonActionPerformed
        operations.loadParam("Quick");
}//GEN-LAST:event_quickLoadButtonActionPerformed

    private void quickSaveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quickSaveButtonActionPerformed
        operations.saveParam("Quick");
    }//GEN-LAST:event_quickSaveButtonActionPerformed

    private void clearFieldsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearFieldsButtonActionPerformed
        operations.clearAllFields();
    }//GEN-LAST:event_clearFieldsButtonActionPerformed

    private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitButtonActionPerformed
        operations.systemEnd();
    }//GEN-LAST:event_exitButtonActionPerformed

    private void saveParamFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveParamFileButtonActionPerformed
        operations.saveParam("Menu");
}//GEN-LAST:event_saveParamFileButtonActionPerformed

    private void loadParamFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadParamFileButtonActionPerformed
        operations.loadParam("Menu");
    }//GEN-LAST:event_loadParamFileButtonActionPerformed

    private void driverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_driverButtonActionPerformed
        operations.setPath("driverDirPath");
}//GEN-LAST:event_driverButtonActionPerformed

    private void sSpyPathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sSpyPathButtonActionPerformed
        operations.setPath("sSpyFilePath");
}//GEN-LAST:event_sSpyPathButtonActionPerformed

    private void propertiePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_propertiePathButtonActionPerformed
        operations.setPath("propertiePath");
}//GEN-LAST:event_propertiePathButtonActionPerformed

    private void dbTypeCBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dbTypeCBoxActionPerformed
        // nothing TODO here at the moment
    }//GEN-LAST:event_dbTypeCBoxActionPerformed

    private void outDirButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_outDirButtonActionPerformed
        operations.setPath("outDirPath");
}//GEN-LAST:event_outDirButtonActionPerformed

    private void allSchemasCBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_allSchemasCBoxStateChanged
        if (allSchemasCBox.isSelected())
            schemaTField.setEnabled(false);
        else schemaTField.setEnabled(true);
}//GEN-LAST:event_allSchemasCBoxStateChanged

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        operations.setPath("cssPath");
}//GEN-LAST:event_jButton1ActionPerformed

    private void startSchemaSpyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startSchemaSpyButtonActionPerformed
        jTabbedPane.setSelectedIndex(2);
        operations.startSchemaSpy(gui);
}//GEN-LAST:event_startSchemaSpyButtonActionPerformed

    private void showOutputButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showOutputButtonActionPerformed
        operations.showOutput();
    }//GEN-LAST:event_showOutputButtonActionPerformed

    private void metaFilePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_metaFilePathButtonActionPerformed
        operations.setPath("metaFilePath");
}//GEN-LAST:event_metaFilePathButtonActionPerformed

    private void setLookandFeel() {
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void initParams() {
        this.gui = this;
        params = new Properties();
        operations = new Operations();
        sSpyPathTField = null;
        dbDriverPTField = null;
        pathOutputTField = null;
        ToolTipManager.sharedInstance().setDismissDelay(12000);
    }

    public boolean getAutoLaunchInfo() {
        boolean info = operations.getAutoLaunch();
        return info;
    }

    public void setOutputText(String outputText) {
        operations.setText(outputText);
    }

    public void startShowOutput() {
        operations.showOutput();
    }

    private SchemaSpyGUIApp gui;
    private Operations operations;
    private Properties params;
    private Build build;
    private RunSchemaSpy op;
    private Thread t1;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JCheckBox aHTMLCBox;
    private javax.swing.JCheckBox allSchemasCBox;
    private javax.swing.JTextField cNameRExTField;
    private javax.swing.JComboBox charsetComBox;
    private javax.swing.JButton clearFieldsButton;
    private javax.swing.JCheckBox colExRelCBox;
    private javax.swing.JTextField cssPathTField;
    private javax.swing.JTextField dbDriverPTField;
    private javax.swing.JTextField dbHostTField;
    private javax.swing.JTextField dbNameTField;
    private javax.swing.JTextField dbPortTField;
    private javax.swing.JPasswordField dbPwdField;
    private javax.swing.JComboBox dbTypeCBox;
    private javax.swing.JTextField dbUserTField;
    private javax.swing.JTextArea descTArea;
    private javax.swing.JScrollPane descTAreaScrollPane;
    private javax.swing.JCheckBox dincFKCBox;
    private javax.swing.JButton driverButton;
    private javax.swing.JButton exitButton;
    private javax.swing.JMenuItem exitMenuItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JPanel flagsPanel;
    private javax.swing.JTextField fontNameTField;
    private javax.swing.JTextField fontSizeTField;
    private javax.swing.JMenuItem helpMenueAboutItem;
    private javax.swing.JCheckBox highQuCBox;
    private javax.swing.JMenu infoMenu;
    private javax.swing.JButton jButton1;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JTabbedPane jTabbedPane;
    private javax.swing.JToolBar jToolBar;
    private javax.swing.JMenuItem lParamMenuItem;
    private javax.swing.JLabel lbl_Charset;
    private javax.swing.JLabel lbl_ColumnRegEx;
    private javax.swing.JLabel lbl_DBHost;
    private javax.swing.JLabel lbl_DBName;
    private javax.swing.JLabel lbl_DBPort;
    private javax.swing.JLabel lbl_DBPwd;
    private javax.swing.JLabel lbl_DBType;
    private javax.swing.JLabel lbl_DBUser;
    private javax.swing.JLabel lbl_Desc;
    private javax.swing.JLabel lbl_Font;
    private javax.swing.JLabel lbl_OutDir;
    private javax.swing.JLabel lbl_OutDir1;
    private javax.swing.JLabel lbl_PathSchemSpy;
    private javax.swing.JLabel lbl_PathtoDBdrvr;
    private javax.swing.JLabel lbl_PropertiePath;
    private javax.swing.JLabel lbl_Schema;
    private javax.swing.JLabel lbl_TableExRegEx;
    private javax.swing.JLabel lbl_TableRegEx;
    private javax.swing.JLabel lbl_css;
    private javax.swing.JLabel lbl_fontSize;
    private javax.swing.JLabel lbl_prop;
    private javax.swing.JButton loadParamFileButton;
    private javax.swing.JCheckBox lowQuCBox;
    private javax.swing.JMenuBar mainMenuBar;
    private javax.swing.JButton metaFilePathButton;
    private javax.swing.JTextField metaFilePathTField;
    private javax.swing.JCheckBox noAdsCBox;
    private javax.swing.JCheckBox noHTMLCBox;
    private javax.swing.JCheckBox noLogoCBox;
    private javax.swing.JCheckBox noRowsBox;
    private javax.swing.JButton outDirButton;
    private javax.swing.JPanel outputOptionsPanel;
    private javax.swing.JPanel outputPanel;
    private javax.swing.JTextField pathOutputTField;
    private javax.swing.JButton propertiePathButton;
    private javax.swing.JTextField propertiePathTField;
    private javax.swing.JTextField propertiesTField;
    private javax.swing.JPanel qualityPanel;
    private javax.swing.JButton quickLoadButton;
    private javax.swing.JButton quickSaveButton;
    private javax.swing.JCheckBox railsCBox;
    private javax.swing.JPanel reqParamPanel;
    private javax.swing.JMenuItem sParamMenuItem;
    private javax.swing.JTextArea sSpyOutTArea;
    private javax.swing.JScrollPane sSpyOutTAreaScrollPane;
    private javax.swing.JButton sSpyPathButton;
    private javax.swing.JTextField sSpyPathTField;
    private javax.swing.JButton saveParamFileButton;
    private javax.swing.JCheckBox savePassCBox;
    private javax.swing.JTextField schemaTField;
    private javax.swing.JCheckBox showFinishCBox;
    private javax.swing.JButton showOutputButton;
    private javax.swing.JCheckBox singleSignCBox;
    private javax.swing.JButton startSchemaSpyButton;
    private javax.swing.JPanel stylePanel;
    private javax.swing.JTextField tNameExRExTField;
    private javax.swing.JTextField tNameRExTField;
    // End of variables declaration//GEN-END:variables

    /*
     * Class for Application Functions like saveParam etc.
     * */
    private class Operations {
        
        public Operations () {
            build = new Build();
        }

        /**
         * Starts the schema scanning with SchemaSpy in a separate thread
         * @param gui
         */
        private void startSchemaSpy(SchemaSpyGUIApp gui) {
            String run_command;
            String displ_command;

            sSpyOutTArea.setText("");

            if (checkPath()) {
                run_command = build.buildCommand("run");
                displ_command = build.buildCommand("displ");

                op = new RunSchemaSpy(gui, run_command, displ_command);
                t1 = new Thread(op);
                t1.setName("SSpy");
                t1.start();
            }
        }

        /**
         * Shows the about box
         * @param frame
         */
        private void showAbout(JFrame frame) {
            JDialog aboutBox = new AboutBox(frame);
            aboutBox.setVisible(true);
        }
        
        /**
         * Sets the text in Output Area
         * @param text
         */
        public void setText (String text) {
            sSpyOutTArea.append(text);
        }

        private void setPath (String button) {
            String openDialogDefaultPath = ".";

            if (button.equals("driverDirPath")) {
                if (!dbDriverPTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(dbDriverPTField.getText());
                        openDialogDefaultPath = dbDriverPTField.getText();
                }
            }
            if (button.equals("outDirPath")) {
                if (!pathOutputTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(pathOutputTField.getText());
                        openDialogDefaultPath = pathOutputTField.getText();
                }
            }
            if (button.equals("sSpyFilePath")) {
                if (!sSpyPathTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(sSpyPathTField.getText());
                        openDialogDefaultPath = sSpyPathTField.getText();
                }
            }
            if (button.equals("propertiePath")) {
                if (!propertiePathTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(propertiePathTField.getText());
                        openDialogDefaultPath = propertiePathTField.getText();
                }
            }
            if (button.equals("cssPath")) {
                if (!cssPathTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(cssPathTField.getText());
                        openDialogDefaultPath = cssPathTField.getText();
                }
            }
            if (button.equals("metaFilePath")) {
                if (!metaFilePathTField.getText().equals("")) {
                        //openDialogDefaultPath = makePathUsable(cssPathTField.getText());
                        openDialogDefaultPath = metaFilePathTField.getText();
                }
            }

            JFileChooser openDialog = new JFileChooser(openDialogDefaultPath);

            if (button.equals("outDirPath")) {
                openDialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            }
            else if (button.equals("cssPath")) {
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
                openDialog.setFileFilter(getCssFilter());
            }
            else {
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
            }
            /*
            if (button.equals("driverDirPath")) {
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
            }
            if (button.equals("sSpyFilePath")) {
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
            }
            if (button.equals("propertiePath")) {
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
            }
            */
            openDialog.setDialogType(JFileChooser.OPEN_DIALOG);

            int returnVal = openDialog.showOpenDialog(gui);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                String path = openDialog.getSelectedFile().getAbsolutePath();
                if (button.equals("driverDirPath")) {
                    dbDriverPTField.setText(path);
                } 
                if (button.equals("outDirPath")) {
                    pathOutputTField.setText(path);
                }
                if (button.equals("sSpyFilePath")) {
                    sSpyPathTField.setText(path);
                }
                if (button.equals("propertiePath")) {
                    propertiePathTField.setText(path);
                }
                if (button.equals("cssPath")) {
                    cssPathTField.setText(path);
                }
                if (button.equals("metaFilePath")) {
                    metaFilePathTField.setText(path);
                }
            }
        }

        private String getCBoxString (JCheckBox cBox) {
            if (cBox.isSelected()) {
                return "true";
            } else {
                return "false";
            }
        }

        private FileFilter getXmlFilter() {
            FileFilter ff = new FileFilter() {
                @Override
                public boolean accept(File f) {
                    return f.getName().toLowerCase().endsWith(".xml")
                            || f.isDirectory();
                }
                @Override
                public String getDescription() {
                    return "XML Files";
                }
            };
            return ff;
        }

        private FileFilter getCssFilter() {
            FileFilter ff = new FileFilter() {
                @Override
                public boolean accept(File f) {
                    return f.getName().toLowerCase().endsWith(".css")
                            || f.isDirectory();
                }
                @Override
                public String getDescription() {
                    return "CSS Files";
                }
            };
            return ff;
        }

        private void saveParam(String option) {
            params.setProperty("dbTypeCBox", (String)dbTypeCBox.getSelectedItem());
            params.setProperty("dbHostTField", dbHostTField.getText());
            params.setProperty("dbNameTField", dbNameTField.getText());
            params.setProperty("dbPortTField", dbPortTField.getText());
            params.setProperty("dbUserTField", dbUserTField.getText());
            // Save password
            if (savePassCBox.isSelected()){
                params.setProperty("dbPwdField", String.valueOf(dbPwdField.getPassword()));
            }
            else params.setProperty("dbPwdField", "");

            params.setProperty("dbDriverPTField", dbDriverPTField.getText());
            params.setProperty("pathOutputTField", pathOutputTField.getText());
            params.setProperty("sSpyPathTField", sSpyPathTField.getText());

            params.setProperty("propertiePathTField", propertiePathTField.getText());
            params.setProperty("propertiesTField", propertiesTField.getText());
            params.setProperty("metaFilePathTField", metaFilePathTField.getText());

            params.setProperty("schemaTField", schemaTField.getText());
            params.setProperty("allSchemasCBox", getCBoxString(allSchemasCBox));
            params.setProperty("descTArea", descTArea.getText().replace("\"", "'"));
            params.setProperty("tNameRExTField", tNameRExTField.getText());
            params.setProperty("tNameExRExTField", tNameExRExTField.getText());
            params.setProperty("cNameRExTField", cNameRExTField.getText());
            params.setProperty("colExRelCBox", getCBoxString(colExRelCBox));

            params.setProperty("charsetComBox", (String)charsetComBox.getSelectedItem());
            params.setProperty("fontSizeTField", fontSizeTField.getText());
            params.setProperty("fontNameTField", fontNameTField.getText());
            params.setProperty("cssPathTField", cssPathTField.getText());

            params.setProperty("aHTMLCBox", getCBoxString(aHTMLCBox));
            params.setProperty("noRowsBox", getCBoxString(noRowsBox));
            params.setProperty("dincFKCBox", getCBoxString(dincFKCBox));
            params.setProperty("noHTMLCBox", getCBoxString(noHTMLCBox));
            params.setProperty("railsCBox", getCBoxString(railsCBox));
            // TODO: Single Sign-On (-sso).
            //params.setProperty("singleSignCBox", getCBoxString(singleSignCBox));
            // Quality Images
            params.setProperty("highQuCBox", getCBoxString(highQuCBox));
            params.setProperty("lowQuCBox", getCBoxString(lowQuCBox));
            //----------
            params.setProperty("noAdsCBox", getCBoxString(noAdsCBox));
            params.setProperty("noLogoCBox", getCBoxString(noLogoCBox));

            params.setProperty("savePassCBox", getCBoxString(savePassCBox));
            params.setProperty("showFinishCBox", getCBoxString(showFinishCBox));

            String name = "", coment = "";
            if (option.equals("Quick")) {
                name = "SSpyGUIQuick.xml";
                coment = "Saved parameters for SchemaSpyGUI. Load it with: Quick Load Parameters";
            }
            // Save JFileChooser
            else if (option.equals("Menu")) {
                JFileChooser saveDialog = new JFileChooser(".");
                saveDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
                saveDialog.setDialogType(JFileChooser.SAVE_DIALOG);
                saveDialog.setDialogTitle("Save Parameters ...");
                saveDialog.setFileFilter(getXmlFilter());

                int returnVal = saveDialog.showOpenDialog(gui);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    name = saveDialog.getSelectedFile().getAbsolutePath();
                    coment = "Saved parameters for SchemaSpyGUI. Load it with Load Menu";
                }
            }
            if (!name.equals("")) {
                // Add xml extension
                if (!name.endsWith(".xml"))
                    name += ".xml";
                try {
                    FileOutputStream fos = new FileOutputStream(name);
                    params.storeToXML(fos, coment);
                    fos.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }

        private void loadParam(String option) {
            String name = "";
            if (option.equals("Quick")) {
                name = "SSpyGUIQuick.xml";
            }
            else if (option.equals("Menu")) {
                JFileChooser openDialog = new JFileChooser(".");
                openDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
                openDialog.setDialogType(JFileChooser.OPEN_DIALOG);
                openDialog.setDialogTitle("Load Parameters ...");
                openDialog.setFileFilter(getXmlFilter());

                int returnVal = openDialog.showOpenDialog(gui);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    name = openDialog.getSelectedFile().getAbsolutePath();
                }
            }
            File file = new File(name);
            if (file.exists()) {
                try {
                    FileInputStream in = new FileInputStream(file);
                    params.loadFromXML(in);
                    in.close();
                    clearAllFields();
                    insertInFields();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }  
            }
        }

        private void insertInFields () {
            dbTypeCBox.setSelectedItem(params.getProperty("dbTypeCBox"));

            dbHostTField.setText(params.getProperty("dbHostTField"));
            dbNameTField.setText(params.getProperty("dbNameTField"));
            dbPortTField.setText(params.getProperty("dbPortTField"));
            dbUserTField.setText(params.getProperty("dbUserTField"));
            // Load Password
            dbPwdField.setText(params.getProperty("dbPwdField"));
            dbDriverPTField.setText(params.getProperty("dbDriverPTField"));
            pathOutputTField.setText(params.getProperty("pathOutputTField"));
            sSpyPathTField.setText(params.getProperty("sSpyPathTField"));

            propertiePathTField.setText(params.getProperty("propertiePathTField"));
            propertiesTField.setText(params.getProperty("propertiesTField"));
            metaFilePathTField.setText(params.getProperty("metaFilePathTField"));

            schemaTField.setText(params.getProperty("schemaTField"));
            if (params.getProperty("allSchemasCBox").equals("true")) {allSchemasCBox.setSelected(true);}
            descTArea.setText(params.getProperty("descTArea"));
            tNameRExTField.setText(params.getProperty("tNameRExTField"));
            tNameExRExTField.setText(params.getProperty("tNameExRExTField"));
            cNameRExTField.setText(params.getProperty("cNameRExTField"));
            if (params.getProperty("colExRelCBox").equals("true")) {colExRelCBox.setSelected(true);}

            charsetComBox.setSelectedItem(params.getProperty("charsetComBox"));
            fontSizeTField.setText(params.getProperty("fontSizeTField"));
            fontNameTField.setText(params.getProperty("fontNameTField"));
            cssPathTField.setText(params.getProperty("cssPathTField"));

            if (params.getProperty("aHTMLCBox").equals("true")) {aHTMLCBox.setSelected(true);}
            if (params.getProperty("noRowsBox").equals("true")) {noRowsBox.setSelected(true);}
            if (params.getProperty("dincFKCBox").equals("true")) {dincFKCBox.setSelected(true);}
            if (params.getProperty("noHTMLCBox").equals("true")) {noHTMLCBox.setSelected(true);}
            if (params.getProperty("railsCBox").equals("true")) {railsCBox.setSelected(true);}
            // TODO: Single Sign-On (-sso).
            //if (params.getProperty("singleSignCBox").equals("true")) {singleSignCBox.setSelected(true);}
            // Quality Images
            if (params.getProperty("highQuCBox").equals("true")) {highQuCBox.setSelected(true);}
            if (params.getProperty("lowQuCBox").equals("true")) {lowQuCBox.setSelected(true);}
            //---------
            if (params.getProperty("noAdsCBox").equals("true")) {noAdsCBox.setSelected(true);}
            if (params.getProperty("noLogoCBox").equals("true")) {noLogoCBox.setSelected(true);}

            if (params.getProperty("savePassCBox").equals("true")) {savePassCBox.setSelected(true);}
            if (params.getProperty("showFinishCBox").equals("true")) {showFinishCBox.setSelected(true);}
        }

        private void clearAllFields() {
            dbTypeCBox.setSelectedItem("");

            dbHostTField.setText("");
            dbNameTField.setText("");
            dbPortTField.setText("");
            dbUserTField.setText("");
            // Password
            dbPwdField.setText("");
            dbDriverPTField.setText("");
            pathOutputTField.setText("");
            sSpyPathTField.setText("");

            propertiePathTField.setText("");
            propertiesTField.setText("");
            metaFilePathTField.setText("");

            schemaTField.setText("");
            allSchemasCBox.setSelected(false);
            descTArea.setText("");
            tNameRExTField.setText("");
            tNameExRExTField.setText("");
            cNameRExTField.setText("");
            colExRelCBox.setSelected(false);

            charsetComBox.setSelectedIndex(0);
            fontSizeTField.setText("");
            fontNameTField.setText("");
            cssPathTField.setText("");

            aHTMLCBox.setSelected(false);
            noRowsBox.setSelected(false);
            dincFKCBox.setSelected(false);
            noHTMLCBox.setSelected(false);
            railsCBox.setSelected(false);
            // TODO: Single Sign-On (-sso).
            //singleSignCBox.setSelected(false);
            // Quality Images
            highQuCBox.setSelected(false);
            lowQuCBox.setSelected(false);
            //--------------------------
            noAdsCBox.setSelected(false);
            noLogoCBox.setSelected(false);

            savePassCBox.setSelected(false);
            showFinishCBox.setSelected(false);
        }

        private String makePathUsable(String s) {
            //s.replace("\\","\\\\"); // This don't work is: s = s.replace("\\","\\\\");
            // Add " for directories and files with spaces
            
            //Bug: Linux doesn't work with "s"
            //Error: Unable to access jarfile
            //simple hack but no support for directories with 
            //spaces currently under Linux
            if (isWindows()) {s = "\"" + s + "\"";}
            else{}
            return s;
        }

        //TODO: copy from isWindows() of BrowserOutputStart ... pooling?
        public boolean isWindows() {
            String os = System.getProperty("os.name");
            if ( os != null && os.startsWith("Windows")) {
                return true;
            } else {
                return false;
            }
        }

        private boolean checkPath() {
            boolean bool = false;
            File sSpyPath = new File(sSpyPathTField.getText());
            File dbDriverPath = new File(dbDriverPTField.getText());
            File outDirPath = new File(pathOutputTField.getText());

            if (sSpyPath.exists()) {
                bool = true;
            } else {
                setText("This is not a valid path to SchemaSpy: " + sSpyPathTField.getText()+ "\n");
                if (!sSpyPath.canRead()) {
                    setText("Jar File ist not readable!\n");
                }
            }

            if (dbDriverPTField.getText().equals("")) {
                setText("You have not specified a driver path. SchemaSpy will try to \n" +
                        "use the path in internal .properties file.\n" +
                        "It's possible that these will not work. In this case, please specify a path.\n");
            } else {
                if (!dbDriverPath.exists() || !dbDriverPath.canRead()) {
                    if (bool) {bool = false;}
                    setText("This is not a valid path to the DB driver: " + dbDriverPTField.getText() + "\n");
                    if (!dbDriverPath.canRead()) {
                        setText("File ist not readable!\n");
                    }
                }
            }
            // SchemaSpy Creates a directory if not exist
            if (!pathOutputTField.getText().equals("") && !outDirPath.exists()) { // && !outDirPath.canWrite()) {
                //if (bool){bool = false;}
                setText("This is not a valid path for the output directory, but SchemaSpy will create it: " + pathOutputTField.getText() + "\n");
                if (!sSpyPath.canWrite()) {
                    if (bool){bool = false;}
                    setText("SchemaSpy can not write!\n");
                }
            }
            return bool;
        }
        
        private String buildOutputDir () {
                String dirName = dbUserTField.getText() + "_" + dbNameTField.getText()
                                 + "_" + schemaTField.getText().replace(",", "-");
                File dir = new File(dirName);
                if(!dir.exists()) {
                   dir.mkdir();
                }
                String dirPath = dir.getAbsolutePath();
                pathOutputTField.setText(dirPath);
                return dirPath;
        }

        public void showOutput() {
            if (!pathOutputTField.getText().equals("")) {
                String url = pathOutputTField.getText() + File.separator + "index.html";
                BrowserOutputStart show = new BrowserOutputStart(url);
                show.launch();
            }
        }

        /**
         * Try are the Threads launched by the program are alive
         * @return Alive
         */
        private boolean isThreadAlive() {
            Boolean tAlive = false;
            if (t1 != null) {
                // Search into alive threads the SchemaSpy threads.
                Set<Thread> set = Thread.getAllStackTraces().keySet();
                for (Thread at : set) {
                   if (at.getName().equals("SSpy")||
                       at.getName().equals("terrOut") ||
                       at.getName().equals("tinOut")) {
                       if (at.isAlive()) {
                           tAlive = true;
                       }
                   }
                }
            }
            return tAlive;
        }
        
        public boolean getAutoLaunch() {
            if (showFinishCBox.isSelected())
                return true;
            else return false;
        }

        private void systemEnd() {
            // If some alive show Warning message
            if (isThreadAlive()) {
                int returnVal = JOptionPane.showConfirmDialog(gui,
                    "SchemaSpy is Running.\n" +
                    "Closing SchemaSpyGUI do NOT finalize the SchemaSpy prosses.\n" +
                    "Do you really want close SchemaSpyGUI?\n",
                    "Exit SchemaSpyGUI",
                    JOptionPane.WARNING_MESSAGE,
                    JOptionPane.YES_NO_OPTION);
                if (returnVal == JOptionPane.YES_OPTION) {
                   System.exit(0);
                } // else do nothing
            }
            // No threads alive
            else {
                System.exit(0);
            }
        }

    }

    /**
     * Inner Class with Methods to build the command line for SchemaSpy
     */
    private class Build {

        /**
         * Build the commad line to launch SchemaSpy
         * @param type "displ" returns the Command line without password
         * @return Command line string for SchemaSpy
         */
        private String buildCommand (String type) {
            //first the path to SchemaSpy.jar
            String s = "java -jar " + operations.makePathUsable(sSpyPathTField.getText());

            //second the path to the driver for the selected DB type
            if (!dbDriverPTField.getText().equals("")) {
                s = s + " -dp " + operations.makePathUsable(dbDriverPTField.getText());
            }

            //then the needed database type
            if (!((String)dbTypeCBox.getSelectedItem()).equals("")) {
                s = s + " -t " + (String)dbTypeCBox.getSelectedItem();
            }

            //and now the necessary database specific informations
            //e.g. database name, schema, user, host etc.
            if (!dbNameTField.getText().equals("")) {
                s = s + " -db " + dbNameTField.getText();
            }

            // Select schemas
            if (allSchemasCBox.isSelected()) {
                s = s + " -all ";
            } else if (!schemaTField.getText().equals("")) {
                // Try remove space before coma
                String sc = schemaTField.getText().replace(", ", ",");
                String[] schemas = sc.split(",");
                if (schemas.length == 1) {
                    s = s + " -s " + sc;
                } else {
                    s = s + " -schemas \"" + sc + "\"";
                }
            }

            if (!dbHostTField.getText().equals("")) {
                s = s + " -host " + dbHostTField.getText();
            }

            if (!dbPortTField.getText().equals("")) {
                s = s + " -port " + dbPortTField.getText();
            }
            // TODO: Single Sign-On (-sso).
            if (!dbUserTField.getText().equals("")) {
                s = s + " -u " + dbUserTField.getText();
            }

            //now the optional informations like RegEx for columns, tables, etc
            // Properties database connection
            if (!propertiePathTField.getText().equals("")) {
                s = s + " -connprops " + operations.makePathUsable(propertiePathTField.getText());
            }
            if (!propertiesTField.getText().equals("")) {
                s = s + " -connprops " + "\"" + propertiesTField.getText() + "\"";
            }
            if (!metaFilePathTField.getText().equals("")) {
                s = s + " -meta " + operations.makePathUsable(metaFilePathTField.getText());
            }

            // Columns Exclusions
            if (!cNameRExTField.getText().equals("")) {
                if (colExRelCBox.isSelected()) {
                    s = s + " -X " + operations.makePathUsable(cNameRExTField.getText());
                } else {
                    s = s + " -x " + operations.makePathUsable(cNameRExTField.getText());
                }
            }
            // Tables inclusions
            if (!tNameRExTField.getText().equals("")) {
                s = s + " -i " + operations.makePathUsable(tNameRExTField.getText());
            }
            // Tables Exclusions
            if (!tNameExRExTField.getText().equals("")) {
                s = s + " -I " + "\"" + tNameExRExTField.getText() + "\"";
            }

            if (!((String)charsetComBox.getSelectedItem()).equals("")) {
                s = s + " -charset " + (String)charsetComBox.getSelectedItem();
            }

            if (!(fontSizeTField.getText().equals(""))) {
                s = s + " -fontsize " + fontSizeTField.getText();
            }

            if (!(fontNameTField.getText().equals(""))) {
                s = s + " -font " + "\"" + fontNameTField.getText() + "\"";
            }

            if (!(cssPathTField.getText().equals(""))) {
                s = s + " -css " + operations.makePathUsable(cssPathTField.getText());
            }

            if (!descTArea.getText().equals("")) {
                // For if someone put " instead of '
                s = s + " -desc " + operations.makePathUsable(descTArea.getText().replace("\"", "'"));
            }

            if (!pathOutputTField.getText().equals("")) {
                s = s + " -o " + operations.makePathUsable(pathOutputTField.getText());
            } else {
                s = s + " -o " + operations.makePathUsable(operations.buildOutputDir());
            }

            //now we insert the flags (e.g. Allow HTML in comments) if there are
            //some checked
            if (aHTMLCBox.isSelected()) {
                s = s + " -ahic ";
            }

            if (noRowsBox.isSelected()) {
                s = s + " -norows ";
            }

            if (dincFKCBox.isSelected()) {
                s = s + " -noimplied ";
            }

            if (noHTMLCBox.isSelected()) {
                s = s + " -nohtml ";
            }

            if (railsCBox.isSelected()) {
                s = s + " -rails ";
            }

            if (highQuCBox.isSelected()) {
                s = s + " -hq ";
            }
            if (lowQuCBox.isSelected()) {
                s = s + " -lq ";
            }

            //---------------------------
            if (noAdsCBox.isSelected()) {
                s = s + " -noads ";
            }

            if (noLogoCBox.isSelected()) {
                s = s + " -nologo ";
            }

            //last but not least String with no password if "displ" is selected
            //else String + PWD for starting SchemaSpy
            if (type.equals("displ")) {
              return s;
            } else {
                if (!String.valueOf(dbPwdField.getPassword()).equals("")) {
                    s = s + " -p " + String.valueOf(dbPwdField.getPassword());
                }
                return s;
            }
        }

    }
}
