/**
 * @(#)ChooseCEC.java
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 * RID-3 : Choose Cell Editor Component
 * @author  Intelligent Technology Inc.
 * @version 1.00 2001/10/01-2002/03/26
 * @see iCellEditorComponent
 */
package	jp.co.nri.rid.table.editor;

import	java.awt.*;
import	java.awt.event.*;
import	javax.swing.*;

/**
 * 値を選択するためのセルエディタ/レンダラコンポーネント(コンボボックス)
 */

public class ChooseCEC extends JComboBox implements iCellEditorComponent{
	protected Color myFore;
	protected Color myBack;
	private CECAdapter myCECAdapter;
	
	protected ChooseCEC(){}
	
	/**
	 * @param	editable	編集可否。
	 * @param	listener	アクションリスナー。
	 * @since	1.00
	 */
	public ChooseCEC(boolean editable ,ActionListener listener){ init(editable ,listener); }
	
	/**
	 * @param	items		リスト配列。
	 * @param	editable	編集可否。
	 * @param	listener	アクションリスナー。
	 * @since	1.00
	 */
	public ChooseCEC(String[] items ,boolean editable ,ActionListener listener){
		super(items);
		insertItemAt("" ,0);
		init(editable ,listener);
	}
	
	/**
	 * おもにコンストラクタから呼び出される。
	 * @param	editable	編集可否。
	 * @param	listener	アクションリスナー。
	 * @since	1.00
	 */
	protected void init(boolean editable ,ActionListener listener){
		myFore = getForeground();
		myBack = getBackground();
		setBorder(null);
		editable(editable);
		addActionListener(listener);
		if(listener instanceof CECAdapter){
			myCECAdapter = (CECAdapter)listener;
			playCECAdapter();
		}
	}
	
	/**
	 * セル値(String)を取得する。
	 * @return	セル値。
	 * @since	1.00
	 */
	public String		text(){	return (String)getSelectedItem();	}
	
	/**
	 * セル値を設定する。
	 * @param	text	セル値。
	 * @since	1.00
	 */
	public void			text(String text){
		pauseCECAdapter();
		/*** fuku *** 20020523 */
/*
		int nAt = 0;
		if ( text != null ) {
			nAt = index(text);
		}
		setSelectedIndex(nAt);
*/
		setSelectedIndex(index(text));
		playCECAdapter();
	}
	
	/**
	 * エディタコンポーネントを取得する。
	 * @return	エディタコンポーネント。
	 * @since	1.00
	 */
	public JComponent	component(){ return this; }
	
//	protected int index(String text){
	private int index(String text){
//		if(null==text)	return -1;
		if(null==text)	return 0;
		int mx = getItemCount();
		for(int i=0;i<mx;i++){
			if(getItemAt(i).toString().equals(text))	return i;
		}
		
//		return -1;
		return 0;
	}
	
	/**
	 * 実装の都合上publicとなっているが、使用しないこと。
	 * @since	1.00
	 */
	public void	focus(boolean hasFocus ,JTable table){
		if(hasFocus){
			setForeground(table.getSelectionForeground());
			setBackground(table.getSelectionBackground());
		}
		else{
//			setForeground(table.getForeground());
//			setBackground(table.getBackground());
			setForeground(myFore);
			setBackground(myBack);
		}
	}
	
	/**
	 * 編集可否を設定する。
	 * @param	editable	true:編集可 false:編集不可。
	 * @since	1.00
	 */
	public void editable(boolean editable){ setEnabled(editable); }
	
	/**
	 * アクションリスナーを一時停止する。
	 * @since	1.00
	 */
	public void pauseCECAdapter(){
		try { myCECAdapter.editor(null); }
		catch(NullPointerException e){}
	}
	
	/**
	 * アクションリスナーの一時停止を解除する。
	 * @since	1.00
	 */
	public void playCECAdapter(){
		try { myCECAdapter.editor(this); }
		catch(NullPointerException e){}
	}
}
