/*
 * @(#)RidElementUrl.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 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.ZPath;
import jp.co.iti.fagot.geom.ZRectangle;

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

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

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

import jp.co.nri.rid.error.RidMessage;
import jp.co.nri.rid.error.RidException;

import jp.co.nri.rid.environment.MessageDialog;
/**
 * Rid Element(Url用)
 */
public class RidElementUrl extends RidElement {

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

	/**
	 * キーアトリビュートの取得
	 */
	public String getAttribute(String name) {
	if ( name.equals("Key" ) ) {
		return super.getAttribute("Name");
	}
	return super.getAttribute(name);
	}

	/**
	 * キーアトリビュートの取得
	 */
	public void setAttribute(String name,String value) {
	if ( name.equals("Key" ) ) {
		setAttribute("Name",value);
	} else {
		super.setAttribute(name,value);
	}
	}

	/**
	 * DOMから削除
	 */
	public void removeFromDocTree() {
	super.removeFromDocTree();
	updateLink(null);
	}

	//## IGobContainer：ヒット ########################################
	/**
	 * 要素に接続するか？
	 * @param gob リクエスト元Gob
	 * @param pt  論理座標
	 * @param obj  接続対象
	 */
	public byte getConnectMode(GElement gob,ZPoint pt,Object obj) {
	return getConnectModeImpl(gob, pt, obj ) ;
	}

	//## IGobContainer：移動 ##########################################
	/**
	 * 移動の完了
	 * @param gob  リクエスト元Gob
	 * @param grid グリッドコントローラ
	 */
	public void moveEnd(GElement gob,DocGridControler grid) {
	// 取得した座標系は、ゾーン内座標系
	ZRectangle rect = new ZRectangle(getMovingPath(gob,grid).getBounds2D());
	DocPane editor = grid.getEditor();
	RidDocument doc = (RidDocument)editor.getDocument();

	// メインGobの場合
	if ( isGobId(gob,"zone") || isGobId(gob,"new") ) {
		switch ( grid.getMoveMode() ) {
		  case GOperation.NEW:		// 新規作成
			// トップゾーンか確認
			DocElement root = (DocElement)doc.getRootElement(editor.getPanelId());
			RidElementZone top = ((RidDocument)doc).getTopZone();
			if ( top == root ) {
				// 追加
				setAttribute("Creator","Operator");
				setSelect(null,true);
				setDocument( doc );
				top.appendChild( this );
				treeChanged();
			} else {
				// Top以外のZoneにURLは配置できません
				RidMessage ridMsg = new RidMessage();
				MessageDialog.showError(ridMsg.Error("E1200",""));
			}
			break;
		}
		setRect( editor.getPanelId(),rect ) ;

	// 他のゾーンへの写像Gobの場合
	} else {
		String szRoot = gob.getGobId().substring(4);
		setRect( editor.getPanelId(),szRoot,rect ) ;
	}
	}

	//## 描画 #########################################################
	/**
	 * 描画エレメントの取得
	 *
	 * @param szPanelId パネル識別子
	 * @param isRoot    ルートの有無(つねにfalse)
	 */
	public Vector createGobs(String szPanelId,boolean isRoot) {
	Vector gobs = new Vector();

	if ( !hasRect(szPanelId) ) {
		ZPoint pt = getSpace(szPanelId);
		ZRectangle rt = new ZRectangle( pt.getX(), pt.getY(), 20, 20 );
		setRect(szPanelId,rt);
	}

	GRectangle gRect = new GRectangle();
	// 矩形の設定
	ZRectangle rect = getRect( szPanelId );
	gRect.setRect( rect );
	// 背景色の設定
	Color col = getBackgroundColor();
	gRect.getStyle().setFillColor( new FColor( col ));
	gRect.getStyle().setStrokeColor( new FColor( Color.black ));
	gRect.setSelect(isSelect());
	gRect.setEditOption(GRectangle.NORESIZE);
	gRect.setContainer(this);
	gRect.setGobId("zone");
	gobs.add(gRect);
	setMainGob(szPanelId,gRect);

	// タイトル文字の表示
	Vector children = new Vector();
	ZResource res = ZApp.getTheApp().getResource();
	String szTextType = res.getString("viewtext.Zone."+getTagName());
	String szText = getAttribute(szTextType);
	if ( szText != null && szText.length() > 0 ) {
//System.out.println(szText);
		double dTitleHeight = getTitleHeight();

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

		ZRectangle rttxt =
			new ZRectangle(rect.getX()+LINE+TTLIN,rect.getY()+rect.getHeight()+LINE+TTLIN,
						   dim.getWidth()+szText.length(),dTitleHeight);
//		ZDebug.trace("str:"+szText+",,,"+rttxt);
		GString str = new GString();
		str.setText( szText );
		str.getStyle().setFillColor( new FColor( Color.black ));
		str.setFormat( GString.SINGLE|GString.LEFT|GString.MIDDLE );
		str.setRect( rttxt );
		children.add(str);
		gRect.addForeChildren(children);
	}

	return gobs;
	}

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

	//## IGobContainer：移動 ##########################################
	/**
	 * 移動中Pathの取得
	 * @param gob  リクエスト元Gob
	 * @param grid グリッドコントローラ
	 */
	public ZPath getMovingPath(GElement gob,DocGridControler grid) {
	ZRectangle rect = ((GRectangle)gob).getMovingRectGob(grid);

	if ( grid.getMoveMode() == GOperation.NEW ) {
		ZPoint pt = grid.getMoveGrid() ;
		rect = new ZRectangle(pt.getX(),pt.getY(),20,20);
	}
	return  new ZPath( rect );
	}

	//## アトリビュート################################################
}
