/*
* EditorUI.java
*
* Created on January 25, 2007, 5:00 PM
*/
package editor;
import editor.ProvinceData.Province;
import editor.mapmode.*;
import eug.parser.EUGFileIO;
import eug.parser.ParserSettings;
import eug.shared.GenericList;
import eug.shared.GenericObject;
import eug.shared.ObjectVariable;
import eug.shared.Style;
import eug.specific.eu3.EU3SaveGame;
import eug.specific.eu3.EU3Scenario;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.*;
/**
*
* @author Michael Myers
* @version 1.0
*/
public final class EditorUI extends javax.swing.JFrame {
protected transient ProvinceData.Province currentProvince = null;
// /** The province that is selected in the combo box at the left. */
// private transient ProvinceData.Province selectedProvince;
private static final String VERSION = "0.6.1";
private JPopupMenu bookmarkMenu = new JPopupMenu("Bookmarks");
/**
* Creates new form EditorUI.
*/
public EditorUI() {
// screen = this.getGraphicsConfiguration().getBounds();
initComponents();
class PaintBordersAction extends AbstractAction {
PaintBordersAction() {
super("Toggle borders");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke('B', InputEvent.CTRL_DOWN_MASK));
}
public void actionPerformed(ActionEvent e) {
mapPanel.setPaintBorders(!mapPanel.isPaintBorders());
mapPanel.repaint();
}
}
viewMenu.add(new PaintBordersAction());
mapPanel.initialize();
pack();
if (Main.map.isInNomine()) {
viewRegionMenu.setEnabled(true);
}
// Make sure the window isn't too big
final java.awt.Rectangle bounds = getGraphicsConfiguration().getBounds();
setSize(Math.min(getWidth(), bounds.width), Math.min(getHeight(), bounds.height));
mapPanel.centerMap();
setDataSource();
addFilters();
viewProvincesMenuItem.doClick();
}
private void setDataSource() {
int choice = JOptionPane.showConfirmDialog(this, "Do you want to load a saved game?");
if (choice == JOptionPane.NO_OPTION) {
System.out.println("Loading province history...");
EU3Scenario scen = new EU3Scenario(Main.filenameResolver);
mapPanel.setDataSource(scen);
System.out.println("Done.");
FileEditorDialog.setDataSource(scen);
GenericObject defines =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/defines.txt"), defaultSettings);
if (defines.containsChild("start_date")) {
GenericObject startDate = defines.getChild("start_date");
yearSpinner.setValue(startDate.getInt("year"));
monthSpinner.setValue(startDate.getInt("month"));
daySpinner.setValue(startDate.getInt("day"));
} else {
// must not be In Nomine
yearSpinner.setValue(1453);
monthSpinner.setValue(5);
daySpinner.setValue(29);
}
readBookmarks();
} else if (choice == JOptionPane.CANCEL_OPTION) {
dispose();
System.exit(0);
} else {
JFileChooser chooser = new JFileChooser(Main.filenameResolver.getModDirName() + "/save games");
chooser.setFileFilter(new SaveGameFileFilter());
int secondChoice = chooser.showOpenDialog(this);
if (secondChoice == JFileChooser.APPROVE_OPTION) {
System.out.println("Loading saved game...");
EU3SaveGame save = EU3SaveGame.loadSaveGame(
chooser.getSelectedFile().getAbsolutePath(),
Main.filenameResolver);
System.out.println("Done.");
System.out.println("Loading province history...");
mapPanel.setDataSource(save);
System.out.println("Done.");
FileEditorDialog.setDataSource(save);
String[] date = save.getDate().split("\\.");
((SpinnerNumberModel)yearSpinner.getModel()).setMaximum(Integer.parseInt(date[0]));
mapPanel.getModel().setDate(save.getDate());
((SpinnerNumberModel)yearSpinner.getModel()).setValue(Integer.parseInt(date[0]));
((SpinnerNumberModel)monthSpinner.getModel()).setValue(Integer.parseInt(date[1]));
((SpinnerNumberModel)daySpinner.getModel()).setValue(Integer.parseInt(date[2]));
bookmarkMenu.add(new BookmarkAction("Game start", "The world before any history", "1.1.1"));
bookmarkMenu.add(new BookmarkAction("Current year", "The current game year", save.getDate()));
bookmarkMenu.pack();
} else {
// do it again
setDataSource();
}
}
}
private void readBookmarks() {
final GenericObject bookmarks =
EUGFileIO.load(
Main.filenameResolver.resolveFilename("common/bookmarks.txt"),
ParserSettings.getNoCommentSettings().setPrintTimingInfo(false)
);
for (GenericObject bookmark : bookmarks.children) {
bookmarkMenu.add(
new BookmarkAction(
Text.getText(bookmark.getString("name")),
Text.getText(bookmark.getString("desc")),
bookmark.getString("date")
));
}
bookmarkMenu.pack();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
viewModeButtonGroup = new javax.swing.ButtonGroup();
javax.swing.JToolBar toolBar = new javax.swing.JToolBar();
javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
viewModeLabel = new javax.swing.JLabel();
javax.swing.JSeparator jSeparator4 = new javax.swing.JSeparator();
javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
yearSpinner = new javax.swing.JSpinner();
monthSpinner = new javax.swing.JSpinner();
daySpinner = new javax.swing.JSpinner();
setDateButton = new javax.swing.JButton();
bookmarksButton = new javax.swing.JButton();
javax.swing.JSeparator jSeparator5 = new javax.swing.JSeparator();
zoomInButton = new javax.swing.JButton();
zoomOutButton = new javax.swing.JButton();
zoomLabel = new javax.swing.JLabel();
javax.swing.JSeparator jSeparator2 = new javax.swing.JSeparator();
goToProvButton = new javax.swing.JButton();
mapScrollPane = new javax.swing.JScrollPane();
javax.swing.JPanel lowerPanel = new javax.swing.JPanel();
provNameLabel = new javax.swing.JLabel();
showProvHistButton = new javax.swing.JButton();
ctryNameLabel = new javax.swing.JLabel();
showCountryHistButton = new javax.swing.JButton();
javax.swing.JMenuBar menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu fileMenu = new javax.swing.JMenu();
exitMenuItem = new javax.swing.JMenuItem();
toolsMenu = new javax.swing.JMenu();
zoomInMenuItem = new javax.swing.JMenuItem();
zoomOutMenuItem = new javax.swing.JMenuItem();
javax.swing.JSeparator jSeparator1 = new javax.swing.JSeparator();
goToProvMenuItem = new javax.swing.JMenuItem();
javax.swing.JSeparator jSeparator3 = new javax.swing.JSeparator();
setDateMenuItem = new javax.swing.JMenuItem();
javax.swing.JSeparator jSeparator7 = new javax.swing.JSeparator();
reloadMenuItem = new javax.swing.JMenuItem();
viewMenu = new javax.swing.JMenu();
viewProvincesMenuItem = new javax.swing.JMenuItem();
viewCountriesMenuItem = new javax.swing.JMenuItem();
viewSingleCountryMenu = new javax.swing.JMenu();
viewContinentMenu = new javax.swing.JMenu();
viewRegionMenu = new javax.swing.JMenu();
viewClimateMenu = new javax.swing.JMenu();
viewProvReligionsMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewCtryReligionsMenuItem = new javax.swing.JMenuItem();
viewSingleReligionMenu = new javax.swing.JMenu();
viewBuildingMenu = new javax.swing.JMenu();
viewCultureMenu = new javax.swing.JMenu();
viewGoodsMenuItem = new javax.swing.JMenuItem();
viewSingleGoodMenu = new javax.swing.JMenu();
viewSingleGovernmentMenu = new javax.swing.JMenu();
viewTechGroupMenu = new javax.swing.JMenu();
javax.swing.JMenuItem viewCOTMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewHREMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewBaseTaxMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewPopulationMenuItem = new javax.swing.JMenuItem();
viewManpowerMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewRevoltRiskMenuItem = new javax.swing.JMenuItem();
final DiscreteStepFilterAction act = new DiscreteStepFilterAction("Revolt risk", "revolt_risk", 0, 10, 1);
//act.setMinColor(java.awt.Color.GREEN);
//act.setMaxColor(java.awt.Color.RED);
viewRevoltRiskMenuItem.setAction(act);
javax.swing.JMenuItem viewCapitalsMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenu viewNativesMenu = new javax.swing.JMenu();
javax.swing.JMenuItem viewNativeSizeMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewNativeFerocityMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenuItem viewNativeHostilenessMenuItem = new javax.swing.JMenuItem();
viewNativeTypesMenu = new javax.swing.JMenu();
warsMenuItem = new javax.swing.JMenuItem();
javax.swing.JSeparator jSeparator6 = new javax.swing.JSeparator();
customMapModeMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenu helpMenu = new javax.swing.JMenu();
aboutMenuItem = new javax.swing.JMenuItem();
FormListener formListener = new FormListener();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("EU3 Scenario Editor");
addWindowListener(formListener);
toolBar.setRollover(true);
jLabel1.setText("Current view: ");
toolBar.add(jLabel1);
toolBar.add(viewModeLabel);
jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);
toolBar.add(jSeparator4);
jLabel2.setText("Date: ");
toolBar.add(jLabel2);
yearSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 50000, 1));
yearSpinner.setEditor(new javax.swing.JSpinner.NumberEditor(yearSpinner, "#####"));
yearSpinner.setMaximumSize(new java.awt.Dimension(100, 30));
yearSpinner.setPreferredSize(new java.awt.Dimension(60, 20));
toolBar.add(yearSpinner);
monthSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 12, 1));
monthSpinner.setMaximumSize(new java.awt.Dimension(100, 30));
toolBar.add(monthSpinner);
daySpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 31, 1));
daySpinner.setMaximumSize(new java.awt.Dimension(100, 30));
toolBar.add(daySpinner);
setDateButton.setAction(setDateAction);
toolBar.add(setDateButton);
bookmarksButton.setText("Bookmarks...");
bookmarksButton.addActionListener(formListener);
toolBar.add(bookmarksButton);
jSeparator5.setOrientation(javax.swing.SwingConstants.VERTICAL);
toolBar.add(jSeparator5);
zoomInButton.setAction(zoomInAction);
toolBar.add(zoomInButton);
zoomOutButton.setAction(zoomOutAction);
toolBar.add(zoomOutButton);
updateZoomLabel();
toolBar.add(zoomLabel);
jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
jSeparator2.setPreferredSize(new java.awt.Dimension(2, 25));
toolBar.add(jSeparator2);
goToProvButton.setAction(goToProvAction);
toolBar.add(goToProvButton);
getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
mapPanel.addMouseListener(formListener);
mapPanel.addMouseMotionListener(formListener);
mapScrollPane.setViewportView(mapPanel);
getContentPane().add(mapScrollPane, java.awt.BorderLayout.CENTER);
lowerPanel.add(provNameLabel);
showProvHistButton.setText("Show province history");
showProvHistButton.setEnabled(false);
showProvHistButton.addActionListener(formListener);
lowerPanel.add(showProvHistButton);
lowerPanel.add(ctryNameLabel);
showCountryHistButton.setText("Show country history");
showCountryHistButton.setEnabled(false);
showCountryHistButton.addActionListener(formListener);
lowerPanel.add(showCountryHistButton);
getContentPane().add(lowerPanel, java.awt.BorderLayout.SOUTH);
fileMenu.setMnemonic('F');
fileMenu.setText("File");
exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
exitMenuItem.setMnemonic('x');
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(formListener);
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
toolsMenu.setMnemonic('T');
toolsMenu.setText("Tools");
zoomInMenuItem.setAction(zoomInAction);
toolsMenu.add(zoomInMenuItem);
zoomOutMenuItem.setAction(zoomOutAction);
toolsMenu.add(zoomOutMenuItem);
toolsMenu.add(jSeparator1);
goToProvMenuItem.setAction(goToProvAction);
toolsMenu.add(goToProvMenuItem);
toolsMenu.add(jSeparator3);
setDateMenuItem.setAction(setDateAction);
toolsMenu.add(setDateMenuItem);
toolsMenu.add(jSeparator7);
reloadMenuItem.setText("Force a reload of all data");
reloadMenuItem.addActionListener(formListener);
toolsMenu.add(reloadMenuItem);
menuBar.add(toolsMenu);
viewMenu.setMnemonic('V');
viewMenu.setText("View");
viewProvincesMenuItem.setAction(provinceFilterAction);
viewMenu.add(viewProvincesMenuItem);
viewCountriesMenuItem.setAction(countryFilterAction);
viewCountriesMenuItem.addActionListener(formListener);
viewMenu.add(viewCountriesMenuItem);
viewSingleCountryMenu.setText("Single country");
viewMenu.add(viewSingleCountryMenu);
viewContinentMenu.setText("Continents...");
viewMenu.add(viewContinentMenu);
viewRegionMenu.setText("Regions...");
viewRegionMenu.setEnabled(false);
viewMenu.add(viewRegionMenu);
viewClimateMenu.setText("Climates...");
viewMenu.add(viewClimateMenu);
viewProvReligionsMenuItem.setAction(provReligionFilterAction);
viewMenu.add(viewProvReligionsMenuItem);
viewCtryReligionsMenuItem.setAction(ctryReligionFilterAction);
viewMenu.add(viewCtryReligionsMenuItem);
viewSingleReligionMenu.setText("Single religion");
viewMenu.add(viewSingleReligionMenu);
viewBuildingMenu.setText("Building");
viewMenu.add(viewBuildingMenu);
viewCultureMenu.setText("Culture");
viewMenu.add(viewCultureMenu);
viewGoodsMenuItem.setAction(goodsFilterAction);
viewMenu.add(viewGoodsMenuItem);
viewSingleGoodMenu.setText("Single trade good");
viewMenu.add(viewSingleGoodMenu);
viewSingleGovernmentMenu.setText("Governments...");
viewMenu.add(viewSingleGovernmentMenu);
viewTechGroupMenu.setText("Tech groups...");
viewMenu.add(viewTechGroupMenu);
viewCOTMenuItem.setAction(new CustomFilterAction("Centers of trade", "cot", "yes"));
viewMenu.add(viewCOTMenuItem);
viewHREMenuItem.setAction(new CustomFilterAction("Holy Roman Empire", "hre", "yes"));
viewMenu.add(viewHREMenuItem);
viewBaseTaxMenuItem.setAction(new DiscreteStepFilterAction("Base tax value", "base_tax", 0, 18, 1));
viewMenu.add(viewBaseTaxMenuItem);
viewPopulationMenuItem.setAction(new DiscreteStepFilterAction("Population", "citysize", 0, 500000, 10000));
viewMenu.add(viewPopulationMenuItem);
viewManpowerMenuItem.setAction(new DiscreteStepFilterAction("Manpower", "manpower", 0, 10, 1));
viewMenu.add(viewManpowerMenuItem);
viewMenu.add(viewRevoltRiskMenuItem);
viewCapitalsMenuItem.setAction(new CapitalFilterAction());
viewMenu.add(viewCapitalsMenuItem);
viewNativesMenu.setText("Natives...");
viewNativeSizeMenuItem.setAction(new DiscreteStepFilterAction("Native size", "native_size", 0, 100, 5));
viewNativesMenu.add(viewNativeSizeMenuItem);
viewNativeFerocityMenuItem.setAction(new DiscreteStepFilterAction("Native ferocity", "native_ferocity", 0, 10, 1));
viewNativesMenu.add(viewNativeFerocityMenuItem);
viewNativeHostilenessMenuItem.setAction(new DiscreteStepFilterAction("Native hostileness", "native_hostileness", 0, 10, 1));
viewNativesMenu.add(viewNativeHostilenessMenuItem);
viewNativeTypesMenu.setText("Native types...");
viewNativesMenu.add(viewNativeTypesMenu);
viewMenu.add(viewNativesMenu);
warsMenuItem.setText("Wars...");
warsMenuItem.addActionListener(formListener);
viewMenu.add(warsMenuItem);
viewMenu.add(jSeparator6);
customMapModeMenuItem.setText("Custom map mode...");
customMapModeMenuItem.addActionListener(formListener);
viewMenu.add(customMapModeMenuItem);
menuBar.add(viewMenu);
helpMenu.setMnemonic('H');
helpMenu.setText("Help");
aboutMenuItem.setText("About");
aboutMenuItem.addActionListener(formListener);
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
setJMenuBar(menuBar);
pack();
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.awt.event.WindowListener {
FormListener() {}
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == bookmarksButton) {
EditorUI.this.bookmarksButtonActionPerformed(evt);
}
else if (evt.getSource() == showProvHistButton) {
EditorUI.this.showProvHistButtonActionPerformed(evt);
}
else if (evt.getSource() == showCountryHistButton) {
EditorUI.this.showCountryHistButtonActionPerformed(evt);
}
else if (evt.getSource() == exitMenuItem) {
EditorUI.this.exitMenuItemActionPerformed(evt);
}
else if (evt.getSource() == reloadMenuItem) {
EditorUI.this.reloadMenuItemActionPerformed(evt);
}
else if (evt.getSource() == warsMenuItem) {
EditorUI.this.warsMenuItemActionPerformed(evt);
}
else if (evt.getSource() == customMapModeMenuItem) {
EditorUI.this.customMapModeMenuItemActionPerformed(evt);
}
else if (evt.getSource() == aboutMenuItem) {
EditorUI.this.aboutMenuItemActionPerformed(evt);
}
else if (evt.getSource() == viewCountriesMenuItem) {
EditorUI.this.viewCountriesMenuItemActionPerformed(evt);
}
}
public void mouseClicked(java.awt.event.MouseEvent evt) {
if (evt.getSource() == mapPanel) {
EditorUI.this.mapPanelMouseClicked(evt);
}
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
}
public void mouseExited(java.awt.event.MouseEvent evt) {
}
public void mousePressed(java.awt.event.MouseEvent evt) {
if (evt.getSource() == mapPanel) {
EditorUI.this.mapPanelMousePressed(evt);
}
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
if (evt.getSource() == mapPanel) {
EditorUI.this.mapPanelMouseReleased(evt);
}
}
public void mouseDragged(java.awt.event.MouseEvent evt) {
if (evt.getSource() == mapPanel) {
EditorUI.this.mapPanelMouseClicked(evt);
}
}
public void mouseMoved(java.awt.event.MouseEvent evt) {
if (evt.getSource() == mapPanel) {
EditorUI.this.mapPanelMouseMoved(evt);
}
}
public void windowActivated(java.awt.event.WindowEvent evt) {
}
public void windowClosed(java.awt.event.WindowEvent evt) {
}
public void windowClosing(java.awt.event.WindowEvent evt) {
if (evt.getSource() == EditorUI.this) {
EditorUI.this.formWindowClosing(evt);
}
}
public void windowDeactivated(java.awt.event.WindowEvent evt) {
}
public void windowDeiconified(java.awt.event.WindowEvent evt) {
}
public void windowIconified(java.awt.event.WindowEvent evt) {
}
public void windowOpened(java.awt.event.WindowEvent evt) {
}
}// </editor-fold>//GEN-END:initComponents
private void bookmarksButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bookmarksButtonActionPerformed
bookmarkMenu.show(bookmarksButton, bookmarksButton.getWidth(), 0);
}//GEN-LAST:event_bookmarksButtonActionPerformed
private void customMapModeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_customMapModeMenuItemActionPerformed
final MapMode mode = CustomModeDialog.showDialog(this);
if (mode != null) {
mode.setMapPanel(mapPanel);
mapPanel.setMode(mode);
viewModeLabel.setText(mode.toString());
mapPanel.repaint();
}
}//GEN-LAST:event_customMapModeMenuItemActionPerformed
private void mapPanelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapPanelMouseReleased
if (evt.isPopupTrigger()) {
popupTriggered(evt);
return;
}
}//GEN-LAST:event_mapPanelMouseReleased
private void mapPanelMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapPanelMousePressed
if (evt.isPopupTrigger()) {
popupTriggered(evt);
return;
}
}//GEN-LAST:event_mapPanelMousePressed
private void showCountryHistButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showCountryHistButtonActionPerformed
FileEditorDialog.showDialog(this, lastCountry, Text.getText(lastCountry));
// final String tag = lastCountry;
// final String name = Text.getText(tag);
// EditorDialog ed = new EditorDialog(this, name,
// mapPanel.getModel().getDataSource().getCountryAsStr(tag)
// );
// ed.setVisible(true);
// if (ed.textHasChanged()) {
// JOptionPane.showMessageDialog(this, "You changed the text!");
// mapPanel.getModel().getDataSource().saveCountry(tag, name, ed.getText());
// }
// mapPanel.getModel().getDataSource().reloadCountry(tag);
// mapPanel.repaint();
}//GEN-LAST:event_showCountryHistButtonActionPerformed
/**
* Cache the last province that the mouse was on, to keep from constantly
* setting tooltip text.
*/
private transient ProvinceData.Province lastProv = null;
/**
* Cache the last point, also.
*/
private transient Point lastPt = null;
// private transient Point lastClick = null;
private transient String lastCountry = null;
private void mapPanelMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapPanelMouseMoved
updateMapTooltip(evt.getPoint());
}//GEN-LAST:event_mapPanelMouseMoved
private void updateMapTooltip(final Point mousePt) {
if (mapPanel.getPreferredSize().height < mousePt.y || mapPanel.getPreferredSize().width < mousePt.x) {
lastProv = null;
mapPanel.setToolTipText(null);
return;
}
final ProvinceData.Province prov = mapPanel.getProvinceAt(mousePt);
if (prov == lastProv) {
// no need to update anything
return;
}
lastProv = prov;
if (lastProv == null) {
mapPanel.setToolTipText(null);
} else {
mapPanel.setToolTipTextForProv(lastProv);
}
lastPt = mousePt;
}
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
doClose();
}//GEN-LAST:event_formWindowClosing
private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
javax.swing.JOptionPane.showMessageDialog(this, "EU3 Scenario Editor\nVersion " + VERSION + "\nBy MichaelM");
}//GEN-LAST:event_aboutMenuItemActionPerformed
private void showProvHistButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showProvHistButtonActionPerformed
FileEditorDialog.showDialog(EditorUI.this, currentProvince);
// final Province prov = currentProvince;
// EditorDialog ed = new EditorDialog(EditorUI.this, prov.getName(),
// mapPanel.getModel().getDataSource().getProvinceAsStr(prov.getId())
// );
// ed.setVisible(true);
// if (ed.textHasChanged()) {
// JOptionPane.showMessageDialog(this, "You changed the text!");
// mapPanel.getModel().getDataSource().saveProvince(prov.getId(), prov.getName(), ed.getText());
// } else {
// JOptionPane.showMessageDialog(this, "You didn't change the text.");
// }
// mapPanel.getModel().getDataSource().reloadProvince(prov.getId());
// mapPanel.repaint();
}//GEN-LAST:event_showProvHistButtonActionPerformed
private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
doClose();
}//GEN-LAST:event_exitMenuItemActionPerformed
private void resetScrollPane() {
mapScrollPane.setViewport(mapScrollPane.getViewport());
// mapPanel.unColorAll();
// mapPanel.setToolTipText(null);
// lastProv = null;
// lastPt = null;
// lastClick = null;
updateMapTooltip(lastPt);
}
private void updateZoomLabel() {
zoomLabel.setText("Scale factor: " + mapPanel.getScaleFactor());
}
private void mapPanelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapPanelMouseClicked
// provNameLabel.setText("Loading...");
if (evt.isPopupTrigger()) {
popupTriggered(evt);
return;
}
showProvHistButton.setEnabled(false);
final int clickCount = evt.getClickCount();
java.awt.EventQueue.invokeLater(
new Runnable() {
public void run() {
doMouseClick(lastProv);
// If it was a double click, go ahead and show an editor.
if (clickCount > 1) {
Class c = mapPanel.getMode().getClass();
if (c.equals(ProvinceMode.class)) {
showProvHistButton.doClick(0);
} else if (c.equals(PoliticalMode.class) ||
c.equals(CountryMode.class) ||
c.equals(SingleCountryMode.class)) {
showCountryHistButton.doClick(0);
} else {
// do what?
showProvHistButton.doClick(0);
}
}
}
});
// lastClick = evt.getPoint();
}//GEN-LAST:event_mapPanelMouseClicked
private void warsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_warsMenuItemActionPerformed
final List<GenericObject> wars = mapPanel.getDataSource().getWars();
JDialog dialog = new JDialog(this, "Wars", false);
dialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(0, 4));
JScrollPane scrollPane = new JScrollPane(panel);
for (final GenericObject war : wars) {
boolean active = war.name.equals("active_war");
JButton button = new JButton(war.getString("name") + (active ? " (active)" : ""));
if (active) {
StringBuilder tooltip = new StringBuilder("<html>");
tooltip.append("Attackers: <ul>");
for (String attacker : war.getStrings("attacker"))
tooltip.append("<li>").append(Text.getText(attacker)).append("</li>");
tooltip.append("</ul>Defenders: <ul>");
for (String defender : war.getStrings("defender"))
tooltip.append("<li>").append(Text.getText(defender)).append("</li>");
tooltip.append("</ul>");
tooltip.append("</html>");
button.setToolTipText(tooltip.toString());
// System.out.println(tooltip);
}
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
EditorDialog ed = new EditorDialog(EditorUI.this, war.getString("name"), war.toString(Style.EU3_SAVE_GAME));
ed.setVisible(true);
}
});
panel.add(button);
}
dialog.add(scrollPane);
dialog.pack();
dialog.setSize(Math.min(dialog.getWidth(), 800), Math.min(dialog.getHeight(), 600));
dialog.setLocationRelativeTo(this);
dialog.setVisible(true);
}//GEN-LAST:event_warsMenuItemActionPerformed
private void reloadMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadMenuItemActionPerformed
int numProvs = Integer.parseInt(Main.map.getString("max_provinces"));
for (int i = 1; i < numProvs; i++) {
mapPanel.getDataSource().reloadProvince(i);
mapPanel.getDataSource().reloadProvinceHistory(i);
}
GenericObject countries =
EUGFileIO.load(
Main.filenameResolver.resolveFilename("common/countries.txt"),
defaultSettings);
for (ObjectVariable def : countries.values) {
mapPanel.getDataSource().reloadCountry(def.varname);
mapPanel.getDataSource().reloadCountryHistory(def.varname);
}
}//GEN-LAST:event_reloadMenuItemActionPerformed
private void viewCountriesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewCountriesMenuItemActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_viewCountriesMenuItemActionPerformed
private void doMouseClick(final ProvinceData.Province p) {
currentProvince = p;
if (p != null && p.getId() != 0) {
mapPanel.flashProvince(p.getId(), 1);
} else { // (p == null)
provNameLabel.setText("No province");
showProvHistButton.setEnabled(false);
ctryNameLabel.setText("No country");
showCountryHistButton.setEnabled(false);
return;
}
provNameLabel.setText(p.getName());
if (p.getId() != 0) {
showProvHistButton.setEnabled(true);
lastCountry = mapPanel.getModel().getHistString(p.getId(), "owner");
} else {
showProvHistButton.setEnabled(false);
lastCountry = "";
}
MapMode mode = mapPanel.getMode();
if (!(mode instanceof ProvinceMode)) {
if (lastCountry == null) {
ctryNameLabel.setText("Province has no history file.");
showCountryHistButton.setEnabled(false);
} else if (lastCountry.length() == 0 || lastCountry.equals("none") || lastCountry.equals("XXX") || lastCountry.equals("---")) {
ctryNameLabel.setText("No country");
showCountryHistButton.setEnabled(false);
} else {
// Do some neat stuff if we're viewing a single country.
if (mode instanceof CustomMode) {
final String name = ((CustomMode)mode).getName();
if (name.equals("owner")) {
mapPanel.setMode(new CustomMode(mapPanel, "owner", lastCountry));
viewModeLabel.setText("owner = " + lastCountry);
mapPanel.repaint();
} else if (name.equals("controller")) {
mapPanel.setMode(new CustomMode(mapPanel, "controller", lastCountry));
viewModeLabel.setText("controller = " + lastCountry);
mapPanel.repaint();
}
} else if (mode instanceof CoreMapMode) {
mapPanel.setMode(new CoreMapMode(mapPanel, lastCountry));
viewModeLabel.setText("Cores of " + lastCountry);
mapPanel.repaint();
} else if (mode instanceof CustomCountryMode) {
final String name = ((CustomCountryMode)mode).getName();
final String owner = mapPanel.getModel().getHistString(p.getId(), "owner");
if (name.equals("government")) {
String government = mapPanel.getModel().getHistString(owner, name);
mapPanel.setMode(new CustomCountryMode(mapPanel, "government", government));
viewModeLabel.setText("government = " + government);
mapPanel.repaint();
} else if (name.equals("technology_group")) {
String tech = mapPanel.getModel().getHistString(owner, name);
mapPanel.setMode(new CustomCountryMode(mapPanel, "technology_group", tech));
viewModeLabel.setText("technology_group = " + tech);
mapPanel.repaint();
}
}
ctryNameLabel.setText(Text.getText(lastCountry));
showCountryHistButton.setEnabled(true);
}
// Do some neat stuff if we're viewing a land province
if (Main.map.isLand(lastProv.getId())) {
if (mode instanceof ContinentMode) {
String cont = Main.map.getContinentOfProv(lastProv.getId());
mapPanel.setMode(new ContinentMode(mapPanel, cont));
viewModeLabel.setText("Provinces in " + cont);
mapPanel.repaint();
} else if (mode instanceof RegionsMode) {
String reg = Main.map.getRegionsOfProv(lastProv.getId()).get(0);
if (!reg.equals("(none)")) {
mapPanel.setMode(new RegionsMode(mapPanel, reg));
viewModeLabel.setText("Provinces in " + reg);
mapPanel.repaint();
}
} else if (mode instanceof ClimateMode) {
String climate = Main.map.getClimateOfProv(lastProv.getId());
mapPanel.setMode(new ClimateMode(mapPanel, climate));
viewModeLabel.setText("Provinces with climate " + climate);
mapPanel.repaint();
} else if (mode instanceof NativeGroupMode) {
String nativeType = Main.map.getNativeTypeOfProv(lastProv.getId());
mapPanel.setMode(new NativeGroupMode(mapPanel, nativeType));
viewModeLabel.setText("Provinces with " + nativeType + " natives");
mapPanel.repaint();
} else if (mode instanceof CustomMode && !(mode instanceof AdvancedCustomMode)) {
String name = ((CustomMode)mode).getName();
if (name.equals("trade_goods")) {
String goods = mapPanel.getModel().getHistString(p.getId(), name);
mapPanel.setMode(new CustomMode(mapPanel, name, goods));
viewModeLabel.setText("trade_goods = " + goods);
mapPanel.repaint();
} else if (name.equals("religion")) {
String religion = mapPanel.getModel().getHistString(p.getId(), name);
mapPanel.setMode(new CustomMode(mapPanel, "religion", religion));
viewModeLabel.setText("religion = " + religion);
mapPanel.repaint();
} else if (name.equals("culture")) {
String culture = mapPanel.getModel().getHistString(p.getId(), name);
mapPanel.setMode(new CustomMode(mapPanel, "culture", culture));
viewModeLabel.setText("culture = " + culture);
mapPanel.repaint();
} else {
// maybe some other types, too
}
}
}
} else {
ctryNameLabel.setText("");
showCountryHistButton.setEnabled(false);
}
}
private void popupTriggered(java.awt.event.MouseEvent evt) {
// // lastProv stores last province that mouse was on.
// // if it's not null, try to make a menu.
// if (lastProv == null)
// return;
//
// JPopupMenu popup = new JPopupMenu(lastProv.getName());
// JMenuItem nameMenuItem = popup.add("<html><b>"+lastProv.getName()+"</b></html>");
// nameMenuItem.setEnabled(false);
// popup.addSeparator();
// JMenuItem setCountryMenuItem = popup.add("Set country...");
// JMenuItem setReligionMenuItem = popup.add("Set religion...");
//// setCountryMenuItem.addActionListener(new ActionListener() {
//// public void actionPerformed(ActionEvent e) {
//// String ctry = JOptionPane.showInputDialog(this, "Enter the new country:");
////
//// }
//// });
// popup.setLocation(evt.getXOnScreen(), evt.getYOnScreen());
// popup.setVisible(true);
}
private void doClose() {
FileEditorDialog.disposeAll();
if (mapPanel.getModel().getDataSource().hasUnsavedChanges()) {
int choice =
JOptionPane.showConfirmDialog(this, "You have unsaved changes. Would you like to save them now?");
if (choice == JOptionPane.CANCEL_OPTION)
return;
else if (choice == JOptionPane.YES_OPTION)
mapPanel.getModel().getDataSource().saveChanges();
}
dispose();
System.out.println("Exiting...");
}
// private void updateProvincePanel(int provId) {
// ((ProvinceEditorPanel)innerProvincePanel).setProvId(provId);
// }
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, ClassNotFoundException {
in.defaultReadObject();
currentProvince = null;
lastCountry = null;
lastPt = null;
lastProv = null;
// lastClick = null;
}
private static final ParserSettings defaultSettings =
ParserSettings.getNoCommentSettings().setPrintTimingInfo(false);
private void addFilters() {
addReligionFilters();
addBuildingFilters();
addCountryFilters();
addCultureFilters();
addGoodsFilters();
addGovernmentFilters();
addTechGroupFilters();
addContinentFilters();
if (Main.map.isInNomine())
addRegionFilters();
addClimateFilters();
addNativesFilters();
// Anything else?
}
private void addReligionFilters() {
final GenericObject religions =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/religion.txt"),
defaultSettings);
Collections.sort(religions.children, new ObjectComparator());
final StringBuilder allReligions = new StringBuilder("(");
for (GenericObject group : religions.children) {
Collections.sort(group.children, new ObjectComparator());
JMenu groupMenu = new JMenu(Text.getText(group.name));
StringBuilder pattern = new StringBuilder(group.size()*10).append('(');
for (GenericObject religion : group.children) {
groupMenu.add(new CustomFilterAction(Text.getText(religion.name), "religion", religion.name));
pattern.append(religion.name).append('|');
allReligions.append(religion.name).append('|');
}
pattern.deleteCharAt(pattern.length()-1); // get rid of the last '|'
pattern.append(')');
groupMenu.add(new MultiFilterAction("All " + Text.getText(group.name), "religion", pattern.toString()));
viewSingleReligionMenu.add(groupMenu);
}
allReligions.deleteCharAt(allReligions.length()-1); // get rid of the last '|'
allReligions.append(')');
viewSingleReligionMenu.add(new MultiFilterAction("All religions (province)", "religion", allReligions.toString()));
viewSingleReligionMenu.add(new MultiCountryFilterAction("All religions (country)", "religion", allReligions.toString()));
}
private void addBuildingFilters() {
final GenericObject buildings =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/buildings.txt"),
defaultSettings);
Collections.sort(buildings.children, new ObjectComparator());
JMenu capitalBuildingsMenu = new JMenu("Capital buildings");
viewBuildingMenu.add(capitalBuildingsMenu);
JMenu manufactoriesMenu = new JMenu("Manufactories");
viewBuildingMenu.add(manufactoriesMenu);
java.util.List<GenericObject> forts = new java.util.ArrayList<GenericObject>();
for (GenericObject building : buildings.children) {
if (building.hasString("fort_level")) {
forts.add(building);
continue;
}
CustomFilterAction act = new CustomFilterAction(Text.getText(building.name), building.name, "yes");
if (building.containsList("manufactory"))
manufactoriesMenu.add(act);
else if (building.getString("capital").equals("yes"))
capitalBuildingsMenu.add(act);
else
viewBuildingMenu.add(act);
}
viewBuildingMenu.add(new FortLevelFilterAction(forts));
}
@SuppressWarnings("unchecked") // array of lists, can't use generics
private void addCountryFilters() {
final GenericObject countries =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/countries.txt"),
defaultSettings);
Collections.sort(countries.values, new VariableComparator());
List[] menus = new List[26];
for (int i = 0; i < menus.length; i++) {
menus[i] = new ArrayList<JMenu>();
}
List<JMenu> otherMenu = new ArrayList<JMenu>();
for (ObjectVariable var : countries.values) {
String cname = Text.getText(var.varname);
char start = Character.toUpperCase(cname.charAt(0));
JMenu menu = new JMenu(cname);
menu.add(new CustomFilterAction("Owned", "owner", var.varname));
menu.add(new CustomFilterAction("Controlled", "controller", var.varname));
menu.add(new CoreFilterAction(var.varname));
menu.add(new ShowCountryAction(var.varname, Text.getText(var.varname)));
int idx = start - 'A';
if (idx >= 0 && idx < menus.length)
menus[idx].add(menu); // unchecked
else
otherMenu.add(menu);
}
for (int i = 0; i < menus.length; i++) {
JMenu menu = new JMenu(" " + (char)('A' + i) + " ");
if (menus[i].size() == 0) {
JMenuItem dummy = new JMenuItem("(none)");
dummy.setEnabled(false);
menu.add(dummy);
} else {
for (Object m : menus[i]) {
menu.add((JMenu)m);
}
}
viewSingleCountryMenu.add(menu);
}
if (!otherMenu.isEmpty()) {
JMenu menu = new JMenu("Other");
for (JMenu m : otherMenu) {
menu.add(m);
}
viewSingleCountryMenu.add(menu);
}
}
private void addCultureFilters() {
final GenericObject cultures =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/cultures.txt"),
defaultSettings);
if (!cultures.lists.isEmpty()) {
Collections.sort(cultures.lists, new ListComparator());
final Comparator<String> listSorter = new StringComparator();
for (GenericList group : cultures.lists) {
group.sort(listSorter);
JMenu groupMenu = new JMenu(Text.getText(group.getName()));
StringBuilder pattern = new StringBuilder(group.size()*10).append('(');
for (String culture : group) {
groupMenu.add(new CustomFilterAction(Text.getText(culture), "culture", culture));
pattern.append(culture).append('|');
}
pattern.deleteCharAt(pattern.length()-1); // get rid of the last '|'
pattern.append(')');
groupMenu.add(new MultiFilterAction("All " + Text.getText(group.getName()), "culture", pattern.toString()));
viewCultureMenu.add(groupMenu);
}
} else {
// In Nomine
final ObjectComparator comp = new ObjectComparator();
Collections.sort(cultures.children, comp);
for (GenericObject group : cultures.children) {
Collections.sort(group.children, comp);
JMenu groupMenu = new JMenu(Text.getText(group.name));
StringBuilder pattern = new StringBuilder(group.size()*10).append('(');
for (GenericObject culture : group.children) {
groupMenu.add(new CustomFilterAction(Text.getText(culture.name), "culture", culture.name));
pattern.append(culture.name).append('|');
}
pattern.deleteCharAt(pattern.length()-1); // get rid of the last '|'
pattern.append(')');
groupMenu.add(new MultiFilterAction("All " + Text.getText(group.name), "culture", pattern.toString()));
viewCultureMenu.add(groupMenu);
}
}
}
private void addGoodsFilters() {
final GenericObject goods =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/tradegoods.txt"),
defaultSettings);
Collections.sort(goods.children, new ObjectComparator());
int counter = 0;
for (GenericObject good : goods.children) {
viewSingleGoodMenu.add(new CustomFilterAction(Text.getText(good.name), "trade_goods", good.name));
if (counter++ > 25) {
viewSingleGoodMenu = (JMenu) viewSingleGoodMenu.add(new JMenu("More..."));
counter = 0;
}
}
}
private void addGovernmentFilters() {
final GenericObject governments =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/governments.txt"),
defaultSettings);
// Collections.sort(governments.children, new ObjectComparator());
final StringBuilder allGovernments = new StringBuilder("(");
if (governments.size() > 20) {
JMenu republicMenu = new JMenu("Republics");
JMenu religiousMenu = new JMenu("Religious");
JMenu normalMenu = new JMenu("Normal");
JMenu tmpRepublic = republicMenu;
JMenu tmpReligious = religiousMenu;
JMenu tmpNormal = normalMenu;
for (GenericObject government : governments.children) {
allGovernments.append(government.name).append('|');
FilterAction action =
new CustomCountryFilterAction(Text.getText(government.name), "government", government.name);
if (government.getString("republican_name").equals("yes")) {
if (tmpRepublic.getMenuComponentCount() > 25)
tmpRepublic = (JMenu)tmpRepublic.add(new JMenu("More..."));
tmpRepublic.add(action);
} else if (government.getString("religion").equals("yes")) {
if (tmpReligious.getMenuComponentCount() > 25)
tmpReligious = (JMenu)tmpReligious.add(new JMenu("More..."));
tmpReligious.add(action);
} else {
if (tmpNormal.getMenuComponentCount() > 25)
tmpNormal = (JMenu)tmpNormal.add(new JMenu("More..."));
tmpNormal.add(action);
}
}
viewSingleGovernmentMenu.add(republicMenu);
viewSingleGovernmentMenu.add(religiousMenu);
viewSingleGovernmentMenu.add(normalMenu);
} else {
for (GenericObject government : governments.children) {
allGovernments.append(government.name).append('|');
viewSingleGovernmentMenu.add(new CustomCountryFilterAction(Text.getText(government.name), "government", government.name));
}
}
allGovernments.deleteCharAt(allGovernments.length()-1); // get rid of the last '|'
allGovernments.append(')');
viewSingleGovernmentMenu.add(new MultiCountryFilterAction("All governments", "government", allGovernments.toString()));
}
private void addTechGroupFilters() {
GenericObject groups =
EUGFileIO.load(Main.filenameResolver.resolveFilename("common/technology.txt"),
defaultSettings);
groups = groups.getChild("groups");
if (!groups.values.isEmpty()) {
for (ObjectVariable group : groups.values) {
viewTechGroupMenu.add(new CustomCountryFilterAction(Text.getText(group.varname), "technology_group", group.varname));
}
} else {
// must be In Nomine
for (GenericObject group : groups.children) {
viewTechGroupMenu.add(new CustomCountryFilterAction(Text.getText(group.name), "technology_group", group.name));
}
}
}
private void addContinentFilters() {
for (String cont : Main.map.getContinents().keySet()) {
viewContinentMenu.add(new ContinentFilterAction(Text.getText(cont), cont));
}
}
private void addClimateFilters() {
for (String climate : Main.map.getClimates().keySet()) {
viewClimateMenu.add(new ClimateFilterAction(Text.getText(climate), climate));
}
}
private void addRegionFilters() {
java.util.Map<String, List<String>> regions = Main.map.getRegions();
List<String> regionNames = new ArrayList<String>(regions.keySet());
Collections.sort(regionNames);
int counter = 0;
for (String region : regionNames) {
viewRegionMenu.add(new RegionFilterAction(Text.getText(region), region));
if (counter++ > 25) {
viewRegionMenu = (JMenu) viewRegionMenu.add(new JMenu("More..."));
counter = 0;
}
}
}
private void addNativesFilters() {
for (String nativeType : Main.map.getNatives().keySet()) {
viewNativeTypesMenu.add(new NativesFilterAction((Text.getText(nativeType)), nativeType));
}
}
// <editor-fold defaultstate="collapsed" desc=" Generated Variables ">
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem aboutMenuItem;
private javax.swing.JButton bookmarksButton;
private javax.swing.JLabel ctryNameLabel;
private javax.swing.JMenuItem customMapModeMenuItem;
private javax.swing.JSpinner daySpinner;
private javax.swing.JMenuItem exitMenuItem;
private javax.swing.JButton goToProvButton;
private javax.swing.JMenuItem goToProvMenuItem;
private final editor.MapPanel mapPanel = new editor.MapPanel();
private javax.swing.JScrollPane mapScrollPane;
private javax.swing.JSpinner monthSpinner;
private javax.swing.JLabel provNameLabel;
javax.swing.JMenuItem reloadMenuItem;
private javax.swing.JButton setDateButton;
private javax.swing.JMenuItem setDateMenuItem;
private javax.swing.JButton showCountryHistButton;
private javax.swing.JButton showProvHistButton;
private javax.swing.JMenu toolsMenu;
private javax.swing.JMenu viewBuildingMenu;
private javax.swing.JMenu viewClimateMenu;
private javax.swing.JMenu viewContinentMenu;
private javax.swing.JMenuItem viewCountriesMenuItem;
private javax.swing.JMenu viewCultureMenu;
private javax.swing.JMenuItem viewGoodsMenuItem;
private javax.swing.JMenuItem viewManpowerMenuItem;
private javax.swing.JMenu viewMenu;
private javax.swing.ButtonGroup viewModeButtonGroup;
private javax.swing.JLabel viewModeLabel;
private javax.swing.JMenu viewNativeTypesMenu;
private javax.swing.JMenuItem viewProvReligionsMenuItem;
private javax.swing.JMenuItem viewProvincesMenuItem;
javax.swing.JMenu viewRegionMenu;
private javax.swing.JMenu viewSingleCountryMenu;
private javax.swing.JMenu viewSingleGoodMenu;
private javax.swing.JMenu viewSingleGovernmentMenu;
private javax.swing.JMenu viewSingleReligionMenu;
javax.swing.JMenu viewTechGroupMenu;
javax.swing.JMenuItem warsMenuItem;
private javax.swing.JSpinner yearSpinner;
private javax.swing.JButton zoomInButton;
private javax.swing.JMenuItem zoomInMenuItem;
private javax.swing.JLabel zoomLabel;
private javax.swing.JButton zoomOutButton;
private javax.swing.JMenuItem zoomOutMenuItem;
// End of variables declaration//GEN-END:variables
// </editor-fold>
private final Action zoomInAction = new ZoomInAction();
private final Action zoomOutAction = new ZoomOutAction();
private final Action goToProvAction = new GoToProvAction();
private final Action setDateAction = new SetDateAction();
private final Action provinceFilterAction = new ProvinceFilterAction();
private final Action countryFilterAction = new PoliticalFilterAction(); //new CountryFilterAction();
private final Action provReligionFilterAction = new ProvReligionFilterAction();
private final Action ctryReligionFilterAction = new ReligionFilterAction(); //CtryReligionFilterAction();
private final Action goodsFilterAction = new GoodsFilterAction();
// Inner classes
// Utilities
// private static class ProvinceChanger {
// public ProvinceChanger() {
// }
// public void changeValue(String name, String date, String value) {
//
// }
// }
private static class SaveGameFileFilter extends javax.swing.filechooser.FileFilter {
public boolean accept(File f) {
return f.isDirectory() || f.getName().toLowerCase().endsWith(".eu3");
}
public String getDescription() {
return "Europa Universalis 3 saved game files";
}
}
private static class ObjectComparator implements Comparator<GenericObject>, Serializable {
private static final long serialVersionUID = 1L;
public int compare(final GenericObject o1, final GenericObject o2) {
return Text.getText(o1.name).compareTo(Text.getText(o2.name));
}
}
private static class ListComparator implements Comparator<GenericList>, Serializable {
private static final long serialVersionUID = 1L;
public int compare(final GenericList o1, final GenericList o2) {
return Text.getText(o1.getName()).compareTo(Text.getText(o2.getName()));
}
}
private static class VariableComparator implements Comparator<ObjectVariable>, Serializable {
private static final long serialVersionUID = 1L;
public int compare(final ObjectVariable o1, final ObjectVariable o2) {
return Text.getText(o1.varname).compareTo(Text.getText(o2.varname));
}
}
private static class StringComparator implements Comparator<String>, Serializable {
private static final long serialVersionUID = 1L;
public int compare(final String o1, final String o2) {
return Text.getText(o1).compareTo(Text.getText(o2));
}
}
// Actions
private class ZoomInAction extends AbstractAction {
public ZoomInAction() {
super("Zoom in", new javax.swing.ImageIcon(EditorUI.this.getClass().getResource("/editor/zoomin.gif")));
enabled = true;
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('=', InputEvent.CTRL_DOWN_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_I);
}
public void actionPerformed(ActionEvent e) {
mapPanel.zoomIn();
resetScrollPane();
updateZoomLabel();
if (currentProvince != null)
mapPanel.goToProv(currentProvince.getId());
}
}
private class ZoomOutAction extends AbstractAction {
public ZoomOutAction() {
super("Zoom out", new javax.swing.ImageIcon(EditorUI.this.getClass().getResource("/editor/zoomout.gif")));
enabled = true;
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('-', InputEvent.CTRL_DOWN_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_O);
}
public void actionPerformed(ActionEvent e) {
mapPanel.zoomOut();
resetScrollPane();
updateZoomLabel();
if (currentProvince != null)
mapPanel.goToProv(currentProvince.getId());
}
}
private class GoToProvAction extends AbstractAction {
public GoToProvAction() {
super("Go to province");
enabled = true;
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('F', InputEvent.CTRL_DOWN_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_G);
}
public void actionPerformed(ActionEvent e) {
final int maxProv = Integer.parseInt(Main.map.getString("max_provinces")) - 1;
String response =
JOptionPane.showInputDialog(EditorUI.this,
"Enter a province ID number (between 1 and " + maxProv +
") or a province name:",
currentProvince == null ? null : currentProvince.getId());
if (response == null || response.length() == 0)
return;
Province p;
if (response.matches("[0-9]{1,4}")) {
int prov = Integer.parseInt(response);
if (prov <= 0 || prov > maxProv) {
JOptionPane.showMessageDialog(EditorUI.this, "Invalid province ID: " + response);
return;
}
p = mapPanel.getModel().getProvinceData().getProvByID(prov);
} else {
p = mapPanel.getModel().getProvinceData().getProvByName(response);
}
if (p == null) {
JOptionPane.showMessageDialog(EditorUI.this, "Cannot find province \"" + response + "\"");
return;
}
resetScrollPane();
mapPanel.goToProv(p.getId());
mapPanel.flashProvince(p.getId());
doMouseClick(p);
}
}
private class SetDateAction extends AbstractAction {
public SetDateAction() {
super("Set date");
enabled = true;
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('D', InputEvent.CTRL_DOWN_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_D);
}
public void actionPerformed(ActionEvent e) {
String date = yearSpinner.getValue().toString() + "." +
monthSpinner.getValue().toString() + "." +
daySpinner.getValue().toString();
System.out.println("Setting date to " + date);
mapPanel.getModel().setDate(date);
// ((ProvinceEditorPanel)innerProvincePanel).setDate(date);
// String country = (String) countryComboBox.getSelectedItem();
// countryComboBox.setModel(new DefaultComboBoxModel(new java.util.Vector<String>(mapPanel.getModel().getTags())));
// countryComboBox.setSelectedItem(country);
mapPanel.repaint();
}
}
private class ShowCountryAction extends AbstractAction {
private final String tag;
private final String name;
public ShowCountryAction(String tag, String name) {
super("Show history");
this.tag = tag;
this.name = name;
putValue(SHORT_DESCRIPTION, "Edit " + name + "'s country history file");
}
public void actionPerformed(ActionEvent e) {
FileEditorDialog.showDialog(EditorUI.this, tag, name);
}
}
private abstract class FilterAction extends AbstractAction {
protected final MapMode mode;
protected FilterAction(String name, MapMode mode) {
super(name);
this.mode = mode;
}
public void actionPerformed(ActionEvent e) {
// java.awt.EventQueue.invokeLater(new Runnable() {
// public void run() {
mapPanel.setMode(mode);
viewModeLabel.setText((String) getValue(SHORT_DESCRIPTION));
mapPanel.repaint();
doMouseClick(currentProvince);
// }
// });
}
}
private class CustomFilterAction extends FilterAction {
public CustomFilterAction(String name, String key, String value) {
super(name, new CustomMode(mapPanel, key, value));
putValue(SHORT_DESCRIPTION, key + " = " + value);
}
}
private class CustomCountryFilterAction extends FilterAction {
public CustomCountryFilterAction(String name, String key, String value) {
super(name, new CustomCountryMode(mapPanel, key, value));
putValue(SHORT_DESCRIPTION, key + " = " + value);
}
}
private class MultiFilterAction extends FilterAction {
public MultiFilterAction(String name, String key, String pattern) {
super(name, new AdvancedCustomMode(mapPanel, key, pattern));
if (pattern.length() > 60)
putValue(SHORT_DESCRIPTION, name);
else
putValue(SHORT_DESCRIPTION, key + " matches " + pattern);
}
}
private class MultiCountryFilterAction extends FilterAction {
public MultiCountryFilterAction(String name, String key, String pattern) {
super(name, new AdvancedCustomCountryMode(mapPanel, key, pattern));
if (pattern.length() > 60)
putValue(SHORT_DESCRIPTION, name);
else
putValue(SHORT_DESCRIPTION, key + " matches " + pattern);
}
}
private class ProvinceFilterAction extends FilterAction {
public ProvinceFilterAction() {
super("Provinces", new ProvinceMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Provinces");
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('P', InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
}
}
private class CountryFilterAction extends FilterAction {
public CountryFilterAction() {
super("Countries", new CountryMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Countries");
}
}
private class PoliticalFilterAction extends FilterAction {
public PoliticalFilterAction() {
super("Countries", new PoliticalMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Countries");
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('C', InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
}
}
private class ProvReligionFilterAction extends FilterAction {
public ProvReligionFilterAction() {
super("Province religions", new ProvReligionMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Province religions");
}
}
private class CtryReligionFilterAction extends FilterAction {
public CtryReligionFilterAction() {
super("Country religions", new CtryReligionMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Country religions");
}
}
private class ReligionFilterAction extends FilterAction {
public ReligionFilterAction() {
super("Religions", new ReligionMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Religions");
}
}
private class GoodsFilterAction extends FilterAction {
public GoodsFilterAction() {
super("Trade goods", new GoodsMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Trade goods");
}
}
private class CoreFilterAction extends FilterAction {
public CoreFilterAction(String tag) {
super("Core", new CoreMapMode(mapPanel, tag));
putValue(SHORT_DESCRIPTION, "Cores of " + tag);
}
}
private class DiscreteStepFilterAction extends FilterAction {
public DiscreteStepFilterAction(String name, String prop, int min, int max, int step) {
super(name, new DiscreteScalingMapMode(mapPanel, prop, min, max, step));
putValue(SHORT_DESCRIPTION, name);
}
// private void setMinColor(Color c) {
// ((DiscreteScalingMapMode)mode).setMinColor(c);
// }
//
// private void setMaxColor(Color c) {
// ((DiscreteScalingMapMode)mode).setMaxColor(c);
// }
}
private class FortLevelFilterAction extends FilterAction {
public FortLevelFilterAction(final java.util.List<GenericObject> forts) {
super("Fort level", new FortMapMode(mapPanel, forts));
putValue(SHORT_DESCRIPTION, "Fort level");
}
}
// private class GroupFilterAction extends FilterAction {
// public GroupFilterAction(String name, final java.util.List<String> group) {
// super(name, new GroupMode(mapPanel, group));
// putValue(SHORT_DESCRIPTION, "Provinces in " + name);
// }
// }
private class ContinentFilterAction extends FilterAction {
public ContinentFilterAction(String name, String contName) {
super(name, new ContinentMode(mapPanel, contName));
putValue(SHORT_DESCRIPTION, "Provinces in " + contName);
}
}
private class ClimateFilterAction extends FilterAction {
public ClimateFilterAction(String name, String climateName) {
super(name, new ClimateMode(mapPanel, climateName));
putValue(SHORT_DESCRIPTION, "Provinces with climate " + climateName);
}
}
private class RegionFilterAction extends FilterAction {
public RegionFilterAction(String name, String regName) {
super(name, new RegionsMode(mapPanel, regName));
putValue(SHORT_DESCRIPTION, "Provinces in " + regName);
}
}
private class CapitalFilterAction extends FilterAction {
public CapitalFilterAction() {
super("Capitals", new CapitalsMode(mapPanel));
putValue(SHORT_DESCRIPTION, "Capitals");
}
}
private class NativesFilterAction extends FilterAction {
public NativesFilterAction(String name, String nativeType) {
super(name, new NativeGroupMode(mapPanel, nativeType));
putValue(SHORT_DESCRIPTION, "Provinces with " + nativeType + " natives");
}
}
private final class BookmarkAction extends AbstractAction {
private final String date;
public BookmarkAction(String name, String desc, String date) {
super(name);
this.date = date;
// split desc into lines
final StringBuilder sb = new StringBuilder("<html>");
final int len = desc.length();
int last = 0;
// Try to get 80-character lines
for (int i = 80; i < len; i+=80) {
// Go to the end of the current word
while (desc.charAt(i) != ' ' && i<len-1)
i++;
sb.append(desc.substring(last, i));
sb.append("<br>");
last = i;
}
// If len wasn't divisible by 80, we didn't get all of the desc in the loop.
sb.append(desc.substring(last)).append("<br>");
sb.append("<br>Date: ").append(date).append("</html>");
putValue(SHORT_DESCRIPTION, sb.toString());
}
public void actionPerformed(ActionEvent e) {
String[] splitDate = date.split("\\.");
((SpinnerNumberModel)yearSpinner.getModel()).setValue(Integer.parseInt(splitDate[0]));
((SpinnerNumberModel)monthSpinner.getModel()).setValue(Integer.parseInt(splitDate[1]));
((SpinnerNumberModel)daySpinner.getModel()).setValue(Integer.parseInt(splitDate[2]));
mapPanel.getModel().setDate(date);
mapPanel.repaint();
}
}
}