package jp.co.cybec.laxide.editParts;

import java.beans.PropertyChangeEvent;

import jp.co.cybec.laxide.editpolicies.LetsAjaxComponentEditPolicy;
import jp.co.cybec.laxide.editpolicies.LetsAjaxDirectEditPolicy;
import jp.co.cybec.laxide.model.base.LetsAjaxButtonModel;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.jface.viewers.TextCellEditor;

/**
 * ボタン部品を描画するクラス.
 * ファイル名：LetsAjaxButtonEditPart.java
 * 
 * @author nakamura 作成時刻：13:08:30
 * 
 */
public class LetsAjaxButtonEditPart extends EditPartWithListener {

	private LetsAjaxDirectEditManager directManager = null;

	// ボタンは枠線を表示しているため、テキスト幅を基準に部品の幅を決定すると
	// 表示文字が途切れてしまう。そのためこの値で調整をおこなう
	private static final int ALIGNMENT = 20;

	/**
	 * ボタンの属性が変化した時に呼ばれるメソッド
	 * @see jp.co.cybec.laxide.editParts.EditPartWithListener#propertyChange(java.beans.PropertyChangeEvent)
	 */
	public void propertyChange(PropertyChangeEvent evt) {
		LetsAjaxButtonModel model = (LetsAjaxButtonModel) getModel();
		Label label = (Label) getFigure();

		// 変更の型がモデルの位置情報の変更を示すものかどうか
		if (evt.getPropertyName().equals(LetsAjaxButtonModel.P_CONSTRAINT)) {
			int textWidth = label.getTextBounds().width + ALIGNMENT;
			label.getSize().width = textWidth;

			model.getConstraint().width = textWidth;
			model.getConstraint().height = 20;
			model.setComponentWidth(String.valueOf(textWidth));
			model.setComponentHeight("20");

			refreshVisuals(); // ビューを更新する
		} else if (evt.getPropertyName().equals(LetsAjaxButtonModel.P_VALUE)) {
			// モデルの変更をビューに表示する
			String newValue = (String) evt.getNewValue();
			label.setText(newValue);

			int newTextWidth = label.getTextBounds().width + ALIGNMENT;
			label.getSize().width = newTextWidth;

			model.getConstraint().width = newTextWidth;
			model.setComponentWidth(String.valueOf(newTextWidth));
		}
	}
    /**
     * ボタンの生成
     * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
     */
	protected IFigure createFigure() {
		LetsAjaxButtonModel model = (LetsAjaxButtonModel) getModel();

		Label label = new Label();
		label.setText(model.getValue());
		label.setSize(60, 20);
		// 周りの線
		label.setBorder(new LineBorder());
		// 背景色を不透明に
		label.setOpaque(true);
		label.setBackgroundColor(ColorConstants.button);
		return label;
	}

	protected void createEditPolicies() {
		// エディットポリシーを作成してインストール
		installEditPolicy(EditPolicy.COMPONENT_ROLE,
				new LetsAjaxComponentEditPolicy());
		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
				new LetsAjaxDirectEditPolicy());
	}

	protected void refreshVisuals() {
		// 制約の取得
		Rectangle constraint = ((LetsAjaxButtonModel) getModel())
				.getConstraint();

		// Rectangleオブジェクトを制約としてビューに設定する
		// setLayoutConstraintメソッドは親EditPartから呼び出す
		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
				getFigure(), constraint);
	}

	public void performRequest(Request req) {
		// Requestがモデル・プロパティの直接編集を要求するものかどうか
		if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {
			performDirectEdit();
			return;
		}
		super.performRequest(req);
	}

	private void performDirectEdit() {
		if (directManager == null) {
			directManager = new LetsAjaxDirectEditManager(this,
					TextCellEditor.class, new LetsAjaxCellEditorLocator(
							getFigure()));
		}
		directManager.show(); // セル・エディタの表示
	}

}
