package jp.co.cybec.laxide.model.base;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

/**
 * Bodyモデルクラス。 ファイル名：LetsAjaxBodyModel.java
 * 
 * @author nakamura 作成時刻：14:56:10
 * 
 */
public class LetsAjaxBodyModel extends BaseModel {

	// 子モデルの追加又は削除によって構造が変化したことを示す文字列
	public static final String P_CHILDREN = "_children";

	private List children = new ArrayList(); // 子モデルのリスト

	public static final String P_TITLE = "_title";

	public static final String P_BGCOLOR = "_BGCOLOR";

	public static final String P_ONLOAD = "_onLoad";

	private String title = "LET'S AJAX";

	private String bgColor = "#FFFFFF";

	/** カラーパレッドのRGB属性値 */
	private int red, green, blue;

	private String onLoad = "init();";

	public void addChild(Object child) {

		if (children.size() != 0 && child instanceof I_LetsAjaxLayoutModel) {
			if (children.get(0) instanceof I_LetsAjaxLayoutModel) {
				children.remove(0);
			}
			children.add(0, child); // 子モデル(レイアウトモデル)を追加
		} else {
			children.add(child); // 子モデルを追加
		}

		// EditPartへの通知
		firePropertyChange(P_CHILDREN, null, null);
	}

	public List getChildren() {
		return children; // 子モデルを返す
	}

	public void removeChild(Object child) {
		// 子モデルの削除
		children.remove(child);
		// EditPartへの通知
		firePropertyChange(P_CHILDREN, null, null);
	}

	// TODO ここから
	public IPropertyDescriptor[] getPropertyDescriptors() {
		IPropertyDescriptor[] descriptors = new IPropertyDescriptor[] {
				new TextPropertyDescriptor(P_TITLE, "タイトル"),
				new TextPropertyDescriptor(super.P_CLASS_NAME, "CSSクラス名"),
				new ColorPropertyDescriptor(P_BGCOLOR, "背景色"),
				new TextPropertyDescriptor(P_ONLOAD, "画面ロード時の処理") };
		return descriptors;
	}

	public Object getPropertyValue(Object id) {
		if (id.equals(P_BGCOLOR)) {
			return new RGB(red, green, blue);
		} else if (id.equals(P_ONLOAD)) {
			return this.onLoad;
		} else if (id.equals(P_TITLE)) {
			return this.title;
		}
		return null;
	}

	public boolean isPropertySet(Object id) {
		if (id.equals(P_BGCOLOR) || id.equals(P_ONLOAD) || id.equals(P_TITLE)) {
			return true;
		} else {
			return false;
		}
	}

	public void setPropertyValue(Object id, Object value) {
		if (id.equals(P_BGCOLOR)) {
			setBgColor((RGB) value);
		} else if (id.equals(P_ONLOAD)) {
			setOnLoad((String) value);
		} else if (id.equals(P_TITLE)) {
			setTitle((String) value);
		}
	}

	/**
	 * @see jp.co.cybec.laxide.model.base.BaseModel#getLayoutXML()
	 */
	@Override
	public String getLayoutXML() {
		return "<" + this.getType() + this.getId() + getBodyComponentXml()
				+ ">\n";
	}

	/**
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#getBodyComponentXml()
	 */
	@Override
	public String getBodyComponentXml() {
		return this.getBgColorForXml() + this.getOnLoadForXml()
				+ this.getTitleForXml();
	}

	/**
	 * @return bgColor
	 */
	private String getBgColorForXml() {
		if (this.bgColor == null
				|| (this.bgColor != null && this.bgColor.equals(""))) {
			return "";
		}
		return " bgColor=\"" + this.bgColor + "\"";
	}

	/**
	 * @return bgColor
	 */
	public String getBgColor() {
		return this.bgColor;
	}

	/**
	 * @param bgColor
	 *            bgColor を設定。
	 */
	public void setBgColor(RGB rgb) {
		red = ((RGB) rgb).red;
		green = ((RGB) rgb).green;
		blue = ((RGB) rgb).blue;

		this.bgColor = "#" + Integer.toString(red, 16)
				+ Integer.toString(green, 16) + Integer.toString(blue, 16);

		// カラーパレッドの変更をEditPartに通知する
		firePropertyChange(P_BGCOLOR, null, bgColor);
	}

	/**
	 * @return script
	 */
	private String getOnLoadForXml() {
		if (this.onLoad == null
				|| (this.onLoad != null && this.onLoad.equals(""))) {
			return "";
		}
		return " onLoad=\"" + this.onLoad + "\"";
	}

	/**
	 * @return script
	 */
	public String getOnLoad() {
		return this.onLoad;
	}

	/**
	 * @param onLoad
	 *            Onload を設定。
	 */
	public void setOnLoad(String onLoad) {
		this.onLoad = onLoad;
		firePropertyChange(P_ONLOAD, null, onLoad);
	}

	public int getChildCount() {
		return this.children.size();
	}

	/**
	 * @return title
	 */
	private String getTitleForXml() {
		if (this.onLoad == null
				|| (this.title != null && this.title.equals(""))) {
			return "";
		}
		return " title=\"" + this.title + "\"";
	}

	/**
	 * @return title
	 */
	public String getTitle() {
		return this.title;
	}

	/**
	 * @param title
	 *            title を設定。
	 */
	public void setTitle(String title) {
		this.title = title;
		firePropertyChange(P_TITLE, null, title);
	}
}
