/*
 * このソースコードは blanco Frameworkによって自動生成されています。
 * Eclipseプラグイン [BlancoValueObjectDotNet]のウィザードクラス
 */
package blanco.plugin.valueobjectdotnet.wizards;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;

import blanco.plugin.valueobjectdotnet.BlancoValueObjectDotNetPluginConstants;

/**
 * Eclipseプラグイン [BlancoValueObjectDotNet]のウィザードクラス。
 *
 * blancoValueObjectDotNetプラグインのソースコード自動生成のための定義書です。<br>
 */
public abstract class AbstractBlancoValueObjectDotNetWizard extends Wizard implements INewWizard {
    /**
     */
    protected ISelection selection;

    /**
     */
    public AbstractBlancoValueObjectDotNetWizard() {
        super();
        setNeedsProgressMonitor(true);
        setWindowTitle("blancoValueObjectDotNet Wizard");
    }

    /**
     *
     * @param workbench
     * @param selection
     */
    public void init(final IWorkbench workbench, final IStructuredSelection selection) {
        this.selection = selection;
    }

    /**
     *
     * @return
     */
    public boolean performFinish() {
        // 基本的にチェックはウィザード側で終了していると仮定します。
        IProject proj = getProject(selection);
        if (proj == null) {
            return false;
        }

        // ここで ファイルを新規作成します。
        IFile file = proj.getFile(BlancoValueObjectDotNetPluginConstants.TARGET_FILENAME);
        doFinish(file);

        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        try {
            // エディタを開きます。
            IDE.openEditor(page, file, "blanco.plugin.valueobjectdotnet.editors");
        } catch (PartInitException e) {
            // 例外は無視します。
        }

        return true;
    }

    /**
     */
    public void addPages() {
        final AbstractBlancoValueObjectDotNetWizardPage page = new BlancoValueObjectDotNetWizardPage(selection);
        addPage(page);
        final BlancoValueObjectDotNetWizardPage2 page2 = new BlancoValueObjectDotNetWizardPage2(selection);
        addPage(page2);
        final BlancoValueObjectDotNetWizardPage3 page3 = new BlancoValueObjectDotNetWizardPage3(selection);
        addPage(page3);
        final BlancoValueObjectDotNetWizardPage4 page4 = new BlancoValueObjectDotNetWizardPage4(selection);
        addPage(page4);
        final AbstractBlancoValueObjectDotNetWizardPage99 page99 = new BlancoValueObjectDotNetWizardPage99(selection);
        addPage(page99);
    }

    /**
     * ISelectionから IProject(プロジェクト)を取得します。
     *
     * @param selection
     * @return
     */
    public static IProject getProject(final ISelection selection) {
        IProject proj = null;
        IStructuredSelection ssel = (IStructuredSelection) selection;
        if (ssel.isEmpty()) {
            return null;
        }
        Object obj = ssel.getFirstElement();
        if (obj instanceof IProjectNature) {
            // プロジェクトの場合には、これが入ってきます。
            IProjectNature nature = (IProjectNature) obj;
            proj = nature.getProject();
        } else if (obj instanceof IResource) {
            IResource res = (IResource) obj;
            proj = res.getProject();
        } else {
            System.out.println(obj.getClass());
            return null;
        }
        return proj;
    }

    /**
     *
     * @param file
     */
    private void doFinish(final IFile file) {
        try {
            InputStream stream = openContentStream();
            if (file.exists()) {
                // なにもしません。
            } else {
                file.create(stream, false, null);
            }
            stream.close();
        } catch (IOException e) {
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @return
     */
    private InputStream openContentStream() {
        String contents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><blanco/>";
        return new ByteArrayInputStream(contents.getBytes());
    }
}
