package jrummikub.control; import java.util.ArrayList; import java.util.List; import jrummikub.model.IHand; import jrummikub.model.ITable; import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.model.StoneSet; import jrummikub.util.Connection; import jrummikub.util.Event; import jrummikub.util.IEvent; import jrummikub.util.IListener; import jrummikub.util.IListener1; import jrummikub.util.IListener2; import jrummikub.view.IView; public class TurnControl { private IHand hand; private ITable table; private ITurnTimer timer; private IView view; private List selectedStones = new ArrayList(); private Event endOfTurnEvent = new Event(); List connections = new ArrayList(); public TurnControl(IHand hand, ITable table, IView view) { this.hand = hand; this.table = table; this.view = view; this.timer = new TurnTimer(view); } /** Test only constructor **/ TurnControl(IHand hand, ITable table, IView view, ITurnTimer testTimer) { this.hand = hand; this.table = table; this.view = view; this.timer = testTimer; } public void startTurn() { IListener endOfTurnListener = new IListener() { @Override public void handle() { endOfTurn(); } }; connections.add(timer.getTimeRunOutEvent().add(endOfTurnListener)); connections.add(view.getPlayerPanel().getEndTurnEvent() .add(endOfTurnListener)); connections.add(view.getPlayerPanel().getHandPanel().getStoneClickEvent() .add(new IListener2() { @Override public void handle(Stone stone, Boolean collect) { stoneClick(stone, collect); } })); connections.add(view.getTablePanel().getStoneCollectionPanel() .getStoneClickEvent().add(new IListener2() { @Override public void handle(Stone stone, Boolean collect) { collectionStoneClick(stone, collect); } })); connections.add(view.getTablePanel().getStoneCollectionPanel() .getSetClickEvent().add(new IListener2() { @Override public void handle(Stone stone, Boolean collect) { collectionSetClick(stone, collect); } })); connections.add(view.getTablePanel().getStoneClickEvent() .add(new IListener2() { @Override public void handle(Stone stone, Boolean collect) { stoneClick(stone, collect); } })); connections.add(view.getTablePanel().getClickEvent() .add(new IListener1() { @Override public void handle(Position pos) { tableClick(pos); } })); connections.add(view.getTablePanel().getLeftConnectorClickEvent() .add(new IListener1() { @Override public void handle(StoneSet set) { leftConnectorClick(set); } })); connections.add(view.getTablePanel().getRightConnectorClickEvent() .add(new IListener1() { @Override public void handle(StoneSet set) { rightConnectorClick(set); } })); view.getPlayerPanel().getHandPanel().setStones(hand.clone()); view.enableStartTurnPanel(false); timer.startTimer(); } private void sortByValue() { } private void sortByColor() { } private void stoneClick(Stone stone, boolean collect) { if (collect) { if (!selectedStones.remove(stone)) { selectedStones.add(stone); } } else { selectedStones.clear(); selectedStones.add(stone); } view.setSelectedStones(selectedStones); } private void collectionStoneClick(Stone stone, boolean collect) { selectedStones.remove(stone); if (collect) { selectedStones.add(stone); } view.setSelectedStones(selectedStones); } private void collectionSetClick(Stone stone, Boolean collect) { selectedStones.clear(); view.setSelectedStones(selectedStones); } private void pickUpSelectedStones() { for (Stone stone : selectedStones) { hand.pickUp(stone); table.pickUpStone(stone); } } private void tableClick(Position position) { if (selectedStones.isEmpty()) { return; } pickUpSelectedStones(); table.drop(new StoneSet(selectedStones), new Position(position.getX() - selectedStones.size() * 0.5f, position.getY() - 0.5f)); selectedStones.clear(); view.getTablePanel().setStoneSets(table); view.getPlayerPanel().getHandPanel().setStones(hand); view.setSelectedStones(selectedStones); } private void leftConnectorClick(StoneSet set) { } private void rightConnectorClick(StoneSet set) { } private void endOfTurn() { timer.stopTimer(); endOfTurnEvent.emit(); for (Connection c : connections) { c.remove(); } view.setSelectedStones(new ArrayList()); } public IEvent getEndOfTurnEvent() { return endOfTurnEvent; } }