/*
 * このソースコードは blanco Frameworkによって自動生成されています。
 * Eclipseプラグイン [BlancoEclipsePluginGenSample]の抽象エディタクラス
 */
package blanco.sample.eclipseplugingen.editors;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.xml.transform.dom.DOMResult;

import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.editors.text.TextEditor;
import org.w3c.dom.Document;

import blanco.commons.util.BlancoXmlUtil;

/**
 * Eclipseプラグイン [BlancoEclipsePluginGenSample]の抽象エディタクラス。
 *
 * サンプルプログラムです。<br>
 */
public abstract class AbstractBlancoEclipsePluginGenSampleEditor extends TextEditor {
    /**
     * エディタクラスのコンストラクタです。
     */
    public AbstractBlancoEclipsePluginGenSampleEditor() {
        // 所定のエンコーディングをもって入出力を実現するためにプロバイダをセットしています。
        setDocumentProvider(new BlancoEclipsePluginGenSampleDocumentProvider());
    }

    /**
     * フォーカスがセットされた場合に呼び出されます。
     */
    public final void setFocus() {
    }

    /**
     * 名前を付けて保存が許可されているかどうか。
     *
     * @return 常にfalseを戻します。
     */
    public final boolean isSaveAsAllowed() {
        return false;
    }

    /**
     * エディタが閉じられる際に保存が必要かどうかを戻します。
     *
     * @return 常にtrueを戻します。
     */
    public final boolean isSaveOnCloseNeeded() {
        return true;
    }

    /**
     *
     * @param target
     */
    protected final void setFocusLostHandler(final Control target) {
        target.addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
            }

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

    /**
     * テキストエディタがデータをロードする際に呼び出されます。
     *
     * このメソッドは blancoで独自に規定するものです。
     */
    protected final void loadFromTextEditor() {
        final String editorText = getDocumentProvider().getDocument(getEditorInput()).get();

        final DOMResult result;
        try {
            result = BlancoXmlUtil.transformStream2Dom(new ByteArrayInputStream(editorText.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return;
        }

        loadFromTextEditorInternal(result);
    }

    /**
     * 実際にデータをロードする処理内容を記述します。
     *
     * @param argResult
     */
    protected abstract void loadFromTextEditorInternal(final DOMResult argResult);

    /**
     * テキストエディタがデータをセーブする際に呼び出されます。
     *
     * このメソッドは blancoで独自に規定するものです。
     */
    protected final void saveToTextEditor() {
        Document document = saveToTextEditorInternal();
        if (document == null) {
            return;
        }

        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        BlancoXmlUtil.transformDom2Stream(document, outStream);
        try {
            outStream.flush();
            final String result = new String(outStream.toByteArray(), "UTF-8");
            final String pastEditorText = getDocumentProvider().getDocument(getEditorInput()).get();
            if (pastEditorText.equals(result) == false) {
                // 内容が異なる場合にのみ書き込みを行います。
                getDocumentProvider().getDocument(getEditorInput()).set(result);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }

    /**
     * 実際にデータをセーブする処理内容を記述します。
     *
     * @return
     */
    protected abstract Document saveToTextEditorInternal();
}
