Add possibility to select in the interface the filtering of the arcs for ShortestPath.

This commit is contained in:
Holt59 2018-03-03 00:27:54 +01:00
parent 5b3690b982
commit 6768374b92
2 changed files with 113 additions and 20 deletions

View File

@ -19,6 +19,7 @@ import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
import javax.swing.JButton;
@ -82,6 +83,15 @@ public class MainWindow extends JFrame {
*/
private static final int THREAD_TIMER_DELAY = 1000; // in milliseconds
private static final String DEFAULT_MAP_FOLDER_KEY = "DefaultMapFolder";
private static final String DEFAULT_MAP_FOLDER_INSA = "/home/commetud/...";
private static final String DEFAULT_PATH_FOLDER_KEY = "DefaultPathFolder";
private static final String DEFAULT_PATH_FOLDER_INSA = "/home/commetud/...";
// Preferences
private Preferences preferences = Preferences.userRoot().node(getClass().getName());
// Current graph.
protected Graph graph;
@ -144,7 +154,7 @@ public class MainWindow extends JFrame {
public void actionPerformed(ActionEvent e) {
StartActionEvent evt = (StartActionEvent) e;
ShortestPathData data = new ShortestPathData(graph, evt.getOrigin(), evt.getDestination(),
evt.getMode());
evt.getMode(), evt.getArcFilter());
ShortestPathAlgorithm spAlgorithm = null;
try {
@ -451,11 +461,20 @@ public class MainWindow extends JFrame {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Graph files", "mapgr");
chooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
File mapFolder = new File(preferences.get(DEFAULT_MAP_FOLDER_KEY, DEFAULT_MAP_FOLDER_INSA));
if (!mapFolder.exists()) {
mapFolder = new File(System.getProperty("user.dir"));
}
chooser.setCurrentDirectory(mapFolder);
chooser.setFileFilter(filter);
if (chooser.showOpenDialog(MainWindow.this) == JFileChooser.APPROVE_OPTION) {
graphFilePath = chooser.getSelectedFile().getAbsolutePath();
// Check...
if (chooser.getSelectedFile().exists()) {
preferences.put(DEFAULT_MAP_FOLDER_KEY, chooser.getSelectedFile().getParent());
}
DataInputStream stream;
try {
stream = new DataInputStream(
@ -478,11 +497,20 @@ public class MainWindow extends JFrame {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Path & compressed path files", "path",
"path.gz");
chooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
FileNameExtensionFilter filter = new FileNameExtensionFilter("Path & compressed path files", "path");
File pathFolder = new File(preferences.get(DEFAULT_PATH_FOLDER_KEY, DEFAULT_PATH_FOLDER_INSA));
if (!pathFolder.exists()) {
pathFolder = new File(System.getProperty("user.dir"));
}
chooser.setCurrentDirectory(pathFolder);
chooser.setFileFilter(filter);
if (chooser.showOpenDialog(MainWindow.this) == JFileChooser.APPROVE_OPTION) {
// Check & Update
if (chooser.getSelectedFile().exists()) {
preferences.put(DEFAULT_PATH_FOLDER_KEY, chooser.getSelectedFile().getParent());
}
BinaryPathReader reader;
try {
reader = new BinaryPathReader(new DataInputStream(

View File

@ -3,7 +3,8 @@ package org.insa.graphics;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
@ -25,8 +26,11 @@ import javax.swing.border.EmptyBorder;
import org.insa.algo.shortestpath.ShortestPathAlgorithm;
import org.insa.algo.shortestpath.ShortestPathAlgorithmFactory;
import org.insa.algo.shortestpath.ShortestPathData.ArcFilter;
import org.insa.algo.shortestpath.ShortestPathData.Mode;
import org.insa.graph.Arc;
import org.insa.graph.Node;
import org.insa.graph.RoadInformation.AccessMode;
import org.insa.graphics.NodesInputPanel.InputChangedEvent;
public class ShortestPathPanel extends JPanel {
@ -51,12 +55,13 @@ public class ShortestPathPanel extends JPanel {
private final Mode mode;
private final Class<? extends ShortestPathAlgorithm> algoClass;
private final ArcFilter arcFilter;
private final boolean graphicVisualization;
private final boolean textualVisualization;
public StartActionEvent(Class<? extends ShortestPathAlgorithm> algoClass, Node origin,
Node destination, Mode mode, boolean graphicVisualization,
boolean textualVisualization) {
public StartActionEvent(Class<? extends ShortestPathAlgorithm> algoClass, Node origin, Node destination,
Mode mode, ArcFilter arcFilter, boolean graphicVisualization, boolean textualVisualization) {
super(ShortestPathPanel.this, START_EVENT_ID, START_EVENT_COMMAND);
this.origin = origin;
this.destination = destination;
@ -64,6 +69,7 @@ public class ShortestPathPanel extends JPanel {
this.algoClass = algoClass;
this.graphicVisualization = graphicVisualization;
this.textualVisualization = textualVisualization;
this.arcFilter = arcFilter;
}
/**
@ -87,6 +93,13 @@ public class ShortestPathPanel extends JPanel {
return this.mode;
}
/**
* @return Arc filter associated with this event.
*/
public ArcFilter getArcFilter() {
return this.arcFilter;
}
/**
* @return Algorithm class associated with this event.
*/
@ -161,10 +174,34 @@ public class ShortestPathPanel extends JPanel {
add(this.nodesInputPanel);
components.add(this.nodesInputPanel);
JComboBox<ArcFilter> arcFilterSelect = new JComboBox<>(new ArcFilter[] { new ArcFilter() {
@Override
public boolean isAllowed(Arc arc) {
return true;
}
@Override
public String toString() {
return "All arcs are allowed";
}
}, new ArcFilter() {
@Override
public boolean isAllowed(Arc arc) {
return arc.getRoadInformation().getAccessRestrictions().isAllowedFor(AccessMode.MOTORCAR)
&& !arc.getRoadInformation().getAccessRestrictions().isPrivate();
}
@Override
public String toString() {
return "Non-private roads allowed for motorcars";
}
} });
arcFilterSelect.setBackground(Color.WHITE);
// Add mode selection
JPanel modeAndObserverPanel = new JPanel();
modeAndObserverPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
modeAndObserverPanel.setLayout(new GridLayout(2, 3));
modeAndObserverPanel.setLayout(new GridBagLayout());
JRadioButton lengthModeButton = new JRadioButton("Length");
lengthModeButton.setSelected(true);
JRadioButton timeModeButton = new JRadioButton("Time");
@ -176,15 +213,44 @@ public class ShortestPathPanel extends JPanel {
graphicObserver.setSelected(true);
JCheckBox textObserver = new JCheckBox("Textual");
modeAndObserverPanel.add(new JLabel("Mode: "));
modeAndObserverPanel.add(lengthModeButton);
modeAndObserverPanel.add(timeModeButton);
modeAndObserverPanel.add(new JLabel("Visualization: "));
modeAndObserverPanel.add(graphicObserver);
modeAndObserverPanel.add(textObserver);
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.weightx = 0;
modeAndObserverPanel.add(new JLabel("Mode: "), c);
c.gridx = 1;
c.weightx = 1;
modeAndObserverPanel.add(lengthModeButton, c);
c.gridx = 2;
c.weightx = 1;
modeAndObserverPanel.add(timeModeButton, c);
c.gridy = 2;
c.gridx = 0;
c.weightx = 0;
modeAndObserverPanel.add(new JLabel("Visualization: "), c);
c.gridx = 1;
c.weightx = 1;
modeAndObserverPanel.add(graphicObserver, c);
c.gridx = 2;
c.weightx = 1;
modeAndObserverPanel.add(textObserver, c);
c.gridy = 1;
c.gridx = 0;
c.weightx = 0;
modeAndObserverPanel.add(new JLabel("Restrictions: "), c);
c.gridx = 1;
c.gridwidth = 2;
c.weightx = 1;
modeAndObserverPanel.add(arcFilterSelect, c);
components.add(timeModeButton);
components.add(lengthModeButton);
components.add(arcFilterSelect);
components.add(graphicObserver);
components.add(textObserver);
@ -211,10 +277,9 @@ public class ShortestPathPanel extends JPanel {
for (ActionListener lis: startActionListeners) {
lis.actionPerformed(new StartActionEvent(
ShortestPathAlgorithmFactory.getAlgorithmClass(
(String) algoSelect.getSelectedItem()),
origin, destination, mode, graphicObserver.isSelected(),
textObserver.isSelected()));
ShortestPathAlgorithmFactory.getAlgorithmClass((String) algoSelect.getSelectedItem()),
origin, destination, mode, (ArcFilter) arcFilterSelect.getSelectedItem(),
graphicObserver.isSelected(), textObserver.isSelected()));
}
}
});