/*
 * 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.eclipseplugingen.expand;

import java.io.File;
import java.util.List;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import blanco.cg.BlancoCgObjectFactory;
import blanco.cg.transformer.BlancoCgTransformerFactory;
import blanco.cg.valueobject.BlancoCgClass;
import blanco.cg.valueobject.BlancoCgField;
import blanco.cg.valueobject.BlancoCgMethod;
import blanco.cg.valueobject.BlancoCgSourceFile;
import blanco.commons.util.BlancoNameAdjuster;
import blanco.commons.util.BlancoXmlUtil;

public class BlancoEclipsePluginGenExpandWizardPage {
    /**
     * 内部的に利用するblancoCg用ファクトリ。
     */
    private BlancoCgObjectFactory fCgFactory = null;

    /**
     * 内部的に利用するblancoCg用ソースファイル情報。
     */
    private BlancoCgSourceFile fCgSourceFile = null;

    /**
     * 内部的に利用するblancoCg用クラス情報。
     */
    private BlancoCgClass fCgClass = null;

    public final void expand(final Element elementCommon,
            final NodeList listList, final File directoryTarget) {
        final String pluginName = BlancoXmlUtil.getTextContent(elementCommon,
                "name");
        final String displayName = BlancoXmlUtil.getTextContent(elementCommon,
                "displayName");

        final String packageName = BlancoXmlUtil.getTextContent(elementCommon,
                "packageName");
        @SuppressWarnings("unused")
        final String description = BlancoXmlUtil.getTextContent(elementCommon,
                "description");

        final String className = "Abstract"
                + BlancoNameAdjuster.toClassName(pluginName) + "WizardPage";

        // 従来と互換性を持たせるため、/mainサブフォルダに出力します。
        final File fileBlancoMain = new File(directoryTarget.getAbsolutePath()
                + "/main");

        fCgFactory = BlancoCgObjectFactory.getInstance();
        fCgSourceFile = fCgFactory.createSourceFile(packageName + ".wizards",
                "このソースコードは blanco Frameworkによって自動生成されています。");

        fCgClass = fCgFactory.createClass(className, "");
        fCgSourceFile.getClassList().add(fCgClass);

        fCgClass.setAbstract(true);
        fCgClass.getExtendClassList().add(
                fCgFactory.createType("org.eclipse.jface.wizard.WizardPage"));

        fCgSourceFile.getImportList().add("org.eclipse.swt.SWT");
        fCgSourceFile.getImportList().add("org.eclipse.swt.layout.GridLayout");
        fCgSourceFile.getImportList()
                .add("org.eclipse.core.resources.IProject");
        fCgSourceFile.getImportList().add("org.eclipse.core.resources.IFile");

        fCgSourceFile.getImportList().add(
                packageName + "." + BlancoNameAdjuster.toClassName(pluginName)
                        + "PluginConstants");

        final BlancoCgField field1 = fCgFactory.createField("labelMessage1",
                "org.eclipse.swt.widgets.Label", "");
        fCgClass.getFieldList().add(field1);

        final BlancoCgField field2 = fCgFactory.createField("labelMessage2",
                "org.eclipse.swt.widgets.Label", "");
        fCgClass.getFieldList().add(field2);

        final BlancoCgField fieldSelection = fCgFactory.createField(
                "selection", "org.eclipse.jface.viewers.ISelection", "");
        fCgClass.getFieldList().add(fieldSelection);
        fieldSelection.setAccess("protected");

        {
            final BlancoCgMethod method = fCgFactory
                    .createMethod(className, "");
            fCgClass.getMethodList().add(method);
            method.setConstructor(true);

            method.getParameterList().add(
                    fCgFactory.createParameter("selection",
                            "org.eclipse.jface.viewers.ISelection", ""));

            final List<java.lang.String> listLine = method.getLineList();

            listLine.add("super(\"wizardPage\");");
            listLine.add("setTitle(\"" + displayName + " プラグイン 利用支援ウィザード\");");
            listLine.add("this.selection = selection;");
        }

        {
            final BlancoCgMethod method = fCgFactory.createMethod(
                    "createControl", "");
            fCgClass.getMethodList().add(method);

            method.getParameterList().add(
                    fCgFactory.createParameter("parent",
                            "org.eclipse.swt.widgets.Composite", ""));

            final List<java.lang.String> listLine = method.getLineList();

            listLine.add("GridLayout gridLayout = new GridLayout();");
            listLine.add("gridLayout.numColumns = 1;");
            listLine.add("");
            listLine
                    .add("Composite container = new Composite(parent, SWT.NULL);");
            listLine.add("container.setLayout(gridLayout);");
            listLine.add("");
            listLine.add("new Label(container, SWT.NONE).setText(\""
                    + displayName + " Wizardへようこそ！\");");
            listLine.add("new Label(container, SWT.NONE).setText(\"このウィザードは"
                    + displayName + "プラグインが利用可能になるまでの手順をお手伝いします。\");");
            listLine.add("new Label(container, SWT.NONE).setText(\"\");");
            listLine
                    .add("new Label(container, SWT.NONE).setText(\"このウィザードの主たる目的は、設定ファイル(\" + "
                            + BlancoNameAdjuster.toClassName(pluginName)
                            + "PluginConstants.TARGET_FILENAME + \")をプロジェクトのルートフォルダに作成することです。\");");
            listLine
                    .add("new Label(container, SWT.NONE).setText(\"設定ファイル(\" + "
                            + BlancoNameAdjuster.toClassName(pluginName)
                            + "PluginConstants.TARGET_FILENAME + \")に関する状況は下記のようになっています。\");");
            listLine.add("");
            listLine.add("labelMessage1 = new Label(container, SWT.NONE);");
            listLine.add("labelMessage1.setText(\"  1.プロジェクトのルートフォルダに \" + "
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "PluginConstants.TARGET_FILENAME + \"ファイルを新規に作成します。\");");
            listLine.add("labelMessage2 = new Label(container, SWT.NONE);");
            listLine
                    .add("labelMessage2.setText(\"  2.ウィザードを完了(Finish)を行うことにより新規に\" + "
                            + BlancoNameAdjuster.toClassName(pluginName)
                            + "PluginConstants.TARGET_FILENAME + \"ファイルを作成して編集を行うことができます。\");");
            listLine.add("");
            listLine.add("setControl(container);");
            listLine.add("");
            listLine.add("IProject proj = "
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "Wizard.getProject(selection);");
            listLine.add("if (proj == null) {");
            listLine.add("setErrorMessage(\"プロジェクトを選んでください\");");
            listLine.add("setPageComplete(false);");
            listLine.add("labelMessage1.setText(\"  1.プロジェクトが選択されていません。\");");
            listLine.add("labelMessage2.setText(\"  2.プロジェクトの中にしか \" + "
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "PluginConstants.TARGET_FILENAME + \"ファイルは作成できません。\");");
            listLine.add("return;");
            listLine.add("}");
            listLine.add("");
            listLine.add("if (proj.isOpen() == false) {");
            listLine.add("setPageComplete(false);");
            listLine
                    .add("setErrorMessage(\"開いているプロジェクトを選択してから、再度ウィザードを実行してください。\");");
            listLine
                    .add("labelMessage1.setText(\"  1.選択されたプロジェクトは開かれていません。\");");
            listLine.add("labelMessage2.setText(\"  2.プロジェクトの中にしか \" + "
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "PluginConstants.TARGET_FILENAME + \"ファイルは作成できません。\");");
            listLine.add("return;");
            listLine.add("}");
            listLine.add("");
            listLine.add("IFile file = proj.getFile("
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "PluginConstants.TARGET_FILENAME);");
            listLine.add("if (file.exists()) {");
            listLine.add("labelMessage1.setText(\"  1.既にプロジェクトのルートに \" + "
                    + BlancoNameAdjuster.toClassName(pluginName)
                    + "PluginConstants.TARGET_FILENAME + \"ファイルが存在しています。\");");
            listLine
                    .add("labelMessage2.setText(\"  2.ウィザードを完了(Finish)を行うことにより既存の\" + "
                            + BlancoNameAdjuster.toClassName(pluginName)
                            + "PluginConstants.TARGET_FILENAME + \"ファイルの編集を行うことができます。\");");
            listLine.add("}");
        }

        // ソースコードを実際に生成します。
        BlancoCgTransformerFactory.getJavaSourceTransformer().transform(
                fCgSourceFile, fileBlancoMain);
    }
}
