/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: SaveDataDialog.java,v 1.1.2.1 2003/12/11 10:12:19 ppoi Exp $
 */
package tsukuba_bunko.peko.session;

import	java.awt.Dimension;
import	java.awt.FlowLayout;
import	java.awt.Rectangle;

import	java.awt.event.ActionEvent;
import	java.awt.event.ActionListener;

import	javax.swing.JButton;
import javax.swing.JDialog;
import	javax.swing.JList;
import	javax.swing.JOptionPane;
import	javax.swing.JPanel;
import	javax.swing.JScrollPane;
import	javax.swing.ListSelectionModel;

import	javax.swing.event.ListSelectionEvent;
import	javax.swing.event.ListSelectionListener;

import	tsukuba_bunko.peko.Logger;
import	tsukuba_bunko.peko.PekoSystem;

import	tsukuba_bunko.peko.resource.ResourceManager;


/**
 * セーブデータ選択ダイアログです。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class SaveDataDialog	extends JDialog	implements ActionListener, ListSelectionListener	{

	/**
	 * ダイアログの用途：セーブ用
	 */
	public static final boolean	FOR_SAVE = true;

	/**
	 * ダイアログの用途：ロード用
	 */
	public static final boolean	FOR_LOAD = false;



	/**
	 * 選択された番号
	 */
	protected int	_selected = -1;

	/**
	 * 表示されるセーブデータ一覧
	 */
	protected SaveDataInfo[]	_infoList = null;


	/**
	 * セーブデータ一覧
	 */
	protected JList	_list = null;

	/**
	 * OK ボタン
	 */
	protected JButton	_ok = null;

	/**
	 * Cancel ボタン
	 */
	protected JButton	_cancel = null;

	/**
	 * ダイアログの用途
	 */
	protected boolean _forSave = false;

	/**
	 * セーブデータ情報を描画する ListCellRenderer
	 */
	protected SaveDataInfoRenderer	_renderer = null;


	/**
	 * <code>SaveDataDialig</code> のインスタンスを生成します。
	 * @param	forSave	ダイアログの用途
	 */
	public SaveDataDialog( boolean forSave )
	{
		super( PekoSystem.getInstance().getMainWindow(), true );
		_forSave = forSave;

		ResourceManager	resources = ResourceManager.getInstance();
		Boolean	decorated = (Boolean)resources.getResource( ResourceIDs.DIALOG_DECORATED, true );
		if( decorated != null )	{
			setUndecorated( !decorated.booleanValue() );
		}

		if( forSave )	{
			String	title = (String)resources.getResource( ResourceIDs.DIALOG_TITLE_SAVE );
			if( title == null )	{
				Logger.warn( MessageIDs.SAV0012W );
			}
			else	{
				setTitle( title );
			}
		}
		else	{
			String	title = (String)resources.getResource( ResourceIDs.DIALOG_TITLE_LOAD );
			if( title == null )	{
				Logger.warn( MessageIDs.SAV0012W );
			}
			else	{
				setTitle( title );
			}
		}

		_renderer = new SaveDataInfoRenderer();
	}


	/**
	 * <code>SaveDataDialog</code> の初期化を行います。
	 * @param	infoList	表示するセーブデータ一覧
	 */
	protected void initialize( SaveDataInfo[] infoList, int initialIndex )
	{
		ResourceManager	resources = ResourceManager.getInstance();

		JList	list = new JList( infoList );
		list.setAutoscrolls( true );
		list.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		list.setCellRenderer( _renderer );
		list.addListSelectionListener( this );

		JScrollPane	container = new JScrollPane( list );
		container.setAutoscrolls( true );

		Integer	atonce = (Integer)resources.getResource( ResourceIDs.ITEMS_AT_ONCE );
		if( atonce == null )	{
			atonce = new Integer( 5 );
			Logger.warn( MessageIDs.SAV0013W, new Object[]{"5"} );
		}
		else if( atonce.intValue() <= 0 )	{
			atonce = new Integer( 5 );
			Logger.warn( MessageIDs.SAV0014W, new Object[]{"5"} );
		}
		Dimension	size = container.getPreferredSize();
		Dimension	cellSize = _renderer.getPreferredSize();
		size.height = cellSize.height * atonce.intValue() + 5;
		container.setPreferredSize( size );
		container.setSize( size );

		Rectangle	visibleRect = new Rectangle( 5, (cellSize.height * (initialIndex - 1)), cellSize.width, cellSize.height );
		container.getViewport().scrollRectToVisible( visibleRect );

		JPanel	buttons = new JPanel( new FlowLayout() );
		JButton	ok = new JButton();
		String	caption = (String)resources.getResource( ResourceIDs.BUTTON_OK );
		if( caption == null )	{
			caption = "OK";
			Logger.warn( MessageIDs.SAV0019W, new Object[]{"OK", caption} );
		}
		ok.setText( caption );
		ok.addActionListener( this );
		JButton	cancel = new JButton();
		caption = (String)resources.getResource( ResourceIDs.BUTTON_CANCEL );
		if( caption == null )	{
			caption = "CANCEL";
			Logger.warn( MessageIDs.SAV0019W, new Object[]{"Cancel", caption} );
		}
		cancel.setText( caption );
		cancel.addActionListener( this );
		buttons.add( ok );

		buttons.add( cancel );

		JPanel	cp = new JPanel( new java.awt.BorderLayout() );
		cp.add( container );
		cp.add( buttons, java.awt.BorderLayout.SOUTH );
		setContentPane( cp );

		pack();
		setResizable( false );

		_list = list;
		_ok = ok;
		_cancel = cancel;
		getRootPane().setDefaultButton( _ok );

		_infoList = infoList;
		list.setSelectedIndex( initialIndex );
	}


	/**
	 * 現在選択されているセーブデータのインデックスを取得します。
	 * @return	選択されているセーブデータのインデックス
	 */
	public int getSelectedIndex()
	{
		return _selected;
	}


//
//	ActionListener の実装
//
	public void actionPerformed( ActionEvent ev )
	{
		if( ev.getSource() == _ok )	{
			if( _list.getSelectedValue() == null )	{
				if( _forSave )	{
					_selected = _list.getSelectedIndex();
				}
				else	{
					return;
				}
			}
			else	{
				if( _forSave )	{
					ResourceManager	resources = ResourceManager.getInstance();
					String	title = (String)resources.getResource( ResourceIDs.DIALOG_CONFIRM_TITLE );
					if( title == null )	{
						Logger.warn( MessageIDs.SAV0015W );
					}
					String	message = (String)resources.getResource( ResourceIDs.DIALOG_CONFIRM_MESSAGE );
					if( message == null )	{
						message = "Do you overwrite save data ?";
						Logger.warn( MessageIDs.SAV0016W, new Object[]{"\"" + message + "\""} );
					}

					if( JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION) )	{
						_selected = _list.getSelectedIndex();
					}
					else	{
						return;
					}
				}
				else	{
					_selected = _list.getSelectedIndex();
				}
			}
		}
		else	{
			_selected = -1;
		}

		dispose();
	}


//
//	ListSelectionListener の実装
//
	public void valueChanged( ListSelectionEvent ev )
	{
		if( _forSave )	{
			return;
		}

		int	selected = _list.getSelectedIndex();
		if( (selected != -1) && (_infoList[selected] != null) )	{
			_ok.setEnabled( true );
		}
		else	{
			_ok.setEnabled( false );
		}	
	}




//
//	ユーティリティ
//
	/**
	 * セーブデータ選択ダイアログを表示し、選択されたセーブデータのインデックスを取得します。
	 * @param	list	表示するセーブデータ一覧
	 * @return	選択されたセーブデータのインデックス
	 */
	public static int showDialog( SaveDataInfo[] list, int initialIndex, boolean forSave )
	{
		SaveDataDialog	dialog = new SaveDataDialog( forSave );
		dialog.initialize( list, initialIndex );
		dialog.setLocationRelativeTo( dialog.getOwner() );
		dialog.show();
		return dialog.getSelectedIndex();
	}
}
