/*
* JNekounter - https://github.com/n3k0/JNekounter
*
* Copyright (C) 2012 N3k0
*
* JNekounter 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 2 of the License,
* or (at your option) any later version.
*
* JNekounter 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 Cobertura; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
package org.workout.counter.panel.swing;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import org.workout.counter.util.FontSearcher;
import org.workout.counter.util.Beep;
/**
* Clase que construye un panel que sirve para contar series
* por intervalos de tiempo, entre tiempos activos (workout) y descansos.
* @author n3k0
*
*/
public class TabataPanel {
private JPanel tabataPanel;
private JPanel parameterPanel;
private JPanel counterPanel;
private JLabel labelSeriesToSet;
private JLabel labelWorkToSet;
private JLabel labelRestToSet;
private JTextField txtSeriesToSet;
private JTextField txtWorkToSet;
private JTextField txtRestToSet;
private JLabel labelSeries;
private JLabel countSeries;
private JLabel labelSecondsWork;
private JLabel countSecondsWork;
private JLabel labelSecondsRest;
private JLabel countSecondsRest;
private JButton beginWorkout;
private SwingWorker<Void, Void> swingWorker;
private static final String EMPTY_STRING = "";
private static final String ZERO_STRING = "0";
private Icon go;
private Icon stop;
private static final int WIDTH = 500;
private static final int HEIGHT = 380;
private boolean workoutStarted;
private Beep beep = Beep.getBeeper();
/**
* Metodo que retorna un panel previamente configurado
*/
public JPanel buildPanel(){
tabataPanel = new JPanel(null);
tabataPanel.setSize( WIDTH , HEIGHT );
parameterPanel = new JPanel( null );
parameterPanel.setBounds(0,0, 490 , 120);
labelSeriesToSet = new JLabel("N\u00FAmero de Series:");
labelSeriesToSet.setHorizontalAlignment(SwingConstants.RIGHT);
labelSeriesToSet.setBounds( 10,10,180,25);
labelWorkToSet = new JLabel("Duraci\u00F3n de la serie:");
labelWorkToSet.setHorizontalAlignment(SwingConstants.RIGHT);
labelWorkToSet.setBounds( 10,46,180,25);
labelRestToSet = new JLabel("Descanso entre series:");
labelRestToSet.setHorizontalAlignment(SwingConstants.RIGHT);
labelRestToSet.setBounds( 10,82,180,25);
txtSeriesToSet = new JTextField("00");
txtSeriesToSet.setHorizontalAlignment(SwingConstants.LEFT);
txtSeriesToSet.setBounds( 220,10,100,25);
txtWorkToSet = new JTextField("00");
txtWorkToSet.setHorizontalAlignment(SwingConstants.LEFT);
txtWorkToSet.setBounds( 220,46,100,25);
txtRestToSet = new JTextField("00");
txtRestToSet.setHorizontalAlignment(SwingConstants.LEFT);
txtRestToSet.setBounds( 220,82,100,25);
go = new ImageIcon( TabataPanel.class.getResource( "/img/run.gif" ));
stop = new ImageIcon( TabataPanel.class.getResource( "/img/zzz.gif" ));
beginWorkout = new JButton("Inicio" , stop );
beginWorkout.setHorizontalTextPosition(SwingConstants.CENTER);
beginWorkout.setVerticalTextPosition(SwingConstants.BOTTOM) ;
beginWorkout.setVerticalAlignment(SwingConstants.BOTTOM);
beginWorkout.setBounds(334, 10, 150, 90);
beginWorkout.setActionCommand( "beginTabata" );
parameterPanel.add( labelSeriesToSet);
parameterPanel.add( labelWorkToSet);
parameterPanel.add(labelRestToSet);
parameterPanel.add(txtSeriesToSet);
parameterPanel.add(txtWorkToSet);
parameterPanel.add(txtRestToSet);
parameterPanel.add( beginWorkout );
counterPanel = new JPanel( null );
counterPanel.setBounds(0, 130, 490, 230);
labelSeries = new JLabel("Serie:");
labelSeries.setHorizontalAlignment(SwingConstants.CENTER);
labelSeries.setBounds( 170 , 5 , 100 , 25 );
labelSecondsWork = new JLabel("Workout");
labelSecondsWork.setHorizontalAlignment(SwingConstants.CENTER);
labelSecondsWork.setBounds( 55 , 105 , 100 , 25 );
labelSecondsRest = new JLabel("Descanso");
labelSecondsRest.setHorizontalAlignment(SwingConstants.CENTER);
labelSecondsRest.setBounds( 340 , 105 , 100 , 25 );
countSeries = new JLabel("00");
countSeries.setHorizontalAlignment(SwingConstants.CENTER);
countSeries.setBounds( 130 , 25 , 200 , 100 );
countSeries.setFont( FontSearcher.chargeFont() );
countSecondsWork = new JLabel("00");
countSecondsWork.setHorizontalAlignment(SwingConstants.CENTER);
countSecondsWork.setBounds( 10 , 130 , 200 , 100 );
countSecondsWork.setFont( FontSearcher.chargeFont() );
countSecondsRest = new JLabel("00");
countSecondsRest.setHorizontalAlignment(SwingConstants.CENTER);
countSecondsRest.setBounds( 290 , 130 , 200 , 100 );
countSecondsRest.setFont( FontSearcher.chargeFont() );
counterPanel.add( labelSeries);
counterPanel.add(countSeries);
counterPanel.add(labelSecondsWork);
counterPanel.add(labelSecondsRest);
counterPanel.add(countSecondsWork);
counterPanel.add(countSecondsRest);
tabataPanel.add(parameterPanel);
tabataPanel.add(counterPanel);
return tabataPanel;
}
/**
* Metodo que ejecuta el calculo de los intervalos de tiempo
* establecidos por el usuario, y refresca las etiquetas
* correspondientes
*/
public void runCronometer() {
final int s = Integer.parseInt( txtSeriesToSet.getText() );
final int w = Integer.parseInt( txtWorkToSet.getText() );
final int r = Integer.parseInt( txtRestToSet.getText() );
countSecondsWork.setText( w >= 10 ? EMPTY_STRING + w : ZERO_STRING + w );
countSecondsRest.setText( r >= 10 ? EMPTY_STRING + r : ZERO_STRING + r );
countSeries.setText( s >= 10 ? EMPTY_STRING + s : ZERO_STRING + s );
swingWorker = new SwingWorker<Void, Void>(){
int seriesToSet = s;
int workToSet = w;
int restToSet = r;
@Override
protected Void doInBackground() throws Exception {
disableElements();
while( seriesToSet >= 0){
if( workToSet > 0 || restToSet > 0 ){
while ( workToSet > 0 ) {
Thread.sleep(1000);
workToSet--;
countSecondsWork.setText( workToSet >= 10 ? EMPTY_STRING + workToSet : ZERO_STRING + workToSet );
}
beep.beep( 5, 500 );
while ( restToSet > 0 ) {
Thread.sleep(1000);
restToSet--;
countSecondsRest.setText( restToSet >= 10 ? EMPTY_STRING + restToSet : ZERO_STRING + restToSet );
}
beep.beep( 3 , 250 );
}
if ( seriesToSet == 0 && workToSet == 0 && restToSet == 0){
beep.beep( 10 , 600 , true );
enableElements();
break;
}
seriesToSet--;
workToSet = w;
restToSet = r;
countSecondsWork.setText( workToSet >= 10 ? EMPTY_STRING + workToSet : ZERO_STRING + workToSet );
countSecondsRest.setText( restToSet >= 10 ? EMPTY_STRING + restToSet : ZERO_STRING + restToSet );
countSeries.setText( seriesToSet >= 10 ? EMPTY_STRING + seriesToSet : ZERO_STRING + seriesToSet );
}
return null;
}
};
swingWorker.execute();
}
/**
* Metodo que retorna la altura preconfigurada del panel
* @return HEIGHT
*/
public int getHeight() {
return HEIGHT;
}
/**
* Metodo que retorna la anchura preconfigurada del panel
* @return WIDTH
*/
public int getWidth() {
return WIDTH;
}
/**
* Metodo que retorna el objeto de tipo JButton
* con el fin de asignarle una accion en el panel principal
* @return JButton
*/
public JButton getBeginWorkout() {
return this.beginWorkout;
}
/**
* Habilita campos de texto y el boton que inicializa el contador
*/
private void enableElements(){
workoutStarted = false;
beginWorkout.setIcon(stop);
txtRestToSet.setEnabled( true );
txtSeriesToSet.setEnabled( true );
txtWorkToSet.setEnabled( true );
}
/**
* Inhabilita campos de texto y el boton que inicializa el contador
*/
private void disableElements(){
workoutStarted = true;
beginWorkout.setIcon(go);
txtRestToSet.setEnabled( true );
txtSeriesToSet.setEnabled( true );
txtWorkToSet.setEnabled( true );
}
/**
* @return true si el workout ha iniciado false en caso contrario
*/
public boolean isWorkoutStarted() {
return workoutStarted;
}
}