package tools.map.xml.creator;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import com.google.common.collect.Maps;
import games.strategy.ui.Util;
class TerritoryDefinitionsPanel extends ImageScrollPanePanel {
private TerritoryDefinitionsPanel() {}
public static void layout(final MapXmlCreator mapXmlCreator) {
setMapXmlCreator(mapXmlCreator);
new TerritoryDefinitionsPanel().layout(mapXmlCreator.getStepActionPanel());
}
@Override
protected void paintCenterSpecifics(final Graphics g, final String centerName, final FontMetrics fontMetrics,
final Point item, final int textStartX) {
final Map<TerritoryDefinitionDialog.DEFINITION, Boolean> territoryDefinition =
MapXmlHelper.getTerritoryDefintionsMap().get(centerName);
if (territoryDefinition != null) {
final int y_value = item.y + 10;
short definitionCount = 0;
g.setFont(g.getFontMetrics().getFont().deriveFont(Font.BOLD));
final FontMetrics fm = g.getFontMetrics();
int h = fm.getAscent();
final int oneCharacterWidthSpace = 17;
for (final Entry<TerritoryDefinitionDialog.DEFINITION, Boolean> definitionEntry : territoryDefinition
.entrySet()) {
if (definitionEntry.getValue()) {
final int x_value = textStartX + oneCharacterWidthSpace * definitionCount;
String character = null;
switch (definitionEntry.getKey()) {
case IS_WATER:
g.setColor(Color.blue);
character = "W";
break;
case IS_VICTORY_CITY:
g.setColor(Color.yellow);
character = "V";
break;
case IMPASSABLE:
g.setColor(Color.gray);
character = "I";
break;
case IS_CAPITAL:
g.setColor(Color.green);
break;
default:
throw new IllegalStateException("No valid value for " + TerritoryDefinitionDialog.DEFINITION.class);
}
g.fillOval(x_value, y_value, 16, 16);
g.setColor(Color.red);
final int w = fm.stringWidth(character);
h = fm.getAscent();
g.drawString(character, x_value + 8 - (w / 2), y_value + 8 + (h / 2));
}
++definitionCount;
}
g.setColor(Color.red);
g.setFont(g.getFontMetrics().getFont().deriveFont(Font.PLAIN));
}
}
@Override
protected void paintPreparation(final Map<String, Point> centers) {
if (!MapXmlCreator.waterFilterString.isEmpty() && MapXmlHelper.getTerritoryDefintionsMap().isEmpty()) {
for (final String centerName : centers.keySet()) {
final HashMap<TerritoryDefinitionDialog.DEFINITION, Boolean> territoyDefintion =
Maps.newHashMap();
if (centerName.startsWith(MapXmlCreator.waterFilterString)) {
territoyDefintion.put(TerritoryDefinitionDialog.DEFINITION.IS_WATER, true);
}
MapXmlHelper.putTerritoryDefintions(centerName, territoyDefintion);
}
} else {
for (final String centerName : centers.keySet()) {
final HashMap<TerritoryDefinitionDialog.DEFINITION, Boolean> territoyDefintion =
Maps.newHashMap();
MapXmlHelper.putTerritoryDefintions(centerName, territoyDefintion);
}
}
}
@Override
protected void paintOwnSpecifics(final Graphics g, final Map<String, Point> centers) {}
@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();
if (SwingUtilities.isRightMouseButton(e)) {
final String territoryNameNew =
JOptionPane.showInputDialog(getImagePanel(), "Enter the territory name:", territoryName);
if (territoryNameNew == null || territoryNameNew.trim().length() == 0) {
return;
}
if (!territoryName.equals(territoryNameNew) && centers.containsKey(territoryNameNew)
&& JOptionPane.showConfirmDialog(getImagePanel(),
"Another center exists with the same name. Are you sure you want to replace it with this one?") != 0) {
return;
}
centers.put(territoryNameNew, centers.get(territoryName));
} else {
SwingUtilities.invokeLater(() -> {
Map<TerritoryDefinitionDialog.DEFINITION, Boolean> territoyDefintions =
MapXmlHelper.getTerritoryDefintionsMap().get(territoryName);
if (territoyDefintions == null) {
territoyDefintions = Maps.newHashMap();
}
new TerritoryDefinitionDialog(getMapXmlCreator(), territoryName, territoyDefintions);
getImagePanel().repaint();
});
}
}
}