/*
 * blanco Framework
 * Copyright (C) 2004-2005 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.plugin.soap.editors;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;

import javax.xml.transform.dom.DOMResult;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
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.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IFileEditorInput;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import blanco.commons.util.BlancoNameUtil;
import blanco.commons.util.BlancoXmlUtil;
import blanco.plugin.soap.BlancoSOAPPlugin;
import blanco.plugin.soap.BlancoSOAPPluginConstants;
import blanco.plugin.soap.actions.BlancoSOAPGenerateAction;
import blanco.plugin.soap.actions.BlancoXsd2CsSourceGenerateAction;
import blanco.plugin.soap.actions.BlancoXsd2JavaSourceGenerateAction;
import blanco.plugin.soap.actions.BlancoXsd2TerasolunaSourceGenerateAction;

/**
 * Eclipseプラグインにおけるエディタ
 * 
 * @author IGA Tosiki
 */
public class BlancoSOAPEditor extends AbstractBlancoSOAPEditor {

    private Composite top = null;

    public static final String BLANCO_META_FILE_TELEGRAM = "電文処理定義書・電文定義書";

    // ビジュアル領域
    private Label labelBlancoSOAPTitle = null;

    private Label labelBlancoSOAPSettingId = null;

    private Text textBlancoSOAPSettingId = null;

    private Combo comboMetaWsdlDir = null;

    private Button buttonCreateMetaWsdlFile = null;

    private Button buttonExecuteWsdl = null;

    private Button checkBoxGenerateXsdElementDeclaration = null;

    private Combo comboBlancoWsdlDir = null;

    private Button buttonExecuteXsd2JavaSource = null;

    private Button buttonExecuteXsd2TerasolunaSource = null;

    private Button checkBoxGenerateDotNetWsdlExe = null;

    private Combo comboDotNetSdkDir = null;

    private Button buttonExecuteXsd2CsSource = null;

    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("");

        labelBlancoSOAPTitle = new Label(top, SWT.NONE);
        labelBlancoSOAPTitle.setText("blancoSOAP 設定ファイル エディタ ("
                + BlancoSOAPPluginConstants.VERSION + ")");

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

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

        labelBlancoSOAPSettingId = new Label(top, SWT.NONE);
        labelBlancoSOAPSettingId.setText("設定ID");
        textBlancoSOAPSettingId = new Text(top, SWT.BORDER);
        textBlancoSOAPSettingId.setText("blancoSOAP");
        textBlancoSOAPSettingId.setEditable(false);

        /**
         * ここからは電文処理定義・電文定義セクション。
         */

        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("電文処理定義・電文定義セクション");

        Label labelMetaWsdlDir = new Label(top, SWT.NONE);
        labelMetaWsdlDir.setText("メタディレクトリ");
        comboMetaWsdlDir = new Combo(top, SWT.NONE);
        comboMetaWsdlDir.add("meta/soap/wsdl");
        comboMetaWsdlDir.select(0);

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

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

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

                        final IFileEditorInput input = (IFileEditorInput) getEditorInput();

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

                                MessageDialog.openInformation(top.getShell(),
                                        "メタディレクトリの作成", "メタディレクトリ ["
                                                + comboMetaWsdlDir.getText()
                                                + "] を新規に作成しました。\n"
                                                + "※初回にのみ必要な動作です。");
                            }

                            if (BlancoSOAPPluginUtil.findFolder(
                                    input.getFile(), getProgressMonitor(),
                                    comboMetaWsdlDir.getText()).exists() == false) {
                                BlancoSOAPPluginUtil.createFolder(input
                                        .getFile(), getProgressMonitor(),
                                        comboMetaWsdlDir.getText());
                            }
                        } catch (CoreException e3) {
                            MessageDialog.openWarning(top.getShell(),
                                    BLANCO_META_FILE_TELEGRAM + " 新規作成",
                                    "メタディレクトリ作成に失敗しました。処理中断します。:"
                                            + e3.toString());
                            e3.printStackTrace();
                            return;
                        }

                        try {
                            URL localURL = BlancoSOAPPlugin.getPluginRoot();

                            InputDialog inputDialog = new InputDialog(top
                                    .getShell(), BLANCO_META_FILE_TELEGRAM
                                    + " 新規作成", BLANCO_META_FILE_TELEGRAM
                                    + "(メタファイル)をメタディレクトリ["
                                    + comboMetaWsdlDir.getText() + "]に作成します。"
                                    + BLANCO_META_FILE_TELEGRAM
                                    + "の新規ファイル名を入力してください。",
                                    "blancoWsdlMeta.xls",
                                    new IInputValidator() {
                                        public String isValid(String newText) {
                                            if (newText.endsWith(".xls") == false) {
                                                return "ファイル名は .xlsで終了するように指定してください。";
                                            }
                                            if (BlancoNameUtil
                                                    .isValidFileName(newText) == false) {
                                                return "ファイル名には "
                                                        + BlancoNameUtil
                                                                .invalidFileNameChar()
                                                        + " は利用しないでください。";
                                            }
                                            // 既にそのファイルが存在しないかどうかをチェック
                                            IFile newFileMeta = input.getFile()
                                                    .getProject().getFolder(
                                                            comboMetaWsdlDir
                                                                    .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()
                                            + BlancoSOAPPluginConstants.TEMPLATE_FILENAME_WITHOUT_EXT
                                            + ".xls");
                            IFile newFileMeta = input.getFile().getProject()
                                    .getFolder(comboMetaWsdlDir.getText())
                                    .getFile(newMetaFilename);
                            newFileMeta.create(inStream, true,
                                    getProgressMonitor());
                            inStream.close();
                            MessageDialog
                                    .openInformation(
                                            top.getShell(),
                                            BLANCO_META_FILE_TELEGRAM + " 新規作成",
                                            BLANCO_META_FILE_TELEGRAM
                                                    + "(メタファイル ["
                                                    + newMetaFilename
                                                    + "] をメタディレクトリ["
                                                    + comboMetaWsdlDir
                                                            .getText()
                                                    + "]に新規作成しました。\n"
                                                    + "このファイルを編集して、電文処理定義・電文定義 関連情報を設定してください。");
                        } catch (CoreException e1) {
                            e1.printStackTrace();
                            return;
                        } catch (IOException e2) {
                            MessageDialog.openWarning(top.getShell(), "メタファイル",
                                    "メタファイルのコピーに失敗しました。:" + e2.toString());
                            e2.printStackTrace();
                        }

                    }
                });

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

        buttonExecuteWsdl = new Button(top, SWT.NONE);
        buttonExecuteWsdl.setText("電文定義書・電文処理定義書からWSDLおよびXSDを生成");
        buttonExecuteWsdl
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        if (checkInputField() == false) {
                            return;
                        }

                        try {
                            // 再入を防止するために必要です。
                            buttonExecuteWsdl.setEnabled(false);

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

                            final IFileEditorInput input = (IFileEditorInput) getEditorInput();
                            if (input.getFile().getProject().getFolder(
                                    comboMetaWsdlDir.getText()).exists() == false) {
                                MessageDialog.openWarning(top.getShell(),
                                        "ソースコード生成", "メタディレクトリ ("
                                                + comboMetaWsdlDir.getText()
                                                + ") が存在しません。処理を中断します。");
                                return;
                            }

                            // 電文処理定義書・電文定義書からWSDL/XSDを生成します。
                            BlancoSOAPGenerateAction.processBlancoSOAP(input
                                    .getFile(), top.getShell(),
                                    getProgressMonitor(), comboMetaWsdlDir
                                            .getText(), comboBlancoWsdlDir
                                            .getText(),
                                    checkBoxGenerateXsdElementDeclaration
                                            .getSelection());

                            // blancoフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "blanco");

                            // blanco.wsdlフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());

                            // tmpフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "tmp");

                            // soapフォルダを同期
                            // あくまでも保険として同期を取ります。
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), comboMetaWsdlDir
                                            .getText());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        } finally {
                            // 再入を防止するために必要です。
                            buttonExecuteWsdl.setEnabled(true);
                        }
                    }

                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");
        Group group = new Group(top, SWT.NONE);
        group.setLayout(new FillLayout());
        group.setText("XSD (XML Schema) 生成オプション");
        checkBoxGenerateXsdElementDeclaration = new Button(group, SWT.CHECK);
        checkBoxGenerateXsdElementDeclaration.setText("要素宣言を生成");
        checkBoxGenerateXsdElementDeclaration.setSelection(false);

        /**
         * ここからはWSDL/XSDセクション。
         */

        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("WSDL/XSDセクション");

        new Label(top, SWT.NONE).setText("メタディレクトリ");
        comboBlancoWsdlDir = new Combo(top, SWT.NONE);
        comboBlancoWsdlDir.add("blanco.wsdl");
        comboBlancoWsdlDir.select(0);

        /**
         * ここからはソースコード生成セクション (Java版)。
         */

        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("ソースコード生成セクション (Java版)");

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

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

                        try {
                            // 再入を防止するために必要です。
                            buttonExecuteXsd2JavaSource.setEnabled(false);

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

                            final IFileEditorInput input = (IFileEditorInput) getEditorInput();
                            if (input.getFile().getProject().getFolder(
                                    comboBlancoWsdlDir.getText()).exists() == false) {
                                MessageDialog.openWarning(top.getShell(),
                                        "ソースコード生成", "WSDLメタディレクトリ ("
                                                + comboBlancoWsdlDir.getText()
                                                + ") が存在しません。処理を中断します。");
                                return;
                            }

                            BlancoXsd2JavaSourceGenerateAction.process(input
                                    .getFile(), top.getShell(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());

                            // blancoフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "blanco");

                            // tmpフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "tmp");

                            // あくまでも保険として同期を取ります。
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        } finally {
                            // 再入を防止するために必要です。
                            buttonExecuteXsd2JavaSource.setEnabled(true);
                        }
                    }

                });

        /**
         * ここからはソースコード生成セクション (TERASOLUNA Rich版)。
         */

        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("ソースコード生成セクション (TERASOLUNA Rich版)");

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

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

                        try {
                            // 再入を防止するために必要です。
                        	buttonExecuteXsd2TerasolunaSource.setEnabled(false);

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

                            final IFileEditorInput input = (IFileEditorInput) getEditorInput();
                            if (input.getFile().getProject().getFolder(
                                    comboBlancoWsdlDir.getText()).exists() == false) {
                                MessageDialog.openWarning(top.getShell(),
                                        "ソースコード生成", "WSDLメタディレクトリ ("
                                                + comboBlancoWsdlDir.getText()
                                                + ") が存在しません。処理を中断します。");
                                return;
                            }

                            BlancoXsd2TerasolunaSourceGenerateAction.process(input
                                    .getFile(), top.getShell(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());

                            // blancoフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "blanco");

                            // tmpフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "tmp");

                            // あくまでも保険として同期を取ります。
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        } finally {
                            // 再入を防止するために必要です。
                        	buttonExecuteXsd2TerasolunaSource.setEnabled(true);
                        }
                    }

                });

        /**
         * ここからはソースコード生成セクション (C#.NET版)
         */

        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("");
        new Label(top, SWT.NONE).setText("ソースコード生成セクション (C#.NET版)");

        // スペーサー
        new Label(top, SWT.NONE).setText("");
        Group group2 = new Group(top, SWT.NONE);
        group2.setLayout(new FillLayout());
        group2.setText(".NET Framework SDK 実行オプション");
        checkBoxGenerateDotNetWsdlExe = new Button(group2, SWT.CHECK);
        checkBoxGenerateDotNetWsdlExe.setText("wsdl.exeを起動");
        checkBoxGenerateDotNetWsdlExe.setSelection(false);
        checkBoxGenerateDotNetWsdlExe
                .addSelectionListener(new SelectionListener() {
                    public void widgetSelected(final SelectionEvent e) {
                        comboDotNetSdkDir
                                .setEnabled(checkBoxGenerateDotNetWsdlExe
                                        .getSelection());
                    }

                    public void widgetDefaultSelected(final SelectionEvent e) {
                        comboDotNetSdkDir
                                .setEnabled(checkBoxGenerateDotNetWsdlExe
                                        .getSelection());
                    }
                });

        new Label(top, SWT.NONE).setText("SDK ディレクトリ");
        comboDotNetSdkDir = new Combo(top, SWT.NONE);
        comboDotNetSdkDir.add("C:\\Program Files\\Microsoft.NET\\SDK\\v1.1");
        comboDotNetSdkDir.select(0);
        comboDotNetSdkDir.setEnabled(false);

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

        buttonExecuteXsd2CsSource = new Button(top, SWT.NONE);
        buttonExecuteXsd2CsSource.setText("WSDL/XSDからC#.NETソースコードを生成");
        buttonExecuteXsd2CsSource
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        if (checkInputField() == false) {
                            return;
                        }

                        try {
                            // 再入を防止するために必要です。
                            buttonExecuteXsd2CsSource.setEnabled(false);

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

                            final IFileEditorInput input = (IFileEditorInput) getEditorInput();
                            if (input.getFile().getProject().getFolder(
                                    comboBlancoWsdlDir.getText()).exists() == false) {
                                MessageDialog.openWarning(top.getShell(),
                                        "ソースコード生成", "WSDLメタディレクトリ ("
                                                + comboBlancoWsdlDir.getText()
                                                + ") が存在しません。処理を中断します。");
                                return;
                            }

                            BlancoXsd2CsSourceGenerateAction.process(input
                                    .getFile(), top.getShell(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText(),
                                    checkBoxGenerateDotNetWsdlExe
                                            .getSelection(), comboDotNetSdkDir
                                            .getText());

                            // blancoフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "blanco.cs");

                            // tmpフォルダを同期
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), "tmp");

                            // あくまでも保険として同期を取ります。
                            BlancoSOAPPluginUtil.refreshFolder(input.getFile(),
                                    getProgressMonitor(), comboBlancoWsdlDir
                                            .getText());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        } finally {
                            // 再入を防止するために必要です。
                            buttonExecuteXsd2CsSource.setEnabled(true);
                        }
                    }

                });

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

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

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

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

        loadFromTextEditor();

        setFocusLostHandler(comboMetaWsdlDir);
        setFocusLostHandler(checkBoxGenerateXsdElementDeclaration);
        setFocusLostHandler(comboBlancoWsdlDir);
        setFocusLostHandler(checkBoxGenerateDotNetWsdlExe);
        setFocusLostHandler(comboDotNetSdkDir);
    }

    /**
     * 読込処理を行います <br>
     */
    protected void loadFromTextEditorInternal(final DOMResult argResult) {
        final Node rootNode = argResult.getNode();
        if (rootNode instanceof Document) {
            // これが正常系。ドキュメントルートを取得
            final Document rootDocument = (Document) rootNode;
            final Element elementBlancoSoap = BlancoXmlUtil.getElement(
                    rootDocument, "blanco/target/blancosoap");
            if (elementBlancoSoap == null) {
                // あきらめて処理中断します。
                return;
            }

            if (elementBlancoSoap.getAttribute("metawsdldir") != null) {
                comboMetaWsdlDir.setText(elementBlancoSoap
                        .getAttribute("metawsdldir"));
            }
            if (elementBlancoSoap.getAttribute("blancowsdldir") != null) {
                comboBlancoWsdlDir.setText(elementBlancoSoap
                        .getAttribute("blancowsdldir"));
            }
            if (elementBlancoSoap.getAttribute("dotnetsdkdir") != null) {
                comboDotNetSdkDir.setText(elementBlancoSoap
                        .getAttribute("dotnetsdkdir"));
            }

            if (elementBlancoSoap.getAttribute("generatexsdelementdeclaration") != null) {
                checkBoxGenerateXsdElementDeclaration
                        .setSelection(elementBlancoSoap.getAttribute(
                                "generatexsdelementdeclaration").equals("true"));
            }
            if (elementBlancoSoap.getAttribute("generatedotnetwsdlexe") != null) {
                checkBoxGenerateDotNetWsdlExe.setSelection(elementBlancoSoap
                        .getAttribute("generatedotnetwsdlexe").equals("true"));
            }
        }
    }

    /**
     * 保存処理を行います。
     */
    protected Document saveToTextEditorInternal() {
        final Document document = BlancoXmlUtil.newDocument();
        final Element blanco = document.createElement("blanco");
        document.appendChild(blanco);
        final Element target = document.createElement("target");
        blanco.appendChild(target);
        final Element blancosoap = document.createElement("blancosoap");
        target.appendChild(blancosoap);
        blancosoap.setAttribute("metawsdldir", comboMetaWsdlDir.getText());
        blancosoap.setAttribute("blancowsdldir", comboBlancoWsdlDir.getText());
        blancosoap.setAttribute("dotnetsdkdir", comboDotNetSdkDir.getText());
        blancosoap.setAttribute("generatexsdelementdeclaration",
                checkBoxGenerateXsdElementDeclaration.getSelection() ? "true"
                        : "false");
        blancosoap
                .setAttribute("generatedotnetwsdlexe",
                        checkBoxGenerateDotNetWsdlExe.getSelection() ? "true"
                                : "false");

        return document;
    }

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

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

        return !isError;
    }
}