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 LetsAjaxComboBoxModel extends BaseModel {
	private String name = "name";

	public static final String P_NAME = "_name";

	private String defaultValue = "defaultValue";

	public static final String P_DEFAULTVALUE = "_defaultValue";

	private int isMultiple;

	private String multipleValues[] = { "true", "false" };

	public static final String P_ISMULTIPLE = "_isMultiple";

	private String size = "1";

	public static final String P_SIZE = "_size";

	private String componentWidth = "80";

	private String componentHeight = "20";

	public static final String P_EVENT = "_event";

	public static final String P_DATASOURCE_ID = "_dataSourceId";

	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 + getNameForXml();
		html = html + getDefaultValueForXml();
		html = html + getIsMultipleForXml();
		html = html + getSizeForXml();
		html = html + this.getComponetWidthForXml();
		html = html + this.getComponetHeightForXml();
		html = html + this.getCssClassNameForXml();
		html = html + this.getEventForXml();
		html = html + this.getDataSourceIdForXml();
		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_COMBO_BOX);
		setName(element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_NAME));
		setSize(element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_SIZE));
		String multiple = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_IS_MULTIPLE);
		if (multiple != null && multiple.equals("true")) {
			setIsMultiple(1);
		} else {
			setIsMultiple(0);
		}

		setDefaultValue(element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_DEFAULTVALUE));
		String event = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_EVENT);
		String dataSourceId = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_DATASOURCEID);
		String cssClass = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_CLASSNAME);
		
		setCssClassName(cssClass);

		setDataSourceId(dataSourceId);
		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 setName(String value) {
		this.name = LetsAjaxUtil.checkNull(value);
		firePropertyChange(P_NAME, null, this.name);
	}

	/**
	 * コンボボックス名を取得します
	 * 
	 * @return コンボボックス名
	 */
	public String getName() {
		return this.name;
	}

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

	/**
	 * デフォルト値を設定します
	 * 
	 * @param value デフォルト値
	 */
	public void setDefaultValue(String value) {
		this.defaultValue = value;
		firePropertyChange(P_DEFAULTVALUE, null, value);
	}

	/**
	 * デフォルト値を設定します
	 * 
	 * @return デフォルト値
	 */
	public String getDefaultValue() {
		return this.defaultValue;
	}

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

	/**
	 * 部品の幅を返します
	 * 
	 * @return 部品の幅
	 */
	public String getComponentWidth() {
		return this.componentWidth;
	}

	/**
	 * 部品の幅を設定します
	 * 
	 * @param width 部品の幅
	 */
	public void setComponentWidth(String width) {
		this.componentWidth = width;
	}

	/**
	 * .laxファイルに設定するための部品の幅を返します
	 * 
	 * @return .laxファイルに設定するための部品の幅
	 */
	private String getComponetWidthForXml() {
		if (componentWidth == null
				|| (componentWidth != null && componentWidth.equals(""))) {
			return " componentWidth=\""
					+ Integer.toString(this.defaultValue.length() * 5) + "\"";
		}
		return " componentWidth=\"" + this.componentWidth + "\" ";
	}

	/**
	 * 部品の高さを返します
	 * 
	 * @return 部品の高さ
	 */
	public String getComponetHeight() {
		return this.componentHeight;
	}

	/**
	 * 部品の高さを設定します
	 * 
	 * @param componentHeight 部品の高さ
	 */
	public void setComponentHeight(String componentHeight) {
		this.componentHeight = componentHeight;
	}

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

	/* (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_NAME, "名称"),
				new TextPropertyDescriptor(P_SIZE, "サイズ"),
				new ComboBoxPropertyDescriptor(P_ISMULTIPLE, "複数選択可",
						multipleValues),
				new TextPropertyDescriptor(P_DEFAULTVALUE, "初期値"),
				new TextPropertyDescriptor(P_CLASS_NAME, "CSSクラス名"),
				new ComboBoxPropertyDescriptor(P_EVENT, "イベント", events),
				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(super.P_ID)) {
			return super.id;
		} else if (id.equals(P_NAME)) {
			return this.name;
		} else if (id.equals(P_DEFAULTVALUE)) {
			return this.defaultValue;
		} else if (id.equals(P_SIZE)) {
			return this.size;
		} else if (id.equals(P_ISMULTIPLE)) {
			return new Integer(this.isMultiple - 1);
		} 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_NAME) || id.equals(P_DEFAULTVALUE)
				|| id.equals(P_SIZE) || id.equals(P_ISMULTIPLE)
				|| id.equals(P_EVENT) || 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_NAME)) {
			setName((String) value);
		} else if (id.equals(P_DEFAULTVALUE)) {
			setDefaultValue((String) value);
		} else if (id.equals(P_SIZE)) {
			setSize(LetsAjaxUtil.getDigitValue(this.size, (String) value));
		} else if (id.equals(P_ISMULTIPLE)) {
			setIsMultiple(((Integer) value).intValue() + 1);
		} 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_CLASS_NAME)) {
			setCssClassName((String) value);
		}
	}

	/**
	 * 複数選択可能かどうか(multiple属性)を返します<br>
	 * 1:複数選択可<br>
	 * 2:複数選択不可
	 * 
	 * @return isMultiple
	 */
	public int getIsMultiple() {
		return isMultiple;
	}

	/**
	 * 複数選択可能かどうか(multiple属性)を設定します<br>
	 * 1:複数選択可<br>
	 * 2:複数選択不可
	 * 
	 * @param isMultiple 複数選択可能かどうか
	 */
	public void setIsMultiple(Integer multiple) {
		this.isMultiple = multiple;
		firePropertyChange(P_ISMULTIPLE, null, this.isMultiple);
	}

	/**
	 * .laxファイルに設定するためのmultiple属性を返します
	 * 
	 * @return .laxファイルに設定するためのmultiple属性
	 */
	private String getIsMultipleForXml() {
		String multipleFlag = "false";
		if (this.isMultiple == 1) {
			multipleFlag = "true";
		}
		return " " + LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_IS_MULTIPLE
				+ "=\"" + multipleFlag + "\" ";
	}

	/**
	 * サイズを返します
	 * 
	 * @return size サイズ
	 */
	public String getSize() {
		return size;
	}

	/**
	 * サイズを設定します
	 * 
	 * @param size サイズ
	 */
	public void setSize(String size) {
		this.size = size;
		firePropertyChange(P_SIZE, null, size);
	}

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

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

	/**
	 * データソースIDを返します
	 * 
	 * @param dataSourceId
	 *            dataSourceId を設定。
	 */
	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] + "\"";
	}
}
