package jp.co.cybec.laxide.editParts.extension;

import java.beans.PropertyChangeEvent;
import java.io.InputStream;

import jp.co.cybec.laxide.LetsAjaxEditor;
import jp.co.cybec.laxide.editParts.EditPartWithListener;
import jp.co.cybec.laxide.editParts.LetsAjaxCellEditorLocator;
import jp.co.cybec.laxide.editParts.LetsAjaxDirectEditManager;
import jp.co.cybec.laxide.editpolicies.LetsAjaxComponentEditPolicy;
import jp.co.cybec.laxide.editpolicies.LetsAjaxDirectEditPolicy;
import jp.co.cybec.laxide.model.extension.LetsAjaxDataTableModel;

import org.eclipse.draw2d.BorderLayout;
import org.eclipse.draw2d.CompoundBorder;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ImageFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MarginBorder;
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;
import org.eclipse.swt.graphics.Image;

/**
 * データテーブルを描画するクラス ファイル名：LetsAjaxDataTableEditPart.java
 * 
 * @author nakamura 作成時刻：14:06:55
 * 
 */
public class LetsAjaxDataTableEditPart extends EditPartWithListener {

	private LetsAjaxDirectEditManager directManager = null;

	/**
	 * 属性に変更があったとき通知するメソッド
	 * 
	 * @see jp.co.cybec.laxide.editParts.EditPartWithListener#propertyChange(java.beans.PropertyChangeEvent)
	 */
	public void propertyChange(PropertyChangeEvent evt) {
		// 変更の型がモデルの位置情報の変更を示すものかどうか
		if (evt.getPropertyName().equals(LetsAjaxDataTableModel.P_CONSTRAINT)) {
			refreshVisuals(); // ビューを更新する
		} else if (evt.getPropertyName().equals(LetsAjaxDataTableModel.P_NAME)) {
			// モデルの変更をビューに表示する
			Label label = (Label) getFigure();
			label.setText((String) evt.getNewValue());
		}
	}

	/**
	 * データテーブルを生成。
	 * 
	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
	 */
	protected IFigure createFigure() {
		LetsAjaxDataTableModel model = (LetsAjaxDataTableModel) getModel();
		InputStream input = LetsAjaxEditor.class
				.getResourceAsStream("dataTable.gif");

		Image img = new Image(null, input);
		ImageFigure figure = new ImageFigure();
		figure.setBorder(new CompoundBorder(new LineBorder(), new MarginBorder(
				3)));
		figure.setSize(60, 50);
		figure.setImage(img);

		Label mainLabel = new Label();
		// 外枠とマージンの設定
		mainLabel.setBorder(new CompoundBorder(new LineBorder(),
				new MarginBorder(4)));
		mainLabel.setSize(100, 80);
		mainLabel.setText(model.getName());
		mainLabel.setOpaque(true);
		mainLabel.setLayoutManager(new BorderLayout());
		mainLabel.add(figure, BorderLayout.TOP);

		return mainLabel;
	}

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

	protected void refreshVisuals() {
		// 制約の取得
		Rectangle constraint = ((LetsAjaxDataTableModel) 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(); // セル・エディタの表示
	}
}
