package games.strategy.engine.chat;
import java.awt.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JList;
import javax.swing.SwingConstants;
import com.google.common.base.Joiner;
import games.strategy.engine.data.PlayerList;
import games.strategy.engine.data.PlayerManager;
import games.strategy.engine.framework.IGame;
import games.strategy.net.INode;
import games.strategy.triplea.ui.IUIContext;
public class PlayerChatRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = -8195565028281374498L;
private final IGame game;
private final IUIContext uiContext;
int m_maxIconCounter = 0;
HashMap<String, List<Icon>> iconMap = new HashMap<>();
HashMap<String, Set<String>> playerMap = new HashMap<>();
public PlayerChatRenderer(final IGame game, final IUIContext uiContext) {
this.game = game;
this.uiContext = uiContext;
setIconMap();
}
@Override
public Component getListCellRendererComponent(final JList<?> list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus) {
final List<Icon> icons = iconMap.get(value.toString());
if (icons != null) {
super.getListCellRendererComponent(list, ((INode) value).getName(), index, isSelected, cellHasFocus);
setHorizontalTextPosition(SwingConstants.LEFT);
setIcon(new CompositeIcon(icons));
} else {
final StringBuilder sb = new StringBuilder(((INode) value).getName());
final Set<String> players = playerMap.get(value.toString());
if (players != null && !players.isEmpty()) {
sb.append(" (");
sb.append(Joiner.on(", ").join(players));
sb.append(")");
}
super.getListCellRendererComponent(list, sb.toString(), index, isSelected, cellHasFocus);
}
return this;
}
private void setIconMap() {
final PlayerManager playerManager = game.getPlayerManager();
PlayerList playerList;
game.getData().acquireReadLock();
try {
playerList = game.getData().getPlayerList();
} finally {
game.getData().releaseReadLock();
}
// new HashSet removes duplicates
for (final INode playerNode : new HashSet<>(playerManager.getPlayerMapping().values())) {
final Set<String> players = playerManager.getPlayedBy(playerNode);
if (players.size() > 0) {
final List<Icon> icons = new ArrayList<>(players.size());
for (final String player : players) {
if (uiContext != null && uiContext.getFlagImageFactory() != null) {
icons.add(new ImageIcon(uiContext.getFlagImageFactory().getSmallFlag(playerList.getPlayerID(player))));
}
}
m_maxIconCounter = Math.max(m_maxIconCounter, icons.size());
playerMap.put(playerNode.toString(), players);
if (uiContext == null) {
iconMap.put(playerNode.toString(), null);
} else {
iconMap.put(playerNode.toString(), icons);
}
}
}
}
public int getMaxIconCounter() {
return m_maxIconCounter;
}
}