diff --git a/EU3_Scenario_Editor/src/editor/MapPanel.java b/EU3_Scenario_Editor/src/editor/MapPanel.java index 1ec031a..f635326 100644 --- a/EU3_Scenario_Editor/src/editor/MapPanel.java +++ b/EU3_Scenario_Editor/src/editor/MapPanel.java @@ -62,7 +62,9 @@ public class MapPanel extends javax.swing.JPanel implements Scrollable { private transient java.util.Map overrides; /** @since 0.5pre3 */ - private boolean paintBorders; + private boolean paintInternalBorders; + + private boolean paintExternalBorders; /** @since 0.7.5 */ private boolean isMapInverted; @@ -101,7 +103,8 @@ public void initialize(Map map, FilenameResolver resolver, ProvinceData provData mode = new ProvinceMode(this); - paintBorders = true; + paintInternalBorders = true; + paintExternalBorders = true; } private void createMapImage(Map map, FilenameResolver resolver) { @@ -170,7 +173,7 @@ private void paintBuffer() { try { mode.paint(g); - if (paintBorders && mode.paintsBorders()) { + if ((paintInternalBorders || paintExternalBorders) && mode.paintsBorders()) { paintBorders((Graphics2D) g); } } catch (RuntimeException ex) { @@ -244,6 +247,8 @@ private void paintBorders(final Graphics2D g) { g.setColor(Color.BLACK); final double scale = scaleFactor/DEFAULT_SCALE_FACTOR; + final java.util.Map provIdByRgb = new java.util.HashMap<>(); + final java.util.Map groupByProvId = new java.util.HashMap<>(); double x, y; @@ -254,14 +259,56 @@ private void paintBorders(final Graphics2D g) { pixelSize = 3; if (scale > 3) pixelSize = 4; - - for (Integer[] pt : model.getMapData().getBorderPixels()) { - x = ((double) pt[0]) * scale; - y = ((double) pt[1]) * scale; + + final int basePixelSize = pixelSize; + + for (MapPixelData.BorderPixel pt : model.getMapData().getBorderPixels()) { + final int provId1 = getProvinceIdForRgb(pt.getRgb1(), provIdByRgb); + final int provId2 = getProvinceIdForRgb(pt.getRgb2(), provIdByRgb); + if (provId1 < 0 || provId2 < 0) + continue; + + final Object group1 = groupByProvId.computeIfAbsent(provId1, mode::getBorderGroup); + final Object group2 = groupByProvId.computeIfAbsent(provId2, mode::getBorderGroup); + final boolean isExternal = !java.util.Objects.equals(group1, group2); + + if (!paintInternalBorders && !paintExternalBorders) + continue; + + final float thicknessMultiplier; + if (isExternal) { + if (paintExternalBorders) { + thicknessMultiplier = Math.max(1.0f, mode.getBorderThicknessMultiplier(provId1, provId2, group1, group2)); + } else if (paintInternalBorders) { + thicknessMultiplier = 1.0f; + } else { + continue; + } + } else { + if (!paintInternalBorders) + continue; + thicknessMultiplier = Math.max(1.0f, mode.getBorderThicknessMultiplier(provId1, provId2, group1, group2)); + } + + final int drawPixelSize = Math.max(1, Math.round(basePixelSize * thicknessMultiplier)); + + x = ((double) pt.getX()) * scale; + y = ((double) pt.getY()) * scale; - g.fillRect((int)x, (int)y, pixelSize, pixelSize); + g.fillRect((int)x, (int)y, drawPixelSize, drawPixelSize); } } + + private int getProvinceIdForRgb(final int rgb, final java.util.Map cache) { + final Integer cached = cache.get(rgb); + if (cached != null) + return cached; + + final ProvinceData.Province province = model.getProvinceData().getProv(rgb); + final int id = (province == null) ? -1 : province.getId(); + cache.put(rgb, id); + return id; + } @Override public Dimension getPreferredSize() { @@ -583,12 +630,31 @@ public void setDataSource(ClausewitzDataSource dataSource) { /** @since 0.5pre3 */ public boolean isPaintBorders() { - return paintBorders; + return paintInternalBorders || paintExternalBorders; } /** @since 0.5pre3 */ public void setPaintBorders(boolean paintBorders) { - this.paintBorders = paintBorders; + paintInternalBorders = paintBorders; + paintExternalBorders = paintBorders; + isDirty = true; + } + + public boolean isPaintInternalBorders() { + return paintInternalBorders; + } + + public void setPaintInternalBorders(boolean paintInternalBorders) { + this.paintInternalBorders = paintInternalBorders; + isDirty = true; + } + + public boolean isPaintExternalBorders() { + return paintExternalBorders; + } + + public void setPaintExternalBorders(boolean paintExternalBorders) { + this.paintExternalBorders = paintExternalBorders; isDirty = true; } diff --git a/EU3_Scenario_Editor/src/editor/MapPixelData.java b/EU3_Scenario_Editor/src/editor/MapPixelData.java index 426fba3..62db315 100644 --- a/EU3_Scenario_Editor/src/editor/MapPixelData.java +++ b/EU3_Scenario_Editor/src/editor/MapPixelData.java @@ -15,6 +15,36 @@ /** @since 0.3pre1 */ public final class MapPixelData { + public static final class BorderPixel { + private final int x; + private final int y; + private final int rgb1; + private final int rgb2; + + public BorderPixel(int x, int y, int rgb1, int rgb2) { + this.x = x; + this.y = y; + this.rgb1 = rgb1; + this.rgb2 = rgb2; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getRgb1() { + return rgb1; + } + + public int getRgb2() { + return rgb2; + } + } + /** * Mapping of rgb value to a list of horizontal lines in the province. * Each line is kept in an array of size 3. @@ -24,16 +54,16 @@ public final class MapPixelData { private final java.util.Map> provLines; /** - * List of two-element arrays holding coordinates of border pixels. + * List of border pixels and the two province colors the border divides. * @since 0.5pre3 */ - private final List borders; + private final List borders; private static final int BLACK = 0xFF000000; // java.awt.Color.BLACK.getRGB(); public MapPixelData(final BufferedImage img, final int numProvs) { provLines = new HashMap<>(numProvs); - java.util.Map tmpBorders = new HashMap<>(numProvs*32); + java.util.List tmpBorders = new ArrayList<>(numProvs*32); int rgb; @@ -63,8 +93,11 @@ public MapPixelData(final BufferedImage img, final int numProvs) { points[2] = x; provLines.get(rgb).add(points); - if (rgb != BLACK && x < width && rgbLine[x] != BLACK) { // it's PTI, so don't bother with a border - tmpBorders.put(new Integer[] {x,y}, null); + if (x < width) { + int rgb2 = rgbLine[x]; + if (rgb != BLACK && rgb2 != BLACK) { // it's PTI, so don't bother with a border + tmpBorders.add(new BorderPixel(x, y, rgb, rgb2)); + } } x--; @@ -81,20 +114,23 @@ public MapPixelData(final BufferedImage img, final int numProvs) { do { y++; } while (y < height && rgb == rgbCol[y]); - if (rgb != BLACK && y < height && rgbCol[y] != BLACK) { // it's PTI, so don't bother with a border - tmpBorders.put(new Integer[] {x,y}, null); + if (y < height) { + int rgb2 = rgbCol[y]; + if (rgb != BLACK && rgb2 != BLACK) { // it's PTI, so don't bother with a border + tmpBorders.add(new BorderPixel(x, y, rgb, rgb2)); + } } } } - borders = new ArrayList<>(tmpBorders.keySet()); + borders = tmpBorders; } public List getLinesInProv(int rgb) { return provLines.get(rgb); } - public List getBorderPixels() { + public List getBorderPixels() { return borders; } } diff --git a/EU3_Scenario_Editor/src/editor/MapmodeBuilder.java b/EU3_Scenario_Editor/src/editor/MapmodeBuilder.java index 81b0c42..6544277 100644 --- a/EU3_Scenario_Editor/src/editor/MapmodeBuilder.java +++ b/EU3_Scenario_Editor/src/editor/MapmodeBuilder.java @@ -295,7 +295,8 @@ public static void buildMapmodeMenu(JMenu viewMenu, MapPanel mapPanel, JLabel vi viewMenu.add(new JSeparator()); viewMenu.add(new CustomMapModeAction()); viewMenu.add(new CustomScalingMapModeAction()); - viewMenu.add(new PaintBordersAction()); + viewMenu.add(new PaintInternalBordersAction()); + viewMenu.add(new PaintExternalBordersAction()); log.log(Level.INFO, "Done in {0} ms.", System.currentTimeMillis() - startTime); } @@ -1379,14 +1380,26 @@ public void actionPerformed(ActionEvent e) { } } - private static class PaintBordersAction extends AbstractAction { - PaintBordersAction() { - super("Toggle borders"); + private static class PaintInternalBordersAction extends AbstractAction { + PaintInternalBordersAction() { + super("Toggle internal borders"); putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke('B', InputEvent.CTRL_DOWN_MASK)); } @Override public void actionPerformed(ActionEvent e) { - mapPanel.setPaintBorders(!mapPanel.isPaintBorders()); + mapPanel.setPaintInternalBorders(!mapPanel.isPaintInternalBorders()); + mapPanel.repaint(); + } + } + + private static class PaintExternalBordersAction extends AbstractAction { + PaintExternalBordersAction() { + super("Toggle external borders"); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke('B', InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)); + } + @Override + public void actionPerformed(ActionEvent e) { + mapPanel.setPaintExternalBorders(!mapPanel.isPaintExternalBorders()); mapPanel.repaint(); } } diff --git a/EU3_Scenario_Editor/src/editor/mapmode/AllAreasMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/AllAreasMapMode.java index 106a633..7946ea8 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/AllAreasMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/AllAreasMapMode.java @@ -94,6 +94,18 @@ protected void paintSeaZone(Graphics2D g, int id) { } } + @Override + public Object getBorderGroup(final int provId) { + String area = provinceAreas.get(provId); + if (area != null) + return area; + if (mapPanel.getMap().isWasteland(provId)) + return "WASTELAND"; + if (!mapPanel.getMap().isLand(provId)) + return "SEA_ZONE"; + return "DEFAULT"; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { String area = provinceAreas.get(current.getId()); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/AllClimatesMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/AllClimatesMapMode.java index 2272c21..946c476 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/AllClimatesMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/AllClimatesMapMode.java @@ -168,6 +168,25 @@ protected void paintSeaZone(Graphics2D g, int id) { mapPanel.paintProvince(g, id, c); } + @Override + public Object getBorderGroup(final int provId) { + final String climate = provinceClimates.get(provId); + final String winter = provinceWinters.get(provId); + final String monsoon = provinceMonsoons.get(provId); + + if (climateType == ClimateType.CLIMATE) + return climate == null ? "DEFAULT" : climate; + if (climateType == ClimateType.WINTER) + return winter == null ? "DEFAULT" : winter; + if (climateType == ClimateType.MONSOON) + return monsoon == null ? "DEFAULT" : monsoon; + + String c = (climate == null) ? "-" : climate; + String w = (winter == null) ? "-" : winter; + String m = (monsoon == null) ? "-" : monsoon; + return c + "|" + w + "|" + m; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { StringBuilder ret = new StringBuilder(); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CapitalsMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CapitalsMode.java index 6b5954c..8b3b3c1 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CapitalsMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CapitalsMode.java @@ -59,6 +59,16 @@ protected void paintSeaZone(final Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + String country = capitals.get(provId); + if (country == null) + return "NOT_CAPITAL"; + return "CAPITAL:" + country; + } + @Override public String getTooltipExtraText(final Province current) { if (capitals.containsKey(current.getId())) diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ColonialRegionsMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ColonialRegionsMode.java index 2af60a3..fc0f64f 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ColonialRegionsMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ColonialRegionsMode.java @@ -96,6 +96,18 @@ protected void paintSeaZone(Graphics2D g, int id) { } } + @Override + public Object getBorderGroup(final int provId) { + ColonialRegion cr = regions.get(provId); + if (cr != null) + return cr.getName(); + if (mapPanel.getMap().isWasteland(provId)) + return "WASTELAND"; + if (!mapPanel.getMap().isLand(provId)) + return "SEA_ZONE"; + return "DEFAULT"; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { ColonialRegion cr = regions.get(current.getId()); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CoreMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CoreMapMode.java index 9222318..28c30b9 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CoreMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CoreMapMode.java @@ -45,6 +45,16 @@ protected void paintSeaZone(final Graphics2D g, int id) { // Sea zones can't be cores. return; } + + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + final List coreOf = mapPanel.getModel().isCoreOf(provId); + if (coreOf != null && coreOf.contains(tag)) + return "CORE"; + return "NOT_CORE"; + } @Override public String getTooltipExtraText(Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CountryFlagMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CountryFlagMode.java index db1b3bf..98a59c3 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CountryFlagMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CountryFlagMode.java @@ -35,6 +35,13 @@ protected Color getCtryColor(String country) { return flag ? Color.GREEN : Color.DARK_GRAY; } + @Override + protected Object getCountryBorderGroup(String country) { + if (country == null || country.isEmpty() || Utilities.isNotACountry(country)) + return "NO_COUNTRY"; + return mapPanel.getModel().isRhsSet(country, SET_COUNTRY_FLAG, CLR_COUNTRY_FLAG, flagName); + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { String owner = mapPanel.getModel().getOwner(current.getId()); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CountryHistoryExistsMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CountryHistoryExistsMode.java index 7c91533..3371149 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CountryHistoryExistsMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CountryHistoryExistsMode.java @@ -44,6 +44,19 @@ protected void paintSeaZone(Graphics2D g, int id) { // Nothing here } + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String ownerTag = mapPanel.getModel().getOwner(provId); + if (Utilities.isNotACountry(ownerTag)) + return "NO_COUNTRY"; + + final GenericObject history = mapPanel.getDataSource().getCountryHistory(ownerTag); + return history != null; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { final String ownerTag = mapPanel.getModel().getOwner(current.getId()); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CountryMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CountryMode.java index f31795c..ab240a8 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CountryMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CountryMode.java @@ -40,6 +40,24 @@ protected void paintSeaZone(final Graphics2D g, int id) { protected Color getCtryColor(String country) { return Utilities.getCtryColor(country); } + + protected Object getCountryBorderGroup(String country) { + if (country == null || country.isEmpty() || Utilities.isNotACountry(country)) { + return "NO_COUNTRY"; + } + return country.toUpperCase(); + } + + @Override + public Object getBorderGroup(final int provId) { + if (getMap().isWasteland(provId)) { + return "WASTELAND"; + } + if (!getMap().isLand(provId)) { + return "SEA_ZONE"; + } + return getCountryBorderGroup(mapPanel.getModel().getOwner(provId)); + } @Override public String getTooltipExtraText(final Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CtryReligionMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CtryReligionMode.java index 8286f38..cf4f606 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CtryReligionMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CtryReligionMode.java @@ -47,6 +47,20 @@ protected Color getCtryColor(String country) { return Utilities.getReligionColor(religion); } } + + @Override + protected Object getCountryBorderGroup(String country) { + if (country == null || country.isEmpty() || Utilities.isNotACountry(country)) + return "NO_COUNTRY"; + + country = country.toUpperCase(); + final String religion = mapPanel.getModel().getHistString(country, "religion"); + if (religion == null) + return "MISSING"; + if (religion.length() == 0 || religion.equalsIgnoreCase("none")) + return "NONE"; + return religion; + } @Override diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CultureGroupMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CultureGroupMode.java index 3c4deff..358c4c5 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CultureGroupMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CultureGroupMode.java @@ -44,6 +44,22 @@ protected void paintProvince(Graphics2D g, int provId) { protected void paintSeaZone(Graphics2D g, int id) { // do nothing } + + @Override + public Object getBorderGroup(final int provId) { + if (mapPanel.getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String pCulture = mapPanel.getModel().getHistString(provId, "culture"); + if (pCulture != null) { + String pGroup = Utilities.getCultureGroup(pCulture); + if (pGroup != null && pGroup.equalsIgnoreCase(this.cultureGroup)) + return pCulture.toLowerCase(); + } + return "OTHER"; + } @Override public String getTooltipExtraText(final ProvinceData.Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CustomCountryMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CustomCountryMode.java index 3cf217e..9dba04b 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CustomCountryMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CustomCountryMode.java @@ -52,6 +52,18 @@ protected Color getCtryColor(String country) { else return notFoundColor; } + + @Override + protected Object getCountryBorderGroup(String country) { + if (country == null || country.isEmpty() || Utilities.isNotACountry(country)) + return "NO_COUNTRY"; + + country = country.toUpperCase(); + String histValue = mapPanel.getModel().getHistString(country, name); + if (histValue == null) + return "MISSING"; + return value.equals(histValue.toLowerCase()); + } @Override public String getTooltipExtraText(final Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/CustomMode.java b/EU3_Scenario_Editor/src/editor/mapmode/CustomMode.java index f20352b..1f8ad3c 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/CustomMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/CustomMode.java @@ -60,6 +60,27 @@ protected void paintSeaZone(final Graphics2D g, int id) { // Default is to do nothing return; } + + @Override + public Object getBorderGroup(final int provId) { + if (getMap().isWasteland(provId)) { + return "WASTELAND"; + } + if (!getMap().isLand(provId)) { + return "SEA_ZONE"; + } + + String prop; + if (isOwner) + prop = mapPanel.getModel().getOwner(provId); + else + prop = mapPanel.getModel().getHistString(provId, name); + + if (prop == null) + return "MISSING"; + + return value.equals(prop.toLowerCase()); + } @Override public String getTooltipExtraText(final Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/DeJureTitleMode.java b/EU3_Scenario_Editor/src/editor/mapmode/DeJureTitleMode.java index bd480d8..af921f0 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/DeJureTitleMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/DeJureTitleMode.java @@ -19,7 +19,7 @@ * @since 0.9.13 */ public class DeJureTitleMode extends ProvincePaintingMode { - + protected CK2DataSource dataSource; protected CK3DataSource ck3DataSource; @@ -198,4 +198,14 @@ public String getTooltipExtraText(final ProvinceData.Province current) { // // return "Unknown owner"; } + + @Override + public Object getBorderGroup(final int provId) { + final String title = provinceTitles.get(provId); + if (title != null && !title.isEmpty()) { + return title; + } + return provId; + } + } diff --git a/EU3_Scenario_Editor/src/editor/mapmode/DiscreteCountryScalingMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/DiscreteCountryScalingMapMode.java index 5fb5d1b..bfc6daf 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/DiscreteCountryScalingMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/DiscreteCountryScalingMapMode.java @@ -94,6 +94,20 @@ protected Color getCtryColor(String countryTag) { return colors[index]; } + + @Override + protected Object getCountryBorderGroup(String countryTag) { + if (countryTag == null || countryTag.isEmpty() || Utilities.isNotACountry(countryTag)) + return "NO_COUNTRY"; + + String value = mapPanel.getModel().getHistString(countryTag, prop); + if (value == null || value.length() == 0) + value = "0"; + + int index = (int) ((Double.parseDouble(value) + min) / step); + index = Math.max(0, Math.min(numColors-1, index)); + return index; + } @Override protected void paintSeaZone(final Graphics2D g, int id) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/DiscreteScalingMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/DiscreteScalingMapMode.java index 785ec71..aa3085f 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/DiscreteScalingMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/DiscreteScalingMapMode.java @@ -80,6 +80,25 @@ protected double getProvinceValue(int provId) { return Double.parseDouble(value); } + + @Override + public Object getBorderGroup(final int provId) { + if (getMap().isWasteland(provId)) { + return "WASTELAND"; + } + if (!getMap().isLand(provId)) { + return "SEA_ZONE"; + } + + final double value = getProvinceValue(provId); + if (value < 0) { + return "NONE"; + } + + int index = (int) ((value + min) / step); + index = Math.max(0, Math.min(colors.length-1, index)); + return index; + } @Override protected void paintSeaZone(final Graphics2D g, int id) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/GoodsMode.java b/EU3_Scenario_Editor/src/editor/mapmode/GoodsMode.java index 0913bea..e302b96 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/GoodsMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/GoodsMode.java @@ -58,6 +58,21 @@ else if (goods == null) { protected void paintSeaZone(Graphics2D g, int id) { // Do nothing } + + @Override + public Object getBorderGroup(final int provId) { + if (getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String goods = mapPanel.getModel().getHistString(provId, "trade_goods"); + if (goods == null) + return "MISSING"; + if (goods.length() == 0 || goods.equalsIgnoreCase("none")) + return "NONE"; + return goods.toLowerCase(); + } @Override diff --git a/EU3_Scenario_Editor/src/editor/mapmode/GroupMode.java b/EU3_Scenario_Editor/src/editor/mapmode/GroupMode.java index f42e9df..36699c2 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/GroupMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/GroupMode.java @@ -54,4 +54,9 @@ protected void paintSeaZone(final Graphics2D g, int id) { mapPanel.paintProvince(g, id, foundColor); } } + + @Override + public Object getBorderGroup(final int provId) { + return provIds.contains(provId); + } } diff --git a/EU3_Scenario_Editor/src/editor/mapmode/HistoryExistsMode.java b/EU3_Scenario_Editor/src/editor/mapmode/HistoryExistsMode.java index 6f29872..1b0665d 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/HistoryExistsMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/HistoryExistsMode.java @@ -35,6 +35,11 @@ protected void paintSeaZone(Graphics2D g, int id) { mapPanel.paintProvince(g, id, COLOR_NO_HIST); } + @Override + public Object getBorderGroup(final int provId) { + return mapPanel.getDataSource().getProvinceHistory(provId) != null; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { if (mapPanel.getDataSource().getProvinceHistory(current.getId()) == null) diff --git a/EU3_Scenario_Editor/src/editor/mapmode/HistorySimpleTerrainMode.java b/EU3_Scenario_Editor/src/editor/mapmode/HistorySimpleTerrainMode.java index 13bc890..732b44c 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/HistorySimpleTerrainMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/HistorySimpleTerrainMode.java @@ -36,6 +36,17 @@ protected void paintSeaZone(Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + String terrain = mapPanel.getModel().getHistString(provId, "terrain"); + if (terrain == null || terrain.isEmpty()) + return "DEFAULT"; + return terrain; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { String terr = mapPanel.getModel().getHistString(current.getId(), "terrain"); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/HotspotMode.java b/EU3_Scenario_Editor/src/editor/mapmode/HotspotMode.java index 0ddb982..e7dd63a 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/HotspotMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/HotspotMode.java @@ -21,26 +21,16 @@ public HotspotMode(MapPanel panel, String property, int max, int step) { } @Override - protected void paintProvince(Graphics2D g, int provId) { - List strings = mapPanel.getModel().getHistStrings(provId, prop); // not very efficient - could precalculate some of this maybe - int count; + protected double getProvinceValue(int provId) { + List strings = mapPanel.getModel().getHistStrings(provId, prop); + if (strings != null && !strings.isEmpty()) + return strings.size(); - if (strings != null && !strings.isEmpty()) { - count = strings.size(); - } else { - List objects = mapPanel.getModel().getHistObjects(provId, prop); - if (objects != null) { - count = objects.size(); - } else { - mapPanel.paintProvince(g, provId, Utilities.COLOR_LAND_DEFAULT); - return; - } - } + List objects = mapPanel.getModel().getHistObjects(provId, prop); + if (objects != null) + return objects.size(); - int index = (int) ((count + 0.0) / getStep()); - index = Math.max(0, Math.min(colors.length-1, index)); - - mapPanel.paintProvince(g, provId, colors[index]); + return 0; } @Override @@ -53,18 +43,7 @@ public String getTooltipExtraText(ProvinceData.Province current) { if (!getMap().isLand(id)) return ""; - List strings = mapPanel.getModel().getHistStrings(id, prop); - int count = -1; - - if (strings != null && !strings.isEmpty()) { - count = strings.size(); - } else { - List objects = mapPanel.getModel().getHistObjects(id, prop); - if (objects != null) { - count = objects.size(); - } - } - return "\"" + prop + "\" changes: " + count; + return prop + " changes: " + (int)getProvinceValue(id); } @Override diff --git a/EU3_Scenario_Editor/src/editor/mapmode/IsPlayerMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/IsPlayerMapMode.java index 9166510..b287daa 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/IsPlayerMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/IsPlayerMapMode.java @@ -43,6 +43,21 @@ protected Color getCtryColor(String country) { return notFoundColor; } } + + @Override + protected Object getCountryBorderGroup(String country) { + if (country == null || country.isEmpty() || Utilities.isNotACountry(country)) + return "NO_COUNTRY"; + + country = country.toUpperCase(); + if (saveGame == null) + return country; + + boolean player = saveGame.getCountry(country).getBoolean("was_player"); + if (player) + return country; + return "NOT_PLAYER"; + } @Override diff --git a/EU3_Scenario_Editor/src/editor/mapmode/MapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/MapMode.java index 60b1ea8..13375bf 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/MapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/MapMode.java @@ -55,5 +55,13 @@ public String getTooltipExtraText(final Province current) { return ""; } + public Object getBorderGroup(final int provId) { + return provId; + } + + public float getBorderThicknessMultiplier(final int provId1, final int provId2, final Object group1, final Object group2) { + return 1.0f; + } + public abstract boolean paintsBorders(); } diff --git a/EU3_Scenario_Editor/src/editor/mapmode/PoliticalMode.java b/EU3_Scenario_Editor/src/editor/mapmode/PoliticalMode.java index ee3896a..f1b692c 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/PoliticalMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/PoliticalMode.java @@ -52,6 +52,24 @@ protected void paintSeaZone(final Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) { + return "SEA_ZONE"; + } + + final String owner = mapPanel.getModel().getOwner(provId); + if (owner == null || owner.isEmpty()) { + return "NO_OWNER"; + } + + String controller = getController(provId); + if (controller == null || controller.isEmpty()) + controller = owner; + + return owner.toUpperCase() + "|" + controller.toUpperCase(); + } + private String getController(int provId) { String controller = mapPanel.getModel().getHistString(provId, "controller"); if (controller.isEmpty()) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/PopCultureMode.java b/EU3_Scenario_Editor/src/editor/mapmode/PopCultureMode.java index 943cdc9..e157fec 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/PopCultureMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/PopCultureMode.java @@ -94,6 +94,16 @@ protected void paintSeaZone(Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!mapPanel.getMap().isLand(provId)) + return "SEA_ZONE"; + String topCulture = provCultures.get(provId); + if (topCulture == null) + return "NO_POPS"; + return topCulture; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { int provId = current.getId(); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/PopReligionMode.java b/EU3_Scenario_Editor/src/editor/mapmode/PopReligionMode.java index 74d152e..bbef1ea 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/PopReligionMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/PopReligionMode.java @@ -94,6 +94,16 @@ protected void paintSeaZone(Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!mapPanel.getMap().isLand(provId)) + return "SEA_ZONE"; + String topReligion = provReligions.get(provId); + if (topReligion == null) + return "NO_POPS"; + return topReligion; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { int provId = current.getId(); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/PopSplitMapMode.java b/EU3_Scenario_Editor/src/editor/mapmode/PopSplitMapMode.java index 9bf7382..133587c 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/PopSplitMapMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/PopSplitMapMode.java @@ -56,6 +56,13 @@ protected final void paintSeaZone(Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + return mapPanel.getModel().getHistString(provId, "split"); + } + @Override public String getTooltipExtraText(final Province current) { final int id = current.getId(); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/PopTypeMode.java b/EU3_Scenario_Editor/src/editor/mapmode/PopTypeMode.java index bb9f01e..d2ff0dd 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/PopTypeMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/PopTypeMode.java @@ -88,6 +88,16 @@ protected void paintSeaZone(Graphics2D g, int id) { // do nothing } + @Override + public Object getBorderGroup(final int provId) { + if (!mapPanel.getMap().isLand(provId)) + return "SEA_ZONE"; + String topPopType = provTypes.get(provId); + if (topPopType == null) + return "NO_POPS"; + return topPopType; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { int provId = current.getId(); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ProvCultureMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ProvCultureMode.java index 9127900..2b32cf0 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ProvCultureMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ProvCultureMode.java @@ -40,6 +40,21 @@ protected void paintProvince(final Graphics2D g, int provId) { protected void paintSeaZone(final Graphics2D g, int id) { // Do nothing } + + @Override + public Object getBorderGroup(final int provId) { + if (mapPanel.getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String culture = mapPanel.getModel().getHistString(provId, "culture"); + if (culture == null) + return "MISSING"; + if (culture.length() == 0 || culture.equalsIgnoreCase("none")) + return "NONE"; + return culture.toLowerCase(); + } @Override public String getTooltipExtraText(final Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ProvReligionMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ProvReligionMode.java index 6172293..8c03939 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ProvReligionMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ProvReligionMode.java @@ -44,6 +44,21 @@ protected void paintSeaZone(final Graphics2D g, int id) { // Do nothing return; } + + @Override + public Object getBorderGroup(final int provId) { + if (mapPanel.getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String religion = mapPanel.getModel().getHistString(provId, "religion"); + if (religion == null) + return "MISSING"; + if (religion.length() == 0 || religion.equalsIgnoreCase("none")) + return "NONE"; + return religion.toLowerCase(); + } @Override public String getTooltipExtraText(final Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ProvinceFlagMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ProvinceFlagMode.java index abf0c81..cc828ee 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ProvinceFlagMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ProvinceFlagMode.java @@ -45,6 +45,13 @@ protected void paintProvince(Graphics2D g, int provId) { protected void paintSeaZone(Graphics2D g, int id) { // probably don't care about sea zones - who is setting flags on them? } + + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + return mapPanel.getModel().isRhsSet(provId, SET_PROVINCE_FLAG, CLR_PROVINCE_FLAG, flagName); + } @Override public String getTooltipExtraText(ProvinceData.Province current) { diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ProvincePaintingMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ProvincePaintingMode.java index b5a6bfc..72ef497 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ProvincePaintingMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ProvincePaintingMode.java @@ -20,6 +20,8 @@ */ public abstract class ProvincePaintingMode extends MapMode { + protected static final float EXTERNAL_BORDER_MULTIPLIER = 3.0f; + private static final Paint background = new Color(15, 100, 255); protected ProvincePaintingMode() { @@ -88,4 +90,12 @@ public boolean paintsBorders() { return true; } + @Override + public float getBorderThicknessMultiplier(final int provId1, final int provId2, final Object group1, final Object group2) { + if (java.util.Objects.equals(group1, group2)) { + return 1.0f; + } + return EXTERNAL_BORDER_MULTIPLIER; + } + } \ No newline at end of file diff --git a/EU3_Scenario_Editor/src/editor/mapmode/ReligionMode.java b/EU3_Scenario_Editor/src/editor/mapmode/ReligionMode.java index 10a8c60..9d9792c 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/ReligionMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/ReligionMode.java @@ -75,6 +75,26 @@ protected void paintProvince(final Graphics2D g, int provId) { protected void paintSeaZone(final Graphics2D g, int id) { // do nothing } + + @Override + public Object getBorderGroup(final int provId) { + if (getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + + final String religion = mapPanel.getModel().getHistString(provId, "religion"); + if (religion == null) + return "MISSING"; + if (religion.length() == 0 || religion.equalsIgnoreCase("none")) + return "NONE"; + + final String owner = mapPanel.getModel().getOwner(provId); + final String ownerRel = (owner == null) ? null : ctryReligions.get(owner.toUpperCase()); + if (ownerRel == null || religion.equalsIgnoreCase(ownerRel)) + return "REL:" + religion.toLowerCase(); + return "REL:" + religion.toLowerCase() + "|OWNER_REL:" + ownerRel.toLowerCase(); + } @Override diff --git a/EU3_Scenario_Editor/src/editor/mapmode/SimpleTerrainMode.java b/EU3_Scenario_Editor/src/editor/mapmode/SimpleTerrainMode.java index a96a102..6c0c116 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/SimpleTerrainMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/SimpleTerrainMode.java @@ -58,6 +58,18 @@ protected void paintSeaZone(Graphics2D g, int id) { } } + @Override + public Object getBorderGroup(final int provId) { + String terr = provTerrains.get(provId); + if (terr != null) + return terr; + if (getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + return "DEFAULT"; + } + @Override public String getTooltipExtraText(ProvinceData.Province current) { String terr = provTerrains.get(current.getId()); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/TitleMode.java b/EU3_Scenario_Editor/src/editor/mapmode/TitleMode.java index 9c3eb6f..d25bb41 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/TitleMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/TitleMode.java @@ -88,6 +88,33 @@ protected void paintProvince(final Graphics2D g, int provId) { protected void paintSeaZone(final Graphics2D g, int id) { // Don't paint sea zones. } + + @Override + public Object getBorderGroup(final int provId) { + if (!getMap().isLand(provId)) { + return "SEA_ZONE"; + } + if (getMap().isWasteland(provId)) { + return "WASTELAND"; + } + + String owner = getLowestHistTitleHolder(provId); + if (owner == null || owner.isEmpty()) { + GenericObject history = getProvinceHistory(provId); + if (history != null) { + for (GenericObject obj : history.children) { + if (obj.name.startsWith("b_")) { + owner = getLiege(obj.name); + break; + } + } + } + } + owner = getLiege(owner); + if (owner == null || owner.isEmpty()) + return "NO_TITLE"; + return owner; + } protected String getLowestHistTitleHolder(int provId) { String title = mapPanel.getModel().getHistString(provId, "title"); diff --git a/EU3_Scenario_Editor/src/editor/mapmode/TradeMode.java b/EU3_Scenario_Editor/src/editor/mapmode/TradeMode.java index 26a08c0..111c5c7 100644 --- a/EU3_Scenario_Editor/src/editor/mapmode/TradeMode.java +++ b/EU3_Scenario_Editor/src/editor/mapmode/TradeMode.java @@ -121,6 +121,20 @@ protected void paintSeaZone(Graphics2D g, int id) { paintProvince(g, id); } + @Override + public Object getBorderGroup(final int provId) { + if (tradeNodes.containsKey(provId)) + return provId; + Integer node = nodeMembers.get(provId); + if (node != null) + return node; + if (getMap().isWasteland(provId)) + return "WASTELAND"; + if (!getMap().isLand(provId)) + return "SEA_ZONE"; + return "UNKNOWN"; + } + @Override protected void paintingEnded(Graphics2D g) { for (Integer node : tradeNodes.keySet()) {