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
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
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
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
90
91
92
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 }