View Javadoc

1   package nl.tudelft.goal.ut2004.visualizer.gui.dialogs;
2   
3   import java.awt.Component;
4   import java.awt.Dimension;
5   import java.awt.FlowLayout;
6   import java.awt.Frame;
7   import java.util.Collection;
8   import java.util.HashMap;
9   import java.util.HashSet;
10  import java.util.Set;
11  
12  import javax.swing.Box;
13  import javax.swing.BoxLayout;
14  import javax.swing.JButton;
15  import javax.swing.JDialog;
16  import javax.swing.JLabel;
17  import javax.swing.JPanel;
18  
19  import nl.tudelft.goal.ut2004.visualizer.controller.ServerController;
20  import nl.tudelft.goal.ut2004.visualizer.gui.action.KickAction;
21  import nl.tudelft.goal.ut2004.visualizer.gui.action.RespawnRandomAction;
22  import nl.tudelft.goal.ut2004.visualizer.util.CollectionEventAdaptor;
23  import nl.tudelft.goal.ut2004.visualizer.util.WindowPersistenceHelper;
24  
25  import cz.cuni.amis.pogamut.unreal.communication.messages.UnrealId;
26  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Player;
27  import cz.cuni.amis.utils.collections.ObservableCollection;
28  
29  public class ListPlayerDialog extends JDialog {
30  
31  	/**
32  	 * Helper class to persist this window.
33  	 */
34  	private WindowPersistenceHelper persistenceHelper;
35  	
36  	public ListPlayerDialog(Frame parent) {
37  		super(parent, false);
38  
39  		setTitle("Players");
40  		add(new PlayerDisplayList());
41  		this.setSize(300, 500);
42  		// Setup persistence
43  		persistenceHelper = new WindowPersistenceHelper(this);
44  		persistenceHelper.load();
45  	}
46  
47  	private class PlayerDisplayList extends JPanel {
48  
49  		private HashMap<UnrealId, PlayerDisplay> displays = new HashMap<UnrealId, ListPlayerDialog.PlayerDisplay>();
50  		private Component verticalGlue = new Box.Filler(new Dimension(), new Dimension(), new Dimension(0, Integer.MAX_VALUE));
51  		
52  		public PlayerDisplayList() {
53  			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS) );
54  			add(verticalGlue);
55  
56  			ObservableCollection<Player> players = ServerController.getInstance().getGameData().getPlayers();
57  
58  			updateList(players);
59  			validate();
60  			
61  			players.addCollectionListener(new CollectionEventAdaptor<Player>() {
62  
63  				@Override
64  				public void postAddEvent(Collection<Player> alreadyAdded, Collection<Player> whereWereAdded) {
65  					updateList(whereWereAdded);
66  
67  				}
68  
69  				@Override
70  				public void postRemoveEvent(Collection<Player> alreadyAdded, Collection<Player> whereWereRemoved) {
71  					updateList(whereWereRemoved);
72  				}	
73  			});
74  		}
75  
76  		private void updateList(Collection<Player> players) {
77  			remove(verticalGlue);
78  			
79  			// Add new elements
80  			for(Player player : players){
81  				PlayerDisplay display = displays.get(player.getId());
82  				if(display == null){
83  					display = new PlayerDisplay(player);
84  					displays.put(player.getId(), display);
85  					add(display);
86  				} 
87  			}
88  
89  			// Remove those that are no longer present
90  			// We first check which players are still in the display list 
91  			// but not in the current group using the unrealIds of the players.
92  			// Not ideal but fastest solution there is.
93  			Set<UnrealId> ids = new HashSet<UnrealId>(displays.keySet());
94  			for(Player player : players){
95  				ids.remove(player.getId());
96  			}
97  			for(UnrealId id : ids){
98  				PlayerDisplay display = displays.remove(id);
99  				remove(display);
100 			}
101 			
102 			add(verticalGlue);
103 			
104 			validate();
105 			repaint();
106 		}
107 	}
108 
109 	private class PlayerDisplay extends JPanel {
110 
111 		private Player player;
112 
113 		public PlayerDisplay(Player player) {
114 			this.player = player;
115 
116 			this.setLayout(new FlowLayout(FlowLayout.LEFT));
117 			this.add(new JButton(new KickAction(player)));
118 			this.add(new JButton(new RespawnRandomAction(player)));
119 			this.add(new JLabel(player.getName()));
120 		}
121 	}
122 }