/*
 * @(#)RidZoomAction.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : rid zoom action
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/05/08
 */
package jp.co.nri.rid.action;

import java.awt.event.ActionEvent;

import javax.swing.JComponent;
import javax.swing.JViewport;

import jp.co.iti.fagot.IZApp;
import jp.co.iti.fagot.action.ZAction;

import jp.co.iti.fagot.geom.ZPoint;

import jp.co.iti.fagot.gob.GElement;
import jp.co.iti.fagot.gob.GobManager;

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

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

import jp.co.nri.Rid;

import jp.co.nri.rid.doc.RidElement;
/**
 * Rid Zoom系アクションを定義する
 */
public class RidZoomAction extends ZAction {
	/**
	 * 唯一のコンストラクタです。
	 * @param app アプリケーション
	 * @param szAction アクション名
	 */
	public RidZoomAction(IZApp app,String szAction) {
    super(app,szAction);
	}

	/**
	 * アクション実行
	 */
	public void doAction(ActionEvent e) {

	// ズームスケールを取得
	if ( getActionName().startsWith( "zoom_" ) ) {
		String szZoom = getActionName().substring(5);
		int nZoom = ZString.parseInt(szZoom,0);
		if ( nZoom >= 25 && nZoom <= 400 ) {
			onZoom( ((double)nZoom)/100 );
		}
	}
	}

	/**
	 * 表示倍率の設定
	 * @param scale 表示倍率
	 */
	protected void onZoom( double scale ) {
	String szTitle = ZInstance.prop().getProperty( Rid.PANEL_ACTIVE );
	JComponent active = (JComponent)ZInstance.map().get(szTitle);
	if ( !(active instanceof DocPane) ) {
		// アクティブパネルが描画パネルでない場合はとりあえず動作しない
		return;
	}
	DocPane editor = (DocPane)active;
	editor.getDocument().beginTransaction();

	// 中央座標を一時保存
	ZPoint pt  = editor.getCenter();

	// 表示倍率の設定
	DocElement root = (DocElement)editor.getDocument().getRootElement(editor.getPanelId());
	root.setDisplayScale(editor.getPanelId(),scale);

	// ビューポートの再レイアウト
	JViewport port = (JViewport)editor.getParent();
	port.doLayout();

	// 中央座標を再設定
	editor.setCenter(pt);

	// 再描画
	editor.updateGobs();
	editor.repaint();
	}

	/**
	 * UI更新
	 */
	public void update() {
	String szTitle = ZInstance.prop().getProperty( Rid.PANEL_ACTIVE );
	JComponent active = (JComponent)ZInstance.map().get(szTitle);
	if ( !(active instanceof DocPane) ) {
		// アクティブパネルが描画パネルでない場合はとりあえず動作しない
		firePropertyChange(ZAction.ENABLED,null,new Boolean(false));
		firePropertyChange(ZAction.CHECKED,null,new Boolean(false));
		return;
	}
	DocPane editor = (DocPane)active;

	// 表示倍率の取得
	DocElement root = (DocElement)editor.getDocument().getRootElement(editor.getPanelId());
	double scale = root.getDisplayScale(editor.getPanelId());

	// ズームスケールを取得
	if ( getActionName().startsWith( "zoom_" ) ) {
		String szZoom = getActionName().substring(5);
		int nZoom = ZString.parseInt(szZoom,0);
		firePropertyChange(ZAction.ENABLED,null,new Boolean(true));
		if ( ((double)nZoom/100) == scale ) {
			firePropertyChange(ZAction.CHECKED,null,new Boolean(true));
		} else {
			firePropertyChange(ZAction.CHECKED,null,new Boolean(false));
		}
	}
	}

	//## アトリビュート ###############################################
    /**
     * アクション名（表示倍率の変更）：25%
     */
	final static public String ZOOM_025			= "zoom_025" ;

    /**
     * アクション名（表示倍率の変更）：50%
     */
	final static public String ZOOM_050			= "zoom_050" ;

    /**
     * アクション名（表示倍率の変更）：75%
     */
	final static public String ZOOM_075			= "zoom_075" ;

    /**
     * アクション名（表示倍率の変更）：100%
     */
	final static public String ZOOM_100			= "zoom_100" ;

    /**
     * アクション名（表示倍率の変更）：125%
     */
	final static public String ZOOM_125			= "zoom_125" ;

    /**
     * アクション名（表示倍率の変更）：150%
     */
	final static public String ZOOM_150			= "zoom_150" ;

    /**
     * アクション名（表示倍率の変更）：200%
     */
	final static public String ZOOM_200			= "zoom_200" ;

    /**
     * アクション名（表示倍率の変更）：300%
     */
	final static public String ZOOM_300			= "zoom_300" ;

    /**
     * アクション名（表示倍率の変更）：400%
     */
	final static public String ZOOM_400			= "zoom_400" ;
}
