Skip to content

Commit 67a7ff4

Browse files
committedSep 17, 2024·
New Feature: Import routes from system names/ids in routing tool (Issue #475)
Merge develop
2 parents 9c3cca1 + efcbb2e commit 67a7ff4

File tree

6 files changed

+304
-43
lines changed

6 files changed

+304
-43
lines changed
 

‎src/main/java/net/nikr/eve/jeveasset/gui/shared/components/JTextAreaPlaceholder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public JTextAreaPlaceholder(String placeholder) {
7373
/**
7474
* Create a textfield with hint.
7575
*
76+
* @param text
7677
* @param placeholder Text displayed when empty
7778
*/
7879
public JTextAreaPlaceholder(String text, String placeholder) {
@@ -192,8 +193,12 @@ private void updatePlaceholderBorder() {
192193
}
193194

194195
private void updateShown() {
196+
updateShown(false);
197+
}
198+
199+
private void updateShown(boolean forceRepaint) {
195200
boolean paint = getText().isEmpty() && placeholderText != null && !placeholderText.isEmpty();
196-
boolean repaint = paint != paintPlaceholder;
201+
boolean repaint = forceRepaint || paint != paintPlaceholder;
197202
getMock().setText(placeholderText);
198203
paintPlaceholder = paint;
199204
if (repaint) {
@@ -214,7 +219,7 @@ private void updateSize() {
214219

215220
public void setPlaceholderText(String placeholder) {
216221
this.placeholderText = placeholder;
217-
updateShown();
222+
updateShown(true);
218223
}
219224

220225
public void setPlaceholderForeground(Color fg) {

‎src/main/java/net/nikr/eve/jeveasset/gui/shared/components/JTextDialog.java

+106-11
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package net.nikr.eve.jeveasset.gui.shared.components;
2323

2424
import java.awt.Color;
25+
import java.awt.Component;
2526
import java.awt.Window;
2627
import java.awt.event.ActionEvent;
2728
import java.awt.event.ActionListener;
@@ -30,12 +31,19 @@
3031
import java.io.FileReader;
3132
import java.io.FileWriter;
3233
import java.io.IOException;
34+
import javax.swing.DefaultComboBoxModel;
35+
import javax.swing.DefaultListCellRenderer;
3336
import javax.swing.GroupLayout;
37+
import javax.swing.Icon;
3438
import javax.swing.JButton;
39+
import javax.swing.JComboBox;
3540
import javax.swing.JComponent;
3641
import javax.swing.JFileChooser;
42+
import javax.swing.JLabel;
43+
import javax.swing.JList;
3744
import javax.swing.JOptionPane;
3845
import javax.swing.JScrollPane;
46+
import javax.swing.ListCellRenderer;
3947
import net.nikr.eve.jeveasset.Program;
4048
import net.nikr.eve.jeveasset.data.settings.Colors;
4149
import net.nikr.eve.jeveasset.gui.images.Images;
@@ -46,6 +54,7 @@
4654
public class JTextDialog extends JDialogCentered {
4755

4856
private enum TextDialogAction {
57+
IMPORT_TYPE,
4958
TO_CLIPBOARD,
5059
TO_FILE,
5160
FROM_CLIPBOARD,
@@ -55,6 +64,7 @@ private enum TextDialogAction {
5564
}
5665

5766
private final JTextAreaPlaceholder jText;
67+
private final JComboBox<TextImport> jImportTypes;
5868
private final JButton jToClipboard;
5969
private final JButton jFromClipboard;
6070
private final JButton jToFile;
@@ -75,6 +85,11 @@ public JTextDialog(Window window) {
7585

7686
ListenerClass listener = new ListenerClass();
7787

88+
jImportTypes = new JComboBox<>();
89+
jImportTypes.setRenderer(new TextImportListRenderer());
90+
jImportTypes.setActionCommand(TextDialogAction.IMPORT_TYPE.name());
91+
jImportTypes.addActionListener(listener);
92+
7893
jToClipboard = new JButton(GuiShared.get().textToClipboard(), Images.EDIT_COPY.getIcon());
7994
jToClipboard.setActionCommand(TextDialogAction.TO_CLIPBOARD.name());
8095
jToClipboard.addActionListener(listener);
@@ -112,6 +127,7 @@ public JTextDialog(Window window) {
112127
layout.setHorizontalGroup(
113128
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
114129
.addGroup(layout.createSequentialGroup()
130+
.addComponent(jImportTypes)
115131
.addComponent(jToClipboard)
116132
.addComponent(jToFile)
117133
.addComponent(jFromClipboard)
@@ -127,6 +143,7 @@ public JTextDialog(Window window) {
127143
layout.setVerticalGroup(
128144
layout.createSequentialGroup()
129145
.addGroup(layout.createParallelGroup()
146+
.addComponent(jImportTypes, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight())
130147
.addComponent(jToClipboard, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight())
131148
.addComponent(jToFile, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight())
132149
.addComponent(jFromClipboard, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight())
@@ -169,7 +186,40 @@ public String importText(String text) {
169186
}
170187

171188
public String importText(String text, String example) {
189+
return importText(text, example, null, null).getText();
190+
}
191+
192+
public <E extends TextImport> TextReturn<E> importText(E[] imports) {
193+
return importText("", "", imports, null);
194+
}
195+
196+
public <E extends TextImport> TextReturn<E> importText(E[] imports, E selected) {
197+
return importText("", "", imports, selected);
198+
}
199+
200+
public <E extends TextImport> TextReturn<E> importText(String text, E[] imports) {
201+
return importText(text, "", imports, null);
202+
}
203+
204+
public <E extends TextImport> TextReturn<E> importText(String text, E[] imports, E selected) {
205+
return importText(text, "", imports, selected);
206+
}
207+
208+
public <E extends TextImport> TextReturn<E> importText(String text, String example, E[] imports, E selected) {
172209
getDialog().setTitle(GuiShared.get().textImport());
210+
if (imports == null || imports.length < 1) {
211+
jImportTypes.removeAllItems();
212+
jImportTypes.setVisible(false);
213+
} else {
214+
jImportTypes.setModel(new DefaultComboBoxModel<>(imports));
215+
if (selected != null) {
216+
jImportTypes.setSelectedItem(selected);
217+
} else {
218+
jImportTypes.setSelectedIndex(0);
219+
}
220+
example = jImportTypes.getItemAt(jImportTypes.getSelectedIndex()).getExample();
221+
jImportTypes.setVisible(true);
222+
}
173223
jText.setEditable(true);
174224
jText.setOpaque(true);
175225
jText.setBackground(importColor);
@@ -186,7 +236,11 @@ public String importText(String text, String example) {
186236
jToFile.setVisible(false);
187237
returnValue = null;
188238
setVisible(true);
189-
return returnValue;
239+
if (imports == null) {
240+
return new TextReturn<>(returnValue, null);
241+
} else {
242+
return new TextReturn<>(returnValue, imports[jImportTypes.getSelectedIndex()]);
243+
}
190244
}
191245

192246
public void exportText(String text) {
@@ -253,29 +307,70 @@ private void fromFile() {
253307
}
254308
}
255309

310+
public static interface TextImport {
311+
public String getExample();
312+
public Icon getIcon();
313+
public String getType();
314+
}
315+
316+
public static class TextReturn<E extends TextImport> {
317+
private final String text;
318+
private final E type;
319+
320+
public TextReturn(String text, E type) {
321+
this.text = text;
322+
this.type = type;
323+
}
324+
325+
public String getText() {
326+
return text;
327+
}
328+
329+
public E getType() {
330+
return type;
331+
}
332+
}
333+
256334
private class ListenerClass implements ActionListener {
257335
@Override
258336
public void actionPerformed(final ActionEvent e) {
259337
if (TextDialogAction.TO_CLIPBOARD.name().equals(e.getActionCommand())) {
260338
CopyHandler.toClipboard(jText.getText());
261-
}
262-
if (TextDialogAction.TO_FILE.name().equals(e.getActionCommand())) {
339+
} else if (TextDialogAction.TO_FILE.name().equals(e.getActionCommand())) {
263340
toFile();
264-
}
265-
if (TextDialogAction.FROM_CLIPBOARD.name().equals(e.getActionCommand())) {
341+
} else if (TextDialogAction.FROM_CLIPBOARD.name().equals(e.getActionCommand())) {
266342
CopyHandler.paste(jText);
267-
}
268-
if (TextDialogAction.FROM_FILE.name().equals(e.getActionCommand())) {
343+
} else if (TextDialogAction.FROM_FILE.name().equals(e.getActionCommand())) {
269344
fromFile();
270-
}
271-
if (TextDialogAction.OK.name().equals(e.getActionCommand())) {
345+
} else if (TextDialogAction.OK.name().equals(e.getActionCommand())) {
272346
returnValue = jText.getText();
273347
setVisible(false);
274-
}
275-
if (TextDialogAction.CANCEL.name().equals(e.getActionCommand())) {
348+
} else if (TextDialogAction.CANCEL.name().equals(e.getActionCommand())) {
276349
returnValue = null;
277350
setVisible(false);
351+
} else if (TextDialogAction.IMPORT_TYPE.name().equals(e.getActionCommand())) {
352+
TextImport textImport = jImportTypes.getItemAt(jImportTypes.getSelectedIndex());
353+
jText.setPlaceholderText(textImport.getExample());
278354
}
279355
}
280356
}
357+
358+
class TextImportListRenderer implements ListCellRenderer<TextImport> {
359+
360+
private final DefaultListCellRenderer renderer;
361+
362+
public TextImportListRenderer() {
363+
renderer = new DefaultListCellRenderer();
364+
}
365+
366+
@Override
367+
public Component getListCellRendererComponent(JList<? extends TextImport> list, TextImport value, int index, boolean isSelected, boolean cellHasFocus) {
368+
JLabel label = (JLabel) renderer.getListCellRendererComponent(list, value.getType(), index, isSelected, cellHasFocus);
369+
// Set icon to display for value
370+
label.setIcon(value.getIcon());
371+
return label;
372+
}
373+
374+
375+
}
281376
}

‎src/main/java/net/nikr/eve/jeveasset/gui/tabs/routing/JRouteEditDialog.java

+28-18
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.awt.event.ActionListener;
2525
import java.io.Serializable;
2626
import java.util.ArrayList;
27+
import java.util.HashMap;
2728
import java.util.List;
2829
import java.util.Map;
2930
import javax.swing.DefaultListModel;
@@ -157,11 +158,11 @@ private boolean recalculateRoutes() {
157158
Route last = null;
158159
for (Route route : list) {
159160
if (last != null) {
160-
jumps = jumps + distanceBetween(last, route);
161+
jumps = jumps + distanceBetween(systemCache, filteredGraph, last, route);
161162
}
162163
last = route;
163164
}
164-
jumps = jumps + distanceBetween(last, list.get(0));
165+
jumps = jumps + distanceBetween(systemCache, filteredGraph, last, list.get(0));
165166
calculateInfo(jumps);
166167
return true;
167168
} catch (DisconnectedGraphException ex) {
@@ -186,11 +187,12 @@ private void calculateInfo(int jumps) {
186187
jJumps.setText(TabsRouting.get().resultEditJumps(jumps));
187188
}
188189

189-
private List<SolarSystem> routeBetween(Route from, Route to) {
190+
private static List<SolarSystem> routeBetween(Map<Long, SolarSystem> systemCache, Graph<SolarSystem> filteredGraph, Route from, Route to) {
190191
return filteredGraph.routeBetween(systemCache.get(from.getSystemID()), systemCache.get(to.getSystemID()));
191192
}
192193

193-
private int distanceBetween(Route from, Route to) {
194+
195+
private static int distanceBetween(Map<Long, SolarSystem> systemCache, Graph<SolarSystem> filteredGraph, Route from, Route to) {
194196
return filteredGraph.distanceBetween(systemCache.get(from.getSystemID()), systemCache.get(to.getSystemID()));
195197
}
196198

@@ -238,26 +240,34 @@ protected void save() {
238240
list.add(model.get(i));
239241
}
240242
try {
241-
List<List<SolarSystem>> routes = new ArrayList<>();
242-
int jumps = 0;
243-
Route last = null;
244-
for (Route route : list) {
245-
if (last != null) {
246-
jumps = jumps + distanceBetween(last, route);
247-
routes.add(routeBetween(last, route));
248-
}
249-
last = route;
250-
}
251-
jumps = jumps + distanceBetween(last, list.get(0));
252-
routes.add(routeBetween(last, list.get(0)));
253-
returnResult = new RouteResult(routes, routeResult.getStations(), routeResult.getWaypoints(), TabsRouting.get().resultEdited(), 0, jumps, program.getRoutingTab().getAvoidString(), program.getRoutingTab().getSecurityString());
243+
returnResult = makeRouteResult(program, systemCache, filteredGraph, list, TabsRouting.get().resultEdited(), routeResult.getStations());
254244
} catch (DisconnectedGraphException ex) {
255245
returnResult = null;
256246
}
257247
setVisible(false);
258248
}
259249

260-
private static class Route implements Serializable {
250+
public static RouteResult makeRouteResult(Program program, Map<Long, SolarSystem> systemCache, Graph<SolarSystem> filteredGraph, List<Route> list, String algorithmName) throws DisconnectedGraphException {
251+
return makeRouteResult(program, systemCache, filteredGraph, list, algorithmName, new HashMap<>());
252+
}
253+
254+
private static RouteResult makeRouteResult(Program program, Map<Long, SolarSystem> systemCache, Graph<SolarSystem> filteredGraph, List<Route> list, String algorithmName, Map<Long, List<SolarSystem>> stations) throws DisconnectedGraphException {
255+
List<List<SolarSystem>> routes = new ArrayList<>();
256+
int jumps = 0;
257+
Route last = null;
258+
for (Route route : list) {
259+
if (last != null) {
260+
jumps = jumps + distanceBetween(systemCache, filteredGraph, last, route);
261+
routes.add(routeBetween(systemCache, filteredGraph, last, route));
262+
}
263+
last = route;
264+
}
265+
jumps = jumps + distanceBetween(systemCache, filteredGraph, last, list.get(0));
266+
routes.add(routeBetween(systemCache, filteredGraph, last, list.get(0)));
267+
return new RouteResult(routes, stations, routes.size(), algorithmName, 0, jumps, program.getRoutingTab().getAvoidString(), program.getRoutingTab().getSecurityString());
268+
}
269+
270+
public static class Route implements Serializable {
261271
private final long systemID;
262272
private final String system;
263273

‎src/main/java/net/nikr/eve/jeveasset/gui/tabs/routing/RoutingTab.java

+147-12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import javax.swing.BorderFactory;
4949
import javax.swing.ButtonGroup;
5050
import javax.swing.GroupLayout;
51+
import javax.swing.Icon;
5152
import javax.swing.JButton;
5253
import javax.swing.JComboBox;
5354
import javax.swing.JFileChooser;
@@ -84,6 +85,8 @@
8485
import net.nikr.eve.jeveasset.gui.shared.components.JMainTabSecondary;
8586
import net.nikr.eve.jeveasset.gui.shared.components.JMultiSelectionDialog;
8687
import net.nikr.eve.jeveasset.gui.shared.components.JTextDialog;
88+
import net.nikr.eve.jeveasset.gui.shared.components.JTextDialog.TextImport;
89+
import net.nikr.eve.jeveasset.gui.shared.components.JTextDialog.TextReturn;
8790
import net.nikr.eve.jeveasset.gui.shared.components.ListComboBoxModel;
8891
import net.nikr.eve.jeveasset.gui.shared.menu.JMenuUI;
8992
import net.nikr.eve.jeveasset.gui.shared.table.EventListManager;
@@ -92,6 +95,7 @@
9295
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewGroup;
9396
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewLocation;
9497
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewLocation.LocationType;
98+
import net.nikr.eve.jeveasset.gui.tabs.routing.JRouteEditDialog.Route;
9599
import net.nikr.eve.jeveasset.i18n.General;
96100
import net.nikr.eve.jeveasset.i18n.GuiShared;
97101
import net.nikr.eve.jeveasset.i18n.TabsRouting;
@@ -121,6 +125,47 @@ public class RoutingTab extends JMainTabSecondary {
121125

122126
private static final Logger LOG = LoggerFactory.getLogger(RoutingTab.class);
123127

128+
enum ImportSystemType implements TextImport {
129+
SYSTEM_NAMES(TabsRouting.get().resultImportNames(), SYSTEM_NAMES_EXAMPLE, Images.STOCKPILE_SHOPPING_LIST.getIcon()),
130+
SYSTEM_IDS(TabsRouting.get().resultImportIDs(), SYSTEM_IDS_EXAMPLE, Images.LOC_SYSTEM.getIcon());
131+
private final String type;
132+
private final String example;
133+
private final Icon icon;
134+
135+
private ImportSystemType(String type, String example, Icon icon) {
136+
this.type = type;
137+
this.example = example;
138+
this.icon = icon;
139+
}
140+
141+
@Override
142+
public String getType() {
143+
return type;
144+
}
145+
146+
@Override
147+
public String getExample() {
148+
return example;
149+
}
150+
151+
@Override
152+
public Icon getIcon() {
153+
return icon;
154+
}
155+
156+
}
157+
158+
private static final String SYSTEM_NAMES_EXAMPLE =
159+
"Jita\n" +
160+
"Sobaseki\n" +
161+
"Malkalen\n" +
162+
"New Caldari\n" +
163+
"Niyabainen\n" +
164+
"Perimeter\n" +
165+
"Maurasi";
166+
167+
private static final String SYSTEM_IDS_EXAMPLE = "30000142 30001363 30001393 30000145 30000143 30000144 30000140";
168+
124169
private enum RoutingAction {
125170
ADD,
126171
REMOVE,
@@ -135,7 +180,8 @@ private enum RoutingAction {
135180
ROUTE_SAVE,
136181
ROUTE_EDIT,
137182
ROUTE_MANAGE,
138-
ROUTE_IMPORT,
183+
IMPORT_ROUTE_XML,
184+
IMPORT_ROUTE,
139185
ROUTE_EXPORT,
140186
AVOID_ADD,
141187
AVOID_REMOVE,
@@ -959,8 +1005,8 @@ private void processRouteInner() {
9591005
try {
9601006
//Update Graph if needed (AKA filter has changed)
9611007
if (lastSecMin != (Double) jSecurityMinimum.getSelectedItem()
962-
|| lastSecMax != (Double) jSecurityMaximum.getSelectedItem()
963-
|| !lastAvoid.equals(new ArrayList<>(Settings.get().getRoutingSettings().getAvoid().keySet()))) {
1008+
|| lastSecMax != (Double) jSecurityMaximum.getSelectedItem()
1009+
|| !lastAvoid.equals(new ArrayList<>(Settings.get().getRoutingSettings().getAvoid().keySet()))) {
9641010
buildGraph(false);
9651011
lastSecMin = (Double) jSecurityMinimum.getSelectedItem();
9661012
lastSecMax = (Double) jSecurityMaximum.getSelectedItem();
@@ -1414,6 +1460,83 @@ private ImportReturn importOptions(final RouteResult routeResult, final String r
14141460
return importReturn;
14151461
}
14161462

1463+
private boolean makeRoute(List<Route> list) {
1464+
if (list.isEmpty()) {
1465+
JOptionPane.showMessageDialog(program.getMainWindow().getFrame(), TabsRouting.get().resultImportRouteEmpty(), TabsRouting.get().resultImportRoute(), JOptionPane.PLAIN_MESSAGE);
1466+
return false;
1467+
}
1468+
if (list.size() < 2) {
1469+
JOptionPane.showMessageDialog(program.getMainWindow().getFrame(), TabsRouting.get().resultImportRouteInvalid(), TabsRouting.get().resultImportRoute(), JOptionPane.PLAIN_MESSAGE);
1470+
return false;
1471+
}
1472+
RouteResult result;
1473+
try {
1474+
result = JRouteEditDialog.makeRouteResult(program, systemCache, filteredGraph, list, TabsRouting.get().resultImported());
1475+
} catch (DisconnectedGraphException ex) {
1476+
JOptionPane.showMessageDialog(program.getMainWindow().getFrame(),
1477+
ex.getMessage(),
1478+
TabsRouting.get().error(),
1479+
JOptionPane.ERROR_MESSAGE);
1480+
return false;
1481+
}
1482+
if (jResult.isEnabled()) {
1483+
int value = JOptionPane.showConfirmDialog(program.getMainWindow().getFrame(), TabsRouting.get().resultOverwrite(), TabsRouting.get().resultImportRoute(), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
1484+
if (value != JOptionPane.OK_OPTION) {
1485+
return false;
1486+
}
1487+
}
1488+
setRouteResult(result);
1489+
return true;
1490+
}
1491+
1492+
private void importTextRoute(String text, ImportSystemType selected) {
1493+
TextReturn<ImportSystemType> textReturn = jImportSystemsDialog.importText(text, ImportSystemType.values(), selected);
1494+
String importText = textReturn.getText();
1495+
ImportSystemType importSystemType = textReturn.getType();
1496+
if (importText == null || importSystemType == null) {
1497+
return; //Cancel
1498+
}
1499+
if (importText.isEmpty()) {
1500+
JOptionPane.showMessageDialog(program.getMainWindow().getFrame(), TabsRouting.get().resultImportRouteEmpty(), TabsRouting.get().resultImportRoute(), JOptionPane.PLAIN_MESSAGE);
1501+
importTextRoute(importText, importSystemType);
1502+
return;
1503+
}
1504+
List<Route> list = new ArrayList<>();
1505+
if (importSystemType == ImportSystemType.SYSTEM_NAMES) {
1506+
//Build lookup map
1507+
Map<String, SolarSystem> systems = new HashMap<>();
1508+
for (SolarSystem node : systemCache.values()) {
1509+
systems.put(node.getSystem().toLowerCase(), node);
1510+
}
1511+
//For each line, check if the line matches a system name
1512+
1513+
for (String line : importText.split("[\r\n]+")) {
1514+
SolarSystem system = systems.get(line.toLowerCase().trim());
1515+
if (system != null) {
1516+
list.add(new Route(system.getSystemID(), system.getName()));
1517+
}
1518+
}
1519+
} else if (importSystemType == ImportSystemType.SYSTEM_IDS) {
1520+
//For each line, check if the line matches a system name
1521+
for (String line : importText.split("\\s+")) {
1522+
try {
1523+
long systemID = Long.parseLong(line.toLowerCase().trim());
1524+
SolarSystem system = systemCache.get(systemID);
1525+
if (system != null) {
1526+
list.add(new Route(system.getSystemID(), system.getName()));
1527+
}
1528+
} catch (NumberFormatException ex) {
1529+
//Try next line...
1530+
}
1531+
}
1532+
}
1533+
1534+
boolean update = makeRoute(list);
1535+
if (!update) {
1536+
importTextRoute(importText, importSystemType);
1537+
}
1538+
}
1539+
14171540
private class ListenerClass extends MouseAdapter implements ActionListener, ListSelectionListener {
14181541

14191542
@Override
@@ -1500,7 +1623,7 @@ public void actionPerformed(final ActionEvent e) {
15001623
program.saveSettings("Routing (Security)");
15011624
updateFilterLabels();
15021625
} else if (RoutingAction.IMPORT_SYSTEMS.name().equals(e.getActionCommand())) {
1503-
String importText = jImportSystemsDialog.importText();
1626+
String importText = jImportSystemsDialog.importText("", SYSTEM_NAMES_EXAMPLE);
15041627
if (importText == null || importText.isEmpty()) {
15051628
return;
15061629
}
@@ -1595,7 +1718,7 @@ protected void fail() {
15951718
} else if (RoutingAction.ROUTE_MANAGE.name().equals(e.getActionCommand())) {
15961719
jManageRoutesDialog.updateData();
15971720
jManageRoutesDialog.setVisible(true);
1598-
} else if (RoutingAction.ROUTE_IMPORT.name().equals(e.getActionCommand())) {
1721+
} else if (RoutingAction.IMPORT_ROUTE_XML.name().equals(e.getActionCommand())) {
15991722
jFileChooser.setSelectedFile(null);
16001723
jFileChooser.setCurrentDirectory(null);
16011724
int returnValue = jFileChooser.showOpenDialog(program.getMainWindow().getFrame());
@@ -1640,6 +1763,8 @@ protected void fail() {
16401763
}
16411764
Settings.unlock("Routing (Import Route)");
16421765
program.saveSettings("Routing (Import Route)");
1766+
} else if (RoutingAction.IMPORT_ROUTE.name().equals(e.getActionCommand())) {
1767+
importTextRoute("", null);
16431768
} else if (RoutingAction.ROUTE_EXPORT.name().equals(e.getActionCommand())) {
16441769
List<String> selected = jRouteSelectionDialog.show(Settings.get().getRoutingSettings().getRoutes().keySet(), false);
16451770
if (selected == null) {
@@ -1700,7 +1825,6 @@ private class ResultToolbar {
17001825
private final JButton jEveUiSetRoute;
17011826
private final JButton jEditRoute;
17021827
private final JButton jExportRoute;
1703-
private final JButton jImportRoute;
17041828
private final JButton jSaveRoute;
17051829
private final JDropDownButton jLoadRoute;
17061830
private final JMenuItem jManageRoutes;
@@ -1738,10 +1862,21 @@ public ResultToolbar() {
17381862
jExportRoute.addActionListener(listener);
17391863
jExportRoute.setEnabled(false);
17401864

1741-
jImportRoute = new JButton(TabsRouting.get().resultImport(), Images.EDIT_IMPORT.getIcon());
1742-
jImportRoute.setHorizontalAlignment(JButton.LEFT);
1743-
jImportRoute.setActionCommand(RoutingAction.ROUTE_IMPORT.name());
1744-
jImportRoute.addActionListener(listener);
1865+
JDropDownButton jImport = new JDropDownButton(TabsRouting.get().resultImport(), Images.EDIT_IMPORT.getIcon());
1866+
1867+
JMenuItem jImportXml = new JMenuItem(TabsRouting.get().resultImportXml(), Images.TOOL_ROUTING.getIcon());
1868+
jImportXml.setHorizontalAlignment(JButton.LEFT);
1869+
jImportXml.setActionCommand(RoutingAction.IMPORT_ROUTE_XML.name());
1870+
jImportXml.addActionListener(listener);
1871+
jImport.add(jImportXml);
1872+
1873+
jImport.addSeparator();
1874+
1875+
JMenuItem jImportText = new JMenuItem(TabsRouting.get().resultImportText(), Images.STOCKPILE_SHOPPING_LIST.getIcon());
1876+
jImportText.setHorizontalAlignment(JButton.LEFT);
1877+
jImportText.setActionCommand(RoutingAction.IMPORT_ROUTE.name());
1878+
jImportText.addActionListener(listener);
1879+
jImport.add(jImportText);
17451880

17461881
jSaveRoute = new JButton(TabsRouting.get().resultSave(), Images.FILTER_SAVE.getIcon());
17471882
jSaveRoute.setHorizontalAlignment(JButton.LEFT);
@@ -1760,7 +1895,7 @@ public ResultToolbar() {
17601895
.addComponent(jEveUiSetRoute)
17611896
.addComponent(jEditRoute, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
17621897
.addComponent(jExportRoute, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
1763-
.addComponent(jImportRoute, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
1898+
.addComponent(jImport, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
17641899
.addComponent(jSaveRoute, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
17651900
.addComponent(jLoadRoute, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, 100)
17661901
.addContainerGap()
@@ -1771,7 +1906,7 @@ public ResultToolbar() {
17711906
.addComponent(jEveUiSetRoute)
17721907
.addComponent(jEditRoute)
17731908
.addComponent(jExportRoute)
1774-
.addComponent(jImportRoute)
1909+
.addComponent(jImport)
17751910
.addComponent(jSaveRoute)
17761911
.addComponent(jLoadRoute)
17771912
);

‎src/main/java/net/nikr/eve/jeveasset/i18n/TabsRouting.java

+8
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ public TabsRouting(final Locale locale) {
8080
public abstract String resultEmpty();
8181
public abstract String resultExport();
8282
public abstract String resultImport();
83+
public abstract String resultImportIDs();
84+
public abstract String resultImportNames();
85+
public abstract String resultImportRoute();
86+
public abstract String resultImportRouteEmpty();
87+
public abstract String resultImportRouteInvalid();
88+
public abstract String resultImportText();
89+
public abstract String resultImportXml();
90+
public abstract String resultImported();
8391
public abstract String resultLoad();
8492
public abstract String resultManage();
8593
public abstract String resultManageTitle();

‎src/main/resources/net/nikr/eve/jeveasset/i18n/TabsRouting.properties

+8
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ resultEdited=Edited
4747
resultEmpty=Empty
4848
resultExport=Export
4949
resultImport=Import
50+
resultImportIDs=System IDs
51+
resultImportNames=System Names
52+
resultImportRoute=Import Route
53+
resultImportRouteEmpty=Import invalid: No systems found
54+
resultImportRouteInvalid=Import invalid: Require minimum two systems
55+
resultImportText=Text Route
56+
resultImportXml=Routing XML
57+
resultImported=Imported
5058
resultLoad=Load
5159
resultManage=Manage...
5260
resultManageTitle=Manage Routes

0 commit comments

Comments
 (0)
Please sign in to comment.