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

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.jdom.Element;

/**
 * モデルクラスの抽象クラス
 * 
 * @author tokumaru
 */
public abstract class AbstractModel implements IPropertySource {

	public abstract void setId(String id);

	public abstract String getId();

	public abstract void setType(String type);

	public abstract String getType();

	public abstract Rectangle getConstraint();

	public abstract void setConstraint(Rectangle rect);

	/** 部品の大きさの自動設定を示す */
	private static int AOUTO_SIZE_SETTING = -1;

	/**
	 * リスナのリスト
	 */
	private PropertyChangeSupport listeners = new PropertyChangeSupport(this);

	/**
	 * リスナの追加
	 */
	public void addPropertyChangeListener(PropertyChangeListener listener) {
		listeners.addPropertyChangeListener(listener);
	}

	/**
	 * モデルの変更を通知
	 * 
	 * @param propName
	 * @param oldValue
	 * @param newValue
	 */
	public void firePropertyChange(String propName, Object oldValue,
			Object newValue) {

		listeners.firePropertyChange(propName, oldValue, newValue);
	}

	/**
	 * リスナの削除
	 * 
	 * @param listener
	 */
	public void removePropertyChangeListener(PropertyChangeListener listener) {
		listeners.removePropertyChangeListener(listener);
	}

	public Object getEditableValue() {
		return this;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
	 */
	public IPropertyDescriptor[] getPropertyDescriptors() {
		return new IPropertyDescriptor[0];
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
	 */
	public Object getPropertyValue(Object id) {
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
	 */
	public boolean isPropertySet(Object id) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
	 */
	public void resetPropertyValue(Object id) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
	 *      java.lang.Object)
	 */
	public void setPropertyValue(Object id, Object value) {
	}

	/**
	 * モデルに属性値をセットする。 ここでは各モデルに共通している項目をセットしている。
	 * 
	 * @param element
	 */
	public void setAttribute(Element element) {
		String id = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_ID);

		String positoinX = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_X);
		int x = 0;
		if (positoinX != null) {
			x = Integer.parseInt(positoinX);
		}

		String positionY = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_Y);
		int y = 0;
		if (positionY != null) {
			y = Integer.parseInt(positionY);
		}
		
		String height = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_COMPONENT_HEIGHT);
		int componentHeight = AOUTO_SIZE_SETTING;
		if (height != null && !height.equals("")) {
			componentHeight = Integer.parseInt(height);
		}

		String width = element
				.getAttributeValue(LetsAjaxLayoutConstant.LETSAJAX_ATTRIBUTE_COMPONENT_WIDTH);
		int componentWidth = AOUTO_SIZE_SETTING;
		if (width != null && !width.equals("")) {
			componentWidth = Integer.parseInt(width);
		}

		setId(id);
		setConstraint(new Rectangle(x, y, componentWidth, componentHeight));
	}

	/**
	 * laxファイルにレイアウト情報を出力する。
	 * 
	 * @return
	 */
	public abstract String getLayoutXML();

	/**
	 * .laxファイルに保存を行う際に呼び出され、その部品に設定された属性値を結合した 文字列を返します。
	 * 
	 * @return 部品に設定された属性値を結合した文字列
	 */
	public abstract String getBodyComponentXml();

}
