/*
 * Paraselene
 * Copyright (c) 2009  Akira Terasaki
 * このファイルは同梱されているLicense.txtに定めた条件に同意できる場合にのみ
 * 利用可能です。
 */
package paraselene;

import paraselene.tag.*;
import java.io.*;
import java.net.*;


class DummyTag extends Tag {
	DummyTag(){ super( "dummy", false ); }
	public void setModify() {}
}

/**
 * HTML構造。スレッドセーフです。
 */
public abstract class HTMLPart implements Serializable {
	/**
	 * 文字列種別。
	 */
	public enum StringMode {
		/**
		 * プレーンテキスト。
		 */
		PLAIN,
		/**
		 * TEXTAREAタグ、PREタグ内の文字列。
		 */
		TEXTAREA,
		/**
		 * タグ属性値の文字列。
		 */
		ATTRIBUTE,
		/**
		 * カスケードスタイルシート。
		 */
		CSS,
		/**
		 * BODYタグ内の文字列。
		 */
		BODY;

		private static final long serialVersionUID = 2L;
	};
	private static final long serialVersionUID = 2L;

	private static final DummyTag	null_tag = new DummyTag();
	/**
	 * フレームワークが使用します。
	 */
	public static Tag getDummyTag() {
		return null_tag;
	}
	/**
	 * 所属先タグ。
	 */
	private Tag	embed_tag = null_tag;
	/**
	 * 所属先タグの設定。
	 * @param t 所属先。
	 */
	public void setAssignedTag( Tag t ) {
		if ( t == null )	t = null_tag;
		embed_tag = t;
	}
	/**
	 * 所属先タグの取得。
	 * @return 所属先。
	 */
	public Tag getAssignedTag() {
		return embed_tag;
	}

	protected HTMLPart() {}

	/**
	 * 文字列化。
	 * @return 文字列化。
	 */
	public String toString() {
		try {
			return toString( StringMode.PLAIN );
		}
		catch( Exception e ) {
			return e.toString();
		}
	}

	/**
	 * テキスト化。
	 * @param mode 出力モード。
	 * @return 文字列。
	 */
	public abstract String toString( StringMode mode );

	/**
	 * 出力。
	 * @param w ライター。
	 * @param mode 出力モード。
	 */
	public void write( PrintWriter w, StringMode mode ) {
		String	str = toString( mode );
		if ( str == null )	return;
		w.print( str );
	}

	/**
	 * 複製の作成。
	 * @return 複製。
	 */
	public abstract HTMLPart getReplica();
}


