package jp.co.cybec.laxide.editParts;

import java.beans.PropertyChangeEvent;
import java.util.List;

import jp.co.cybec.laxide.editpolicies.LetsAjaxComponentEditPolicy;
import jp.co.cybec.laxide.editpolicies.LetsAjaxXYLayoutEditPolicy;
import jp.co.cybec.laxide.model.base.LetsAjaxBodyModel;
import jp.co.cybec.laxide.model.base.LetsAjaxLayoutConstant;
import jp.co.cybec.laxide.model.base.LetsAjaxPlainLayoutModel;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.gef.EditPolicy;

/**
 * ボディ（キャンバス的な）を描画するクラス
 * 
 * @author tokumaru
 * 
 */
public class LetsAjaxBodyEditPart extends EditPartWithListener {

	/**
	 * ボディの生成。Laxファイル新規作成時は、プレーンレイアウトを表示.
	 * 
	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
	 */
	protected IFigure createFigure() {
		Layer figure = new Layer();
		figure.setLayoutManager(new XYLayout());
		List children = ((LetsAjaxBodyModel) getModel()).getChildren();

		if (children.size() == 0) {
			// 初期表示のときはプレーンのレイアウトを表示します。
			// 既に存在する.laxファイルを読み込んだときは.laxファイルのレイアウトを表示するため
			// この処理はおこないません
			LetsAjaxPlainLayoutModel plainModel = new LetsAjaxPlainLayoutModel();
			plainModel
					.setType(LetsAjaxLayoutConstant.LETSAJAX_BODY_PLAIN_LAYOUT);
			((LetsAjaxBodyModel) getModel()).addChild(plainModel);
		}

		return figure;
	}

	/**
	 * 属性が変化した時に呼ばれるメソッド
	 * @see jp.co.cybec.laxide.editParts.EditPartWithListener#propertyChange(java.beans.PropertyChangeEvent)
	 */
	public void propertyChange(PropertyChangeEvent evt) {
		if (evt.getPropertyName().equals(LetsAjaxBodyModel.P_CHILDREN)) {
			// 子モデルの構造が変化したので子EditPartの構造も更新する
			refreshChildren();

		}
	}

	protected void createEditPolicies() {
		installEditPolicy(EditPolicy.COMPONENT_ROLE,
				new LetsAjaxComponentEditPolicy());
		// エディット・ポリシーのインストール
		installEditPolicy(EditPolicy.LAYOUT_ROLE,
				new LetsAjaxXYLayoutEditPolicy());
	}

	protected List getModelChildren() {
		return ((LetsAjaxBodyModel) getModel()).getChildren();
	}

}
