diff --git a/res/cross_mark.png b/res/cross_mark.png new file mode 100644 index 0000000..b84f635 Binary files /dev/null and b/res/cross_mark.png differ diff --git a/src/main/org/insa/graphics/PathsPanel.java b/src/main/org/insa/graphics/PathsPanel.java index 6c4c3c6..899b131 100644 --- a/src/main/org/insa/graphics/PathsPanel.java +++ b/src/main/org/insa/graphics/PathsPanel.java @@ -2,6 +2,8 @@ package org.insa.graphics; import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; +import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -15,13 +17,18 @@ import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JColorChooser; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.UIManager; import javax.swing.border.EmptyBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.insa.graph.Graph; import org.insa.graph.Path; @@ -49,6 +56,9 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh // Path Overlay (not final due to redraw) private PathOverlay overlay; + // Color button + private final JButton colorButton; + /** * Create a new bundle with the given path and create a new overlay * corresponding to the path. @@ -59,7 +69,8 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh public PathPanel(Path path) { super(); setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); - setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY), + 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); @@ -107,7 +118,58 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh } }); - JButton saveButton = new JButton("Save"); + colorButton = new JButton(" "); + colorButton.setOpaque(true); + colorButton.setBorderPainted(false); + colorButton.setBackground(this.overlay.getColor()); + colorButton.setBorder(new EmptyBorder(0, 0, 0, 0)); + Dimension size = colorButton.getPreferredSize(); + size.setSize(size.height, size.height); + colorButton.setMinimumSize(size); + colorButton.setPreferredSize(size); + colorButton.setMaximumSize(size); + + colorButton.setToolTipText("Pick a color"); + + colorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final Color originalColor = overlay.getColor(); + JColorChooser chooser = new JColorChooser(overlay.getColor()); + chooser.getSelectionModel().addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + colorButton + .setBackground(chooser.getSelectionModel().getSelectedColor()); + overlay.setColor(chooser.getSelectionModel().getSelectedColor()); + overlay.redraw(); + } + }); + + JColorChooser.createDialog(getTopLevelAncestor(), "Pick a new color", true, + chooser, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + colorButton.setBackground( + chooser.getSelectionModel().getSelectedColor()); + overlay.setColor( + chooser.getSelectionModel().getSelectedColor()); + overlay.redraw(); + } + }, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + colorButton.setBackground(originalColor); + overlay.setColor(originalColor); + overlay.redraw(); + } + }).setVisible(true); + ; + + } + }); + + JButton saveButton = new JButton(UIManager.getIcon("FileView.floppyDriveIcon")); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -118,12 +180,14 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh JFileChooser fileChooser = new JFileChooser(); fileChooser.setSelectedFile(new File(filepath)); fileChooser.setApproveButtonText("Save"); + fileChooser.setToolTipText("Save"); - if (fileChooser.showOpenDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) { + if (fileChooser + .showSaveDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); try { - BinaryPathWriter writer = new BinaryPathWriter( - new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)))); + BinaryPathWriter writer = new BinaryPathWriter(new DataOutputStream( + new BufferedOutputStream(new FileOutputStream(file)))); writer.writePath(path); } catch (IOException e1) { @@ -135,7 +199,13 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh } }); - JButton deleteButton = new JButton("Delete"); + Image newimg = new ImageIcon("res/cross_mark.png").getImage() + .getScaledInstance(size.width, size.height, java.awt.Image.SCALE_SMOOTH); + JButton deleteButton = new JButton(new ImageIcon(newimg)); + deleteButton.setMinimumSize(size); + deleteButton.setMaximumSize(size); + deleteButton.setBorderPainted(true); + deleteButton.setOpaque(false); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -148,6 +218,7 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh add(Box.createHorizontalStrut(5)); add(infoPanel); add(Box.createHorizontalGlue()); + add(colorButton); add(saveButton); add(deleteButton); @@ -160,17 +231,18 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh public void updateOverlay() { PathOverlay oldOverlay = this.overlay; this.overlay = drawing.drawPath(path); + this.colorButton.setBackground(this.overlay.getColor()); this.overlay.setVisible(oldOverlay.isVisible()); oldOverlay.delete(); } /* * (non-Javadoc) - * * @see java.lang.Object#toString() */ public String toString() { - return "Path from #" + path.getOrigin().getId() + " to #" + path.getDestination().getId(); + return "Path from #" + path.getOrigin().getId() + " to #" + + path.getDestination().getId(); } } diff --git a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java index 3cbd885..e249179 100644 --- a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java +++ b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java @@ -102,6 +102,10 @@ public class BasicDrawing extends JPanel implements Drawing { public abstract void drawImpl(Graphics2D g); + public void redraw() { + BasicDrawing.this.repaint(); + } + }; private class BasicMarkerOverlay extends BasicOverlay implements MarkerOverlay { @@ -168,6 +172,13 @@ public class BasicDrawing extends JPanel implements Drawing { this.color = color; } + @Override + public void setColor(Color color) { + super.setColor(color); + this.origin.setColor(color); + this.destination.setColor(color); + } + @Override public void drawImpl(Graphics2D graphics) { diff --git a/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java b/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java index 4eb76af..28d3f2f 100644 --- a/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java +++ b/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java @@ -107,6 +107,10 @@ public class MapViewDrawing extends MapView implements Drawing { } } + @Override + public void redraw() { + MapViewDrawing.this.getLayerManager().redrawLayers(); + } }; /** diff --git a/src/main/org/insa/graphics/drawing/overlays/Overlay.java b/src/main/org/insa/graphics/drawing/overlays/Overlay.java index b95645f..26ad6b5 100644 --- a/src/main/org/insa/graphics/drawing/overlays/Overlay.java +++ b/src/main/org/insa/graphics/drawing/overlays/Overlay.java @@ -33,4 +33,10 @@ public interface Overlay { */ public void delete(); + /** + * Request a redraw of this overlay - This can start a full redraw of the inner + * drawing. + */ + public void redraw(); + }