package jrummikub.control.turn; import java.util.ArrayList; import java.util.List; import jrummikub.control.ITurnTimer; import jrummikub.control.TurnTimer; import jrummikub.model.GameSettings; import jrummikub.model.ITable; import jrummikub.util.Connection; import jrummikub.util.Event; import jrummikub.util.Event1; import jrummikub.util.IEvent; import jrummikub.util.IEvent1; import jrummikub.util.IListener; import jrummikub.view.IView; /** * Abstract base class for TurnControls */ public abstract class AbstractTurnControl implements ITurnControl { protected Event1 endOfTurnEvent = new Event1(); protected Event redealEvent = new Event(); protected Event1 tableUpdateEvent = new Event1(); protected TurnInfo turnInfo; protected GameSettings settings; protected IView view; protected ITurnTimer timer; protected List connections = new ArrayList(); private boolean started = false; @Override public IEvent1 getEndOfTurnEvent() { return endOfTurnEvent; } @Override public IEvent getRedealEvent() { return redealEvent; } @Override public IEvent1 getTableUpdateEvent() { return tableUpdateEvent; } protected void pauseTurn() { timer.stopTimer(); view.enablePauseMode(true); } protected void resumeTurn() { timer.startTimer(); view.enablePauseMode(false); } @Override public void startTurn() { if (started) { return; } started = true; doStartTurn(); } protected abstract void doStartTurn(); protected abstract void timeOut(); @Override public void setup(TurnInfo info, GameSettings settings, IView view) { turnInfo = info; this.settings = settings; this.view = view; if (timer == null) { timer = new TurnTimer(view, settings.getTotalTime()); } connections.add(timer.getTimeRunOutEvent().add(new IListener() { @Override public void handle() { timeOut(); } })); connections.add(view.getPauseEvent().add(new IListener() { @Override public void handle() { pauseTurn(); } })); connections.add(view.getEndPauseEvent().add(new IListener() { @Override public void handle() { resumeTurn(); } })); } protected void cleanUp() { if (timer != null) { timer.stopTimer(); } started = true; for (Connection c : connections) { c.remove(); } } public void abortTurn() { cleanUp(); } }