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

/**
 * SelectIntervalDialog クラスは、自動再生の再生速度を選択するダイアログを提供します。
 * @author Jiro Suzuki
 */
public class SelectIntervalDialog extends JDialog
             implements ListSelectionListener,ListCellRenderer{

    /** メニューのフォント */
    private static final Font FONT_MENU=new Font("MS UI Gothic",Font.PLAIN,17);

    private int interval;

    /**
     * パラメータで指定された SelectIntervalDialog インスタンスを生成します。
     * @param owner ダイアログの所有者
     * @param title ダイアログのタイトル
     * @param modal ダイアログをモーダルにするかどうかの真偽値
     */
    SelectIntervalDialog(Frame owner,String title,boolean modal){

        super(owner,title,modal);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        interval=0;

        String[] menu={"             1秒", "             2秒", "             3秒", "             4秒",
                       "             5秒", "             6秒", "             7秒", "             8秒"};
        JList list=new JList(menu);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setCellRenderer(this);
        list.addListSelectionListener(this);

        JButton okButton=new JButton("OK");
        okButton.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                setVisible(false);
            }
        });

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add("Center",list);
        getContentPane().add("South",okButton);
    
    }

    /**
     * 再生速度を指定するダイアログを表示します。
     * @return 指定された秒数
     */
    public int showIntervalDialog(){
        pack();
        setVisible(true);
        return interval; 
    }

    /**
     * 選択範囲内の値が変更されたときに呼び出されます。選択された再生速度をワーク項目に設定します。
     * @param e 変更を記述するイベント
     */
    public void valueChanged(ListSelectionEvent e) {
        JList list=(JList)e.getSource();
        interval=list.getSelectedIndex() + 1;
    }

    /**
     * 指定された値を表示するように設定されたコンポーネントを返します。次に、そのコンポーネントの paint メソッドが呼び出されて、セルを「描画」します。
     * @param list ペイントしている JList
     * @param object list.getModel().getElementAt(index) によって返される値
     * @param index セルのインデックス
     * @param isSelected 指定されたセルが選択された場合は true
     * @param hasFocus 指定されたセルにフォーカスがある場合は true
     * @return 指定された値を描画する paint() メソッドがあるコンポーネント
     */
    public Component getListCellRendererComponent(JList list, Object object,
                     int index,boolean isSelected, boolean hasFocus) {
        JLabel label = new JLabel((String)object);
        label.setOpaque(true);

        if (isSelected){
            label.setBackground(new Color(255,127,80));
        } else {
            int remainder=index % 2;
            switch(remainder){
                case 0:
                    label.setBackground(new Color(245,245,245));
                    break;
                case 1:
                    label.setBackground(new Color(230,230,250));
                    break;
            }
        }
        label.setFont(FONT_MENU);
        label.setForeground(Color.BLACK);
        return label;
    }
}