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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user