New updates.
This commit is contained in:
@@ -14,22 +14,18 @@ import java.util.List;
|
||||
|
||||
import javax.swing.Box;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
import org.insa.algo.AbstractAlgorithm;
|
||||
import org.insa.algo.AbstractInputData;
|
||||
import org.insa.algo.AbstractInputData.ArcFilter;
|
||||
import org.insa.algo.AbstractInputData.Mode;
|
||||
import org.insa.algo.AlgorithmFactory;
|
||||
import org.insa.algo.ArcFilterFactory;
|
||||
import org.insa.algo.ArcInspector;
|
||||
import org.insa.algo.ArcInspectorFactory;
|
||||
import org.insa.graph.Node;
|
||||
import org.insa.graphics.NodesInputPanel.InputChangedEvent;
|
||||
import org.insa.graphics.drawing.Drawing;
|
||||
@@ -55,20 +51,18 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
protected static final int START_EVENT_ID = 0x1;
|
||||
|
||||
private final List<Node> nodes;
|
||||
private final AbstractInputData.Mode mode;
|
||||
private final Class<? extends AbstractAlgorithm<?>> algoClass;
|
||||
|
||||
private final AbstractInputData.ArcFilter arcFilter;
|
||||
private final ArcInspector arcFilter;
|
||||
|
||||
private final boolean graphicVisualization;
|
||||
private final boolean textualVisualization;
|
||||
|
||||
public StartActionEvent(Class<? extends AbstractAlgorithm<?>> algoClass, List<Node> nodes,
|
||||
Mode mode, ArcFilter arcFilter, boolean graphicVisualization,
|
||||
ArcInspector arcFilter, boolean graphicVisualization,
|
||||
boolean textualVisualization) {
|
||||
super(AlgorithmPanel.this, START_EVENT_ID, START_EVENT_COMMAND);
|
||||
this.nodes = nodes;
|
||||
this.mode = mode;
|
||||
this.algoClass = algoClass;
|
||||
this.graphicVisualization = graphicVisualization;
|
||||
this.textualVisualization = textualVisualization;
|
||||
@@ -82,17 +76,10 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
return this.nodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Mode associated with this event.
|
||||
*/
|
||||
public Mode getMode() {
|
||||
return this.mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Arc filter associated with this event.
|
||||
*/
|
||||
public ArcFilter getArcFilter() {
|
||||
public ArcInspector getArcFilter() {
|
||||
return this.arcFilter;
|
||||
}
|
||||
|
||||
@@ -147,16 +134,13 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
* @param baseAlgorithm Base algorithm for this algorithm panel.
|
||||
* @param title Title of the panel.
|
||||
* @param nodeNames Names of the input nodes.
|
||||
* @param enableModeSelection <code>true</code> to enable {@link Mode}
|
||||
* selection.
|
||||
* @param enableArcFilterSelection <code>true</code> to enable {@link ArcFilter}
|
||||
* selection.
|
||||
* @param enableArcFilterSelection <code>true</code> to enable
|
||||
* {@link ArcInspector} selection.
|
||||
*
|
||||
* @see ArcFilterFactory
|
||||
* @see ArcInspectorFactory
|
||||
*/
|
||||
public AlgorithmPanel(Component parent, Class<? extends AbstractAlgorithm<?>> baseAlgorithm,
|
||||
String title, String[] nodeNames, boolean enableModeSelection,
|
||||
boolean enableArcFilterSelection) {
|
||||
String title, String[] nodeNames, boolean enableArcFilterSelection) {
|
||||
super();
|
||||
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
||||
|
||||
@@ -178,20 +162,14 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
add(this.nodesInputPanel);
|
||||
components.add(this.nodesInputPanel);
|
||||
|
||||
JComboBox<ArcFilter> arcFilterSelect = new JComboBox<>(
|
||||
ArcFilterFactory.getAllFilters().toArray(new ArcFilter[0]));
|
||||
JComboBox<ArcInspector> arcFilterSelect = new JComboBox<>(
|
||||
ArcInspectorFactory.getAllFilters().toArray(new ArcInspector[0]));
|
||||
arcFilterSelect.setBackground(Color.WHITE);
|
||||
|
||||
// Add mode selection
|
||||
JPanel modeAndObserverPanel = new JPanel();
|
||||
modeAndObserverPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
modeAndObserverPanel.setLayout(new GridBagLayout());
|
||||
JRadioButton lengthModeButton = new JRadioButton("Length");
|
||||
lengthModeButton.setSelected(true);
|
||||
JRadioButton timeModeButton = new JRadioButton("Time");
|
||||
ButtonGroup group = new ButtonGroup();
|
||||
group.add(lengthModeButton);
|
||||
group.add(timeModeButton);
|
||||
|
||||
graphicObserverCheckbox = new JCheckBox("Graphic");
|
||||
graphicObserverCheckbox.setSelected(true);
|
||||
@@ -201,19 +179,6 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
|
||||
if (enableModeSelection) {
|
||||
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;
|
||||
@@ -236,8 +201,6 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
modeAndObserverPanel.add(arcFilterSelect, c);
|
||||
}
|
||||
|
||||
components.add(timeModeButton);
|
||||
components.add(lengthModeButton);
|
||||
components.add(arcFilterSelect);
|
||||
components.add(textualObserverCheckbox);
|
||||
|
||||
@@ -258,16 +221,12 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||
startAlgoButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
AbstractInputData.Mode mode = lengthModeButton.isSelected()
|
||||
? AbstractInputData.Mode.LENGTH
|
||||
: AbstractInputData.Mode.TIME;
|
||||
|
||||
for (ActionListener lis: startActionListeners) {
|
||||
lis.actionPerformed(new StartActionEvent(
|
||||
AlgorithmFactory.getAlgorithmClass(baseAlgorithm,
|
||||
(String) algoSelect.getSelectedItem()),
|
||||
nodesInputPanel.getNodeForInputs(), mode,
|
||||
(AbstractInputData.ArcFilter) arcFilterSelect.getSelectedItem(),
|
||||
nodesInputPanel.getNodeForInputs(),
|
||||
(ArcInspector) arcFilterSelect.getSelectedItem(),
|
||||
graphicObserverCheckbox.isSelected(),
|
||||
textualObserverCheckbox.isSelected()));
|
||||
}
|
||||
|
@@ -157,7 +157,7 @@ public class MainWindow extends JFrame {
|
||||
this.currentPalette = this.basicPalette;
|
||||
|
||||
wccPanel = new AlgorithmPanel(this, WeaklyConnectedComponentsAlgorithm.class,
|
||||
"Weakly-Connected Components", new String[] {}, false, false);
|
||||
"Weakly-Connected Components", new String[] {}, false);
|
||||
wccPanel.addStartActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@@ -202,13 +202,13 @@ public class MainWindow extends JFrame {
|
||||
});
|
||||
|
||||
spPanel = new AlgorithmPanel(this, ShortestPathAlgorithm.class, "Shortest-Path",
|
||||
new String[] { "Origin", "Destination" }, true, true);
|
||||
new String[] { "Origin", "Destination" }, true);
|
||||
spPanel.addStartActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
StartActionEvent evt = (StartActionEvent) e;
|
||||
ShortestPathData data = new ShortestPathData(graph, evt.getNodes().get(0),
|
||||
evt.getNodes().get(1), evt.getMode(), evt.getArcFilter());
|
||||
evt.getNodes().get(1), evt.getArcFilter());
|
||||
|
||||
ShortestPathAlgorithm spAlgorithm = null;
|
||||
try {
|
||||
@@ -257,11 +257,10 @@ public class MainWindow extends JFrame {
|
||||
cpPanel = new AlgorithmPanel(
|
||||
this, CarPoolingAlgorithm.class, "Car-Pooling", new String[] { "Origin Car",
|
||||
"Origin Pedestrian", "Destination Car", "Destination Pedestrian" },
|
||||
true, true);
|
||||
true);
|
||||
|
||||
psPanel = new AlgorithmPanel(this, PackageSwitchAlgorithm.class, "Car-Pooling",
|
||||
new String[] { "Oribin A", "Origin B", "Destination A", "Destination B" }, true,
|
||||
true);
|
||||
new String[] { "Oribin A", "Origin B", "Destination A", "Destination B" }, true);
|
||||
|
||||
// add algorithm panels
|
||||
algoPanels.add(wccPanel);
|
||||
|
@@ -15,7 +15,6 @@ import java.awt.geom.Point2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
@@ -65,6 +64,11 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The Z level of this overlay (>= 1).
|
||||
*/
|
||||
public abstract int getZLevel();
|
||||
|
||||
@Override
|
||||
public void setColor(Color color) {
|
||||
this.color = color;
|
||||
@@ -88,10 +92,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
|
||||
@Override
|
||||
public void delete() {
|
||||
synchronized (overlays) {
|
||||
BasicDrawing.this.overlays.remove(this);
|
||||
}
|
||||
BasicDrawing.this.repaint();
|
||||
BasicDrawing.this.overlays.remove(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -134,6 +135,10 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
this.alphaMode = alphaMode;
|
||||
}
|
||||
|
||||
public int getZLevel() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point getPoint() {
|
||||
return point;
|
||||
@@ -181,6 +186,10 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public int getZLevel() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColor(Color color) {
|
||||
super.setColor(color);
|
||||
@@ -243,6 +252,10 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
this.graphics.setBackground(new Color(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
public int getZLevel() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColor(Color color) {
|
||||
super.setColor(color);
|
||||
@@ -294,6 +307,68 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Class encapsulating a set of overlays.
|
||||
*
|
||||
*/
|
||||
private class BasicOverlays {
|
||||
|
||||
// List of overlays.
|
||||
private ArrayList<ArrayList<BasicOverlay>> overlays = new ArrayList<>();
|
||||
|
||||
public synchronized void draw(Graphics2D g) {
|
||||
// Clear overlays.
|
||||
for (ArrayList<BasicOverlay> arr: this.overlays) {
|
||||
for (BasicOverlay overlay: arr) {
|
||||
overlay.draw(g);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void remove(BasicOverlay overlay) {
|
||||
overlays.get(overlay.getZLevel() - 1).remove(overlay);
|
||||
BasicDrawing.this.repaint();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
clear(true);
|
||||
}
|
||||
|
||||
public void clear(boolean repaint) {
|
||||
// Clear overlays.
|
||||
for (ArrayList<BasicOverlay> arr: this.overlays) {
|
||||
arr.clear();
|
||||
}
|
||||
// Repaint if requested.
|
||||
if (repaint) {
|
||||
BasicDrawing.this.repaint();
|
||||
}
|
||||
}
|
||||
|
||||
public BasicOverlay add(BasicOverlay marker) {
|
||||
return add(marker, true);
|
||||
}
|
||||
|
||||
public synchronized BasicOverlay add(BasicOverlay overlay, boolean repaint) {
|
||||
|
||||
// Check if we have a level for this...
|
||||
for (int i = overlays.size(); i < overlay.getZLevel(); ++i) {
|
||||
overlays.add(new ArrayList<>());
|
||||
}
|
||||
|
||||
// Add overlay to the given list.
|
||||
overlays.get(overlay.getZLevel() - 1).add(overlay);
|
||||
|
||||
// Repaint if requested.
|
||||
if (repaint) {
|
||||
BasicDrawing.this.repaint();
|
||||
}
|
||||
|
||||
return overlay;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// Default path color.
|
||||
public static final Color DEFAULT_PATH_COLOR = new Color(66, 134, 244);
|
||||
|
||||
@@ -317,8 +392,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
private Graphics2D graphGraphics = null;
|
||||
|
||||
// List of image for markers
|
||||
private List<BasicOverlay> overlays = Collections
|
||||
.synchronizedList(new ArrayList<BasicOverlay>());
|
||||
private BasicOverlays overlays = new BasicOverlays();
|
||||
|
||||
// Mapping DrawingClickListener -> MouseEventListener
|
||||
private List<DrawingClickListener> drawingClickListeners = new ArrayList<>();
|
||||
@@ -391,11 +465,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
}
|
||||
|
||||
// Draw markers
|
||||
synchronized (overlays) {
|
||||
for (BasicOverlay overlay: overlays) {
|
||||
overlay.draw(g);
|
||||
}
|
||||
}
|
||||
this.overlays.draw(g);
|
||||
|
||||
g.setTransform(sTransform);
|
||||
if (this.zoomControls != null) {
|
||||
@@ -416,9 +486,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
if (this.graphGraphics != null) {
|
||||
this.graphGraphics.clearRect(0, 0, this.width, this.height);
|
||||
}
|
||||
synchronized (overlays) {
|
||||
this.overlays.clear();
|
||||
}
|
||||
this.overlays.clear(false);
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
@@ -429,10 +497,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
*/
|
||||
@Override
|
||||
public void clearOverlays() {
|
||||
synchronized (overlays) {
|
||||
this.overlays.clear();
|
||||
}
|
||||
this.repaint();
|
||||
this.overlays.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -495,21 +560,12 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
|
||||
@Override
|
||||
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
||||
BasicMarkerOverlay marker = createMarker(point, outer, inner, mode);
|
||||
synchronized (overlays) {
|
||||
this.overlays.add(marker);
|
||||
}
|
||||
this.repaint();
|
||||
return marker;
|
||||
return (MarkerOverlay) this.overlays.add(createMarker(point, outer, inner, mode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointSetOverlay createPointSetOverlay() {
|
||||
BasicPointSetOverlay ps = new BasicPointSetOverlay();
|
||||
synchronized (overlays) {
|
||||
this.overlays.add(ps);
|
||||
}
|
||||
return ps;
|
||||
return (PointSetOverlay) this.overlays.add(new BasicPointSetOverlay(), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -671,12 +727,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
||||
destination = createMarker(path.getDestination().getPoint(), color, color,
|
||||
AlphaMode.TRANSPARENT);
|
||||
}
|
||||
BasicPathOverlay overlay = new BasicPathOverlay(points, color, origin, destination);
|
||||
synchronized (overlays) {
|
||||
this.overlays.add(overlay);
|
||||
}
|
||||
this.repaint();
|
||||
return overlay;
|
||||
return (PathOverlay) this.overlays
|
||||
.add(new BasicPathOverlay(points, color, origin, destination));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -18,7 +18,8 @@ import org.mapsforge.map.layer.overlay.Marker;
|
||||
* correcting this. Internally, this image stores an {@link Image} instance and
|
||||
* scale it when a redraw is requested.
|
||||
*
|
||||
* @see MarkerUtils#getMarkerForColor(java.awt.Color)
|
||||
* @see MarkerUtils#getMarkerForColor(java.awt.Color, java.awt.Color,
|
||||
* org.insa.graphics.drawing.Drawing.AlphaMode)
|
||||
* @see PaintUtils#getStrokeWidth(int, byte)
|
||||
*/
|
||||
public class MarkerAutoScaling extends Marker {
|
||||
|
@@ -18,8 +18,6 @@ public class MarkerUtils {
|
||||
* @param mode Mode to use to fill the inner part of the marker.
|
||||
*
|
||||
* @return An image representing a marker.
|
||||
*
|
||||
* @see MarkerUtils#getMarkerForColor(Color, AlphaMode)
|
||||
*/
|
||||
public static Image getMarkerForColor(Color outer, Color inner, AlphaMode mode) {
|
||||
// create image
|
||||
|
Reference in New Issue
Block a user