/**
 * @(#)Menu.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Right button menu
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/08/09
 */
package jp.co.nri.rid;

import java.awt.Point;
import java.awt.Dimension;
import java.awt.Window;

import java.awt.event.MouseEvent;

import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JPopupMenu;

import jp.co.iti.fagot.ZApp;

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

import jp.co.iti.fagot.ui.UIFactory;

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

import jp.co.iti.fagot.util.ZInstance;
import jp.co.iti.fagot.util.ZUIUtil;
import jp.co.iti.fagot.util.ZDebug;
/**
 * 右ボタンメニュー
 */
public class RMenu {

	/**
	 * 右ボタンメニューの作成
	 * @param evt     マウスイベント
	 * @param target  選択されているエレメント
	 */
	static public void createContextMenu( MouseEvent evt, DocElement target ) {
	Vector targets = new Vector();
	targets.add( target );
	createContextMenu( evt, targets ) ;
	}

	/**
	 * 右ボタンメニューの作成
	 * @param evt     マウスイベント
	 * @param targets 選択されているエレメント群
	 */
	static public void createContextMenu( MouseEvent evt, Vector targets ) {
	String     szPanelId = "List";
	JComponent invoker   = (JComponent)evt.getSource();

	UIFactory ui = DocManager.createUIFactory(DocManager.ELEMENT);
	Vector keys = new Vector();
	Enumeration elm = targets.elements();
	while ( elm.hasMoreElements() ) {
		DocElement target = (DocElement)elm.nextElement();
		keys.add( target.getContextKey(szPanelId) );
	}
	JPopupMenu popup = ui.createContextMenu(invoker,keys);
	ZInstance.map().put("doc.rmenu.target", targets );

	// 表示位置の計算
	Dimension scrDim = popup.getToolkit().getScreenSize();
	Dimension popDim = popup.getPreferredSize();
	Window win = ZUIUtil.getParentWindow(invoker);
	Point  ptEditor = invoker.getLocationOnScreen();
	Point  ptWin = win.getLocationOnScreen();

	// ウィンドウ上の位置に修正
	int nX = (int)(evt.getX()+ptEditor.getX()-ptWin.getX());
	int nY = (int)(evt.getY()+ptEditor.getY()-ptWin.getY());
	// 位置の補正
	if ( nX+ptWin.getX()+popDim.getWidth() > (scrDim.getWidth()-40) ) {
		nX -= popDim.getWidth();
	}
	if ( nY+ptWin.getY()+popDim.getHeight() > (scrDim.getHeight()-40) ) {
		nY -= popDim.getHeight();
	}

	popup.show(win, nX, nY);
	}

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