Project: jMemorize
/*
 * jMemorize - Learning made easy (and fun) - A Leitner flashcards tool 
 * Copyright(C) 2004-2006 Riad Djemili 
 *  
 * This program is free software; you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 1, or (at your option) 
 * any later version. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 */
package jmemorize.gui.swing.panels; 
 
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DecimalFormat; 
 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
 
import jmemorize.core.learn.LearnSession; 
import jmemorize.gui.Localization; 
 
/**
 * @author djemili 
 */
 
public class TimerPanel extends JPanel implements ActionListener 
    // show two digits fully 
    private DecimalFormat m_formater  = new DecimalFormat("##00"); //$NON-NLS-1$ 
 
    private int           m_secondsPassed; 
    private int           m_secondsTarget; 
 
    private Timer         m_timer; 
 
    private JProgressBar  m_bar       = new JProgressBar(); 
    private JTextField    m_textField = new JTextField(); 
 
    private LearnSession  m_learnSession; 
 
    public void start(LearnSession learnSession, int seconds) 
    { 
        m_learnSession = learnSession; 
        m_secondsTarget = seconds; 
        m_secondsPassed = 0
 
        removeAll(); 
        setLayout(new BorderLayout()); 
         
        // if there is a time limit we show a progess bar 
        // otherwise only a label 
        if (m_secondsTarget > -1
        { 
            m_bar.setValue(0); 
            m_bar.setStringPainted(true); 
            m_bar.setString(getTimeString()); 
            add(m_bar, BorderLayout.CENTER); 
        } 
        else 
        { 
            m_textField.setText(getTimeString()); 
            m_textField.setHorizontalAlignment(JTextField.CENTER); 
            m_textField.setEditable(false); 
            add(m_textField, BorderLayout.CENTER); 
        } 
         
        // call action performer every second 
        m_timer = new Timer(1000this); 
        m_timer.start(); 
    } 
     
    public void start(LearnSession strategy) 
    { 
        start(strategy, -1); 
    } 
 
    /**
     * Stops the timer. 
     */
 
    public void stop() 
    { 
        m_timer.stop(); 
    } 
 
    /**
     * Is called every second and updates the timer representation. 
     */
 
    public void actionPerformed(ActionEvent evt) 
    { 
        m_secondsPassed++; 
 
        if (m_secondsTarget > -1
        { 
            m_bar.setValue((100 * m_secondsPassed) / m_secondsTarget); 
            m_bar.setString(getTimeString()); 
        } 
        else 
        { 
            m_textField.setText(getTimeString()); 
        } 
         
        if (m_secondsPassed == m_secondsTarget) 
        { 
            m_timer.stop(); 
            m_learnSession.onTimer(); 
        } 
    } 
 
    /**
     * @return The string that is used to show time in progressbar. 
     */
 
    protected String getTimeString() 
    { 
        // if progress bar 
        if (m_secondsTarget > -1
        { 
            // if target time reached 
            if (m_secondsTarget <= m_secondsPassed) 
            { 
                return timeString(m_secondsTarget, m_secondsTarget) + timeExtString(m_secondsTarget) 
                     + " " + Localization.get("Time.PASSED") + "!"//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
            } 
            else 
            { 
                return timeString(m_secondsPassed, m_secondsTarget) + " / " + //$NON-NLS-1$ 
                    timeString(m_secondsTarget, m_secondsTarget) + timeExtString(m_secondsTarget); 
            } 
        } 
        // else show just a text label 
        else 
        { 
            return timeString(m_secondsPassed, m_secondsPassed) + 
                timeExtString(m_secondsPassed); 
        } 
    } 
     
    protected String timeString(int seconds, int secondsTarget) 
    { 
        if (secondsTarget > 60*60// show hours if over 60 minutes 
        { 
            return (seconds/(60*60)) +":"+ m_formater.format((seconds/60)%60)  //$NON-NLS-1$ 
                +":"+ m_formater.format(seconds%60); //$NON-NLS-1$ 
        } 
         
        if (secondsTarget > 60// show minutes if over 60 seconds 
        { 
            return (seconds/60) +":"+ m_formater.format(seconds%60); //$NON-NLS-1$ 
        } 
 
        return Integer.toString(seconds); 
    } 
     
    protected String timeExtString(int seconds) 
    { 
        if (seconds > 60*60
        { 
            return " "+ Localization.get("Time.HOURS");    //$NON-NLS-1$ //$NON-NLS-2$ 
        } 
         
        if (seconds > 60
        { 
            return " " + Localization.get("Time.MINUTES"); //$NON-NLS-1$ //$NON-NLS-2$ 
        } 
             
        return " " + Localization.get("Time.SECONDS");     //$NON-NLS-1$ //$NON-NLS-2$ 
    } 
}