diff --git a/src/main/org/insa/graphics/PathsPanel.java b/src/main/org/insa/graphics/PathsPanel.java
index 5e6a12c..66d6f12 100644
--- a/src/main/org/insa/graphics/PathsPanel.java
+++ b/src/main/org/insa/graphics/PathsPanel.java
@@ -10,16 +10,15 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
-import javax.swing.JComboBox;
+import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
-import javax.swing.JTextArea;
-import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import org.insa.graph.Graph;
@@ -35,7 +34,12 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
*/
private static final long serialVersionUID = 1L;
- private class PathBundle {
+ private class PathPanel extends JPanel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
// Solution
private final Path path;
@@ -50,23 +54,77 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
* @param path Path for this bundle, must not be null.
*
*/
- public PathBundle(Path path) {
+ public PathPanel(Path path) {
+ super();
+ setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
+ setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY),
+ new EmptyBorder(5, 0, 5, 0)));
this.path = path;
this.overlay = drawing.drawPath(this.path);
- }
- /**
- * @return Path associated with this bundle.
- */
- public Path getPath() {
- return this.path;
- }
+ JCheckBox checkbox = new JCheckBox();
+ checkbox.setSelected(true);
+ checkbox.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ overlay.setVisible(checkbox.isSelected());
+ }
+ });
+
+ JLabel infoPanel = new JLabel();
+ String info = "";
+ info += String.format("Length = %.3f kilometers, duration = ", path.getLength() / 1000.);
+ double time = path.getMinimumTravelTime();
+ int hours = (int) (time / 3600);
+ int minutes = (int) (time / 60) % 60;
+ int seconds = ((int) time) % 60;
+ info += String.format("%d hours, %d minutes, %d seconds.", hours, minutes, seconds);
+ infoPanel.setText("" + toString() + "
" + info + "");
+
+ JButton saveButton = new JButton("Save");
+ saveButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String filepath = System.getProperty("user.dir");
+ filepath += File.separator + String.format("path_%s_%d_%d.path",
+ path.getGraph().getMapId().toLowerCase().replaceAll("[^a-z0-9_]", "_"),
+ path.getOrigin().getId(), path.getDestination().getId());
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setSelectedFile(new File(filepath));
+ fileChooser.setApproveButtonText("Save");
+
+ if (fileChooser.showOpenDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) {
+ File file = fileChooser.getSelectedFile();
+ try {
+ BinaryPathWriter writer = new BinaryPathWriter(
+ new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))));
+ writer.writePath(path);
+ }
+ catch (IOException e1) {
+ JOptionPane.showMessageDialog(getTopLevelAncestor(),
+ "Unable to write path to the selected file.");
+ e1.printStackTrace();
+ }
+ }
+ }
+ });
+
+ JButton deleteButton = new JButton("Delete");
+ deleteButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ overlay.delete();
+ PathsPanel.this.removePath(PathPanel.this);
+ }
+ });
+
+ add(checkbox);
+ add(Box.createHorizontalStrut(5));
+ add(infoPanel);
+ add(Box.createHorizontalGlue());
+ add(saveButton);
+ add(deleteButton);
- /**
- * @return Overlay associated with this bundle (never null).
- */
- public PathOverlay getOverlay() {
- return this.overlay;
}
/**
@@ -94,164 +152,34 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
// Solution
private Drawing drawing;
- // Solution selector
- private final JComboBox solutionSelect;
-
- // Map solution -> panel
- private final JTextArea informationPanel;
-
- // Current bundle
- private PathBundle currentBundle = null;
-
public PathsPanel(Component parent) {
super();
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
-
setBorder(new EmptyBorder(15, 15, 15, 15));
- solutionSelect = new JComboBox<>();
- solutionSelect.setBackground(Color.WHITE);
- solutionSelect.setAlignmentX(Component.LEFT_ALIGNMENT);
- add(solutionSelect);
-
- informationPanel = new JTextArea();
- informationPanel.setWrapStyleWord(true);
- informationPanel.setLineWrap(true);
- informationPanel.setOpaque(true);
- informationPanel.setFocusable(false);
- informationPanel.setEditable(false);
- informationPanel.setBackground(UIManager.getColor("Label.background"));
- informationPanel.setFont(UIManager.getFont("Label.font"));
- informationPanel.setBorder(UIManager.getBorder("Label.border"));
- informationPanel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
-
- add(Box.createVerticalStrut(8));
- add(informationPanel);
-
- JButton clearButton = new JButton("Hide");
- clearButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- if (currentBundle != null) {
- if (currentBundle.getOverlay().isVisible()) {
- currentBundle.getOverlay().setVisible(false);
- clearButton.setText("Show");
- }
- else {
- currentBundle.getOverlay().setVisible(true);
- clearButton.setText("Hide");
- }
- }
- }
- });
-
- JButton saveButton = new JButton("Save");
- saveButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- String filepath = System.getProperty("user.dir");
- filepath += File.separator + String.format("path_%s_%d_%d.path",
- currentBundle.getPath().getGraph().getMapId().toLowerCase().replaceAll("[^a-z0-9_]", "_"),
- currentBundle.getPath().getOrigin().getId(), currentBundle.getPath().getDestination().getId());
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setSelectedFile(new File(filepath));
- fileChooser.setApproveButtonText("Save");
-
- if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
- File file = fileChooser.getSelectedFile();
- try {
- BinaryPathWriter writer = new BinaryPathWriter(
- new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))));
- writer.writePath(currentBundle.getPath());
- }
- catch (IOException e1) {
- JOptionPane.showMessageDialog(parent, "Unable to write path to the selected file.");
- e1.printStackTrace();
- }
- }
- }
- });
-
- JPanel buttonPanel = new JPanel();
- buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
- buttonPanel.add(Box.createHorizontalGlue());
- buttonPanel.add(clearButton);
- buttonPanel.add(saveButton);
- buttonPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
-
- add(Box.createVerticalStrut(4));
- add(buttonPanel);
-
- solutionSelect.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
-
- PathBundle bundle = (PathBundle) solutionSelect.getSelectedItem();
-
- // Handle case when the JComboBox is empty.
- if (bundle == null) {
- return;
- }
-
- if (currentBundle != null) {
- currentBundle.getOverlay().setVisible(false);
- }
-
- updateInformationLabel(bundle);
- clearButton.setText("Hide");
- bundle.getOverlay().setVisible(true);
- currentBundle = bundle;
- }
- });
-
// Default hidden
this.setVisible(false);
}
public void addPath(Path path) {
- PathBundle bundle = new PathBundle(path);
- solutionSelect.addItem(bundle);
- solutionSelect.setSelectedItem(bundle);
-
+ this.add(new PathPanel(path));
this.setVisible(true);
+ this.revalidate();
}
- protected void updateInformationLabel(PathBundle bundle) {
- String info = "";
- info += String.format("Length = %.3f kilometers, duration = ", bundle.getPath().getLength() / 1000.);
- double time = bundle.getPath().getMinimumTravelTime();
- int hours = (int) (time / 3600);
- int minutes = (int) (time / 60) % 60;
- int seconds = ((int) time) % 60;
- info += String.format("%d hours, %d minutes, %d seconds.", hours, minutes, seconds);
- informationPanel.setText(info);
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- solutionSelect.setEnabled(enabled);
-
- if (enabled) {
- // Trigger event
- solutionSelect.actionPerformed(null);
- }
- else {
- PathBundle bundle = (PathBundle) this.solutionSelect.getSelectedItem();
- if (bundle != null) {
- bundle.getOverlay().setVisible(false);
- }
+ protected void removePath(PathPanel panel) {
+ PathsPanel.this.remove(panel);
+ PathsPanel.this.validate();
+ PathsPanel.this.repaint();
+ if (this.getComponentCount() == 0) {
+ this.setVisible(false);
}
}
@Override
public void newGraphLoaded(Graph graph) {
- for (int i = 0; i < this.solutionSelect.getItemCount(); ++i) {
- this.solutionSelect.getItemAt(i).getOverlay().delete();
- }
- this.solutionSelect.removeAllItems();
- this.currentBundle = null;
+ this.removeAll();
this.setVisible(false);
}
@@ -264,8 +192,10 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
@Override
public void onRedrawRequest() {
- for (int i = 0; i < this.solutionSelect.getItemCount(); ++i) {
- this.solutionSelect.getItemAt(i).updateOverlay();
+ for (Component c: this.getComponents()) {
+ if (c instanceof PathPanel) {
+ ((PathPanel) c).updateOverlay();
+ }
}
}