package games.strategy.triplea.printgenerator; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.imageio.ImageIO; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.triplea.Constants; import games.strategy.util.IntegerMap; class PUChart { private final Iterator<PlayerID> m_playerIterator; private final IntegerMap<PlayerID> m_moneyMap; private final int m_numPlayers; private final PlayerID[] m_playerArray; private final Integer[] m_moneyArray; private final Map<Integer, Integer> m_avoidMap; private final Font CHART_FONT = new Font("Serif", Font.PLAIN, 12); private final BufferedImage m_PUImage; private final Graphics2D m_g2d; private final File m_outDir; PUChart(final PrintGenerationData printData) { final GameData m_data = printData.getData(); m_playerIterator = m_data.getPlayerList().iterator(); m_moneyMap = new IntegerMap<>(); m_numPlayers = m_data.getPlayerList().size(); m_playerArray = new PlayerID[m_numPlayers]; m_moneyArray = new Integer[m_numPlayers]; m_avoidMap = new HashMap<>(); m_PUImage = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB); m_g2d = m_PUImage.createGraphics(); m_outDir = printData.getOutDir(); } private void initializeMap() { int count = 0; while (m_playerIterator.hasNext()) { final PlayerID currentPlayer = m_playerIterator.next(); m_moneyMap.put(currentPlayer, currentPlayer.getResources().getQuantity(Constants.PUS)); m_playerArray[count] = currentPlayer; m_moneyArray[count] = currentPlayer.getResources().getQuantity(Constants.PUS); count++; } } private void initializeAvoidMap() { for (int i = 0; i < m_numPlayers - 1; i++) { for (int j = i + 1; j < m_numPlayers; j++) { // i = firstPlayerMoney ; j = secondPlayerMoney if (m_moneyArray[i].equals(m_moneyArray[j])) { // s_avoidMap.put(s_playerArray[i], s_playerArray[j]); m_avoidMap.put(i, j); } } } } private void drawEllipseAndString(final int x, final int y, final String string) { m_g2d.setFont(CHART_FONT); m_g2d.draw(new Ellipse2D.Double(5 + 87 * x, 5 + 87 * y, 72, 72)); final FontMetrics metrics = m_g2d.getFontMetrics(); final int h = metrics.stringWidth(string) / 2; final int k = metrics.getHeight() / 2; m_g2d.drawString(string, 42 + 87 * x - h, 39 + 87 * y + k); } protected void saveToFile() throws IOException { initializeMap(); initializeAvoidMap(); final int yDimension = 6; final int xDimension = 7; final int numChartsNeeded = (int) Math.ceil(((double) m_moneyMap.totalValues()) / (xDimension * yDimension)); for (int i = 0; i < numChartsNeeded; i++) { m_g2d.setColor(Color.black); // Draw Country Names for (int z = 0; z < m_playerArray.length; z++) { final int valMod42 = m_moneyArray[z] % 42; final int valModXDim = valMod42 % xDimension; final int valFloorXDim = valMod42 / xDimension; if (m_avoidMap.containsKey(z) && m_moneyArray[z] / 42 == i) { final FontMetrics metrics = m_g2d.getFontMetrics(); final int width = metrics.stringWidth(m_playerArray[z].getName()) / 2; m_g2d.drawString(m_playerArray[z].getName(), 42 + 87 * valModXDim - width, 63 + 87 * valFloorXDim); } else if (m_avoidMap.containsValue(z) && m_moneyArray[z] / 42 == i) { final FontMetrics metrics = m_g2d.getFontMetrics(); final int width = metrics.stringWidth(m_playerArray[z].getName()) / 2; m_g2d.drawString(m_playerArray[z].getName(), 42 + 87 * valModXDim - width, 30 + 87 * valFloorXDim); } else if (m_moneyArray[z] / 42 == i) { final FontMetrics metrics = m_g2d.getFontMetrics(); final int width = metrics.stringWidth(m_playerArray[z].getName()) / 2; m_g2d.drawString(m_playerArray[z].getName(), 42 + 87 * valModXDim - width, 60 + 87 * valFloorXDim); } } // Draw Ellipses and Numbers for (int j = 0; j < yDimension; j++) { for (int k = 0; k < xDimension; k++) { final int numberincircle = xDimension * yDimension * i + xDimension * j + k; final String string = "" + numberincircle; drawEllipseAndString(k, j, string); } } // Write to file final int firstnum = xDimension * yDimension * i; final int secondnum = xDimension * yDimension * (i + 1) - 1; final File outputfile = new File(m_outDir, "PUchart" + firstnum + "-" + secondnum + ".png"); ImageIO.write(m_PUImage, "png", outputfile); final Color transparent = new Color(0, 0, 0, 0); m_g2d.setColor(transparent); m_g2d.setComposite(AlphaComposite.Src); m_g2d.fill(new Rectangle2D.Float(0, 0, 600, 600)); } } }