package tools.map.xml.creator; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.util.Map; import java.util.Optional; import javax.swing.JOptionPane; import games.strategy.ui.SwingAction; import games.strategy.ui.Util; public class TerritoryProductionPanel extends ImageScrollPanePanel { private TerritoryProductionPanel() {} public static void layout(final MapXmlCreator mapXmlCreator) { setMapXmlCreator(mapXmlCreator); final TerritoryProductionPanel panel = new TerritoryProductionPanel(); panel.layout(mapXmlCreator.getStepActionPanel()); mapXmlCreator.setAutoFillAction(SwingAction.of(Exception -> { panel.paintPreparation(null); panel.repaint(); })); } @Override protected void paintCenterSpecifics(final Graphics g, final String centerName, final FontMetrics fontMetrics, final Point item, final int textStartX) { final Integer production = MapXmlHelper.getTerritoyProductionsMap().get(centerName); if (production != null && production > 0) { final String productionString = production.toString(); final Rectangle2D prodStringBounds = fontMetrics.getStringBounds(productionString, g); final Rectangle2D centerStringBounds = fontMetrics.getStringBounds(centerName, g); final double wDiff = (centerStringBounds.getWidth() - prodStringBounds.getWidth()) / 2; g.setColor(Color.yellow); g.fillRect(Math.max(0, textStartX - 2 + (int) wDiff), item.y + 6, (int) prodStringBounds.getWidth() + 4, (int) prodStringBounds.getHeight()); g.setColor(Color.red); g.drawString(productionString, Math.max(0, textStartX + (int) wDiff), item.y + 17); } g.setColor(Color.red); } @Override protected void paintPreparation(final Map<String, Point> centers) { if (centers != null && !MapXmlHelper.getTerritoyProductionsMap().isEmpty()) { return; } for (final String territoryName : polygons.keySet()) { MapXmlHelper.putTerritoyProductions(territoryName, 0); } } @Override protected void paintOwnSpecifics(final Graphics g, final Map<String, Point> centers) { // nothing to do } @Override protected void mouseClickedOnImage(final Map<String, Point> centers, final MouseEvent e) { final Optional<String> territoryNameOptional = Util.findTerritoryName(e.getPoint(), polygons); if (!territoryNameOptional.isPresent()) { return; } final String territoryName = territoryNameOptional.get(); final Integer currValue = MapXmlHelper.getTerritoyProductionsMap().get(territoryName); final String inputText = JOptionPane.showInputDialog(null, "Enter the new production value for territory " + territoryName + ":", (currValue != null ? currValue : 0)); try { final int newValue = Integer.parseInt(inputText); MapXmlHelper.putTerritoyProductions(territoryName, newValue); } catch (final NumberFormatException nfe) { JOptionPane.showMessageDialog(null, "'" + inputText + "' is no integer value.", "Input error", JOptionPane.ERROR_MESSAGE); return; } repaint(); } }