Move listener class outside of MainWindow.
This commit is contained in:
parent
c624fd9dfd
commit
164a9d4494
14
src/main/org/insa/graphics/BlockingActionListener.java
Normal file
14
src/main/org/insa/graphics/BlockingActionListener.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package org.insa.graphics;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
public abstract class BlockingActionListener implements ActionListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
this.actionAccepted(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void actionAccepted(ActionEvent e);
|
||||||
|
}
|
@ -49,7 +49,6 @@ import org.insa.algo.weakconnectivity.WeaklyConnectedComponentsData;
|
|||||||
import org.insa.graph.Graph;
|
import org.insa.graph.Graph;
|
||||||
import org.insa.graph.Node;
|
import org.insa.graph.Node;
|
||||||
import org.insa.graph.Path;
|
import org.insa.graph.Path;
|
||||||
import org.insa.graph.Point;
|
|
||||||
import org.insa.graph.io.AbstractGraphReader;
|
import org.insa.graph.io.AbstractGraphReader;
|
||||||
import org.insa.graph.io.BinaryGraphReader;
|
import org.insa.graph.io.BinaryGraphReader;
|
||||||
import org.insa.graph.io.BinaryGraphReaderV2;
|
import org.insa.graph.io.BinaryGraphReaderV2;
|
||||||
@ -59,7 +58,6 @@ import org.insa.graph.io.Openfile;
|
|||||||
import org.insa.graphics.drawing.BasicDrawing;
|
import org.insa.graphics.drawing.BasicDrawing;
|
||||||
import org.insa.graphics.drawing.BlackAndWhiteGraphPalette;
|
import org.insa.graphics.drawing.BlackAndWhiteGraphPalette;
|
||||||
import org.insa.graphics.drawing.Drawing;
|
import org.insa.graphics.drawing.Drawing;
|
||||||
import org.insa.graphics.drawing.DrawingClickListener;
|
|
||||||
import org.insa.graphics.drawing.MapViewDrawing;
|
import org.insa.graphics.drawing.MapViewDrawing;
|
||||||
|
|
||||||
public class MainWindow extends JFrame {
|
public class MainWindow extends JFrame {
|
||||||
@ -88,63 +86,6 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
protected class MultiPointsClickListener implements DrawingClickListener {
|
|
||||||
|
|
||||||
// Enable/Disable.
|
|
||||||
private boolean enabled = false;
|
|
||||||
|
|
||||||
// List of points.
|
|
||||||
private ArrayList<Node> points = new ArrayList<Node>();
|
|
||||||
|
|
||||||
// Number of points to find before running.
|
|
||||||
private int nTargetPoints = 0;
|
|
||||||
|
|
||||||
// Callable to call when points are reached.
|
|
||||||
CallableWithNodes callable = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this listener is enabled.
|
|
||||||
*/
|
|
||||||
public boolean isEnabled() {
|
|
||||||
return enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable this listener.
|
|
||||||
*
|
|
||||||
* @param nTargetPoints
|
|
||||||
* Number of point to found before calling the callable.
|
|
||||||
*/
|
|
||||||
public void enable(int nTargetPoints, CallableWithNodes callable) {
|
|
||||||
this.enabled = true;
|
|
||||||
this.nTargetPoints = nTargetPoints;
|
|
||||||
this.points.clear();
|
|
||||||
this.callable = callable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable this listener.
|
|
||||||
*/
|
|
||||||
public void disable() {
|
|
||||||
this.enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseClicked(Point lonlat) {
|
|
||||||
if (!isEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Node node = graph.findClosestNode(lonlat);
|
|
||||||
drawing.drawMarker(node.getPoint(), Color.BLUE);
|
|
||||||
points.add(node);
|
|
||||||
System.out.println("Click at " + lonlat + ", " + points.size() + "/" + nTargetPoints + " in array.");
|
|
||||||
if (points.size() == nTargetPoints) {
|
|
||||||
callable.call(points);
|
|
||||||
this.disable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -168,7 +109,7 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
// Drawing and click adapter.
|
// Drawing and click adapter.
|
||||||
private Drawing drawing;
|
private Drawing drawing;
|
||||||
private MultiPointsClickListener clickAdapter;
|
private MultiPointsClickListener clickAdapter = null;
|
||||||
|
|
||||||
// Main panel.
|
// Main panel.
|
||||||
private JSplitPane mainPanel;
|
private JSplitPane mainPanel;
|
||||||
@ -220,8 +161,7 @@ public class MainWindow extends JFrame {
|
|||||||
this.drawing = new BasicDrawing();
|
this.drawing = new BasicDrawing();
|
||||||
|
|
||||||
// Click adapter
|
// Click adapter
|
||||||
this.clickAdapter = new MultiPointsClickListener();
|
addDrawingClickListeners();
|
||||||
this.drawing.addDrawingClickListener(this.clickAdapter);
|
|
||||||
|
|
||||||
JTextArea infoPanel = new JTextArea();
|
JTextArea infoPanel = new JTextArea();
|
||||||
infoPanel.setMinimumSize(new Dimension(200, 50));
|
infoPanel.setMinimumSize(new Dimension(200, 50));
|
||||||
@ -300,6 +240,11 @@ public class MainWindow extends JFrame {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addDrawingClickListeners() {
|
||||||
|
this.clickAdapter = new MultiPointsClickListener(graph, drawing);
|
||||||
|
drawing.addDrawingClickListener(this.clickAdapter);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateDrawing(Class<? extends Drawing> newClass) {
|
private void updateDrawing(Class<? extends Drawing> newClass) {
|
||||||
|
|
||||||
drawing.clear();
|
drawing.clear();
|
||||||
@ -310,7 +255,7 @@ public class MainWindow extends JFrame {
|
|||||||
catch (InstantiationException | IllegalAccessException e) {
|
catch (InstantiationException | IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
drawing.addDrawingClickListener(this.clickAdapter);
|
addDrawingClickListeners();
|
||||||
}
|
}
|
||||||
mainPanel.setLeftComponent((Component) drawing);
|
mainPanel.setLeftComponent((Component) drawing);
|
||||||
}
|
}
|
||||||
@ -320,9 +265,9 @@ public class MainWindow extends JFrame {
|
|||||||
// Open Map item...
|
// Open Map item...
|
||||||
openMapItem = new JMenuItem("Open Map... ", KeyEvent.VK_O);
|
openMapItem = new JMenuItem("Open Map... ", KeyEvent.VK_O);
|
||||||
openMapItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
|
openMapItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
|
||||||
openMapItem.addActionListener(new ActionListener() {
|
openMapItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
JFileChooser chooser = new JFileChooser();
|
JFileChooser chooser = new JFileChooser();
|
||||||
FileNameExtensionFilter filter = new FileNameExtensionFilter("Map & compressed map files", "map",
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("Map & compressed map files", "map",
|
||||||
"map2", "mapgr", "map.gz");
|
"map2", "mapgr", "map.gz");
|
||||||
@ -373,9 +318,9 @@ public class MainWindow extends JFrame {
|
|||||||
// Open Path item...
|
// Open Path item...
|
||||||
JMenuItem openPathItem = new JMenuItem("Open Path... ", KeyEvent.VK_P);
|
JMenuItem openPathItem = new JMenuItem("Open Path... ", KeyEvent.VK_P);
|
||||||
openPathItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.ALT_MASK));
|
openPathItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.ALT_MASK));
|
||||||
openPathItem.addActionListener(new ActionListener() {
|
openPathItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
JFileChooser chooser = new JFileChooser();
|
JFileChooser chooser = new JFileChooser();
|
||||||
FileNameExtensionFilter filter = new FileNameExtensionFilter("Path & compressed path files", "path",
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("Path & compressed path files", "path",
|
||||||
"path.gz");
|
"path.gz");
|
||||||
@ -411,9 +356,9 @@ public class MainWindow extends JFrame {
|
|||||||
// Close item
|
// Close item
|
||||||
JMenuItem closeItem = new JMenuItem("Quit", KeyEvent.VK_Q);
|
JMenuItem closeItem = new JMenuItem("Quit", KeyEvent.VK_Q);
|
||||||
closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK));
|
closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK));
|
||||||
closeItem.addActionListener(new ActionListener() {
|
closeItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
MainWindow.this.dispatchEvent(new WindowEvent(MainWindow.this, WindowEvent.WINDOW_CLOSING));
|
MainWindow.this.dispatchEvent(new WindowEvent(MainWindow.this, WindowEvent.WINDOW_CLOSING));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -428,9 +373,9 @@ public class MainWindow extends JFrame {
|
|||||||
// Second menu
|
// Second menu
|
||||||
JMenuItem drawGraphItem = new JMenuItem("Redraw", KeyEvent.VK_R);
|
JMenuItem drawGraphItem = new JMenuItem("Redraw", KeyEvent.VK_R);
|
||||||
drawGraphItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK));
|
drawGraphItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK));
|
||||||
drawGraphItem.addActionListener(new ActionListener() {
|
drawGraphItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
launchThread(new Runnable() {
|
launchThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -443,9 +388,9 @@ public class MainWindow extends JFrame {
|
|||||||
graphLockItems.add(drawGraphItem);
|
graphLockItems.add(drawGraphItem);
|
||||||
JMenuItem drawGraphBWItem = new JMenuItem("Redraw (B&W)", KeyEvent.VK_B);
|
JMenuItem drawGraphBWItem = new JMenuItem("Redraw (B&W)", KeyEvent.VK_B);
|
||||||
drawGraphBWItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.ALT_MASK));
|
drawGraphBWItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.ALT_MASK));
|
||||||
drawGraphBWItem.addActionListener(new ActionListener() {
|
drawGraphBWItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
launchThread(new Runnable() {
|
launchThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -458,9 +403,9 @@ public class MainWindow extends JFrame {
|
|||||||
graphLockItems.add(drawGraphBWItem);
|
graphLockItems.add(drawGraphBWItem);
|
||||||
JMenuItem drawGraphMapsforgeItem = new JMenuItem("Redraw (Map)", KeyEvent.VK_M);
|
JMenuItem drawGraphMapsforgeItem = new JMenuItem("Redraw (Map)", KeyEvent.VK_M);
|
||||||
drawGraphMapsforgeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.ALT_MASK));
|
drawGraphMapsforgeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.ALT_MASK));
|
||||||
drawGraphMapsforgeItem.addActionListener(new ActionListener() {
|
drawGraphMapsforgeItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
launchThread(new Runnable() {
|
launchThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -483,9 +428,9 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
// Weakly connected components
|
// Weakly connected components
|
||||||
JMenuItem wccItem = new JMenuItem("Weakly Connected Components");
|
JMenuItem wccItem = new JMenuItem("Weakly Connected Components");
|
||||||
wccItem.addActionListener(new ActionListener() {
|
wccItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
WeaklyConnectedComponentsData instance = new WeaklyConnectedComponentsData(graph);
|
WeaklyConnectedComponentsData instance = new WeaklyConnectedComponentsData(graph);
|
||||||
WeaklyConnectedComponentsAlgorithm algo = new WeaklyConnectedComponentsAlgorithm(instance);
|
WeaklyConnectedComponentsAlgorithm algo = new WeaklyConnectedComponentsAlgorithm(instance);
|
||||||
algo.addObserver(new WeaklyConnectedComponentGraphicObserver(drawing));
|
algo.addObserver(new WeaklyConnectedComponentGraphicObserver(drawing));
|
||||||
@ -501,9 +446,9 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
// Shortest path
|
// Shortest path
|
||||||
JMenuItem bellmanItem = new JMenuItem("Shortest Path (Bellman-Ford)");
|
JMenuItem bellmanItem = new JMenuItem("Shortest Path (Bellman-Ford)");
|
||||||
bellmanItem.addActionListener(new ActionListener() {
|
bellmanItem.addActionListener(new BlockingActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionAccepted(ActionEvent e) {
|
||||||
int idx = JOptionPane.showOptionDialog(MainWindow.this, "Which mode do you want?", "Mode selection",
|
int idx = JOptionPane.showOptionDialog(MainWindow.this, "Which mode do you want?", "Mode selection",
|
||||||
JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, Mode.values(), Mode.LENGTH);
|
JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, Mode.values(), Mode.LENGTH);
|
||||||
|
|
||||||
|
79
src/main/org/insa/graphics/MultiPointsClickListener.java
Normal file
79
src/main/org/insa/graphics/MultiPointsClickListener.java
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package org.insa.graphics;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.insa.graph.Graph;
|
||||||
|
import org.insa.graph.Node;
|
||||||
|
import org.insa.graph.Point;
|
||||||
|
import org.insa.graphics.MainWindow.CallableWithNodes;
|
||||||
|
import org.insa.graphics.drawing.Drawing;
|
||||||
|
import org.insa.graphics.drawing.DrawingClickListener;
|
||||||
|
|
||||||
|
public class MultiPointsClickListener implements DrawingClickListener {
|
||||||
|
|
||||||
|
// Enable/Disable.
|
||||||
|
private boolean enabled = false;
|
||||||
|
|
||||||
|
// List of points.
|
||||||
|
private ArrayList<Node> points = new ArrayList<Node>();
|
||||||
|
|
||||||
|
// Number of points to find before running.
|
||||||
|
private int nTargetPoints = 0;
|
||||||
|
|
||||||
|
// Callable to call when points are reached.
|
||||||
|
CallableWithNodes callable = null;
|
||||||
|
|
||||||
|
// Graph
|
||||||
|
private final Graph graph;
|
||||||
|
|
||||||
|
// Drawing
|
||||||
|
private final Drawing drawing;
|
||||||
|
|
||||||
|
public MultiPointsClickListener(Graph graph, Drawing drawing) {
|
||||||
|
this.graph = graph;
|
||||||
|
this.drawing = drawing;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if this listener is enabled.
|
||||||
|
*/
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable this listener.
|
||||||
|
*
|
||||||
|
* @param nTargetPoints
|
||||||
|
* Number of point to found before calling the callable.
|
||||||
|
*/
|
||||||
|
public void enable(int nTargetPoints, CallableWithNodes callable) {
|
||||||
|
this.enabled = true;
|
||||||
|
this.nTargetPoints = nTargetPoints;
|
||||||
|
this.points.clear();
|
||||||
|
this.callable = callable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable this listener.
|
||||||
|
*/
|
||||||
|
public void disable() {
|
||||||
|
this.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(Point lonlat) {
|
||||||
|
if (!isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Node node = graph.findClosestNode(lonlat);
|
||||||
|
drawing.drawMarker(node.getPoint(), Color.BLUE);
|
||||||
|
points.add(node);
|
||||||
|
if (points.size() == nTargetPoints) {
|
||||||
|
callable.call(points);
|
||||||
|
this.disable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,8 +1,6 @@
|
|||||||
package org.insa.graphics.drawing;
|
package org.insa.graphics.drawing;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.event.MouseAdapter;
|
|
||||||
import java.awt.event.MouseWheelEvent;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -17,10 +15,9 @@ import org.insa.graph.Graph;
|
|||||||
import org.insa.graph.Path;
|
import org.insa.graph.Path;
|
||||||
import org.insa.graph.Point;
|
import org.insa.graph.Point;
|
||||||
import org.insa.graphics.drawing.utils.MarkerUtils;
|
import org.insa.graphics.drawing.utils.MarkerUtils;
|
||||||
|
import org.insa.graphics.drawing.utils.PolylineAutoScaling;
|
||||||
import org.mapsforge.core.graphics.Bitmap;
|
import org.mapsforge.core.graphics.Bitmap;
|
||||||
import org.mapsforge.core.graphics.GraphicFactory;
|
import org.mapsforge.core.graphics.GraphicFactory;
|
||||||
import org.mapsforge.core.graphics.Paint;
|
|
||||||
import org.mapsforge.core.graphics.Style;
|
|
||||||
import org.mapsforge.core.model.BoundingBox;
|
import org.mapsforge.core.model.BoundingBox;
|
||||||
import org.mapsforge.core.model.LatLong;
|
import org.mapsforge.core.model.LatLong;
|
||||||
import org.mapsforge.core.model.MapPosition;
|
import org.mapsforge.core.model.MapPosition;
|
||||||
@ -60,80 +57,14 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
// List of listeners.
|
// List of listeners.
|
||||||
private ArrayList<DrawingClickListener> drawingClickListeners = new ArrayList<>();
|
private ArrayList<DrawingClickListener> drawingClickListeners = new ArrayList<>();
|
||||||
|
|
||||||
// Tile size.
|
// Tile size
|
||||||
int tileSize;
|
private int tileSize;
|
||||||
|
|
||||||
// Extra layers...
|
|
||||||
private static class FixedStrokeWidthLayer {
|
|
||||||
public Paint paint;
|
|
||||||
public int width;
|
|
||||||
|
|
||||||
public FixedStrokeWidthLayer(Paint paint, int width) {
|
|
||||||
this.paint = paint;
|
|
||||||
this.width = width;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
ArrayList<FixedStrokeWidthLayer> extraLayers = new ArrayList<>();
|
|
||||||
|
|
||||||
public MapViewDrawing() {
|
public MapViewDrawing() {
|
||||||
getMapScaleBar().setVisible(true);
|
getMapScaleBar().setVisible(true);
|
||||||
this.tileSize = DEFAULT_TILE_SIZE;
|
|
||||||
DisplayModel model = getModel().displayModel;
|
DisplayModel model = getModel().displayModel;
|
||||||
model.setFixedTileSize(tileSize);
|
this.tileSize = DEFAULT_TILE_SIZE;
|
||||||
|
model.setFixedTileSize(this.tileSize);
|
||||||
addMouseWheelListener(new MouseAdapter() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
|
||||||
for (FixedStrokeWidthLayer f: extraLayers) {
|
|
||||||
f.paint.setStrokeWidth(getStrokeWidth(f.width));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param color
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected int convertColor(Color color) {
|
|
||||||
return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param width
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private int getStrokeWidth(int width) {
|
|
||||||
byte zoomLevel = getModel().mapViewPosition.getZoomLevel();
|
|
||||||
int mul = 2;
|
|
||||||
if (zoomLevel < 8) {
|
|
||||||
mul = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mul += 2 * (zoomLevel - 8) / 3;
|
|
||||||
}
|
|
||||||
return width * mul;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param width
|
|
||||||
* @param color
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private Paint createPaintStroke(int width, Color color) {
|
|
||||||
Paint paintStroke = AwtGraphicFactory.INSTANCE.createPaint();
|
|
||||||
paintStroke.setStyle(Style.STROKE);
|
|
||||||
if (width != 0) {
|
|
||||||
paintStroke.setStrokeWidth(getStrokeWidth(width));
|
|
||||||
}
|
|
||||||
if (color != null) {
|
|
||||||
paintStroke.setColor(convertColor(color));
|
|
||||||
}
|
|
||||||
return paintStroke;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,7 +138,6 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
@Override
|
@Override
|
||||||
public void clear() {
|
public void clear() {
|
||||||
getLayerManager().getLayers().clear();
|
getLayerManager().getLayers().clear();
|
||||||
extraLayers.clear();
|
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,8 +153,7 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawLine(Point from, Point to, int width, Color color) {
|
public void drawLine(Point from, Point to, int width, Color color) {
|
||||||
Paint paintStroke = createPaintStroke(width, color);
|
Polyline line = new PolylineAutoScaling(width, color);
|
||||||
Polyline line = new Polyline(paintStroke, AwtGraphicFactory.INSTANCE);
|
|
||||||
line.getLatLongs().add(convertPoint(from));
|
line.getLatLongs().add(convertPoint(from));
|
||||||
line.getLatLongs().add(convertPoint(to));
|
line.getLatLongs().add(convertPoint(to));
|
||||||
getLayerManager().getLayers().add(line);
|
getLayerManager().getLayers().add(line);
|
||||||
@ -281,16 +210,11 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawPath(Path path, Color color, boolean markers) {
|
public void drawPath(Path path, Color color, boolean markers) {
|
||||||
Paint paintStroke = createPaintStroke(1, DEFAULT_PATH_COLOR);
|
PolylineAutoScaling line = new PolylineAutoScaling(1, DEFAULT_PATH_COLOR);
|
||||||
Polyline line = new Polyline(paintStroke, AwtGraphicFactory.INSTANCE);
|
|
||||||
for (Arc arc: path.getArcs()) {
|
for (Arc arc: path.getArcs()) {
|
||||||
ArrayList<Point> points = arc.getPoints();
|
line.add(arc.getPoints());
|
||||||
for (int i = 0; i < points.size(); ++i) {
|
|
||||||
line.getLatLongs().add(new LatLong(points.get(i).getLatitude(), points.get(i).getLongitude()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
getLayerManager().getLayers().add(line);
|
getLayerManager().getLayers().add(line);
|
||||||
extraLayers.add(new FixedStrokeWidthLayer(paintStroke, 1));
|
|
||||||
if (markers) {
|
if (markers) {
|
||||||
drawMarker(path.getOrigin().getPoint(), DEFAULT_PATH_COLOR);
|
drawMarker(path.getOrigin().getPoint(), DEFAULT_PATH_COLOR);
|
||||||
drawMarker(path.getDestination().getPoint(), DEFAULT_PATH_COLOR);
|
drawMarker(path.getDestination().getPoint(), DEFAULT_PATH_COLOR);
|
||||||
|
35
src/main/org/insa/graphics/drawing/utils/PaintUtils.java
Normal file
35
src/main/org/insa/graphics/drawing/utils/PaintUtils.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package org.insa.graphics.drawing.utils;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
import org.mapsforge.core.graphics.GraphicFactory;
|
||||||
|
import org.mapsforge.map.awt.graphics.AwtGraphicFactory;
|
||||||
|
|
||||||
|
public class PaintUtils {
|
||||||
|
|
||||||
|
// Graphic factory.
|
||||||
|
private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param color
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int convertColor(Color color) {
|
||||||
|
return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param width
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int getStrokeWidth(int width, byte zoomLevel) {
|
||||||
|
int mul = 2;
|
||||||
|
if (zoomLevel < 8) {
|
||||||
|
mul = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mul += 2 * (zoomLevel - 8) / 3;
|
||||||
|
}
|
||||||
|
return width * mul;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package org.insa.graphics.drawing.utils;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.insa.graph.Point;
|
||||||
|
import org.mapsforge.core.graphics.Canvas;
|
||||||
|
import org.mapsforge.core.graphics.GraphicFactory;
|
||||||
|
import org.mapsforge.core.model.BoundingBox;
|
||||||
|
import org.mapsforge.core.model.LatLong;
|
||||||
|
import org.mapsforge.map.awt.graphics.AwtGraphicFactory;
|
||||||
|
import org.mapsforge.map.layer.overlay.Polyline;
|
||||||
|
|
||||||
|
public class PolylineAutoScaling extends Polyline {
|
||||||
|
|
||||||
|
// Graphic factory.
|
||||||
|
private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE;
|
||||||
|
|
||||||
|
// Original width of the polyline.
|
||||||
|
private final int width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param width
|
||||||
|
* @param color
|
||||||
|
*/
|
||||||
|
public PolylineAutoScaling(int width, Color color) {
|
||||||
|
super(GRAPHIC_FACTORY.createPaint(), GRAPHIC_FACTORY);
|
||||||
|
getPaintStroke().setColor(PaintUtils.convertColor(color));
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param point
|
||||||
|
*/
|
||||||
|
public void add(Point point) {
|
||||||
|
getLatLongs().add(new LatLong(point.getLatitude(), point.getLongitude()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param points
|
||||||
|
*/
|
||||||
|
public void add(ArrayList<Point> points) {
|
||||||
|
for (Point point: points) {
|
||||||
|
add(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas,
|
||||||
|
org.mapsforge.core.model.Point topLeftPoint) {
|
||||||
|
|
||||||
|
// Update paint stroke with width for level
|
||||||
|
this.getPaintStroke().setStrokeWidth(PaintUtils.getStrokeWidth(width, zoomLevel));
|
||||||
|
|
||||||
|
super.draw(boundingBox, zoomLevel, canvas, topLeftPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user