From 40eb978a96819d4fae3ac6bb2d972c826bf47391 Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Wed, 2 Mar 2005 02:33:46 +0000 Subject: [PATCH] Added a simple turn display widget (for game gardens). git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3373 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../threerings/parlor/turn/TurnDisplay.java | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 src/java/com/threerings/parlor/turn/TurnDisplay.java diff --git a/src/java/com/threerings/parlor/turn/TurnDisplay.java b/src/java/com/threerings/parlor/turn/TurnDisplay.java new file mode 100644 index 000000000..e732805db --- /dev/null +++ b/src/java/com/threerings/parlor/turn/TurnDisplay.java @@ -0,0 +1,199 @@ +// +// $Id$ + +package com.threerings.parlor.turn; + +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import java.util.HashMap; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.Icon; + +import com.samskivert.swing.GroupLayout; +import com.samskivert.swing.VGroupLayout; +import com.samskivert.swing.util.SwingUtil; + +import com.threerings.util.Name; + +import com.threerings.crowd.client.PlaceView; +import com.threerings.crowd.data.PlaceObject; + +import com.threerings.parlor.game.GameObject; +import com.threerings.parlor.turn.TurnGameObject; + +import com.threerings.presents.dobj.AttributeChangeListener; +import com.threerings.presents.dobj.AttributeChangedEvent; +import com.threerings.presents.dobj.ElementUpdateListener; +import com.threerings.presents.dobj.ElementUpdatedEvent; +import com.threerings.presents.dobj.DObject; + +/** + * Automatically display a list of players and turn change information + * in a turn-based game. + */ +// TODO +// - adapt this to be able to display scores in some generic way as well. +// - allow configuring of turn / winner labels from prototypes, +// rather than forcing one to be an icon, the other a string, and +// examine the prototype to determine how to highlight the turnholder. +public class TurnDisplay extends JPanel + implements PlaceView, AttributeChangeListener, ElementUpdateListener +{ + /** + * Create a TurnDisplay. + */ + public TurnDisplay () + { + } + + /** + * Create a TurnDisplay for a game using the specified Icon to denote + * whose turn it is. + */ + public TurnDisplay (Icon turnIcon) + { + setTurnIcon(turnIcon); + } + + /** + * Set the icon to use. + */ + public void setTurnIcon (Icon turnIcon) + { + _turnIcon = turnIcon; + if (_turnObj != null) { + createList(); + } + } + + /** + * Set the text to be displayed next to the winner's name. + */ + public void setWinnerText (String winnerText) + { + _winnerText = winnerText; + } + + /** + * Set optional icons to use for identifying each player in the game. + */ + public void setPlayerIcons (Icon[] icons) + { + _playerIcons = icons; + if (_turnObj != null) { + createList(); + } + } + + /** + * Create the list of names and highlight as appropriate. + */ + protected void createList () + { + removeAll(); + _labels.clear(); + + GridBagLayout gridbag = new GridBagLayout(); + setLayout(gridbag); + + GridBagConstraints iconC = new GridBagConstraints(); + GridBagConstraints labelC = new GridBagConstraints(); + iconC.fill = labelC.fill = GridBagConstraints.BOTH; + labelC.weightx = 1.0; + labelC.insets.left = 10; + labelC.gridwidth = GridBagConstraints.REMAINDER; + + Name[] names = _turnObj.getPlayers(); + boolean[] winners = ((GameObject) _turnObj).winners; + Name holder = _turnObj.getTurnHolder(); + for (int ii=0, jj=0; ii < names.length; ii++, jj++) { + if (names[ii] == null) continue; + + JLabel iconLabel = new JLabel(); + if (winners == null) { + if (names[ii].equals(holder)) { + iconLabel.setIcon(_turnIcon); + } + } else if (winners[ii]) { + iconLabel.setText(_winnerText); + iconLabel.setForeground(Color.GREEN); + } + _labels.put(names[ii], iconLabel); + add(iconLabel, iconC); + + JLabel label = new JLabel(names[ii].toString()); + if (_playerIcons != null) { + label.setIcon(_playerIcons[jj]); + } + add(label, labelC); + } + + SwingUtil.refresh(this); + } + + // documentation inherited from interface PlaceView + public void willEnterPlace (PlaceObject plobj) + { + _turnObj = (TurnGameObject) plobj; + plobj.addListener(this); + createList(); + } + + // documentation inherited from interface PlaceView + public void didLeavePlace (PlaceObject plobj) + { + plobj.removeListener(this); + _turnObj = null; + removeAll(); + } + + // documentation inherited from interface AttributeChangeListener + public void attributeChanged (AttributeChangedEvent event) + { + String name = event.getName(); + if (name.equals(_turnObj.getTurnHolderFieldName())) { + JLabel oldLabel = (JLabel) _labels.get((Name) event.getOldValue()); + if (oldLabel != null) { + oldLabel.setIcon(null); + } + JLabel newLabel = (JLabel) _labels.get((Name) event.getValue()); + if (newLabel != null) { + newLabel.setIcon(_turnIcon); + } + + } else if (name.equals(GameObject.PLAYERS)) { + createList(); + + } else if (name.equals(GameObject.WINNERS)) { + createList(); + } + } + + // documentation inherited from interface ElementUpdateListener + public void elementUpdated (ElementUpdatedEvent event) + { + String name = event.getName(); + if (name.equals(GameObject.PLAYERS)) { + createList(); + } + } + + /** The TurnGameObject we're displaying. */ + protected TurnGameObject _turnObj; + + /** A mapping of the labels currently associated with each player. */ + protected HashMap _labels = new HashMap(); + + /** The game-specified player icons. */ + protected Icon[] _playerIcons; + + /** The text to display next to a winner's name. */ + protected String _winnerText; + + /** The Icon we use for indicating the turn. */ + protected Icon _turnIcon; +}