package blanco.plugin.dbee.editors;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.editors.text.TextEditor;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import blanco.plugin.dbee.BlancoDbEEPlugin;
import blanco.plugin.dbee.actions.BlancoDbEEGenerateAction;

/**
 * blancoDbエディタ <br>
 * 
 * @author iga
 */
public class BlancoDbEEEditor extends TextEditor {

    private Composite top = null;

    public static final String TARGET_FILENAME = "blancodb.blancofw";

    public static final String BLANCO_DB_META_FILE = "blancoDb SQL定義ファイル";

    // ビジュアル領域
    private Text textBlancoDbSettingId = null;

    private Combo comboJdbcdriver = null;

    private Combo comboJdbcurl = null;

    private Combo comboJdbcuser = null;

    private Text textJdbcpassword = null;

    private Combo comboBasepackage = null;

    private Combo comboMetadir = null;

    private Combo comboSchema = null;

    private Button checkBoxTable = null;

    private Button checkBoxSql = null;

    public BlancoDbEEEditor() {
        // エンコーディングを操作するためにセットしています。
        setDocumentProvider(new BlancoDbEEDocumentProvider());
    }

    public void createPartControl(Composite parent) {
        top = parent;
        top.setSize(new org.eclipse.swt.graphics.Point(1000, 400));

        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        top.setLayout(layout);

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelBlancoDbTitle = new Label(top, SWT.NONE);
        labelBlancoDbTitle.setText("BlancoDb設定ファイル エディタ");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelBlancoDbSettingId = new Label(top, SWT.NONE);
        labelBlancoDbSettingId.setText("BlancoDb設定ID");
        textBlancoDbSettingId = new Text(top, SWT.BORDER);
        textBlancoDbSettingId.setText("blancoDb設定");
        textBlancoDbSettingId.setEditable(false);
        Label labelJdbcdriver = new Label(top, SWT.NONE);
        labelJdbcdriver.setText("JDBCドライバ");
        createComboJdbcdriver();
        Label labelJdbcurl = new Label(top, SWT.NONE);
        labelJdbcurl.setText("URL");
        createComboJdbcurl();
        Label labelJdbcuser = new Label(top, SWT.NONE);
        labelJdbcuser.setText("ユーザ");
        createComboJdbcuser();
        Label labelJdbcpassword = new Label(top, SWT.NONE);
        labelJdbcpassword.setText("パスワード");
        textJdbcpassword = new Text(top, SWT.BORDER | SWT.PASSWORD);
        Label labelBasepackage = new Label(top, SWT.NONE);
        labelBasepackage.setText("基準パッケージ");
        createComboBasepackage();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPackageComment = new Label(top, SWT.NONE);
        labelPackageComment.setText("※パッケージを指定してください。");

        Label labelMetadir = new Label(top, SWT.NONE);
        labelMetadir.setText("メタディレクトリ");
        createComboMetadir();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelMetadirComment = new Label(top, SWT.NONE);
        labelMetadirComment.setText("※メタディレクトリは通常変更せずに利用します。");

        Label labelSchema = new Label(top, SWT.NONE);
        labelSchema.setText("スキーマ");
        createComboSchema();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonConnectionCheck = new Button(top, SWT.NONE);
        buttonConnectionCheck.setText("接続チェック");
        buttonConnectionCheck
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        if (checkInputField() == false) {
                            return;
                        }
                        try {
                            checkConnectionSetting(true);
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonCreateMetafile = new Button(top, SWT.NONE);
        buttonCreateMetafile.setText("SQL定義ファイル 新規作成");
        buttonCreateMetafile
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        // メタファイル作成の際には、他の項目のチェックは行いません。
                        saveToTextEditor();

                        if (comboMetadir.getText().length() == 0) {
                            MessageDialog
                                    .openWarning(
                                            top.getShell(),
                                            BLANCO_DB_META_FILE + " 新規作成",
                                            "メタディレクトリ名を指定してください。\n"
                                                    + "※メタディレクトリ名の一般的な設定値は 'meta/sql' です。");
                            return;
                        }

                        final IFileEditorInput input = (IFileEditorInput) getEditorInput();

                        try {
                            if (BlancoDbEEPluginUtil.findFolder(
                                    input.getFile(), getProgressMonitor(),
                                    comboMetadir.getText()).exists() == false) {
                                BlancoDbEEPluginUtil.createFolder(input
                                        .getFile(), getProgressMonitor(),
                                        comboMetadir.getText());

                                MessageDialog.openInformation(top.getShell(),
                                        "メタディレクトリの作成", "メタディレクトリ ["
                                                + comboMetadir.getText()
                                                + "] を新規に作成しました。\n"
                                                + "※初回にのみ必要な動作です。");
                            }
                        } catch (CoreException e3) {
                            MessageDialog.openWarning(top.getShell(),
                                    BLANCO_DB_META_FILE + " 新規作成",
                                    "メタディレクトリ作成に失敗しました。処理中断します。:"
                                            + e3.toString());
                            e3.printStackTrace();
                            return;
                        }

                        try {
                            URL localURL = getPluginRoot();

                            InputDialog inputDialog = new InputDialog(top
                                    .getShell(), BLANCO_DB_META_FILE + " 新規作成",
                                    BLANCO_DB_META_FILE + "(メタファイル)をメタディレクトリ["
                                            + comboMetadir.getText()
                                            + "]に作成します。" + BLANCO_DB_META_FILE
                                            + "の新規ファイル名を入力してください。",
                                    "blancoDbMeta.xls", new IInputValidator() {
                                        public String isValid(String newText) {
                                            if (newText.endsWith(".xls") == false) {
                                                return "ファイル名は .xlsで終了するように指定してください。";
                                            }
                                            // 既にそのファイルが存在しないかどうかをチェック
                                            IFile newFileMeta = input.getFile()
                                                    .getProject().getFolder(
                                                            comboMetadir
                                                                    .getText())
                                                    .getFile(newText);
                                            if (newFileMeta.exists()) {
                                                return "指定のファイルは既に存在しています。"
                                                        + "別のファイル名を指定してください。";
                                            }
                                            return null;
                                        }
                                    });
                            if (inputDialog.open() == InputDialog.CANCEL) {
                                inputDialog.close();
                                return;
                            }
                            final String newMetaFilename = inputDialog
                                    .getValue();
                            inputDialog.close();

                            // プラグインのローカルからテンプレートを読み込みます。
                            InputStream inStream = new FileInputStream(localURL
                                    .getPath()
                                    + "/meta/sql/template/blancoDbTemplate.xls");
                            IFile newFileMeta = input.getFile().getProject()
                                    .getFolder(comboMetadir.getText()).getFile(
                                            newMetaFilename);
                            newFileMeta.create(inStream, true,
                                    getProgressMonitor());
                            inStream.close();
                            MessageDialog
                                    .openInformation(
                                            top.getShell(),
                                            BLANCO_DB_META_FILE + " 新規作成",
                                            BLANCO_DB_META_FILE
                                                    + "(メタファイル ["
                                                    + newMetaFilename
                                                    + "] をメタディレクトリ["
                                                    + comboMetadir.getText()
                                                    + "]に新規作成しました。\n"
                                                    + "このファイルを編集して、SQLおよび関連情報を設定してください。");
                        } catch (CoreException e1) {
                            e1.printStackTrace();
                            return;
                        } catch (IOException e2) {
                            MessageDialog.openWarning(top.getShell(), "メタファイル",
                                    "メタファイルのコピーに失敗しました。:" + e2.toString());
                            e2.printStackTrace();
                        }

                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonExecute = new Button(top, SWT.NONE);
        buttonExecute.setText("ソースコード生成");
        buttonExecute
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        if (checkInputField() == false) {
                            return;
                        }

                        try {
                            if (checkInputField() == false) {
                                return;
                            }
                            if (checkConnectionSetting(false) == false) {
                                return;
                            }

                            BlancoDbEEGenerateAction.processBlancoDb(
                                    ((IFileEditorInput) getEditorInput())
                                            .getFile(), top.getShell(),
                                    getProgressMonitor(), comboMetadir
                                            .getText(), comboJdbcdriver
                                            .getText(), comboJdbcurl.getText(),
                                    comboJdbcuser.getText(), textJdbcpassword
                                            .getText(), comboSchema.getText(),
                                    comboBasepackage.getText(), checkBoxTable
                                            .getSelection(), checkBoxSql
                                            .getSelection());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        }
                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Group group = new Group(top, SWT.NONE);
        group.setLayout(new FillLayout());
        group.setText("ソースコード生成オプション");
        checkBoxTable = new Button(group, SWT.CHECK);
        checkBoxTable.setText("単一表");
        checkBoxTable.setSelection(true);
        checkBoxSql = new Button(group, SWT.CHECK);
        checkBoxSql.setText("SQL定義");
        checkBoxSql.setSelection(true);

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPasswordComment = new Label(top, SWT.NONE);
        labelPasswordComment.setText("※注意: 各々の設定値は " + TARGET_FILENAME
                + "ファイルに平文で格納されます。");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPasswordComment2 = new Label(top, SWT.NONE);
        labelPasswordComment2.setText("※セキュリティ要件を確認して適切な対処をおこなってください。");

        loadFromTextEditor();

        // フォーカスを失った際の処理を実装。
        setFocusLostHandler(comboJdbcdriver);
        setFocusLostHandler(comboJdbcurl);
        setFocusLostHandler(comboJdbcuser);
        setFocusLostHandler(textJdbcpassword);
        setFocusLostHandler(comboBasepackage);
        setFocusLostHandler(comboMetadir);
        setFocusLostHandler(comboSchema);
        setFocusLostHandler(checkBoxTable);
        setFocusLostHandler(checkBoxSql);
    }

    /**
     * 接続設定通りに接続可能かどうかを調べます。
     * 
     * @throws IOException
     * 
     */
    private boolean checkConnectionSetting(boolean isReportSuccess)
            throws IOException {
        try {
            Class.forName(comboJdbcdriver.getText());
            Connection conn = DriverManager.getConnection(comboJdbcurl
                    .getText(), comboJdbcuser.getText(), textJdbcpassword
                    .getText());
            conn.close();
            if (isReportSuccess) {
                MessageDialog
                        .openInformation(top.getShell(), "接続チェック成功",
                                "データベースへの接続試験に成功しました.\n現在の設定でデータベースに接続可能であることが確認できました。");
            }
            return true;
        } catch (ClassNotFoundException e1) {
            MessageDialog
                    .openWarning(
                            top.getShell(),
                            "接続チェック失敗",
                            "指定のJDBCドライバ("
                                    + comboJdbcdriver.getText()
                                    + ")の読み込みに失敗しました。\n\n"
                                    + "JDBCドライバが読み込めるように調整を行う必要がある可能性があります。\n"
                                    + "BlancoDbEEPluginプラグインのフォルダ内の下記の箇所を調査してください。\n"
                                    + "  ※フォルダ ["
                                    + getPluginRoot().getPath()
                                    + "] がプラグインのフォルダです\n"
                                    + "1.プラグインのライブラリ設定\n"
                                    + "  META-INF/MANIFEST.MFファイルの Bundle-ClassPathエントリに \n"
                                    + "      lib/JDBCドライバ.jar"
                                    + "    の記載があることを確認します。\n"
                                    + "    無い場合には追加してください。\n"
                                    + "  ※「JDBCドライバ.jar」は実際のjarファイル名へと適宜読替を行ってください。\n"
                                    + "2.指定したプラグインフォルダ内の lib/JDBCドライバ.jar が\n"
                                    + "  実際に存在することを確認します。\n"
                                    + "  ※現在利用しているJavaプロジェクトのlibフォルダではない点に\n"
                                    + "    注意してください。\n"
                                    + "3.確認が終わり、もし変更点があった場合には 変更後にEclipseの再起動\n"
                                    + "  を行ってください。\n"
                                    + "  なお、META-INF/MANIFEST.MFファイルを変更した場合には\n"
                                    + "  eclipse -cleanのようにオプション付きで起動してください。\n\n"
                                    + e1.toString());
        } catch (SQLException e1) {
            MessageDialog.openWarning(top.getShell(), "接続チェック失敗",
                    "接続に失敗しました。\n" + "環境にまつわる設定値や、ユーザ名・パスワードなどを確認してください。\n\n"
                            + e1.toString());
        }
        return false;
    }

    /**
     * プラグインのルートディレクトリを取得します。
     * 
     * @return ルートディレクトリのURL これをgetPath()するとフルパスになります。
     * @throws IOException
     */
    private URL getPluginRoot() throws IOException {
        URL relativeURL = BlancoDbEEPlugin.getDefault().getBundle().getEntry(
                "/");
        URL localURL = Platform.asLocalURL(relativeURL);
        return localURL;
    }

    private void setFocusLostHandler(Control target) {
        target.addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
            }

            public void focusLost(FocusEvent e) {
                saveToTextEditor();
            }

        });
    }

    public void setFocus() {
    }

    /**
     * 読込処理を行います <br>
     * このメソッドは勝手に命名して作成しました。 <br>
     */
    public void loadFromTextEditor() {
        try {
            String editorText = getDocumentProvider().getDocument(
                    getEditorInput()).get();

            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(
                    new StreamSource(new StringReader(editorText)),
                    new SAXResult(new ContentHandler() {
                        public void setDocumentLocator(Locator arg0) {
                        }

                        public void startDocument() throws SAXException {
                            comboSchema.setText("");
                        }

                        public void endDocument() throws SAXException {
                        }

                        public void startPrefixMapping(String arg0, String arg1)
                                throws SAXException {
                        }

                        public void endPrefixMapping(String arg0)
                                throws SAXException {
                        }

                        public void startElement(String arg0, String arg1,
                                String arg2, Attributes attributes)
                                throws SAXException {
                            // System.out.println("startElement:" + arg1);
                            if (arg1.equals("blancodb")) {
                                // System.out.println("blancodbエンティティを発見");
                                for (int index = 0; index < attributes
                                        .getLength(); index++) {
                                    // System.out.println(attributes
                                    // .getLocalName(index));
                                    String localName = attributes
                                            .getLocalName(index);
                                    String value = attributes.getValue(index);
                                    if (localName.equals("jdbcdriver")) {
                                        comboJdbcdriver.setText(value);
                                    } else if (localName.equals("jdbcurl")) {
                                        comboJdbcurl.setText(value);
                                    } else if (localName.equals("jdbcuser")) {
                                        comboJdbcuser.setText(value);
                                    } else if (localName.equals("jdbcpassword")) {
                                        textJdbcpassword.setText(value);
                                    } else if (localName.equals("basepackage")) {
                                        comboBasepackage.setText(value);
                                    } else if (localName.equals("metadir")) {
                                        comboMetadir.setText(value);
                                    } else if (localName.equals("schema")) {
                                        comboSchema.setText(value);
                                    } else if (localName.equals("table")) {
                                        checkBoxTable.setSelection(value
                                                .equals("true"));
                                    } else if (localName.equals("sql")) {
                                        checkBoxSql.setSelection(value
                                                .equals("true"));
                                    }
                                }
                            }
                        }

                        public void endElement(String arg0, String arg1,
                                String arg2) throws SAXException {
                        }

                        public void characters(char[] arg0, int arg1, int arg2)
                                throws SAXException {
                        }

                        public void ignorableWhitespace(char[] arg0, int arg1,
                                int arg2) throws SAXException {
                        }

                        public void processingInstruction(String arg0,
                                String arg1) throws SAXException {
                        }

                        public void skippedEntity(String arg0)
                                throws SAXException {
                        }
                    }));
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            // この読み込みエラーは無視します。
        }
    }

    /**
     * 保存処理を行います。
     */
    public void saveToTextEditor() {
        StringWriter writer = new StringWriter();
        try {
            TransformerFactory tf = TransformerFactory.newInstance();
            SAXTransformerFactory saxTf = (SAXTransformerFactory) tf;
            TransformerHandler saxHandler;
            saxHandler = saxTf.newTransformerHandler();
            saxHandler.setResult(new StreamResult(writer));

            saxHandler.startDocument();
            AttributesImpl attributes = new AttributesImpl();
            attributes.addAttribute("", "version", "version", "CDATA", "0.1.0");
            saxHandler.startElement("", "blanco", "blanco", attributes);
            attributes = new AttributesImpl();
            attributes.addAttribute("", "name", "name", "CDATA",
                    textBlancoDbSettingId.getText());
            saxHandler.startElement("", "target", "target", attributes);
            attributes = new AttributesImpl();

            attributes.addAttribute("", "jdbcdriver", "jdbcdriver", "CDATA",
                    comboJdbcdriver.getText());
            attributes.addAttribute("", "jdbcurl", "jdbcurl", "CDATA",
                    comboJdbcurl.getText());
            attributes.addAttribute("", "jdbcuser", "jdbcuser", "CDATA",
                    comboJdbcuser.getText());
            attributes.addAttribute("", "jdbcpassword", "jdbcpassword",
                    "CDATA", textJdbcpassword.getText());
            attributes.addAttribute("", "basepackage", "basepackage", "CDATA",
                    comboBasepackage.getText());
            attributes.addAttribute("", "metadir", "metadir", "CDATA",
                    comboMetadir.getText());
            if (comboSchema.getText().length() > 0) {
                attributes.addAttribute("", "schema", "schema", "CDATA",
                        comboSchema.getText());
            }
            attributes.addAttribute("", "table", "table", "CDATA",
                    (checkBoxTable.getSelection() ? "true" : "false"));
            attributes.addAttribute("", "sql", "sql", "CDATA", (checkBoxSql
                    .getSelection() ? "true" : "false"));

            saxHandler.startElement("", "blancodb", "blancodb", attributes);

            saxHandler.endElement("", "blancodb", "blancodb");
            saxHandler.endElement("", "target", "target");
            saxHandler.endElement("", "blanco", "blanco");

            saxHandler.endDocument();
        } catch (TransformerConfigurationException e1) {
            e1.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (SAXException ex) {
            ex.printStackTrace();
        }

        String pastEditorText = getDocumentProvider().getDocument(
                getEditorInput()).get();
        if (pastEditorText.equals(writer.toString()) == false) {
            // 内容が異なる場合にのみ書き込みを行います。
            getDocumentProvider().getDocument(getEditorInput()).set(
                    writer.toString());
        }
    }

    public boolean isSaveAsAllowed() {
        return false;
    }

    public boolean isSaveOnCloseNeeded() {
        return true;
    }

    /**
     * 入力項目のチェックを実施します。 <br>
     * エラーダイアログはこのメソッドで表示します。
     * 
     * @return
     */
    private final boolean checkInputField() {
        boolean isError = false;
        if (comboJdbcdriver.getText().length() == 0) {
            comboJdbcdriver.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcdriver.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboJdbcurl.getText().length() == 0) {
            comboJdbcurl.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcurl.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboJdbcuser.getText().length() == 0) {
            comboJdbcuser.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcuser.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboBasepackage.getText().length() == 0) {
            comboBasepackage.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboBasepackage.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboMetadir.getText().length() == 0) {
            comboMetadir.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboMetadir.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (isError) {
            MessageDialog.openWarning(top.getShell(), "必須項目への入力が足りません",
                    "必須項目への入力が足りません。\nハイライト表示されている必須項目に値を入力してください");
        }

        return !isError;
    }

    /**
     * This method initializes comboJdbcdriver
     * 
     */
    private void createComboJdbcdriver() {
        comboJdbcdriver = new Combo(top, SWT.NONE);
        comboJdbcdriver
                .addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {

                        Object source = e.getSource();
                        if (source instanceof Combo) {
                            Combo combo = (Combo) source;
                            if (combo.getText().equals(
                                    "oracle.jdbc.driver.OracleDriver")) {
                                comboJdbcurl
                                        .setText("jdbc:oracle:thin:@localhost:1521:orcl");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("SCOTT");
                                comboSchema.removeAll();
                                comboSchema.add("SCOTT");
                                comboSchema.setText("SCOTT");
                            } else if (combo
                                    .getText()
                                    .equals(
                                            "com.microsoft.jdbc.sqlserver.SQLServerDriver")) {
                                comboJdbcurl
                                        .setText("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind;SelectMethod=cursor");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("sa");
                                comboSchema.removeAll();
                            } else if (combo.getText().equals(
                                    "org.postgresql.Driver")) {
                                comboJdbcurl
                                        .setText("jdbc:postgresql://localhost:5432/template1");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("postgres");
                                comboSchema.removeAll();
                            }
                        }
                    }

                    public void widgetDefaultSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                    }
                });
        comboJdbcdriver.add("oracle.jdbc.driver.OracleDriver");
        comboJdbcdriver.add("com.microsoft.jdbc.sqlserver.SQLServerDriver");
        comboJdbcdriver.add("org.postgresql.Driver");
    }

    /**
     * This method initializes comboJdbcurl
     * 
     */
    private void createComboJdbcurl() {
        comboJdbcurl = new Combo(top, SWT.NONE);
    }

    /**
     * This method initializes comboJdbcuser
     * 
     */
    private void createComboJdbcuser() {
        comboJdbcuser = new Combo(top, SWT.NONE);
    }

    /**
     * This method initializes comboBasepackage
     * 
     */
    private void createComboBasepackage() {
        comboBasepackage = new Combo(top, SWT.NONE);
        comboBasepackage.add("myapp.db");
        comboBasepackage.add("mycompany.myapp.db");
        comboBasepackage.select(0);
    }

    /**
     * This method initializes comboMetadir
     * 
     */
    private void createComboMetadir() {
        comboMetadir = new Combo(top, SWT.NONE);
        comboMetadir.add("meta/sql");
        comboMetadir.select(0);
    }

    /**
     * This method initializes comboSchema
     * 
     */
    private void createComboSchema() {
        comboSchema = new Combo(top, SWT.NONE);
    }
}