package games.strategy.triplea.ui; import java.awt.GridLayout; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import games.strategy.engine.data.Change; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Resource; import games.strategy.engine.data.events.GameDataChangeListener; import games.strategy.engine.stats.IStat; import games.strategy.triplea.Constants; public class EconomyPanel extends AbstractStatPanel { private static final long serialVersionUID = -7713792841831042952L; private IStat[] m_statsResource; private ResourceTableModel m_resourceModel; public EconomyPanel(final GameData data) { super(data); initLayout(); } @Override protected void initLayout() { setLayout(new GridLayout(1, 1)); m_resourceModel = new ResourceTableModel(); final JTable table = new JTable(m_resourceModel); table.getTableHeader().setReorderingAllowed(false); final TableColumn column = table.getColumnModel().getColumn(0); column.setPreferredWidth(175); final JScrollPane scroll = new JScrollPane(table); add(scroll); } class ResourceTableModel extends AbstractTableModel implements GameDataChangeListener { private static final long serialVersionUID = 5197895788633898324L; private boolean m_isDirty = true; private String[][] m_collectedData; public ResourceTableModel() { setResourceCollums(); m_data.addDataChangeListener(this); m_isDirty = true; } private void setResourceCollums() { final List<IStat> statList = new ArrayList<>(); for (final Resource resource : m_data.getResourceList().getResources()) { if (resource.getName().equals(Constants.TECH_TOKENS) || resource.getName().equals(Constants.VPS)) { continue; } statList.add(new ResourceStat(resource)); } m_statsResource = statList.toArray(new IStat[statList.size()]); } @Override public synchronized Object getValueAt(final int row, final int col) { if (m_isDirty) { loadData(); m_isDirty = false; } return m_collectedData[row][col]; } private synchronized void loadData() { m_data.acquireReadLock(); try { final List<PlayerID> players = getPlayers(); final Collection<String> alliances = getAlliances(); m_collectedData = new String[players.size() + alliances.size()][m_statsResource.length + 1]; int row = 0; for (final PlayerID player : players) { m_collectedData[row][0] = player.getName(); for (int i = 0; i < m_statsResource.length; i++) { m_collectedData[row][i + 1] = m_statsResource[i].getFormatter().format(m_statsResource[i].getValue(player, m_data)); } row++; } final Iterator<String> allianceIterator = alliances.iterator(); while (allianceIterator.hasNext()) { final String alliance = allianceIterator.next(); m_collectedData[row][0] = alliance; for (int i = 0; i < m_statsResource.length; i++) { m_collectedData[row][i + 1] = m_statsResource[i].getFormatter().format(m_statsResource[i].getValue(alliance, m_data)); } row++; } } finally { m_data.releaseReadLock(); } } @Override public void gameDataChanged(final Change aChange) { synchronized (this) { m_isDirty = true; } SwingUtilities.invokeLater(() -> repaint()); } @Override public String getColumnName(final int col) { if (col == 0) { return "Player"; } return m_statsResource[col - 1].getName(); } @Override public int getColumnCount() { return m_statsResource.length + 1; } @Override public synchronized int getRowCount() { if (!m_isDirty) { return m_collectedData.length; } else { m_data.acquireReadLock(); try { return m_data.getPlayerList().size() + getAlliances().size(); } finally { m_data.releaseReadLock(); } } } public synchronized void setGameData(final GameData data) { synchronized (this) { m_data.removeDataChangeListener(this); m_data = data; m_data.addDataChangeListener(this); m_isDirty = true; } repaint(); } } @Override public void setGameData(final GameData data) { m_data = data; m_resourceModel.setGameData(data); m_resourceModel.gameDataChanged(null); } }