Skip to content

Commit 7164aed

Browse files
committed
Merge pull request #78 from Akjosch/planetary_event_editor
Planetary event editor
2 parents 9f21593 + d4f7ee3 commit 7164aed

6 files changed

+1553
-0
lines changed

MekHQ/src/mekhq/campaign/Campaign.java

+59
Original file line numberDiff line numberDiff line change
@@ -3351,6 +3351,26 @@ public void writeToXml(PrintWriter pw1) {
33513351
}
33523352
retirementDefectionTracker.writeToXml(pw1, 1);
33533353
}
3354+
3355+
// Customised planetary events
3356+
pw1.println("\t<customPlanetaryEvents>");
3357+
for(Planet p : Planets.getInstance().getPlanets().values()) {
3358+
List<Planet.PlanetaryEvent> customEvents = new ArrayList<>();
3359+
for(Planet.PlanetaryEvent event : p.getEvents()) {
3360+
if(event.custom) {
3361+
customEvents.add(event);
3362+
}
3363+
}
3364+
if(!customEvents.isEmpty()) {
3365+
pw1.println("\t\t<planet><id>" + p.getId() + "</id>");
3366+
for(Planet.PlanetaryEvent event : customEvents) {
3367+
Planets.getInstance().writePlanetaryEvent(pw1, event);
3368+
pw1.println();
3369+
}
3370+
pw1.println("\t\t</planet>");
3371+
}
3372+
}
3373+
pw1.println("\t</customPlanetaryEvents>");
33543374

33553375
writeCustoms(pw1);
33563376
// Okay, we're done.
@@ -3643,6 +3663,8 @@ else if (xn.equalsIgnoreCase("info")) {
36433663
processLanceNodes(retVal, wn);
36443664
} else if (xn.equalsIgnoreCase("retirementDefectionTracker")) {
36453665
retVal.retirementDefectionTracker = RetirementDefectionTracker.generateInstanceFromXML(wn, retVal);
3666+
} else if (xn.equalsIgnoreCase("customPlanetaryEvents")) {
3667+
updatePlanetaryEventsFromXML(wn);
36463668
}
36473669

36483670
} else {
@@ -4060,6 +4082,43 @@ else if (xn.equalsIgnoreCase("info")) {
40604082
return retVal;
40614083
}
40624084

4085+
private static void updatePlanetaryEventsFromXML(Node wn) {
4086+
Planets.reload(true);
4087+
NodeList wList = wn.getChildNodes();
4088+
for (int x = 0; x < wList.getLength(); x++) {
4089+
Node wn2 = wList.item(x);
4090+
4091+
// If it's not an element node, we ignore it.
4092+
if (wn2.getNodeType() != Node.ELEMENT_NODE) {
4093+
continue;
4094+
}
4095+
4096+
if (wn2.getNodeName().equalsIgnoreCase("planet")) {
4097+
NodeList planetNodes = wn2.getChildNodes();
4098+
String planetId = null;
4099+
List<Planet.PlanetaryEvent> events = new ArrayList<>();
4100+
for(int n = 0; n < planetNodes.getLength(); ++ n) {
4101+
Node planetNode = planetNodes.item(n);
4102+
if(planetNode.getNodeType() != Node.ELEMENT_NODE) {
4103+
continue;
4104+
}
4105+
if(planetNode.getNodeName().equalsIgnoreCase("id")) {
4106+
planetId = planetNode.getTextContent();
4107+
} else if(planetNode.getNodeName().equalsIgnoreCase("event")) {
4108+
Planet.PlanetaryEvent event = Planets.getInstance().readPlanetaryEvent(planetNode);
4109+
if(null != event) {
4110+
event.custom = true;
4111+
events.add(event);
4112+
}
4113+
}
4114+
}
4115+
if(null != planetId) {
4116+
Planets.getInstance().updatePlanetaryEvents(planetId, events, true);
4117+
}
4118+
}
4119+
}
4120+
}
4121+
40634122
private static void fixIdReferences(Campaign retVal) {
40644123
// set up translation hashes
40654124
Hashtable<Integer, UUID> uHash = new Hashtable<Integer, UUID>();

MekHQ/src/mekhq/gui/InterstellarMapPanel.java

+26
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.awt.geom.Arc2D;
2121
import java.awt.geom.Line2D;
2222
import java.util.ArrayList;
23+
import java.util.List;
2324
import java.util.Set;
2425

2526
import javax.swing.BorderFactory;
@@ -33,6 +34,8 @@
3334
import mekhq.campaign.JumpPath;
3435
import mekhq.campaign.universe.Faction;
3536
import mekhq.campaign.universe.Planet;
37+
import mekhq.campaign.universe.Planets;
38+
import mekhq.gui.dialog.NewPlanetaryEventDialog;
3639

3740

3841
/**
@@ -184,6 +187,18 @@ public void actionPerformed(ActionEvent ae) {
184187
});
185188
}
186189
menuGM.add(item);
190+
item = new JMenuItem("Edit planetary events");
191+
item.setEnabled(selectedPlanet != null && campaign.isGM());
192+
if (selectedPlanet != null) {
193+
item.setText("Edit planetary events for " + selectedPlanet.getPrintableName(new DateTime(campaign.getCalendar())));
194+
item.addActionListener(new ActionListener() {
195+
@Override
196+
public void actionPerformed(ActionEvent ae) {
197+
openPlanetEventEditor(selectedPlanet);
198+
}
199+
});
200+
}
201+
menuGM.add(item);
187202
popup.add(menuGM);
188203
popup.show(e.getComponent(), e.getX() + 10, e.getY() + 10);
189204
}
@@ -495,6 +510,17 @@ private void changeSelectedPlanet(Planet p) {
495510
hqview.refreshPlanetView();
496511
}
497512

513+
private void openPlanetEventEditor(Planet p) {
514+
NewPlanetaryEventDialog editor = new NewPlanetaryEventDialog(null, campaign, selectedPlanet);
515+
editor.setVisible(true);
516+
List<Planet.PlanetaryEvent> result = editor.getChangedEvents();
517+
if((null != result) && !result.isEmpty()) {
518+
Planets.getInstance().updatePlanetaryEvents(p.getId(), result, true);
519+
repaint();
520+
hqview.refreshPlanetView();
521+
}
522+
523+
}
498524
/**
499525
* All configuration behaviour of InterStellarMap are saved here.
500526
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package mekhq.gui.dialog;
2+
3+
import java.awt.Component;
4+
import java.awt.Container;
5+
import java.awt.Dimension;
6+
import java.awt.Frame;
7+
import java.awt.GridBagConstraints;
8+
import java.awt.GridBagLayout;
9+
import java.awt.event.ActionEvent;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.Objects;
13+
import java.util.ResourceBundle;
14+
import java.util.TreeMap;
15+
16+
import javax.swing.AbstractAction;
17+
import javax.swing.AbstractListModel;
18+
import javax.swing.DefaultListCellRenderer;
19+
import javax.swing.JButton;
20+
import javax.swing.JDialog;
21+
import javax.swing.JList;
22+
import javax.swing.JScrollPane;
23+
24+
import org.joda.time.DateTime;
25+
26+
import megamek.common.util.EncodeControl;
27+
import mekhq.campaign.universe.Era;
28+
import mekhq.campaign.universe.Faction;
29+
30+
public class ChooseFactionsDialog extends JDialog {
31+
private static final long serialVersionUID = 805616085217507489L;
32+
33+
private DateTime date;
34+
35+
ResourceBundle resourceMap;
36+
private JList<Faction> factionList;
37+
private List<String> result;
38+
private boolean changed;
39+
40+
public ChooseFactionsDialog(Frame parent, DateTime date, List<String> defaults) {
41+
this(parent, date, defaults, true);
42+
}
43+
44+
public ChooseFactionsDialog(Frame parent, DateTime date, List<String> defaults, boolean modal) {
45+
super(parent, modal);
46+
this.date = Objects.requireNonNull(date);
47+
this.result = defaults;
48+
this.changed = false;
49+
initComponents();
50+
setLocationRelativeTo(parent);
51+
}
52+
53+
protected void initComponents() {
54+
resourceMap = ResourceBundle.getBundle("mekhq.resources.ChooseFactionsDialog", new EncodeControl()); //$NON-NLS-1$
55+
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
56+
setName("form"); //$NON-NLS-1$
57+
setTitle(resourceMap.getString("Form.title")); //$NON-NLS-1$
58+
setMinimumSize(new Dimension(400, 500));
59+
60+
final Container content = getContentPane();
61+
content.setLayout(new GridBagLayout());
62+
GridBagConstraints gbc = new GridBagConstraints();
63+
gbc.gridx = 0;
64+
gbc.gridy = 0;
65+
gbc.gridwidth = 2;
66+
gbc.weightx = 1.0;
67+
gbc.weighty = 1.0;
68+
gbc.fill = GridBagConstraints.BOTH;
69+
JScrollPane scrollPane = new JScrollPane();
70+
factionList = new JList<>(new FactionListModel(date));
71+
factionList.setCellRenderer(new DefaultListCellRenderer(){
72+
private static final long serialVersionUID = -2504011562223561964L;
73+
74+
@Override
75+
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
76+
boolean cellHasFocus) {
77+
DefaultListCellRenderer result = (DefaultListCellRenderer) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
78+
if(value instanceof Faction) {
79+
result.setText(((Faction)value).getFullName(Era.getEra(date.getYear())));
80+
}
81+
return result;
82+
}
83+
84+
});
85+
scrollPane.setViewportView(factionList);
86+
content.add(scrollPane, gbc);
87+
88+
gbc.gridy = 1;
89+
gbc.gridwidth = 1;
90+
gbc.weighty = 0.0;
91+
gbc.anchor = GridBagConstraints.WEST;
92+
gbc.fill = GridBagConstraints.NONE;
93+
content.add(new JButton(new AbstractAction(resourceMap.getString("ok.label")) { //$NON-NLS-1$
94+
private static final long serialVersionUID = -8920630119126015954L;
95+
96+
@Override
97+
public void actionPerformed(ActionEvent e) {
98+
result = new ArrayList<>();
99+
for(Faction faction : factionList.getSelectedValuesList()) {
100+
result.add(faction.getShortName());
101+
}
102+
changed = true;
103+
setVisible(false);
104+
}
105+
}), gbc);
106+
107+
gbc.gridx = 1;
108+
gbc.anchor = GridBagConstraints.EAST;
109+
content.add(new JButton(new AbstractAction(resourceMap.getString("cancel.label")){ //$NON-NLS-1$
110+
private static final long serialVersionUID = -8920630119126015955L;
111+
112+
@Override
113+
public void actionPerformed(ActionEvent e) {
114+
setVisible(false);
115+
}
116+
}), gbc);
117+
pack();
118+
}
119+
120+
public List<String> getResult() {
121+
return result;
122+
}
123+
124+
public boolean isChanged() {
125+
return changed;
126+
}
127+
128+
private static class FactionListModel extends AbstractListModel<Faction> {
129+
private static final long serialVersionUID = 2779479232585980171L;
130+
131+
private TreeMap<String, Faction> factionMap = new TreeMap<>();
132+
private List<String> names;
133+
134+
public FactionListModel(DateTime date) {
135+
int era = Era.getEra(date.getYear());
136+
for(Faction faction : Faction.factions.values()) {
137+
factionMap.put(faction.getFullName(era), faction);
138+
}
139+
names = new ArrayList<>(factionMap.navigableKeySet());
140+
}
141+
142+
@Override
143+
public int getSize() {
144+
return names.size();
145+
}
146+
147+
@Override
148+
public Faction getElementAt(int index) {
149+
return factionMap.get(names.get(index));
150+
}
151+
}
152+
}

0 commit comments

Comments
 (0)