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

import jp.co.cybec.laxide.util.LetsAjaxUtil;

import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
import org.jdom.Element;

/**
 * イメージファイルのモデルクラス
 * 
 * @author tokumaru
 */
public class LetsAjaxImageModel extends BaseModel {
	/** ファイル属性 */
	private String file = "file";

	/** alt属性 */
	private String alt = "alt";

	public static final String P_EVENT = "_event";

	public static final String P_DATASOURCE_ID = "_dataSourceId";

	public static final String P_FILE = "_file";

	public static final String P_ALT = "_alt";

	private String dataSourceId = "dataSourceId";

	private int eventId = 1;

	private String events[] = { "", "onClick", "onDblClick ", "onMouseDown",
			"onKeyDown", "onKeyPress", "onKeyUp", "onMouseDown", "onMouseUp",
			"onMouseOver", "onMouseOut", "onMouseMove", "onChange", "onSelect" };

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.BaseModel#getBodyComponentXml()
	 */
	@Override
	public String getBodyComponentXml() {
		String html = "";
		html = html + getFileForXml() + getAltForXml();
		html = html + getEventForXml() + getDataSourceIdForXml();
		html = html + getCssClassNameForXml();

		return html;
	}

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#setAttribute(org.jdom.Element)
	 */
	@Override
	public void setAttribute(Element element) {

		super.setAttribute(element);
		super.setType(LetsAjaxLayoutConstant.LETSAJAX_BODY_IMAGE);
		this.setFile(element
						.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_FILE));
		this.setAlt(element
						.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_ALT));
		String event = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_EVENT);
		String dataSourceId = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_DATASOURCEID);
		String cssClass = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_CLASSNAME);

		setDataSourceId(dataSourceId);
		super.setCssClassName(cssClass);

		setEventId(1);
		for (int i = 0; i < events.length; i++) {
			if (event != null && event.equals(events[i])) {
				setEventId(i + 1);
				break;
			}
		}
	}

	/**
	 * ファイル名を設定します
	 * 
	 * @param value ファイル名
	 */
	public void setFile(String value) {
		this.file = LetsAjaxUtil.checkNull(value);
		firePropertyChange(P_FILE, null, this.file);
	}

	/**
	 * ファイル名を取得します
	 * 
	 * @return ファイル名
	 */
	public String getFile() {
		return this.file;
	}

	/**
	 * 代替テキストを設定します
	 * 
	 * @param value 代替テキスト
	 */
	public void setAlt(String value) {
		this.alt = LetsAjaxUtil.checkNull(value);
		firePropertyChange(P_ALT, null, this.alt);
	}

	/**
	 * 代替テキストを返します
	 * 
	 * @return 代替テキスト
	 */
	public String getAlt() {
		return this.alt;
	}

	/**
	 * .laxに設定するためのファイル名を返します
	 * 
	 * @return .laxに設定するためのファイル名
	 */
	private String getFileForXml() {
		if (this.file == null || (this.file != null && this.file.equals(""))) {
			return "";
		}
		
		return " file=\"" + this.file + "\" ";
	}

	/**
	 * .laxに設定するための代替テキストを返します
	 * 
	 * @return .laxに設定するための代替テキスト
	 */
	private String getAltForXml() {
		if (this.alt == null || (this.alt != null && this.alt.equals(""))) {
			return "";
		}
		return " alt=\"" + this.alt + "\" ";
	}

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#getPropertyDescriptors()
	 */
	public IPropertyDescriptor[] getPropertyDescriptors() {
		IPropertyDescriptor[] descriptors = new IPropertyDescriptor[] {
				new TextPropertyDescriptor(P_ID, "ID"),
				new TextPropertyDescriptor(P_FILE, "イメージファイル"),
				new TextPropertyDescriptor(P_ALT, "代替テキスト"),
				new ComboBoxPropertyDescriptor(P_EVENT, "イベント", events),
				new TextPropertyDescriptor(P_CLASS_NAME, "CSSクラス名"),
				new TextPropertyDescriptor(P_DATASOURCE_ID, "DATASOURCEID") };
		return descriptors;
	}

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#getPropertyValue(java.lang.Object)
	 */
	public Object getPropertyValue(Object id) {
		if (id.equals(P_ID)) {
			return super.id;
		} else if (id.equals(P_FILE)) {
			return this.file;
		} else if (id.equals(P_ALT)) {
			return this.alt;
		} else if (id.equals(P_EVENT)) {
			return new Integer(this.eventId - 1);
		} else if (id.equals(P_DATASOURCE_ID)) {
			return dataSourceId;
		} else if (id.equals(P_CLASS_NAME)) {
			return getCssClassName();
		}
		
		return null;
	}

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#isPropertySet(java.lang.Object)
	 */
	public boolean isPropertySet(Object id) {
		if (id.equals(P_FILE) || id.equals(P_EVENT) || id.equals(P_ALT)
				|| id.equals(P_DATASOURCE_ID) || id.equals(P_CLASS_NAME)) {
			return true;
		} else {
			return false;
		}
	}

	/* (non-Javadoc)
	 * @see jp.co.cybec.laxide.model.base.AbstractModel#setPropertyValue(java.lang.Object, java.lang.Object)
	 */
	public void setPropertyValue(Object id, Object value) {
		if (id.equals(P_FILE)) {
			setFile((String) value);
		} else if (id.equals(P_EVENT)) {
			setEventId(((Integer) value).intValue() + 1);
		} else if (id.equals(P_DATASOURCE_ID)) {
			setDataSourceId((String) value);
		} else if (id.equals(P_ALT)) {
			setAlt((String) value);
		} else if (id.equals(P_CLASS_NAME)) {
			setCssClassName((String) value);
		}
	}

	/**
	 * データソースIDを返します
	 * 
	 * @return dataSourceId データソースID
	 */
	public String getDataSourceId() {
		return dataSourceId;
	}

	/**
	 * データソースIDを設定します
	 * 
	 * @param dataSourceId データソースID
	 */
	public void setDataSourceId(String dataSourceId) {
		this.dataSourceId = LetsAjaxUtil.checkNull(dataSourceId);
		firePropertyChange(P_DATASOURCE_ID, null, this.dataSourceId);
	}

	/**
	 * .laxファイルに設定するためのデータソースIDを取得します
	 * 
	 * @return .laxファイルに設定するためのデータソースID
	 */
	private String getDataSourceIdForXml() {
		if (this.dataSourceId == null
				|| (this.dataSourceId != null && this.dataSourceId.equals(""))) {
			return "";
		}
		return " dataSourceId=\"" + this.dataSourceId + "\" ";
	}

	/**
	 * イベントIDを取得します
	 * 
	 * @return event イベントID
	 */
	public int getEventId() {
		return eventId;
	}

	/**
	 * イベントIDを設定します
	 * 
	 * @param event イベントID
	 */
	public void setEventId(Integer eventId) {
		this.eventId = LetsAjaxUtil.checkNull(eventId);
		firePropertyChange(P_EVENT, null, this.eventId);
	}

	/**
	 * .laxに設定するためのイベントIDを返します
	 * 
	 * @return イベントID
	 */
	private String getEventForXml() {
		return " event=\"" + events[eventId - 1] + "\"";
	}
}
