/*
 * @(#)RidElementComment.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Element
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/11/07
 */
package jp.co.nri.rid.doc;

import java.awt.Color;

import java.util.Vector;

import javax.swing.JComponent;

import org.w3c.dom.DOMException;

import jp.co.iti.fagot.ZApp;

import jp.co.iti.fagot.fob.FColor;

import jp.co.iti.fagot.geom.ZPoint;
import jp.co.iti.fagot.geom.ZDimension;
import jp.co.iti.fagot.geom.ZRectangle;
import jp.co.iti.fagot.geom.ZPath;

import jp.co.iti.fagot.gob.GElement;
import jp.co.iti.fagot.gob.GString;
import jp.co.iti.fagot.gob.GOperation;

import jp.co.iti.fagot.doc.DocGridControler;
import jp.co.iti.fagot.doc.DocElement;
import jp.co.iti.fagot.doc.DocPane;

import jp.co.iti.fagot.util.ZInstance;
import jp.co.iti.fagot.util.ZDebug;

import jp.co.nri.Rid;

import jp.co.nri.rid.RUpdateManager;
/**
 * Rid Element(Comment用)
 */
public class RidElementComment extends RidElement {

	/**
	 * デフォルトコンストラクタ
	 */
	public RidElementComment() throws DOMException {
	}

	//## IGobContainer：ヒット ########################################
	/**
	 * ダブルクリックの動作
	 * @param gob  リクエスト元Gob
	 * @param mode クリック位置
	 */
	public void verbDblClick(GElement gob,ZPoint pt) {
	ZRectangle rect = gob.getTransformedBounds();

	String szTitle = ZInstance.prop().getProperty( Rid.PANEL_ACTIVE );
	JComponent active = (JComponent)ZInstance.map().get(szTitle);
	if ( !(active instanceof DocPane) ) {
		// アクティブパネルが描画パネルでない場合は描画しない
		return;
	}

	DocPane editor = (DocPane)active;
	rect.setWidth( Math.max(300,rect.getWidth()) );
	rect.setY( rect.getY() - DIFF );
	rect.setHeight( rect.getHeight() + DIFF*2 );
	editor.setEditElement(this,rect,false);
	}

	//## IGobContainer：移動 ##########################################
	/**
	 * 移動中Pathの取得
	 * @param gob  リクエスト元Gob
	 * @param grid グリッドコントローラ
	 */
	public ZPath getMovingPath(GElement gob,DocGridControler grid) {
	ZPath path = null;
	switch ( grid.getMoveMode() ) {
	  case GOperation.NEW:		// 新規作成
		// 大きさは変えない
		ZPoint pt = grid.getMoveGrid();
		ZRectangle rect = new ZRectangle( pt.getX(),pt.getY(),300,getTitleHeight()+DIFF*2);
		path = new ZPath( rect );
		break;
	  default:
		path = super.getMovingPath(gob,grid);
		break;
	}
	return path;
	}

	/**
	 * 移動の完了
	 * @param gob  リクエスト元Gob
	 * @param grid グリッドコントローラ
	 */
	public void moveEnd(GElement gob,DocGridControler grid) {

	// Map画面の場合はトップページに追加
	DocPane editor = grid.getEditor();
	if ( editor.getPanelId().startsWith("Map") ) {
		ZRectangle rect = new ZRectangle(getMovingPath(gob,grid).getBounds2D());
		switch ( grid.getMoveMode() ) {
		  case GOperation.NEW:		// 新規作成
			// 追加
			RidDocumentSite doc = (RidDocumentSite)editor.getDocument();
			RidElementPage  top = doc.getTopPage(editor.getPanelId());
			if ( top == null ) {
				return;
			}
			// トップページへコメントの設定
			setAttribute("Creator","Operator");
			setSelect(null,true);
			setDocument( doc );
			DocElement elm = (DocElement)top.getChildElement(".Comments",null);
			elm.appendChild( this );
			break;
		}
		setRect( editor.getPanelId(),rect ) ;

	} else {
		super.moveEnd(gob, grid);
	}

	switch ( grid.getMoveMode() ) {
	  case GOperation.NEW:		// 新規作成
		// getRect()の矩形は、ゾーン内座標に変換されてしまっているかもしれないので
		// 再度矩形を取得する
		ZRectangle rect = new ZRectangle(getMovingPath(gob,grid).getBounds2D());
		editor.setEditElement(this,rect,false);

		break;
	}
	}

	//## 描画 #########################################################
	/**
	 * 描画エレメントの取得
	 *
	 * ルートの場合は、自分自身を背景として描画する
	 * @param szPanelId パネル識別子
	 * @param isRoot    ルートの有無
	 */
	public Vector createGobs(String szPanelId,boolean isRoot) {
	Vector gobs = new Vector();

	// gobIdの設定
	String szGobId = "zone";
	if ( szPanelId.startsWith("Map") ) {
		szGobId = "map";
	} else if ( szPanelId.equals("Page") ) {
		szGobId = "page";
	}

	// 自分自身の作成
	String szText = getText();
//	ZDebug.trace(szText);
	if ( hasRect(szPanelId) && szText != null && szText.length()>0 ) {
//		ZDebug.trace("Name="+szText);
		GString gStr = new GString();
		gStr.setEditOption(0x0001);	// NORESIZE

		gStr.setText( szText );
		gStr.getStyle().setFillColor( new FColor( Color.black ));
		gStr.setFormat( GString.LEFT|GString.TOP );
//		gStr.setFormat( GString.MIDDLE|GString.CENTER );

		// 高さ補正：TextFieldとの差分だけ小さくする
		ZRectangle rect = getRect(szPanelId);

		// 幅補正：実サイズと同じにする
		ZDimension dim = getTextPreferredSize(null,0,szText,null,0) ;
		rect.setWidth(  dim.getWidth() );
		rect.setHeight( dim.getHeight() );

		gStr.setRect( rect );
		gStr.setSelect(isSelect());
		gStr.setContainer(this);
		gStr.setGobId(szGobId);
		setMainGob("comment",gStr);
		gobs.add(gStr);
	}
	return gobs;
	}

	/**
	 * 描画エレメントの取得
	 *
	 * ルートの場合は、自分自身を背景として描画する
	 * @param szPanelId パネル識別子
	 * @param isRoot    ルートの有無
	 */
	public Vector createSkeltonGobs(String szPanelId,boolean isRoot) {
	return new Vector();
	}

	//## 編集 #########################################################
	/**
	 * アトリビュートの設定
	 */
	public void setAttribute(String name,String value) {
	if ( name.equals("Comment" ) ) {
		if ( value == null || value.length()==0 ) {
			// コメントの削除
//			ZDebug.trace("remove");
			removeFromDocTree();

		// コメントが削除されたときにプロパティパネルを変更させるために
		// 選択なしに設定する
			GElement gob = getMainGob("comment");
			if ( gob != null ) {
				gob.setSelect(false);
			}
			RUpdateManager.update(RUpdateManager.PANEL_ACTIVE);
		}
	}
	super.setAttribute( name, value );
	}

	/**
	 * アトリビュートの削除
	 */
	public void removeAttribute(String name) {
	if ( name.equals("Comment" ) ) {
		// コメントの削除
//		ZDebug.trace("remove");
		super.removeAttribute( name );
		removeFromDocTree();

		// コメントが削除されたときにプロパティパネルを変更させるために
		// 選択なしに設定する
		GElement gob = getMainGob("comment");
		if ( gob != null ) {
			gob.setSelect(false);
		}
		RUpdateManager.update(RUpdateManager.PANEL_ACTIVE);
	} else {
		super.removeAttribute( name );
	}
	}

	/**
	 * 文字列の設定
	 */
	public void setText(String szText) {
	setAttribute("Comment",szText);
	}

	/**
	 * 文字列の取得
	 */
	public String getText() {
//	ZDebug.trace(getAttribute("Comment"));
	return 	getAttribute("Comment");
	}

	//## アトリビュート################################################
	/**
	 * 文字の高さと、TextFieldの高さの差分
	 * 実差分は DIFF*2;
	 */
	static protected double DIFF = 3;
}
