package org.matveev.pomodoro4nb.timer; import java.awt.Container; import java.io.IOException; import java.util.Properties; import org.matveev.pomodoro4nb.controllers.AbstractController; import org.matveev.pomodoro4nb.data.Property; import org.matveev.pomodoro4nb.prefs.DefaultPreferencesProvider; import org.matveev.pomodoro4nb.prefs.PreferencesProvider; import org.matveev.pomodoro4nb.task.TaskController; import org.matveev.pomodoro4nb.timer.PomodoroTimer.State; import org.matveev.pomodoro4nb.utils.Handler; /** * * @author Alexey Matvey */ public class TimerController extends AbstractController { public static final String TIMER_CONTROLLER_ID = "timerController"; public static final Property<StateInfo> STATE_CHANGED_PROPERTY = new Property<StateInfo>("stateChanged", StateInfo.class); public static final Property<Boolean> PRE_START_TIMER_PROPERTY = new Property<Boolean>("preStart", Boolean.class); private final PomodoroTimer timer; private final PreferencesProvider provider; public TimerController(final PreferencesProvider aProvider) { this.provider = aProvider; timer = new PomodoroTimer(createTimerDataForPrefs(provider)); timer.addPomodoroTimerListener(new PomodoroTimerListener() { @Override public void stateChanged(State state, boolean forced) { final StateInfo info = new StateInfo(state, forced); fire(STATE_CHANGED_PROPERTY, null, info); } }); provider.addPrefrencesListener(new PreferencesProvider.PreferencesListener() { @Override public void preferencesChange(String key, Object newValue) { timer.setTimerData(createTimerDataForPrefs(provider)); } }); registerHandler(TaskController.ActiveTaskRemovedProperty, new Handler<Boolean>() { @Override public void handle(Boolean oldValue, Boolean newValue) { if (Boolean.TRUE.equals(newValue)) { timer.forcedStop(); } } }); } private static PomodoroTimerData createTimerDataForPrefs(PreferencesProvider provider) { return new PomodoroTimerData( provider.getInteger(DefaultPreferencesProvider.POMODORO_LENGTH_KEY, DefaultPreferencesProvider.DEFAULT_POMODORO_LENGTH), provider.getInteger(DefaultPreferencesProvider.SHORT_BREAK_LENGTH_KEY, DefaultPreferencesProvider.DEFAULT_SHORT_BREAK_LENGTH), provider.getInteger(DefaultPreferencesProvider.LONG_BREAK_LENGTH_KEY, DefaultPreferencesProvider.DEFAULT_LONG_BREAK_LENGTH), provider.getInteger(DefaultPreferencesProvider.LONG_BREAK_INTERVAL_KEY, DefaultPreferencesProvider.DEFAULT_LONG_BREAK_INTERVAL)); } @Override public Container createUI() { return timer; } @Override public void restore(Properties props) throws IOException, ClassNotFoundException { // do nothing } @Override public void store(Properties props) throws IOException { // do nothing } public static final class StateInfo { private final State state; private final boolean isForced; public StateInfo(State state, boolean isForced) { this.state = state; this.isForced = isForced; } public boolean isForced() { return isForced; } public State getState() { return state; } } }