[clean] Apply formatting and add formatter configuration.
This commit is contained in:
parent
2f936d44ec
commit
730cda6426
3
.gitignore
vendored
3
.gitignore
vendored
@ -8,6 +8,7 @@ doc
|
|||||||
*.jar
|
*.jar
|
||||||
.settings
|
.settings
|
||||||
.classpath
|
.classpath
|
||||||
|
.vscode
|
||||||
|
|
||||||
# Editor specific files and folders
|
# Editor specific files and folders
|
||||||
*~
|
*~
|
||||||
@ -17,4 +18,4 @@ doc
|
|||||||
*.mapfg
|
*.mapfg
|
||||||
*.mapgr
|
*.mapgr
|
||||||
*.path
|
*.path
|
||||||
*.tgz
|
*.tgz
|
||||||
|
@ -1,19 +1,16 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<project
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
|
||||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
<artifactId>be-graphes-all</artifactId>
|
<artifactId>be-graphes-all</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>be-graphes-algos</artifactId>
|
<artifactId>be-graphes-algos</artifactId>
|
||||||
<name>be-graphes-algos</name>
|
<name>be-graphes-algos</name>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
@ -21,5 +18,5 @@
|
|||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -19,7 +19,7 @@ public abstract class AbstractAlgorithm<Observer> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new algorithm with an empty list of observers.
|
* Create a new algorithm with an empty list of observers.
|
||||||
*
|
*
|
||||||
* @param data Input data for the algorithm.
|
* @param data Input data for the algorithm.
|
||||||
*/
|
*/
|
||||||
protected AbstractAlgorithm(AbstractInputData data) {
|
protected AbstractAlgorithm(AbstractInputData data) {
|
||||||
@ -29,7 +29,7 @@ public abstract class AbstractAlgorithm<Observer> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new algorithm with the given list of observers.
|
* Create a new algorithm with the given list of observers.
|
||||||
*
|
*
|
||||||
* @param data Input data for the algorithm.
|
* @param data Input data for the algorithm.
|
||||||
* @param observers Initial list of observers for the algorithm.
|
* @param observers Initial list of observers for the algorithm.
|
||||||
*/
|
*/
|
||||||
@ -40,7 +40,7 @@ public abstract class AbstractAlgorithm<Observer> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an observer to this algorithm.
|
* Add an observer to this algorithm.
|
||||||
*
|
*
|
||||||
* @param observer Observer to add to this algorithm.
|
* @param observer Observer to add to this algorithm.
|
||||||
*/
|
*/
|
||||||
public void addObserver(Observer observer) {
|
public void addObserver(Observer observer) {
|
||||||
@ -62,11 +62,9 @@ public abstract class AbstractAlgorithm<Observer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the algorithm and return the solution.
|
* Run the algorithm and return the solution. This methods internally time the call
|
||||||
*
|
* to doRun() and update the result of the call with the computed solving time.
|
||||||
* This methods internally time the call to doRun() and update the result of the
|
*
|
||||||
* call with the computed solving time.
|
|
||||||
*
|
|
||||||
* @return The solution found by the algorithm (may not be a feasible solution).
|
* @return The solution found by the algorithm (may not be a feasible solution).
|
||||||
*/
|
*/
|
||||||
public AbstractSolution run() {
|
public AbstractSolution run() {
|
||||||
@ -78,9 +76,9 @@ public abstract class AbstractAlgorithm<Observer> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract method that should be implemented by child class.
|
* Abstract method that should be implemented by child class.
|
||||||
*
|
*
|
||||||
* @return The solution found, must not be null (use an infeasible or unknown
|
* @return The solution found, must not be null (use an infeasible or unknown status
|
||||||
* status if necessary).
|
* if necessary).
|
||||||
*/
|
*/
|
||||||
protected abstract AbstractSolution doRun();
|
protected abstract AbstractSolution doRun();
|
||||||
|
|
||||||
|
@ -5,16 +5,15 @@ import org.insa.graphs.model.Graph;
|
|||||||
import org.insa.graphs.model.GraphStatistics;
|
import org.insa.graphs.model.GraphStatistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for algorithm input data classes. This class contains the basic
|
* Base class for algorithm input data classes. This class contains the basic data that
|
||||||
* data that are required by most graph algorithms, i.e. a graph, a mode (time /
|
* are required by most graph algorithms, i.e. a graph, a mode (time / length) and a
|
||||||
* length) and a filter for the arc.
|
* filter for the arc.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractInputData {
|
public abstract class AbstractInputData {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum specifying the top mode of the algorithms.
|
* Enum specifying the top mode of the algorithms.
|
||||||
*
|
*
|
||||||
* @see ArcInspector
|
* @see ArcInspector
|
||||||
*/
|
*/
|
||||||
public enum Mode {
|
public enum Mode {
|
||||||
@ -29,7 +28,7 @@ public abstract class AbstractInputData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new AbstractInputData instance for the given graph, mode and filter.
|
* Create a new AbstractInputData instance for the given graph, mode and filter.
|
||||||
*
|
*
|
||||||
* @param graph Graph for this input data.
|
* @param graph Graph for this input data.
|
||||||
* @param arcInspector Arc inspector for this input data.
|
* @param arcInspector Arc inspector for this input data.
|
||||||
*/
|
*/
|
||||||
@ -46,13 +45,11 @@ public abstract class AbstractInputData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the cost associated with the given arc according to the underlying
|
* Retrieve the cost associated with the given arc according to the underlying arc
|
||||||
* arc inspector.
|
* inspector.
|
||||||
*
|
*
|
||||||
* @param arc Arc for which cost should be retrieved.
|
* @param arc Arc for which cost should be retrieved.
|
||||||
*
|
|
||||||
* @return Cost for the given arc.
|
* @return Cost for the given arc.
|
||||||
*
|
|
||||||
* @see ArcInspector
|
* @see ArcInspector
|
||||||
*/
|
*/
|
||||||
public double getCost(Arc arc) {
|
public double getCost(Arc arc) {
|
||||||
@ -61,7 +58,6 @@ public abstract class AbstractInputData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Mode associated with this input data.
|
* @return Mode associated with this input data.
|
||||||
*
|
|
||||||
* @see Mode
|
* @see Mode
|
||||||
*/
|
*/
|
||||||
public Mode getMode() {
|
public Mode getMode() {
|
||||||
@ -70,10 +66,10 @@ public abstract class AbstractInputData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the maximum speed associated with this input data, or
|
* Retrieve the maximum speed associated with this input data, or
|
||||||
* {@link GraphStatistics#NO_MAXIMUM_SPEED} if none is associated. The maximum
|
* {@link GraphStatistics#NO_MAXIMUM_SPEED} if none is associated. The maximum speed
|
||||||
* speed associated with input data is different from the maximum speed
|
* associated with input data is different from the maximum speed associated with
|
||||||
* associated with graph (accessible via {@link Graph#getGraphInformation()}).
|
* graph (accessible via {@link Graph#getGraphInformation()}).
|
||||||
*
|
*
|
||||||
* @return The maximum speed for this inspector, or
|
* @return The maximum speed for this inspector, or
|
||||||
* {@link GraphStatistics#NO_MAXIMUM_SPEED} if none is set.
|
* {@link GraphStatistics#NO_MAXIMUM_SPEED} if none is set.
|
||||||
*/
|
*/
|
||||||
@ -83,11 +79,9 @@ public abstract class AbstractInputData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given arc is allowed for the filter corresponding to this input.
|
* Check if the given arc is allowed for the filter corresponding to this input.
|
||||||
*
|
*
|
||||||
* @param arc Arc to check.
|
* @param arc Arc to check.
|
||||||
*
|
|
||||||
* @return true if the given arc is allowed.
|
* @return true if the given arc is allowed.
|
||||||
*
|
|
||||||
* @see ArcInspector
|
* @see ArcInspector
|
||||||
*/
|
*/
|
||||||
public boolean isAllowed(Arc arc) {
|
public boolean isAllowed(Arc arc) {
|
||||||
|
@ -3,16 +3,14 @@ package org.insa.graphs.algorithm;
|
|||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for solution classes returned by the algorithm. This class
|
* Base class for solution classes returned by the algorithm. This class contains the
|
||||||
* contains the basic information that any solution should have: status of the
|
* basic information that any solution should have: status of the solution (unknown,
|
||||||
* solution (unknown, infeasible, etc.), solving time and the original input
|
* infeasible, etc.), solving time and the original input data.
|
||||||
* data.
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSolution {
|
public abstract class AbstractSolution {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possible status for a solution.
|
* Possible status for a solution.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public enum Status {
|
public enum Status {
|
||||||
UNKNOWN, INFEASIBLE, FEASIBLE, OPTIMAL,
|
UNKNOWN, INFEASIBLE, FEASIBLE, OPTIMAL,
|
||||||
@ -29,7 +27,7 @@ public abstract class AbstractSolution {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new abstract solution with unknown status.
|
* Create a new abstract solution with unknown status.
|
||||||
*
|
*
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
protected AbstractSolution(AbstractInputData data) {
|
protected AbstractSolution(AbstractInputData data) {
|
||||||
@ -39,7 +37,6 @@ public abstract class AbstractSolution {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param data
|
* @param data
|
||||||
* @param status
|
* @param status
|
||||||
*/
|
*/
|
||||||
@ -71,7 +68,7 @@ public abstract class AbstractSolution {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the solving time of this solution.
|
* Set the solving time of this solution.
|
||||||
*
|
*
|
||||||
* @param solvingTime Solving time for the solution.
|
* @param solvingTime Solving time for the solution.
|
||||||
*/
|
*/
|
||||||
protected void setSolvingTime(Duration solvingTime) {
|
protected void setSolvingTime(Duration solvingTime) {
|
||||||
|
@ -5,26 +5,23 @@ import org.insa.graphs.model.Arc;
|
|||||||
import org.insa.graphs.model.GraphStatistics;
|
import org.insa.graphs.model.GraphStatistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class can be used to indicate to an algorithm which arcs can be used and
|
* This class can be used to indicate to an algorithm which arcs can be used and the
|
||||||
* the costs of the usable arcs..
|
* costs of the usable arcs..
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface ArcInspector {
|
public interface ArcInspector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given arc can be used (is allowed).
|
* Check if the given arc can be used (is allowed).
|
||||||
*
|
*
|
||||||
* @param arc Arc to check.
|
* @param arc Arc to check.
|
||||||
*
|
|
||||||
* @return true if the given arc is allowed.
|
* @return true if the given arc is allowed.
|
||||||
*/
|
*/
|
||||||
public boolean isAllowed(Arc arc);
|
public boolean isAllowed(Arc arc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the cost of the given arc.
|
* Find the cost of the given arc.
|
||||||
*
|
*
|
||||||
* @param arc Arc for which the cost should be returned.
|
* @param arc Arc for which the cost should be returned.
|
||||||
*
|
|
||||||
* @return Cost of the arc.
|
* @return Cost of the arc.
|
||||||
*/
|
*/
|
||||||
public double getCost(Arc arc);
|
public double getCost(Arc arc);
|
||||||
@ -40,4 +37,4 @@ public interface ArcInspector {
|
|||||||
*/
|
*/
|
||||||
public Mode getMode();
|
public Mode getMode();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -52,9 +52,10 @@ public class ArcInspectorFactory {
|
|||||||
filters.add(new ArcInspector() {
|
filters.add(new ArcInspector() {
|
||||||
@Override
|
@Override
|
||||||
public boolean isAllowed(Arc arc) {
|
public boolean isAllowed(Arc arc) {
|
||||||
return arc.getRoadInformation().getAccessRestrictions()
|
return arc.getRoadInformation().getAccessRestrictions().isAllowedForAny(
|
||||||
.isAllowedForAny(AccessMode.MOTORCAR, EnumSet.complementOf(EnumSet
|
AccessMode.MOTORCAR,
|
||||||
.of(AccessRestriction.FORBIDDEN, AccessRestriction.PRIVATE)));
|
EnumSet.complementOf(EnumSet.of(AccessRestriction.FORBIDDEN,
|
||||||
|
AccessRestriction.PRIVATE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -110,9 +111,10 @@ public class ArcInspectorFactory {
|
|||||||
filters.add(new ArcInspector() {
|
filters.add(new ArcInspector() {
|
||||||
@Override
|
@Override
|
||||||
public boolean isAllowed(Arc arc) {
|
public boolean isAllowed(Arc arc) {
|
||||||
return arc.getRoadInformation().getAccessRestrictions()
|
return arc.getRoadInformation().getAccessRestrictions().isAllowedForAny(
|
||||||
.isAllowedForAny(AccessMode.MOTORCAR, EnumSet.complementOf(EnumSet
|
AccessMode.MOTORCAR,
|
||||||
.of(AccessRestriction.FORBIDDEN, AccessRestriction.PRIVATE)));
|
EnumSet.complementOf(EnumSet.of(AccessRestriction.FORBIDDEN,
|
||||||
|
AccessRestriction.PRIVATE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -141,15 +143,16 @@ public class ArcInspectorFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAllowed(Arc arc) {
|
public boolean isAllowed(Arc arc) {
|
||||||
return arc.getRoadInformation().getAccessRestrictions()
|
return arc.getRoadInformation().getAccessRestrictions().isAllowedForAny(
|
||||||
.isAllowedForAny(AccessMode.FOOT, EnumSet.complementOf(EnumSet
|
AccessMode.FOOT,
|
||||||
.of(AccessRestriction.FORBIDDEN, AccessRestriction.PRIVATE)));
|
EnumSet.complementOf(EnumSet.of(AccessRestriction.FORBIDDEN,
|
||||||
|
AccessRestriction.PRIVATE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getCost(Arc arc) {
|
public double getCost(Arc arc) {
|
||||||
return arc.getTravelTime(
|
return arc.getTravelTime(Math.min(getMaximumSpeed(),
|
||||||
Math.min(getMaximumSpeed(), arc.getRoadInformation().getMaximumSpeed()));
|
arc.getRoadInformation().getMaximumSpeed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2,7 +2,8 @@ package org.insa.graphs.algorithm.carpooling;
|
|||||||
|
|
||||||
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
|
|
||||||
public abstract class CarPoolingAlgorithm extends AbstractAlgorithm<CarPoolingObserver> {
|
public abstract class CarPoolingAlgorithm
|
||||||
|
extends AbstractAlgorithm<CarPoolingObserver> {
|
||||||
|
|
||||||
protected CarPoolingAlgorithm(CarPoolingData data) {
|
protected CarPoolingAlgorithm(CarPoolingData data) {
|
||||||
super(data);
|
super(data);
|
||||||
|
@ -2,11 +2,12 @@ package org.insa.graphs.algorithm.packageswitch;
|
|||||||
|
|
||||||
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
|
|
||||||
public abstract class PackageSwitchAlgorithm extends AbstractAlgorithm<PackageSwitchObserver> {
|
public abstract class PackageSwitchAlgorithm
|
||||||
|
extends AbstractAlgorithm<PackageSwitchObserver> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new PackageSwitchAlgorithm with the given data.
|
* Create a new PackageSwitchAlgorithm with the given data.
|
||||||
*
|
*
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
protected PackageSwitchAlgorithm(PackageSwitchData data) {
|
protected PackageSwitchAlgorithm(PackageSwitchData data) {
|
||||||
|
@ -41,8 +41,8 @@ public class BellmanFordAlgorithm extends ShortestPathAlgorithm {
|
|||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (int i = 0; !found && i < nbNodes; ++i) {
|
for (int i = 0; !found && i < nbNodes; ++i) {
|
||||||
found = true;
|
found = true;
|
||||||
for (Node node: graph.getNodes()) {
|
for (Node node : graph.getNodes()) {
|
||||||
for (Arc arc: node.getSuccessors()) {
|
for (Arc arc : node.getSuccessors()) {
|
||||||
|
|
||||||
// Small test to check allowed roads...
|
// Small test to check allowed roads...
|
||||||
if (!data.isAllowed(arc)) {
|
if (!data.isAllowed(arc)) {
|
||||||
@ -54,14 +54,16 @@ public class BellmanFordAlgorithm extends ShortestPathAlgorithm {
|
|||||||
double oldDistance = distances[arc.getDestination().getId()];
|
double oldDistance = distances[arc.getDestination().getId()];
|
||||||
double newDistance = distances[node.getId()] + w;
|
double newDistance = distances[node.getId()] + w;
|
||||||
|
|
||||||
if (Double.isInfinite(oldDistance) && Double.isFinite(newDistance)) {
|
if (Double.isInfinite(oldDistance)
|
||||||
|
&& Double.isFinite(newDistance)) {
|
||||||
notifyNodeReached(arc.getDestination());
|
notifyNodeReached(arc.getDestination());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if new distances would be better, if so update...
|
// Check if new distances would be better, if so update...
|
||||||
if (newDistance < oldDistance) {
|
if (newDistance < oldDistance) {
|
||||||
found = false;
|
found = false;
|
||||||
distances[arc.getDestination().getId()] = distances[node.getId()] + w;
|
distances[arc.getDestination().getId()] =
|
||||||
|
distances[node.getId()] + w;
|
||||||
predecessorArcs[arc.getDestination().getId()] = arc;
|
predecessorArcs[arc.getDestination().getId()] = arc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,7 +93,8 @@ public class BellmanFordAlgorithm extends ShortestPathAlgorithm {
|
|||||||
Collections.reverse(arcs);
|
Collections.reverse(arcs);
|
||||||
|
|
||||||
// Create the final solution.
|
// Create the final solution.
|
||||||
solution = new ShortestPathSolution(data, Status.OPTIMAL, new Path(graph, arcs));
|
solution = new ShortestPathSolution(data, Status.OPTIMAL,
|
||||||
|
new Path(graph, arcs));
|
||||||
}
|
}
|
||||||
|
|
||||||
return solution;
|
return solution;
|
||||||
|
@ -3,7 +3,8 @@ package org.insa.graphs.algorithm.shortestpath;
|
|||||||
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
import org.insa.graphs.algorithm.AbstractAlgorithm;
|
||||||
import org.insa.graphs.model.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public abstract class ShortestPathAlgorithm extends AbstractAlgorithm<ShortestPathObserver> {
|
public abstract class ShortestPathAlgorithm
|
||||||
|
extends AbstractAlgorithm<ShortestPathObserver> {
|
||||||
|
|
||||||
protected ShortestPathAlgorithm(ShortestPathData data) {
|
protected ShortestPathAlgorithm(ShortestPathData data) {
|
||||||
super(data);
|
super(data);
|
||||||
@ -24,45 +25,45 @@ public abstract class ShortestPathAlgorithm extends AbstractAlgorithm<ShortestPa
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that the origin has been processed.
|
* Notify all observers that the origin has been processed.
|
||||||
*
|
*
|
||||||
* @param node Origin.
|
* @param node Origin.
|
||||||
*/
|
*/
|
||||||
public void notifyOriginProcessed(Node node) {
|
public void notifyOriginProcessed(Node node) {
|
||||||
for (ShortestPathObserver obs: getObservers()) {
|
for (ShortestPathObserver obs : getObservers()) {
|
||||||
obs.notifyOriginProcessed(node);
|
obs.notifyOriginProcessed(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that a node has been reached for the first time.
|
* Notify all observers that a node has been reached for the first time.
|
||||||
*
|
*
|
||||||
* @param node Node that has been reached.
|
* @param node Node that has been reached.
|
||||||
*/
|
*/
|
||||||
public void notifyNodeReached(Node node) {
|
public void notifyNodeReached(Node node) {
|
||||||
for (ShortestPathObserver obs: getObservers()) {
|
for (ShortestPathObserver obs : getObservers()) {
|
||||||
obs.notifyNodeReached(node);
|
obs.notifyNodeReached(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that a node has been marked, i.e. its final value has
|
* Notify all observers that a node has been marked, i.e. its final value has been
|
||||||
* been set.
|
* set.
|
||||||
*
|
*
|
||||||
* @param node Node that has been marked.
|
* @param node Node that has been marked.
|
||||||
*/
|
*/
|
||||||
public void notifyNodeMarked(Node node) {
|
public void notifyNodeMarked(Node node) {
|
||||||
for (ShortestPathObserver obs: getObservers()) {
|
for (ShortestPathObserver obs : getObservers()) {
|
||||||
obs.notifyNodeMarked(node);
|
obs.notifyNodeMarked(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that the destination has been reached.
|
* Notify all observers that the destination has been reached.
|
||||||
*
|
*
|
||||||
* @param node Destination.
|
* @param node Destination.
|
||||||
*/
|
*/
|
||||||
public void notifyDestinationReached(Node node) {
|
public void notifyDestinationReached(Node node) {
|
||||||
for (ShortestPathObserver obs: getObservers()) {
|
for (ShortestPathObserver obs : getObservers()) {
|
||||||
obs.notifyDestinationReached(node);
|
obs.notifyDestinationReached(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,15 @@ public class ShortestPathData extends AbstractInputData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new instance of ShortestPathInputData with the given parameters.
|
* Construct a new instance of ShortestPathInputData with the given parameters.
|
||||||
*
|
*
|
||||||
* @param graph Graph in which the path should be looked for.
|
* @param graph Graph in which the path should be looked for.
|
||||||
* @param origin Origin node of the path.
|
* @param origin Origin node of the path.
|
||||||
* @param destination Destination node of the path.
|
* @param destination Destination node of the path.
|
||||||
* @param arcInspector Filter for arcs (used to allow only a specific set of
|
* @param arcInspector Filter for arcs (used to allow only a specific set of arcs in
|
||||||
* arcs in the graph to be used).
|
* the graph to be used).
|
||||||
*/
|
*/
|
||||||
public ShortestPathData(Graph graph, Node origin, Node destination, ArcInspector arcInspector) {
|
public ShortestPathData(Graph graph, Node origin, Node destination,
|
||||||
|
ArcInspector arcInspector) {
|
||||||
super(graph, arcInspector);
|
super(graph, arcInspector);
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
this.destination = destination;
|
this.destination = destination;
|
||||||
@ -41,7 +42,7 @@ public class ShortestPathData extends AbstractInputData {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Shortest-path from #" + origin.getId() + " to #" + destination.getId() + " ["
|
return "Shortest-path from #" + origin.getId() + " to #" + destination.getId()
|
||||||
+ this.arcInspector.toString().toLowerCase() + "]";
|
+ " [" + this.arcInspector.toString().toLowerCase() + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,35 +3,34 @@ package org.insa.graphs.algorithm.shortestpath;
|
|||||||
import org.insa.graphs.model.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public interface ShortestPathObserver {
|
public interface ShortestPathObserver {
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify the observer that the origin has been processed.
|
|
||||||
*
|
|
||||||
* @param node Origin.
|
|
||||||
*/
|
|
||||||
public void notifyOriginProcessed(Node node);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify the observer that a node has been reached for the first
|
|
||||||
* time.
|
|
||||||
*
|
|
||||||
* @param node Node that has been reached.
|
|
||||||
*/
|
|
||||||
public void notifyNodeReached(Node node);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify the observer that a node has been marked, i.e. its final
|
|
||||||
* value has been set.
|
|
||||||
*
|
|
||||||
* @param node Node that has been marked.
|
|
||||||
*/
|
|
||||||
public void notifyNodeMarked(Node node);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify the observer that the destination has been reached.
|
* Notify the observer that the origin has been processed.
|
||||||
*
|
*
|
||||||
* @param node Destination.
|
* @param node Origin.
|
||||||
*/
|
*/
|
||||||
public void notifyDestinationReached(Node node);
|
public void notifyOriginProcessed(Node node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the observer that a node has been reached for the first time.
|
||||||
|
*
|
||||||
|
* @param node Node that has been reached.
|
||||||
|
*/
|
||||||
|
public void notifyNodeReached(Node node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the observer that a node has been marked, i.e. its final value has been
|
||||||
|
* set.
|
||||||
|
*
|
||||||
|
* @param node Node that has been marked.
|
||||||
|
*/
|
||||||
|
public void notifyNodeMarked(Node node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the observer that the destination has been reached.
|
||||||
|
*
|
||||||
|
* @param node Destination.
|
||||||
|
*/
|
||||||
|
public void notifyDestinationReached(Node node);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,8 @@ public class ShortestPathSolution extends AbstractSolution {
|
|||||||
private final Path path;
|
private final Path path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new infeasible shortest-path solution for the given input and
|
* Create a new infeasible shortest-path solution for the given input and status.
|
||||||
* status.
|
*
|
||||||
*
|
|
||||||
* @param data Original input data for this solution.
|
* @param data Original input data for this solution.
|
||||||
* @param status Status of the solution (UNKNOWN / INFEASIBLE).
|
* @param status Status of the solution (UNKNOWN / INFEASIBLE).
|
||||||
*/
|
*/
|
||||||
@ -24,7 +23,7 @@ public class ShortestPathSolution extends AbstractSolution {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new shortest-path solution.
|
* Create a new shortest-path solution.
|
||||||
*
|
*
|
||||||
* @param data Original input data for this solution.
|
* @param data Original input data for this solution.
|
||||||
* @param status Status of the solution (FEASIBLE / OPTIMAL).
|
* @param status Status of the solution (FEASIBLE / OPTIMAL).
|
||||||
* @param path Path corresponding to the solution.
|
* @param path Path corresponding to the solution.
|
||||||
@ -51,15 +50,17 @@ public class ShortestPathSolution extends AbstractSolution {
|
|||||||
String info = null;
|
String info = null;
|
||||||
if (!isFeasible()) {
|
if (!isFeasible()) {
|
||||||
info = String.format("No path found from node #%d to node #%d",
|
info = String.format("No path found from node #%d to node #%d",
|
||||||
getInputData().getOrigin().getId(), getInputData().getDestination().getId());
|
getInputData().getOrigin().getId(),
|
||||||
|
getInputData().getDestination().getId());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
double cost = 0;
|
double cost = 0;
|
||||||
for (Arc arc: getPath().getArcs()) {
|
for (Arc arc : getPath().getArcs()) {
|
||||||
cost += getInputData().getCost(arc);
|
cost += getInputData().getCost(arc);
|
||||||
}
|
}
|
||||||
info = String.format("Found a path from node #%d to node #%d",
|
info = String.format("Found a path from node #%d to node #%d",
|
||||||
getInputData().getOrigin().getId(), getInputData().getDestination().getId());
|
getInputData().getOrigin().getId(),
|
||||||
|
getInputData().getDestination().getId());
|
||||||
if (getInputData().getMode() == Mode.LENGTH) {
|
if (getInputData().getMode() == Mode.LENGTH) {
|
||||||
info = String.format("%s, %.4f kilometers", info, cost / 1000.0);
|
info = String.format("%s, %.4f kilometers", info, cost / 1000.0);
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,9 @@ package org.insa.graphs.algorithm.utils;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements a binary heap containing elements of type E.
|
* Implements a binary heap containing elements of type E. Note that all comparisons are
|
||||||
|
* based on the compareTo method, hence E must implement Comparable
|
||||||
*
|
*
|
||||||
* Note that all comparisons are based on the compareTo method, hence E must
|
|
||||||
* implement Comparable
|
|
||||||
*
|
|
||||||
* @author Mark Allen Weiss
|
* @author Mark Allen Weiss
|
||||||
* @author DLB
|
* @author DLB
|
||||||
*/
|
*/
|
||||||
@ -29,7 +27,7 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a copy of the given heap.
|
* Construct a copy of the given heap.
|
||||||
*
|
*
|
||||||
* @param heap Binary heap to copy.
|
* @param heap Binary heap to copy.
|
||||||
*/
|
*/
|
||||||
public BinaryHeap(BinaryHeap<E> heap) {
|
public BinaryHeap(BinaryHeap<E> heap) {
|
||||||
@ -39,7 +37,7 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an element at the given index.
|
* Set an element at the given index.
|
||||||
*
|
*
|
||||||
* @param index Index at which the element should be set.
|
* @param index Index at which the element should be set.
|
||||||
* @param value Element to set.
|
* @param value Element to set.
|
||||||
*/
|
*/
|
||||||
@ -68,15 +66,14 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method to percolate up in the heap.
|
* Internal method to percolate up in the heap.
|
||||||
*
|
*
|
||||||
* @param index Index at which the percolate begins.
|
* @param index Index at which the percolate begins.
|
||||||
*/
|
*/
|
||||||
private void percolateUp(int index) {
|
private void percolateUp(int index) {
|
||||||
E x = this.array.get(index);
|
E x = this.array.get(index);
|
||||||
|
|
||||||
for (; index > 0
|
for (; index > 0 && x.compareTo(this.array.get(indexParent(index))) < 0; index =
|
||||||
&& x.compareTo(this.array.get(indexParent(index))) < 0; index = indexParent(
|
indexParent(index)) {
|
||||||
index)) {
|
|
||||||
E moving_val = this.array.get(indexParent(index));
|
E moving_val = this.array.get(indexParent(index));
|
||||||
this.arraySet(index, moving_val);
|
this.arraySet(index, moving_val);
|
||||||
}
|
}
|
||||||
@ -86,7 +83,7 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method to percolate down in the heap.
|
* Internal method to percolate down in the heap.
|
||||||
*
|
*
|
||||||
* @param index Index at which the percolate begins.
|
* @param index Index at which the percolate begins.
|
||||||
*/
|
*/
|
||||||
private void percolateDown(int index) {
|
private void percolateDown(int index) {
|
||||||
@ -158,7 +155,7 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a sorted view of this binary heap.
|
* Creates a multi-lines string representing a sorted view of this binary heap.
|
||||||
*
|
*
|
||||||
* @return a string containing a sorted view this binary heap.
|
* @return a string containing a sorted view this binary heap.
|
||||||
*/
|
*/
|
||||||
public String toStringSorted() {
|
public String toStringSorted() {
|
||||||
@ -167,10 +164,9 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a sorted view of this binary heap.
|
* Creates a multi-lines string representing a sorted view of this binary heap.
|
||||||
*
|
*
|
||||||
* @param maxElement Maximum number of elements to display. or {@code -1} to
|
* @param maxElement Maximum number of elements to display. or {@code -1} to display
|
||||||
* display all the elements.
|
* all the elements.
|
||||||
*
|
|
||||||
* @return a string containing a sorted view this binary heap.
|
* @return a string containing a sorted view this binary heap.
|
||||||
*/
|
*/
|
||||||
public String toStringSorted(int maxElement) {
|
public String toStringSorted(int maxElement) {
|
||||||
@ -179,7 +175,7 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a tree view of this binary heap.
|
* Creates a multi-lines string representing a tree view of this binary heap.
|
||||||
*
|
*
|
||||||
* @return a string containing a tree view of this binary heap.
|
* @return a string containing a tree view of this binary heap.
|
||||||
*/
|
*/
|
||||||
public String toStringTree() {
|
public String toStringTree() {
|
||||||
@ -188,9 +184,8 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a tree view of this binary heap.
|
* Creates a multi-lines string representing a tree view of this binary heap.
|
||||||
*
|
*
|
||||||
* @param maxDepth Maximum depth of the tree to display.
|
* @param maxDepth Maximum depth of the tree to display.
|
||||||
*
|
|
||||||
* @return a string containing a tree view of this binary heap.
|
* @return a string containing a tree view of this binary heap.
|
||||||
*/
|
*/
|
||||||
public String toStringTree(int maxDepth) {
|
public String toStringTree(int maxDepth) {
|
||||||
|
@ -7,7 +7,6 @@ public class BinaryHeapFormatter {
|
|||||||
/**
|
/**
|
||||||
* This class is used by {@link #toStringTree}, and simply contains three string
|
* This class is used by {@link #toStringTree}, and simply contains three string
|
||||||
* accumulating. This is an immutable class.
|
* accumulating. This is an immutable class.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private static class Context {
|
private static class Context {
|
||||||
|
|
||||||
@ -22,9 +21,9 @@ public class BinaryHeapFormatter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creaet a new {@code Context}.
|
* Creaet a new {@code Context}.
|
||||||
*
|
*
|
||||||
* @param acu The accumulated string.
|
* @param acu The accumulated string.
|
||||||
* @param margin The current margin.
|
* @param margin The current margin.
|
||||||
* @param lastMargin The last margin used.
|
* @param lastMargin The last margin used.
|
||||||
*/
|
*/
|
||||||
public Context(String acu, String margin, String lastMargin) {
|
public Context(String acu, String margin, String lastMargin) {
|
||||||
@ -35,9 +34,8 @@ public class BinaryHeapFormatter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new context by appending newlines to this context.
|
* Creates a new context by appending newlines to this context.
|
||||||
*
|
*
|
||||||
* @param n Number of newlines to append.
|
* @param n Number of newlines to append.
|
||||||
*
|
|
||||||
* @return a new context with {@code n} newlines appended.
|
* @return a new context with {@code n} newlines appended.
|
||||||
*/
|
*/
|
||||||
public Context appendNewlines(int n) {
|
public Context appendNewlines(int n) {
|
||||||
@ -45,40 +43,40 @@ public class BinaryHeapFormatter {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return (new Context(this.acu + "\n" + this.margin, this.margin, this.lastmargin)
|
return (new Context(this.acu + "\n" + this.margin, this.margin,
|
||||||
.appendNewlines(n - 1));
|
this.lastmargin).appendNewlines(n - 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new context by appending the given string to this context.
|
* Creates a new context by appending the given string to this context.
|
||||||
*
|
*
|
||||||
* @param count Number of spaces to add to the margin, or {@code null} to use
|
* @param count Number of spaces to add to the margin, or {@code null} to use
|
||||||
* the length of the string.
|
* the length of the string.
|
||||||
* @param text String to append.
|
* @param text String to append.
|
||||||
*
|
|
||||||
* @return a new context with {@code text} appended.
|
* @return a new context with {@code text} appended.
|
||||||
*/
|
*/
|
||||||
public Context appendText(Integer count, String text) {
|
public Context appendText(Integer count, String text) {
|
||||||
int cnt = (count == null) ? text.length() : count;
|
int cnt = (count == null) ? text.length() : count;
|
||||||
final String spaces = new String(new char[cnt]).replace('\0', ' ');
|
final String spaces = new String(new char[cnt]).replace('\0', ' ');
|
||||||
return new Context(this.acu + text, this.margin + spaces, this.lastmargin + spaces);
|
return new Context(this.acu + text, this.margin + spaces,
|
||||||
|
this.lastmargin + spaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new context by appending a branch to this context.
|
* Creates a new context by appending a branch to this context.
|
||||||
*
|
*
|
||||||
* @param n Number of spaces to add to the margin, or {@code null} to use
|
* @param n Number of spaces to add to the margin, or {@code null} to use the
|
||||||
* the length of the string.
|
* length of the string.
|
||||||
* @param label Name of the branch.
|
* @param label Name of the branch.
|
||||||
*
|
|
||||||
* @return a new context with the branch appended.
|
* @return a new context with the branch appended.
|
||||||
*/
|
*/
|
||||||
public Context appendBranch(Integer count, String label) {
|
public Context appendBranch(Integer count, String label) {
|
||||||
final Context ctxt = this.appendText(count, label);
|
final Context ctxt = this.appendText(count, label);
|
||||||
|
|
||||||
if (count == null) {
|
if (count == null) {
|
||||||
return new Context(ctxt.acu + "_", ctxt.margin + "|", ctxt.margin + " ");
|
return new Context(ctxt.acu + "_", ctxt.margin + "|",
|
||||||
|
ctxt.margin + " ");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return new Context(ctxt.acu, ctxt.margin + "|", ctxt.margin + " ")
|
return new Context(ctxt.acu, ctxt.margin + "|", ctxt.margin + " ")
|
||||||
@ -89,8 +87,8 @@ public class BinaryHeapFormatter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Input : ready to write the current node at the current context position.
|
* Input : ready to write the current node at the current context position. Output :
|
||||||
* Output : the last character of acu is the last character of the current node.
|
* the last character of acu is the last character of the current node.
|
||||||
*/
|
*/
|
||||||
protected static <E extends Comparable<E>> Context toStringLoop(BinaryHeap<E> heap,
|
protected static <E extends Comparable<E>> Context toStringLoop(BinaryHeap<E> heap,
|
||||||
Context ctxt, int node, int max_depth) {
|
Context ctxt, int node, int max_depth) {
|
||||||
@ -122,13 +120,16 @@ public class BinaryHeapFormatter {
|
|||||||
int child = childs.get(ch);
|
int child = childs.get(ch);
|
||||||
|
|
||||||
if (is_last) {
|
if (is_last) {
|
||||||
Context ctxt3 = new Context(ctxt2.acu, ctxt2.lastmargin, ctxt2.lastmargin);
|
Context ctxt3 =
|
||||||
ctxt2 = new Context(toStringLoop(heap, ctxt3.appendText(null, "___"), child,
|
new Context(ctxt2.acu, ctxt2.lastmargin, ctxt2.lastmargin);
|
||||||
max_depth - 1).acu, ctxt2.margin, ctxt2.lastmargin);
|
ctxt2 = new Context(toStringLoop(heap,
|
||||||
|
ctxt3.appendText(null, "___"), child, max_depth - 1).acu,
|
||||||
|
ctxt2.margin, ctxt2.lastmargin);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ctxt2 = new Context(toStringLoop(heap, ctxt2.appendText(null, "___"), child,
|
ctxt2 = new Context(toStringLoop(heap,
|
||||||
max_depth - 1).acu, ctxt2.margin, ctxt2.lastmargin).appendNewlines(2);
|
ctxt2.appendText(null, "___"), child, max_depth - 1).acu,
|
||||||
|
ctxt2.margin, ctxt2.lastmargin).appendNewlines(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,28 +138,25 @@ public class BinaryHeapFormatter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a tree view of the given binary
|
* Creates a multi-lines string representing a tree view of the given binary heap.
|
||||||
* heap.
|
*
|
||||||
*
|
* @param heap The binary heap to display.
|
||||||
* @param heap The binary heap to display.
|
|
||||||
* @param maxDepth Maximum depth of the tree to display.
|
* @param maxDepth Maximum depth of the tree to display.
|
||||||
*
|
|
||||||
* @return a string containing a tree view of the given binary heap.
|
* @return a string containing a tree view of the given binary heap.
|
||||||
*/
|
*/
|
||||||
public static <E extends Comparable<E>> String toStringTree(BinaryHeap<E> heap, int maxDepth) {
|
public static <E extends Comparable<E>> String toStringTree(BinaryHeap<E> heap,
|
||||||
|
int maxDepth) {
|
||||||
final Context init_context = new Context(" ", " ", " ");
|
final Context init_context = new Context(" ", " ", " ");
|
||||||
final Context result = toStringLoop(heap, init_context, 0, maxDepth);
|
final Context result = toStringLoop(heap, init_context, 0, maxDepth);
|
||||||
return result.acu;
|
return result.acu;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a multi-lines string representing a sorted view of the given binary
|
* Creates a multi-lines string representing a sorted view of the given binary heap.
|
||||||
* heap.
|
*
|
||||||
*
|
* @param heap The binary heap to display.
|
||||||
* @param heap The binary heap to display.
|
* @param maxElement Maximum number of elements to display. or {@code -1} to display
|
||||||
* @param maxElement Maximum number of elements to display. or {@code -1} to
|
* all the elements.
|
||||||
* display all the elements.
|
|
||||||
*
|
|
||||||
* @return a string containing a sorted view the given binary heap.
|
* @return a string containing a sorted view the given binary heap.
|
||||||
*/
|
*/
|
||||||
public static <E extends Comparable<E>> String toStringSorted(BinaryHeap<E> heap,
|
public static <E extends Comparable<E>> String toStringSorted(BinaryHeap<E> heap,
|
||||||
@ -174,7 +172,8 @@ public class BinaryHeapFormatter {
|
|||||||
truncate = ", only " + max_elements + " elements are shown";
|
truncate = ", only " + max_elements + " elements are shown";
|
||||||
}
|
}
|
||||||
|
|
||||||
result += "======== Sorted HEAP (size = " + heap.size() + truncate + ") ========\n\n";
|
result += "======== Sorted HEAP (size = " + heap.size() + truncate
|
||||||
|
+ ") ========\n\n";
|
||||||
|
|
||||||
while (!copy.isEmpty() && max_elements-- != 0) {
|
while (!copy.isEmpty() && max_elements-- != 0) {
|
||||||
result += copy.deleteMin() + "\n";
|
result += copy.deleteMin() + "\n";
|
||||||
|
@ -17,7 +17,7 @@ public class BinarySearchTree<E extends Comparable<E>> implements PriorityQueue<
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a copy of the given binary search tree.
|
* Create a copy of the given binary search tree.
|
||||||
*
|
*
|
||||||
* @param bst Binary search tree to copy.
|
* @param bst Binary search tree to copy.
|
||||||
*/
|
*/
|
||||||
public BinarySearchTree(BinarySearchTree<E> bst) {
|
public BinarySearchTree(BinarySearchTree<E> bst) {
|
||||||
|
@ -3,7 +3,7 @@ package org.insa.graphs.algorithm.utils;
|
|||||||
public class ElementNotFoundException extends RuntimeException {
|
public class ElementNotFoundException extends RuntimeException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ -3,14 +3,13 @@ package org.insa.graphs.algorithm.utils;
|
|||||||
public class EmptyPriorityQueueException extends RuntimeException {
|
public class EmptyPriorityQueueException extends RuntimeException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public EmptyPriorityQueueException() {
|
public EmptyPriorityQueueException() {}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,79 +1,69 @@
|
|||||||
package org.insa.graphs.algorithm.utils;
|
package org.insa.graphs.algorithm.utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing a basic priority queue.
|
* Interface representing a basic priority queue. Implementation should enforce the
|
||||||
*
|
* required complexity of each method.
|
||||||
* Implementation should enforce the required complexity of each method.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface PriorityQueue<E extends Comparable<E>> {
|
public interface PriorityQueue<E extends Comparable<E>> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the priority queue is empty.
|
* Check if the priority queue is empty.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(1)</i>
|
* <b>Complexity:</b> <i>O(1)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return true if the queue is empty, false otherwise.
|
* @return true if the queue is empty, false otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean isEmpty();
|
public boolean isEmpty();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of elements in this queue.
|
* Get the number of elements in this queue.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(1)</i>
|
* <b>Complexity:</b> <i>O(1)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return Current size (number of elements) of this queue.
|
* @return Current size (number of elements) of this queue.
|
||||||
*/
|
*/
|
||||||
public int size();
|
public int size();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert the given element into the queue.
|
* Insert the given element into the queue.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(log n)</i>
|
* <b>Complexity:</b> <i>O(log n)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param x Item to insert.
|
* @param x Item to insert.
|
||||||
*/
|
*/
|
||||||
public void insert(E x);
|
public void insert(E x);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given element from the priority queue.
|
* Remove the given element from the priority queue.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(log n)</i>
|
* <b>Complexity:</b> <i>O(log n)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param x Item to remove.
|
* @param x Item to remove.
|
||||||
*/
|
*/
|
||||||
public void remove(E x) throws ElementNotFoundException;
|
public void remove(E x) throws ElementNotFoundException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve (but not remove) the smallest item in the queue.
|
* Retrieve (but not remove) the smallest item in the queue.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(1)</i>
|
* <b>Complexity:</b> <i>O(1)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return The smallest item in the queue.
|
* @return The smallest item in the queue.
|
||||||
*
|
|
||||||
* @throws EmptyPriorityQueueException if this queue is empty.
|
* @throws EmptyPriorityQueueException if this queue is empty.
|
||||||
*/
|
*/
|
||||||
public E findMin() throws EmptyPriorityQueueException;
|
public E findMin() throws EmptyPriorityQueueException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove and return the smallest item from the priority queue.
|
* Remove and return the smallest item from the priority queue.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* <b>Complexity:</b> <i>O(log n)</i>
|
* <b>Complexity:</b> <i>O(log n)</i>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return The smallest item in the queue.
|
* @return The smallest item in the queue.
|
||||||
*
|
|
||||||
* @throws EmptyPriorityQueueException if this queue is empty.
|
* @throws EmptyPriorityQueueException if this queue is empty.
|
||||||
*/
|
*/
|
||||||
public E deleteMin() throws EmptyPriorityQueueException;
|
public E deleteMin() throws EmptyPriorityQueueException;
|
||||||
|
@ -6,25 +6,25 @@ import org.insa.graphs.model.Node;
|
|||||||
|
|
||||||
public interface WeaklyConnectedComponentObserver {
|
public interface WeaklyConnectedComponentObserver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that the algorithm is entering a new component.
|
* Notify that the algorithm is entering a new component.
|
||||||
*
|
*
|
||||||
* @param curNode Starting node for the component.
|
* @param curNode Starting node for the component.
|
||||||
*/
|
*/
|
||||||
public void notifyStartComponent(Node curNode);
|
public void notifyStartComponent(Node curNode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that a new node has been found for the current component.
|
* Notify that a new node has been found for the current component.
|
||||||
*
|
*
|
||||||
* @param node New node found for the current component.
|
* @param node New node found for the current component.
|
||||||
*/
|
*/
|
||||||
public void notifyNewNodeInComponent(Node node);
|
public void notifyNewNodeInComponent(Node node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that the algorithm has computed a new component.
|
* Notify that the algorithm has computed a new component.
|
||||||
*
|
*
|
||||||
* @param nodes List of nodes in the component.
|
* @param nodes List of nodes in the component.
|
||||||
*/
|
*/
|
||||||
public void notifyEndComponent(ArrayList<Node> nodes);
|
public void notifyEndComponent(ArrayList<Node> nodes);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,32 +5,33 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
import org.insa.graphs.model.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentTextObserver implements WeaklyConnectedComponentObserver {
|
public class WeaklyConnectedComponentTextObserver
|
||||||
|
implements WeaklyConnectedComponentObserver {
|
||||||
// Number of the current component.
|
|
||||||
private int numComponent = 1;
|
|
||||||
|
|
||||||
// Output stream
|
|
||||||
PrintStream stream;
|
|
||||||
|
|
||||||
public WeaklyConnectedComponentTextObserver(PrintStream stream) {
|
// Number of the current component.
|
||||||
this.stream = stream;
|
private int numComponent = 1;
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
// Output stream
|
||||||
public void notifyStartComponent(Node curNode) {
|
PrintStream stream;
|
||||||
stream.print("Entering component #" + numComponent + " from node #" + curNode.getId() + "... ");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public WeaklyConnectedComponentTextObserver(PrintStream stream) {
|
||||||
public void notifyNewNodeInComponent(Node node) {
|
this.stream = stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyEndComponent(ArrayList<Node> nodes) {
|
public void notifyStartComponent(Node curNode) {
|
||||||
stream.println(nodes.size() + " nodes found.");
|
stream.print("Entering component #" + numComponent + " from node #"
|
||||||
stream.flush();
|
+ curNode.getId() + "... ");
|
||||||
numComponent += 1;
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void notifyNewNodeInComponent(Node node) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyEndComponent(ArrayList<Node> nodes) {
|
||||||
|
stream.println(nodes.size() + " nodes found.");
|
||||||
|
stream.flush();
|
||||||
|
numComponent += 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -34,34 +34,33 @@ public class WeaklyConnectedComponentsAlgorithm
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that the algorithm is entering a new component.
|
* Notify all observers that the algorithm is entering a new component.
|
||||||
*
|
*
|
||||||
* @param curNode Starting node for the component.
|
* @param curNode Starting node for the component.
|
||||||
*/
|
*/
|
||||||
protected void notifyStartComponent(Node curNode) {
|
protected void notifyStartComponent(Node curNode) {
|
||||||
for (WeaklyConnectedComponentObserver obs: getObservers()) {
|
for (WeaklyConnectedComponentObserver obs : getObservers()) {
|
||||||
obs.notifyStartComponent(curNode);
|
obs.notifyStartComponent(curNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that a new node has been found for the current
|
* Notify all observers that a new node has been found for the current component.
|
||||||
* component.
|
*
|
||||||
*
|
|
||||||
* @param node New node found for the current component.
|
* @param node New node found for the current component.
|
||||||
*/
|
*/
|
||||||
protected void notifyNewNodeInComponent(Node node) {
|
protected void notifyNewNodeInComponent(Node node) {
|
||||||
for (WeaklyConnectedComponentObserver obs: getObservers()) {
|
for (WeaklyConnectedComponentObserver obs : getObservers()) {
|
||||||
obs.notifyNewNodeInComponent(node);
|
obs.notifyNewNodeInComponent(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all observers that the algorithm has computed a new component.
|
* Notify all observers that the algorithm has computed a new component.
|
||||||
*
|
*
|
||||||
* @param nodes List of nodes in the component.
|
* @param nodes List of nodes in the component.
|
||||||
*/
|
*/
|
||||||
protected void notifyEndComponent(ArrayList<Node> nodes) {
|
protected void notifyEndComponent(ArrayList<Node> nodes) {
|
||||||
for (WeaklyConnectedComponentObserver obs: getObservers()) {
|
for (WeaklyConnectedComponentObserver obs : getObservers()) {
|
||||||
obs.notifyEndComponent(nodes);
|
obs.notifyEndComponent(nodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,8 +76,8 @@ public class WeaklyConnectedComponentsAlgorithm
|
|||||||
res.add(new HashSet<Integer>());
|
res.add(new HashSet<Integer>());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Node node: getInputData().getGraph().getNodes()) {
|
for (Node node : getInputData().getGraph().getNodes()) {
|
||||||
for (Arc arc: node.getSuccessors()) {
|
for (Arc arc : node.getSuccessors()) {
|
||||||
res.get(node.getId()).add(arc.getDestination().getId());
|
res.get(node.getId()).add(arc.getDestination().getId());
|
||||||
if (arc.getRoadInformation().isOneWay()) {
|
if (arc.getRoadInformation().isOneWay()) {
|
||||||
res.get(arc.getDestination().getId()).add(node.getId());
|
res.get(arc.getDestination().getId()).add(node.getId());
|
||||||
@ -90,15 +89,15 @@ public class WeaklyConnectedComponentsAlgorithm
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply a breadth first search algorithm on the given undirected graph
|
* Apply a breadth first search algorithm on the given undirected graph (adjacency
|
||||||
* (adjacency list), starting at node cur, and marking nodes in marked.
|
* list), starting at node cur, and marking nodes in marked.
|
||||||
*
|
*
|
||||||
* @param marked
|
* @param marked
|
||||||
* @param cur
|
* @param cur
|
||||||
*
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected ArrayList<Node> bfs(ArrayList<HashSet<Integer>> ugraph, boolean[] marked, int cur) {
|
protected ArrayList<Node> bfs(ArrayList<HashSet<Integer>> ugraph, boolean[] marked,
|
||||||
|
int cur) {
|
||||||
Graph graph = getInputData().getGraph();
|
Graph graph = getInputData().getGraph();
|
||||||
ArrayList<Node> component = new ArrayList<Node>();
|
ArrayList<Node> component = new ArrayList<Node>();
|
||||||
|
|
||||||
@ -118,7 +117,7 @@ public class WeaklyConnectedComponentsAlgorithm
|
|||||||
// Notify observers
|
// Notify observers
|
||||||
notifyNewNodeInComponent(node);
|
notifyNewNodeInComponent(node);
|
||||||
|
|
||||||
for (Integer destId: ugraph.get(node.getId())) {
|
for (Integer destId : ugraph.get(node.getId())) {
|
||||||
Node dest = graph.get(destId);
|
Node dest = graph.get(destId);
|
||||||
if (!marked[dest.getId()]) {
|
if (!marked[dest.getId()]) {
|
||||||
queue.add(destId);
|
queue.add(destId);
|
||||||
@ -149,11 +148,11 @@ public class WeaklyConnectedComponentsAlgorithm
|
|||||||
components.add(this.bfs(ugraph, marked, cur));
|
components.add(this.bfs(ugraph, marked, cur));
|
||||||
|
|
||||||
// Find next non-marked
|
// Find next non-marked
|
||||||
for (; cur < marked.length && marked[cur]; ++cur)
|
for (; cur < marked.length && marked[cur]; ++cur);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new WeaklyConnectedComponentsSolution(getInputData(), Status.OPTIMAL, components);
|
return new WeaklyConnectedComponentsSolution(getInputData(), Status.OPTIMAL,
|
||||||
|
components);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ public class WeaklyConnectedComponentsSolution extends AbstractSolution {
|
|||||||
super(data);
|
super(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected WeaklyConnectedComponentsSolution(WeaklyConnectedComponentsData data, Status status,
|
protected WeaklyConnectedComponentsSolution(WeaklyConnectedComponentsData data,
|
||||||
ArrayList<ArrayList<Node>> components) {
|
Status status, ArrayList<ArrayList<Node>> components) {
|
||||||
super(data, status);
|
super(data, status);
|
||||||
this.components = components;
|
this.components = components;
|
||||||
}
|
}
|
||||||
@ -34,14 +34,14 @@ public class WeaklyConnectedComponentsSolution extends AbstractSolution {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see java.lang.Object#toString()
|
* @see java.lang.Object#toString()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
int nIsolated = 0;
|
int nIsolated = 0;
|
||||||
int nGt10 = 0;
|
int nGt10 = 0;
|
||||||
for (ArrayList<Node> component: components) {
|
for (ArrayList<Node> component : components) {
|
||||||
if (component.size() == 1) {
|
if (component.size() == 1) {
|
||||||
nIsolated += 1;
|
nIsolated += 1;
|
||||||
}
|
}
|
||||||
@ -49,8 +49,9 @@ public class WeaklyConnectedComponentsSolution extends AbstractSolution {
|
|||||||
nGt10 += 1;
|
nGt10 += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "Found " + components.size() + " components (" + nGt10 + " with more than 10 nodes, "
|
return "Found " + components.size() + " components (" + nGt10
|
||||||
+ nIsolated + " isolated nodes) in " + getSolvingTime().getSeconds() + " seconds.";
|
+ " with more than 10 nodes, " + nIsolated + " isolated nodes) in "
|
||||||
|
+ getSolvingTime().getSeconds() + " seconds.";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,8 @@ public class BinaryHeapTest extends PriorityQueueTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PriorityQueue<MutableInteger> createQueue(PriorityQueue<MutableInteger> queue) {
|
public PriorityQueue<MutableInteger> createQueue(
|
||||||
|
PriorityQueue<MutableInteger> queue) {
|
||||||
return new BinaryHeap<>((BinaryHeap<MutableInteger>) queue);
|
return new BinaryHeap<>((BinaryHeap<MutableInteger>) queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,8 @@ public class BinarySearchTreeTest extends PriorityQueueTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PriorityQueue<MutableInteger> createQueue(PriorityQueue<MutableInteger> queue) {
|
public PriorityQueue<MutableInteger> createQueue(
|
||||||
|
PriorityQueue<MutableInteger> queue) {
|
||||||
return new BinarySearchTree<>((BinarySearchTree<MutableInteger>) queue);
|
return new BinarySearchTree<>((BinarySearchTree<MutableInteger>) queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ public abstract class PriorityQueueTest {
|
|||||||
/**
|
/**
|
||||||
* Needs to be implemented by child class to actually provide priority queue
|
* Needs to be implemented by child class to actually provide priority queue
|
||||||
* implementation.
|
* implementation.
|
||||||
*
|
*
|
||||||
* @return A new instance of a PriorityQueue implementation.
|
* @return A new instance of a PriorityQueue implementation.
|
||||||
*/
|
*/
|
||||||
public abstract PriorityQueue<MutableInteger> createQueue();
|
public abstract PriorityQueue<MutableInteger> createQueue();
|
||||||
@ -33,12 +33,12 @@ public abstract class PriorityQueueTest {
|
|||||||
/**
|
/**
|
||||||
* Needs to be implemented by child class to actually provide priority queue
|
* Needs to be implemented by child class to actually provide priority queue
|
||||||
* implementation.
|
* implementation.
|
||||||
*
|
*
|
||||||
* @param queue Queue to copy.
|
* @param queue Queue to copy.
|
||||||
*
|
|
||||||
* @return Copy of the given queue.
|
* @return Copy of the given queue.
|
||||||
*/
|
*/
|
||||||
public abstract PriorityQueue<MutableInteger> createQueue(PriorityQueue<MutableInteger> queue);
|
public abstract PriorityQueue<MutableInteger> createQueue(
|
||||||
|
PriorityQueue<MutableInteger> queue);
|
||||||
|
|
||||||
protected static class MutableInteger implements Comparable<MutableInteger> {
|
protected static class MutableInteger implements Comparable<MutableInteger> {
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ public abstract class PriorityQueueTest {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the integer value stored inside this MutableInteger.
|
* Update the integer value stored inside this MutableInteger.
|
||||||
*
|
*
|
||||||
* @param value New value to set.
|
* @param value New value to set.
|
||||||
*/
|
*/
|
||||||
public void set(int value) {
|
public void set(int value) {
|
||||||
@ -92,7 +92,6 @@ public abstract class PriorityQueueTest {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set of parameters.
|
* Set of parameters.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@Parameters
|
@Parameters
|
||||||
public static Collection<Object> data() {
|
public static Collection<Object> data() {
|
||||||
@ -102,30 +101,31 @@ public abstract class PriorityQueueTest {
|
|||||||
objects.add(new TestParameters<>(new MutableInteger[0], new int[0]));
|
objects.add(new TestParameters<>(new MutableInteger[0], new int[0]));
|
||||||
|
|
||||||
// Queue with 50 elements from 0 to 49, inserted in order and deleted in order.
|
// Queue with 50 elements from 0 to 49, inserted in order and deleted in order.
|
||||||
objects.add(new TestParameters<>(
|
objects.add(
|
||||||
IntStream.range(0, 50).mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
new TestParameters<>(
|
||||||
IntStream.range(0, 50).toArray()));
|
IntStream.range(0, 50).mapToObj(MutableInteger::new)
|
||||||
|
.toArray(MutableInteger[]::new),
|
||||||
|
IntStream.range(0, 50).toArray()));
|
||||||
|
|
||||||
// Queue with 20 elements from 0 to 19, inserted in order, deleted in the given
|
// Queue with 20 elements from 0 to 19, inserted in order, deleted in the given
|
||||||
// order.
|
// order.
|
||||||
objects.add(new TestParameters<>(
|
objects.add(new TestParameters<>(
|
||||||
IntStream.range(0, 20).mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
IntStream.range(0, 20).mapToObj(MutableInteger::new)
|
||||||
new int[] { 12, 17, 18, 19, 4, 5, 3, 2, 0, 9, 10, 16, 8, 14, 13, 15, 7, 6, 1,
|
.toArray(MutableInteger[]::new),
|
||||||
11 }));
|
new int[] { 12, 17, 18, 19, 4, 5, 3, 2, 0, 9, 10, 16, 8, 14, 13, 15, 7,
|
||||||
|
6, 1, 11 }));
|
||||||
|
|
||||||
// Queue with 7 elements.
|
// Queue with 7 elements.
|
||||||
objects.add(
|
objects.add(new TestParameters<>(
|
||||||
new TestParameters<>(
|
Arrays.stream(new int[] { 8, 1, 6, 3, 4, 5, 9 })
|
||||||
Arrays.stream(new int[] { 8, 1, 6, 3, 4, 5, 9 })
|
.mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
||||||
.mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
new int[] { 6, 5, 0, 1, 4, 2, 3 }));
|
||||||
new int[] { 6, 5, 0, 1, 4, 2, 3 }));
|
|
||||||
|
|
||||||
// Queue with 7 elements.
|
// Queue with 7 elements.
|
||||||
objects.add(
|
objects.add(new TestParameters<>(
|
||||||
new TestParameters<>(
|
Arrays.stream(new int[] { 1, 7, 4, 8, 9, 6, 5 })
|
||||||
Arrays.stream(new int[] { 1, 7, 4, 8, 9, 6, 5 })
|
.mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
||||||
.mapToObj(MutableInteger::new).toArray(MutableInteger[]::new),
|
new int[] { 2, 0, 1, 3, 4, 5, 6 }));
|
||||||
new int[] { 2, 0, 1, 3, 4, 5, 6 }));
|
|
||||||
|
|
||||||
// Queue with 13 elements.
|
// Queue with 13 elements.
|
||||||
objects.add(new TestParameters<>(
|
objects.add(new TestParameters<>(
|
||||||
@ -147,7 +147,7 @@ public abstract class PriorityQueueTest {
|
|||||||
// Create the range queue
|
// Create the range queue
|
||||||
this.queue = createQueue();
|
this.queue = createQueue();
|
||||||
|
|
||||||
for (MutableInteger v: parameters.data) {
|
for (MutableInteger v : parameters.data) {
|
||||||
this.queue.insert(v);
|
this.queue.insert(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,7 +166,7 @@ public abstract class PriorityQueueTest {
|
|||||||
public void testInsert() {
|
public void testInsert() {
|
||||||
PriorityQueue<MutableInteger> queue = createQueue();
|
PriorityQueue<MutableInteger> queue = createQueue();
|
||||||
int size = 0;
|
int size = 0;
|
||||||
for (MutableInteger x: parameters.data) {
|
for (MutableInteger x : parameters.data) {
|
||||||
queue.insert(x);
|
queue.insert(x);
|
||||||
assertEquals(++size, queue.size());
|
assertEquals(++size, queue.size());
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ public abstract class PriorityQueueTest {
|
|||||||
MutableInteger[] range = Arrays.copyOf(parameters.data, parameters.data.length);
|
MutableInteger[] range = Arrays.copyOf(parameters.data, parameters.data.length);
|
||||||
Arrays.sort(range);
|
Arrays.sort(range);
|
||||||
|
|
||||||
for (MutableInteger mi: range) {
|
for (MutableInteger mi : range) {
|
||||||
assertEquals(mi.get(), queue.deleteMin().value);
|
assertEquals(mi.get(), queue.deleteMin().value);
|
||||||
assertEquals(--size, queue.size());
|
assertEquals(--size, queue.size());
|
||||||
}
|
}
|
||||||
@ -189,7 +189,8 @@ public abstract class PriorityQueueTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testFindMin() {
|
public void testFindMin() {
|
||||||
Assume.assumeFalse(queue.isEmpty());
|
Assume.assumeFalse(queue.isEmpty());
|
||||||
assertEquals(Collections.min(Arrays.asList(parameters.data)).get(), queue.findMin().get());
|
assertEquals(Collections.min(Arrays.asList(parameters.data)).get(),
|
||||||
|
queue.findMin().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = EmptyPriorityQueueException.class)
|
@Test(expected = EmptyPriorityQueueException.class)
|
||||||
@ -204,7 +205,7 @@ public abstract class PriorityQueueTest {
|
|||||||
assertEquals(size, queue.size());
|
assertEquals(size, queue.size());
|
||||||
MutableInteger[] range = Arrays.copyOf(parameters.data, parameters.data.length);
|
MutableInteger[] range = Arrays.copyOf(parameters.data, parameters.data.length);
|
||||||
Arrays.sort(range);
|
Arrays.sort(range);
|
||||||
for (MutableInteger x: range) {
|
for (MutableInteger x : range) {
|
||||||
assertEquals(x, queue.deleteMin());
|
assertEquals(x, queue.deleteMin());
|
||||||
size -= 1;
|
size -= 1;
|
||||||
assertEquals(size, queue.size());
|
assertEquals(size, queue.size());
|
||||||
@ -259,7 +260,7 @@ public abstract class PriorityQueueTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testRemoveTwice() {
|
public void testRemoveTwice() {
|
||||||
Assume.assumeFalse(queue.isEmpty());
|
Assume.assumeFalse(queue.isEmpty());
|
||||||
for (MutableInteger data: parameters.data) {
|
for (MutableInteger data : parameters.data) {
|
||||||
PriorityQueue<MutableInteger> copyQueue = this.createQueue(this.queue);
|
PriorityQueue<MutableInteger> copyQueue = this.createQueue(this.queue);
|
||||||
copyQueue.remove(data);
|
copyQueue.remove(data);
|
||||||
try {
|
try {
|
||||||
@ -307,7 +308,7 @@ public abstract class PriorityQueueTest {
|
|||||||
public void testRemoveThenAdd() {
|
public void testRemoveThenAdd() {
|
||||||
Assume.assumeFalse(queue.isEmpty());
|
Assume.assumeFalse(queue.isEmpty());
|
||||||
int min = Collections.min(Arrays.asList(parameters.data)).get();
|
int min = Collections.min(Arrays.asList(parameters.data)).get();
|
||||||
for (MutableInteger mi: parameters.data) {
|
for (MutableInteger mi : parameters.data) {
|
||||||
queue.remove(mi);
|
queue.remove(mi);
|
||||||
assertEquals(parameters.data.length - 1, queue.size());
|
assertEquals(parameters.data.length - 1, queue.size());
|
||||||
mi.set(--min);
|
mi.set(--min);
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<project
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
|
||||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
@ -16,7 +13,7 @@
|
|||||||
|
|
||||||
<artifactId>be-graphes-gui</artifactId>
|
<artifactId>be-graphes-gui</artifactId>
|
||||||
<name>be-graphes-gui</name>
|
<name>be-graphes-gui</name>
|
||||||
|
|
||||||
<!-- Repository for Salamander (dependency of Mapsforge). -->
|
<!-- Repository for Salamander (dependency of Mapsforge). -->
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
@ -26,13 +23,13 @@
|
|||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
<artifactId>be-graphes-model</artifactId>
|
<artifactId>be-graphes-model</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
<artifactId>be-graphes-algos</artifactId>
|
<artifactId>be-graphes-algos</artifactId>
|
||||||
|
@ -34,14 +34,14 @@ import org.insa.graphs.model.Node;
|
|||||||
public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
public class StartActionEvent extends ActionEvent {
|
public class StartActionEvent extends ActionEvent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 4090710269781229078L;
|
private static final long serialVersionUID = 4090710269781229078L;
|
||||||
|
|
||||||
@ -57,8 +57,8 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
private final boolean graphicVisualization;
|
private final boolean graphicVisualization;
|
||||||
private final boolean textualVisualization;
|
private final boolean textualVisualization;
|
||||||
|
|
||||||
public StartActionEvent(Class<? extends AbstractAlgorithm<?>> algoClass, List<Node> nodes,
|
public StartActionEvent(Class<? extends AbstractAlgorithm<?>> algoClass,
|
||||||
ArcInspector arcFilter, boolean graphicVisualization,
|
List<Node> nodes, ArcInspector arcFilter, boolean graphicVisualization,
|
||||||
boolean textualVisualization) {
|
boolean textualVisualization) {
|
||||||
super(AlgorithmPanel.this, START_EVENT_ID, START_EVENT_COMMAND);
|
super(AlgorithmPanel.this, START_EVENT_ID, START_EVENT_COMMAND);
|
||||||
this.nodes = nodes;
|
this.nodes = nodes;
|
||||||
@ -124,19 +124,18 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new AlgorithmPanel with the given parameters.
|
* Create a new AlgorithmPanel with the given parameters.
|
||||||
*
|
*
|
||||||
* @param parent Parent component for this panel. Only use for centering
|
* @param parent Parent component for this panel. Only use for centering dialogs.
|
||||||
* dialogs.
|
|
||||||
* @param baseAlgorithm Base algorithm for this algorithm panel.
|
* @param baseAlgorithm Base algorithm for this algorithm panel.
|
||||||
* @param title Title of the panel.
|
* @param title Title of the panel.
|
||||||
* @param nodeNames Names of the input nodes.
|
* @param nodeNames Names of the input nodes.
|
||||||
* @param enableArcFilterSelection <code>true</code> to enable
|
* @param enableArcFilterSelection <code>true</code> to enable {@link ArcInspector}
|
||||||
* {@link ArcInspector} selection.
|
* selection.
|
||||||
*
|
|
||||||
* @see ArcInspectorFactory
|
* @see ArcInspectorFactory
|
||||||
*/
|
*/
|
||||||
public AlgorithmPanel(Component parent, Class<? extends AbstractAlgorithm<?>> baseAlgorithm,
|
public AlgorithmPanel(Component parent,
|
||||||
String title, String[] nodeNames, boolean enableArcFilterSelection) {
|
Class<? extends AbstractAlgorithm<?>> baseAlgorithm, String title,
|
||||||
|
String[] nodeNames, boolean enableArcFilterSelection) {
|
||||||
super();
|
super();
|
||||||
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
||||||
|
|
||||||
@ -217,7 +216,7 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
startAlgoButton.addActionListener(new ActionListener() {
|
startAlgoButton.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
for (ActionListener lis: startActionListeners) {
|
for (ActionListener lis : startActionListeners) {
|
||||||
lis.actionPerformed(new StartActionEvent(
|
lis.actionPerformed(new StartActionEvent(
|
||||||
AlgorithmFactory.getAlgorithmClass(baseAlgorithm,
|
AlgorithmFactory.getAlgorithmClass(baseAlgorithm,
|
||||||
(String) algoSelect.getSelectedItem()),
|
(String) algoSelect.getSelectedItem()),
|
||||||
@ -278,9 +277,8 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the title JLabel for this panel.
|
* Create the title JLabel for this panel.
|
||||||
*
|
*
|
||||||
* @param title Title for the label.
|
* @param title Title for the label.
|
||||||
*
|
|
||||||
* @return A new JLabel containing the given title with proper font.
|
* @return A new JLabel containing the given title with proper font.
|
||||||
*/
|
*/
|
||||||
protected JLabel createTitleLabel(String title) {
|
protected JLabel createTitleLabel(String title) {
|
||||||
@ -296,18 +294,15 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the combo box for the algorithm selection.
|
* Create the combo box for the algorithm selection.
|
||||||
*
|
*
|
||||||
* @param baseAlgorithm Base algorithm for which the select box should be
|
* @param baseAlgorithm Base algorithm for which the select box should be created.
|
||||||
* created.
|
|
||||||
*
|
|
||||||
* @return A new JComboBox containing algorithms for the given base algorithm.
|
* @return A new JComboBox containing algorithms for the given base algorithm.
|
||||||
*
|
|
||||||
* @see AlgorithmFactory
|
* @see AlgorithmFactory
|
||||||
*/
|
*/
|
||||||
protected JComboBox<String> createAlgoritmSelectComboBox(
|
protected JComboBox<String> createAlgoritmSelectComboBox(
|
||||||
Class<? extends AbstractAlgorithm<?>> baseAlgorithm) {
|
Class<? extends AbstractAlgorithm<?>> baseAlgorithm) {
|
||||||
JComboBox<String> algoSelect = new JComboBox<>(
|
JComboBox<String> algoSelect = new JComboBox<>(AlgorithmFactory
|
||||||
AlgorithmFactory.getAlgorithmNames(baseAlgorithm).toArray(new String[0]));
|
.getAlgorithmNames(baseAlgorithm).toArray(new String[0]));
|
||||||
algoSelect.setBackground(Color.WHITE);
|
algoSelect.setBackground(Color.WHITE);
|
||||||
algoSelect.setAlignmentX(Component.LEFT_ALIGNMENT);
|
algoSelect.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||||
return algoSelect;
|
return algoSelect;
|
||||||
@ -316,9 +311,8 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a node input panel with the given node input names.
|
* Create a node input panel with the given node input names.
|
||||||
*
|
*
|
||||||
* @param nodeNames Field names for the inputs to create.
|
* @param nodeNames Field names for the inputs to create.
|
||||||
*
|
|
||||||
* @return A new NodesInputPanel containing inputs for the given names.
|
* @return A new NodesInputPanel containing inputs for the given names.
|
||||||
*/
|
*/
|
||||||
protected NodesInputPanel createNodesInputPanel(String[] nodeNames) {
|
protected NodesInputPanel createNodesInputPanel(String[] nodeNames) {
|
||||||
@ -332,17 +326,15 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given list of nodes does not contain any <code>null</code>
|
* Check if the given list of nodes does not contain any <code>null</code> value.
|
||||||
* value.
|
*
|
||||||
*
|
|
||||||
* @param nodes List of {@link Node} to check.
|
* @param nodes List of {@link Node} to check.
|
||||||
*
|
|
||||||
* @return <code>true</code> if the list does not contain any <code>null</code>
|
* @return <code>true</code> if the list does not contain any <code>null</code>
|
||||||
* value, <code>false</code> otherwise.
|
* value, <code>false</code> otherwise.
|
||||||
*/
|
*/
|
||||||
protected boolean allNotNull(List<Node> nodes) {
|
protected boolean allNotNull(List<Node> nodes) {
|
||||||
boolean allNotNull = true;
|
boolean allNotNull = true;
|
||||||
for (Node node: nodes) {
|
for (Node node : nodes) {
|
||||||
allNotNull = allNotNull && node != null;
|
allNotNull = allNotNull && node != null;
|
||||||
}
|
}
|
||||||
return allNotNull;
|
return allNotNull;
|
||||||
@ -353,7 +345,7 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
super.setEnabled(enabled);
|
super.setEnabled(enabled);
|
||||||
nodesInputPanel.setEnabled(enabled);
|
nodesInputPanel.setEnabled(enabled);
|
||||||
solutionPanel.setEnabled(enabled);
|
solutionPanel.setEnabled(enabled);
|
||||||
for (JComponent component: components) {
|
for (JComponent component : components) {
|
||||||
component.setEnabled(enabled);
|
component.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
graphicObserverCheckbox.setEnabled(enabled);
|
graphicObserverCheckbox.setEnabled(enabled);
|
||||||
@ -363,7 +355,7 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new start action listener to this class.
|
* Add a new start action listener to this class.
|
||||||
*
|
*
|
||||||
* @param listener Listener to add.
|
* @param listener Listener to add.
|
||||||
*/
|
*/
|
||||||
public void addStartActionListener(ActionListener listener) {
|
public void addStartActionListener(ActionListener listener) {
|
||||||
@ -371,11 +363,9 @@ public class AlgorithmPanel extends JPanel implements DrawingChangeListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {
|
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRedrawRequest() {
|
public void onRedrawRequest() {}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,18 +6,16 @@ public interface DrawingChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Event fired when a new drawing is loaded.
|
* Event fired when a new drawing is loaded.
|
||||||
*
|
*
|
||||||
* @param oldDrawing Old drawing, may be null if no drawing exits prior to this
|
* @param oldDrawing Old drawing, may be null if no drawing exits prior to this one.
|
||||||
* one.
|
|
||||||
* @param newDrawing New drawing.
|
* @param newDrawing New drawing.
|
||||||
*/
|
*/
|
||||||
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing);
|
public void onDrawingLoaded(Drawing oldDrawing, Drawing newDrawing);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event fired when a redraw request is emitted - This is typically emitted
|
* Event fired when a redraw request is emitted - This is typically emitted after a
|
||||||
* after a onDrawingLoaded event, but not always, and request that elements are
|
* onDrawingLoaded event, but not always, and request that elements are drawn again
|
||||||
* drawn again on the new drawing.
|
* on the new drawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void onRedrawRequest();
|
public void onRedrawRequest();
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ public interface GraphChangeListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Event fire when a new graph has been loaded.
|
* Event fire when a new graph has been loaded.
|
||||||
*
|
*
|
||||||
* @param graph The new graph.
|
* @param graph The new graph.
|
||||||
*/
|
*/
|
||||||
public void newGraphLoaded(Graph graph);
|
public void newGraphLoaded(Graph graph);
|
||||||
|
@ -19,14 +19,13 @@ import org.insa.graphs.model.io.GraphReaderObserver;
|
|||||||
/**
|
/**
|
||||||
* One-time use GraphReaderObserver that display progress in three different
|
* One-time use GraphReaderObserver that display progress in three different
|
||||||
* JProgressBar.
|
* JProgressBar.
|
||||||
*
|
|
||||||
* @author Mikael
|
|
||||||
*
|
*
|
||||||
|
* @author Mikael
|
||||||
*/
|
*/
|
||||||
public class GraphReaderProgressBar extends JDialog implements GraphReaderObserver {
|
public class GraphReaderProgressBar extends JDialog implements GraphReaderObserver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -1;
|
private static final long serialVersionUID = -1;
|
||||||
|
|
||||||
@ -37,7 +36,7 @@ public class GraphReaderProgressBar extends JDialog implements GraphReaderObserv
|
|||||||
private final JProgressBar[] progressBars = new JProgressBar[3];
|
private final JProgressBar[] progressBars = new JProgressBar[3];
|
||||||
|
|
||||||
// Current element read, and modulo.
|
// Current element read, and modulo.
|
||||||
private int[] counters = new int[]{ 0, 0, 0 };
|
private int[] counters = new int[] { 0, 0, 0 };
|
||||||
private int[] modulos = new int[3];
|
private int[] modulos = new int[3];
|
||||||
|
|
||||||
public GraphReaderProgressBar(JFrame owner) {
|
public GraphReaderProgressBar(JFrame owner) {
|
||||||
|
@ -75,17 +75,17 @@ import org.insa.graphs.model.io.MapMismatchException;
|
|||||||
public class MainWindow extends JFrame {
|
public class MainWindow extends JFrame {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final String WINDOW_TITLE = "BE Graphes INSA";
|
private static final String WINDOW_TITLE = "BE Graphes INSA";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final int THREAD_TIMER_DELAY = 1000; // in milliseconds
|
private static final int THREAD_TIMER_DELAY = 1000; // in milliseconds
|
||||||
|
|
||||||
@ -162,7 +162,8 @@ public class MainWindow extends JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
StartActionEvent evt = (StartActionEvent) e;
|
StartActionEvent evt = (StartActionEvent) e;
|
||||||
WeaklyConnectedComponentsData data = new WeaklyConnectedComponentsData(graph);
|
WeaklyConnectedComponentsData data =
|
||||||
|
new WeaklyConnectedComponentsData(graph);
|
||||||
|
|
||||||
WeaklyConnectedComponentsAlgorithm wccAlgorithm = null;
|
WeaklyConnectedComponentsAlgorithm wccAlgorithm = null;
|
||||||
try {
|
try {
|
||||||
@ -181,10 +182,12 @@ public class MainWindow extends JFrame {
|
|||||||
wccPanel.setEnabled(false);
|
wccPanel.setEnabled(false);
|
||||||
|
|
||||||
if (evt.isGraphicVisualizationEnabled()) {
|
if (evt.isGraphicVisualizationEnabled()) {
|
||||||
wccAlgorithm.addObserver(new WeaklyConnectedComponentGraphicObserver(drawing));
|
wccAlgorithm.addObserver(
|
||||||
|
new WeaklyConnectedComponentGraphicObserver(drawing));
|
||||||
}
|
}
|
||||||
if (evt.isTextualVisualizationEnabled()) {
|
if (evt.isTextualVisualizationEnabled()) {
|
||||||
wccAlgorithm.addObserver(new WeaklyConnectedComponentTextObserver(printStream));
|
wccAlgorithm.addObserver(
|
||||||
|
new WeaklyConnectedComponentTextObserver(printStream));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We love Java...
|
// We love Java...
|
||||||
@ -207,8 +210,9 @@ public class MainWindow extends JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
StartActionEvent evt = (StartActionEvent) e;
|
StartActionEvent evt = (StartActionEvent) e;
|
||||||
ShortestPathData data = new ShortestPathData(graph, evt.getNodes().get(0),
|
ShortestPathData data =
|
||||||
evt.getNodes().get(1), evt.getArcFilter());
|
new ShortestPathData(graph, evt.getNodes().get(0),
|
||||||
|
evt.getNodes().get(1), evt.getArcFilter());
|
||||||
|
|
||||||
ShortestPathAlgorithm spAlgorithm = null;
|
ShortestPathAlgorithm spAlgorithm = null;
|
||||||
try {
|
try {
|
||||||
@ -254,12 +258,15 @@ public class MainWindow extends JFrame {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cpPanel = new AlgorithmPanel(this, CarPoolingAlgorithm.class, "Car-Pooling", new String[] {
|
cpPanel = new AlgorithmPanel(this, CarPoolingAlgorithm.class, "Car-Pooling",
|
||||||
"Origin Car", "Origin Pedestrian", "Destination Car", "Destination Pedestrian" },
|
new String[] { "Origin Car", "Origin Pedestrian", "Destination Car",
|
||||||
|
"Destination Pedestrian" },
|
||||||
true);
|
true);
|
||||||
|
|
||||||
psPanel = new AlgorithmPanel(this, PackageSwitchAlgorithm.class, "Car-Pooling",
|
psPanel = new AlgorithmPanel(
|
||||||
new String[] { "Oribin A", "Origin B", "Destination A", "Destination B" }, true);
|
this, PackageSwitchAlgorithm.class, "Car-Pooling", new String[] {
|
||||||
|
"Oribin A", "Origin B", "Destination A", "Destination B" },
|
||||||
|
true);
|
||||||
|
|
||||||
// add algorithm panels
|
// add algorithm panels
|
||||||
algoPanels.add(wccPanel);
|
algoPanels.add(wccPanel);
|
||||||
@ -271,7 +278,7 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
// Add click listeners to both drawing.
|
// Add click listeners to both drawing.
|
||||||
|
|
||||||
for (AlgorithmPanel panel: algoPanels) {
|
for (AlgorithmPanel panel : algoPanels) {
|
||||||
this.basicDrawing.addDrawingClickListener(panel.nodesInputPanel);
|
this.basicDrawing.addDrawingClickListener(panel.nodesInputPanel);
|
||||||
this.mapViewDrawing.addDrawingClickListener(panel.nodesInputPanel);
|
this.mapViewDrawing.addDrawingClickListener(panel.nodesInputPanel);
|
||||||
this.graphChangeListeneres.add(panel.nodesInputPanel);
|
this.graphChangeListeneres.add(panel.nodesInputPanel);
|
||||||
@ -294,10 +301,12 @@ public class MainWindow extends JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
JFileChooser chooser = FileUtils.createFileChooser(FolderType.Map);
|
JFileChooser chooser = FileUtils.createFileChooser(FolderType.Map);
|
||||||
if (chooser.showOpenDialog(MainWindow.this) == JFileChooser.APPROVE_OPTION) {
|
if (chooser.showOpenDialog(
|
||||||
|
MainWindow.this) == JFileChooser.APPROVE_OPTION) {
|
||||||
graphFilePath = chooser.getSelectedFile().getAbsolutePath();
|
graphFilePath = chooser.getSelectedFile().getAbsolutePath();
|
||||||
|
|
||||||
// Note: Don't use a try-resources block since loadGraph is asynchronous.
|
// Note: Don't use a try-resources block since loadGraph is
|
||||||
|
// asynchronous.
|
||||||
final DataInputStream stream;
|
final DataInputStream stream;
|
||||||
try {
|
try {
|
||||||
stream = new DataInputStream(new BufferedInputStream(
|
stream = new DataInputStream(new BufferedInputStream(
|
||||||
@ -329,8 +338,8 @@ public class MainWindow extends JFrame {
|
|||||||
addWindowListener(new WindowAdapter() {
|
addWindowListener(new WindowAdapter() {
|
||||||
public void windowClosing(WindowEvent e) {
|
public void windowClosing(WindowEvent e) {
|
||||||
int confirmed = JOptionPane.showConfirmDialog(MainWindow.this,
|
int confirmed = JOptionPane.showConfirmDialog(MainWindow.this,
|
||||||
"Are you sure you want to close the application?", "Exit Confirmation",
|
"Are you sure you want to close the application?",
|
||||||
JOptionPane.YES_NO_OPTION);
|
"Exit Confirmation", JOptionPane.YES_NO_OPTION);
|
||||||
|
|
||||||
if (confirmed == JOptionPane.YES_OPTION) {
|
if (confirmed == JOptionPane.YES_OPTION) {
|
||||||
dispose();
|
dispose();
|
||||||
@ -360,7 +369,7 @@ public class MainWindow extends JFrame {
|
|||||||
rightComponent.add(pathPanel, c);
|
rightComponent.add(pathPanel, c);
|
||||||
|
|
||||||
c.gridy = 1;
|
c.gridy = 1;
|
||||||
for (AlgorithmPanel panel: algoPanels) {
|
for (AlgorithmPanel panel : algoPanels) {
|
||||||
panel.setVisible(false);
|
panel.setVisible(false);
|
||||||
rightComponent.add(panel, c);
|
rightComponent.add(panel, c);
|
||||||
}
|
}
|
||||||
@ -428,19 +437,19 @@ public class MainWindow extends JFrame {
|
|||||||
* Notify all listeners that a new graph has been loaded.
|
* Notify all listeners that a new graph has been loaded.
|
||||||
*/
|
*/
|
||||||
private void notifyNewGraphLoaded() {
|
private void notifyNewGraphLoaded() {
|
||||||
for (GraphChangeListener listener: graphChangeListeneres) {
|
for (GraphChangeListener listener : graphChangeListeneres) {
|
||||||
listener.newGraphLoaded(graph);
|
listener.newGraphLoaded(graph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify all listeners that a new drawing has been set up.
|
* Notify all listeners that a new drawing has been set up.
|
||||||
*
|
*
|
||||||
* @param oldDrawing
|
* @param oldDrawing
|
||||||
* @param newDrawing
|
* @param newDrawing
|
||||||
*/
|
*/
|
||||||
private void notifyDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {
|
private void notifyDrawingLoaded(Drawing oldDrawing, Drawing newDrawing) {
|
||||||
for (DrawingChangeListener listener: drawingChangeListeners) {
|
for (DrawingChangeListener listener : drawingChangeListeners) {
|
||||||
listener.onDrawingLoaded(oldDrawing, newDrawing);
|
listener.onDrawingLoaded(oldDrawing, newDrawing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -449,7 +458,7 @@ public class MainWindow extends JFrame {
|
|||||||
* Notify all listeners that a redraw request is emitted.
|
* Notify all listeners that a redraw request is emitted.
|
||||||
*/
|
*/
|
||||||
private void notifyRedrawRequest() {
|
private void notifyRedrawRequest() {
|
||||||
for (DrawingChangeListener listener: drawingChangeListeners) {
|
for (DrawingChangeListener listener : drawingChangeListeners) {
|
||||||
listener.onRedrawRequest();
|
listener.onRedrawRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -478,8 +487,9 @@ public class MainWindow extends JFrame {
|
|||||||
// We need to draw MapView, we have to check if the file exists.
|
// We need to draw MapView, we have to check if the file exists.
|
||||||
File mfile = null;
|
File mfile = null;
|
||||||
if (isMapView) {
|
if (isMapView) {
|
||||||
String mfpath = graphFilePath.substring(0, graphFilePath.lastIndexOf(".map"))
|
String mfpath =
|
||||||
+ ".mapfg";
|
graphFilePath.substring(0, graphFilePath.lastIndexOf(".map"))
|
||||||
|
+ ".mapfg";
|
||||||
mfile = new File(mfpath);
|
mfile = new File(mfpath);
|
||||||
if (!mfile.exists()) {
|
if (!mfile.exists()) {
|
||||||
if (JOptionPane.showConfirmDialog(this,
|
if (JOptionPane.showConfirmDialog(this,
|
||||||
@ -566,7 +576,7 @@ public class MainWindow extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private void drawGraph() {
|
private void drawGraph() {
|
||||||
drawGraph(null, this.currentPalette);
|
drawGraph(null, this.currentPalette);
|
||||||
@ -576,7 +586,8 @@ public class MainWindow extends JFrame {
|
|||||||
launchThread(new Runnable() {
|
launchThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
GraphReaderProgressBar progressBar = new GraphReaderProgressBar(MainWindow.this);
|
GraphReaderProgressBar progressBar =
|
||||||
|
new GraphReaderProgressBar(MainWindow.this);
|
||||||
progressBar.setLocationRelativeTo(mainPanel.getLeftComponent());
|
progressBar.setLocationRelativeTo(mainPanel.getLeftComponent());
|
||||||
reader.addObserver(progressBar);
|
reader.addObserver(progressBar);
|
||||||
try {
|
try {
|
||||||
@ -601,19 +612,20 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
String info = graph.getMapId();
|
String info = graph.getMapId();
|
||||||
if (graph.getMapName() != null && !graph.getMapName().isEmpty()) {
|
if (graph.getMapName() != null && !graph.getMapName().isEmpty()) {
|
||||||
// The \u200e character is the left-to-right mark, we need to avoid issue with
|
// The \u200e character is the left-to-right mark, we need to avoid
|
||||||
|
// issue with
|
||||||
// name that are right-to-left (e.g. arabic names).
|
// name that are right-to-left (e.g. arabic names).
|
||||||
info += " - " + graph.getMapName() + "\u200e";
|
info += " - " + graph.getMapName() + "\u200e";
|
||||||
}
|
}
|
||||||
info += ", " + graph.size() + " nodes, " + graph.getGraphInformation().getArcCount()
|
info += ", " + graph.size() + " nodes, "
|
||||||
+ " arcs.";
|
+ graph.getGraphInformation().getArcCount() + " arcs.";
|
||||||
graphInfoPanel.setText(info);
|
graphInfoPanel.setText(info);
|
||||||
|
|
||||||
drawGraph();
|
drawGraph();
|
||||||
|
|
||||||
notifyNewGraphLoaded();
|
notifyNewGraphLoaded();
|
||||||
|
|
||||||
for (JMenuItem item: graphLockItems) {
|
for (JMenuItem item : graphLockItems) {
|
||||||
item.setEnabled(true);
|
item.setEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -622,12 +634,12 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Show and enable the given AlgorithmPanel (and hide all others).
|
* Show and enable the given AlgorithmPanel (and hide all others).
|
||||||
*
|
*
|
||||||
* @param algorithmPanel
|
* @param algorithmPanel
|
||||||
*/
|
*/
|
||||||
private void enableAlgorithmPanel(AlgorithmPanel algorithmPanel) {
|
private void enableAlgorithmPanel(AlgorithmPanel algorithmPanel) {
|
||||||
int dividerLocation = mainPanel.getDividerLocation();
|
int dividerLocation = mainPanel.getDividerLocation();
|
||||||
for (AlgorithmPanel panel: algoPanels) {
|
for (AlgorithmPanel panel : algoPanels) {
|
||||||
panel.setVisible(panel == algorithmPanel);
|
panel.setVisible(panel == algorithmPanel);
|
||||||
}
|
}
|
||||||
mainPanel.setDividerLocation(dividerLocation);
|
mainPanel.setDividerLocation(dividerLocation);
|
||||||
@ -637,20 +649,25 @@ public class MainWindow extends JFrame {
|
|||||||
|
|
||||||
// Open Map item...
|
// Open Map item...
|
||||||
JMenuItem openMapItem = new JMenuItem("Open Map... ", KeyEvent.VK_O);
|
JMenuItem 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(baf.createBlockingAction(openMapActionListener));
|
openMapItem.addActionListener(baf.createBlockingAction(openMapActionListener));
|
||||||
|
|
||||||
// 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(baf.createBlockingAction(new ActionListener() {
|
openPathItem.addActionListener(baf.createBlockingAction(new ActionListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
JFileChooser chooser = FileUtils.createFileChooser(FolderType.PathInput);
|
JFileChooser chooser =
|
||||||
if (chooser.showOpenDialog(MainWindow.this) == JFileChooser.APPROVE_OPTION) {
|
FileUtils.createFileChooser(FolderType.PathInput);
|
||||||
try (BinaryPathReader reader = new BinaryPathReader(new DataInputStream(new BufferedInputStream(
|
if (chooser.showOpenDialog(
|
||||||
new FileInputStream(chooser.getSelectedFile()))))){
|
MainWindow.this) == JFileChooser.APPROVE_OPTION) {
|
||||||
|
try (BinaryPathReader reader = new BinaryPathReader(
|
||||||
|
new DataInputStream(new BufferedInputStream(
|
||||||
|
new FileInputStream(chooser.getSelectedFile()))))) {
|
||||||
Path path = reader.readPath(graph);
|
Path path = reader.readPath(graph);
|
||||||
pathPanel.addPath(path);
|
pathPanel.addPath(path);
|
||||||
}
|
}
|
||||||
@ -673,7 +690,8 @@ 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 ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@ -691,7 +709,8 @@ 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(baf.createBlockingAction(new ActionListener() {
|
drawGraphItem.addActionListener(baf.createBlockingAction(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@ -700,23 +719,26 @@ 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(
|
||||||
drawGraphBWItem.addActionListener(baf.createBlockingAction(new ActionListener() {
|
KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.ALT_MASK));
|
||||||
@Override
|
drawGraphBWItem
|
||||||
public void actionPerformed(ActionEvent e) {
|
.addActionListener(baf.createBlockingAction(new ActionListener() {
|
||||||
drawGraph(BasicDrawing.class, blackAndWhitePalette);
|
@Override
|
||||||
}
|
public void actionPerformed(ActionEvent e) {
|
||||||
}));
|
drawGraph(BasicDrawing.class, blackAndWhitePalette);
|
||||||
|
}
|
||||||
|
}));
|
||||||
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
|
drawGraphMapsforgeItem
|
||||||
.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.ALT_MASK));
|
.addActionListener(baf.createBlockingAction(new ActionListener() {
|
||||||
drawGraphMapsforgeItem.addActionListener(baf.createBlockingAction(new ActionListener() {
|
@Override
|
||||||
@Override
|
public void actionPerformed(ActionEvent e) {
|
||||||
public void actionPerformed(ActionEvent e) {
|
drawGraph(MapViewDrawing.class);
|
||||||
drawGraph(MapViewDrawing.class);
|
}
|
||||||
}
|
}));
|
||||||
}));
|
|
||||||
graphLockItems.add(drawGraphMapsforgeItem);
|
graphLockItems.add(drawGraphMapsforgeItem);
|
||||||
|
|
||||||
JMenu graphMenu = new JMenu("Graph");
|
JMenu graphMenu = new JMenu("Graph");
|
||||||
@ -782,7 +804,7 @@ public class MainWindow extends JFrame {
|
|||||||
menuBar.add(graphMenu);
|
menuBar.add(graphMenu);
|
||||||
menuBar.add(algoMenu);
|
menuBar.add(algoMenu);
|
||||||
|
|
||||||
for (JMenuItem item: graphLockItems) {
|
for (JMenuItem item : graphLockItems) {
|
||||||
item.setEnabled(false);
|
item.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -792,9 +814,9 @@ public class MainWindow extends JFrame {
|
|||||||
private JPanel createStatusBar() {
|
private JPanel createStatusBar() {
|
||||||
// create the status bar panel and shove it down the bottom of the frame
|
// create the status bar panel and shove it down the bottom of the frame
|
||||||
JPanel statusPanel = new JPanel();
|
JPanel statusPanel = new JPanel();
|
||||||
statusPanel.setBorder(
|
statusPanel.setBorder(new CompoundBorder(
|
||||||
new CompoundBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GRAY),
|
BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GRAY),
|
||||||
new EmptyBorder(0, 15, 0, 15)));
|
new EmptyBorder(0, 15, 0, 15)));
|
||||||
statusPanel.setPreferredSize(new Dimension(getWidth(), 38));
|
statusPanel.setPreferredSize(new Dimension(getWidth(), 38));
|
||||||
statusPanel.setLayout(new BorderLayout());
|
statusPanel.setLayout(new BorderLayout());
|
||||||
|
|
||||||
|
@ -33,16 +33,14 @@ public class NodesInputPanel extends JPanel
|
|||||||
implements DrawingClickListener, DrawingChangeListener, GraphChangeListener {
|
implements DrawingClickListener, DrawingChangeListener, GraphChangeListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private static final Color DEFAULT_MARKER_COLOR = Color.BLUE;
|
private static final Color DEFAULT_MARKER_COLOR = Color.BLUE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class that can be used to find a node from coordinates in a "fast"
|
* Utility class that can be used to find a node from coordinates in a "fast" way.
|
||||||
* way.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private static class NodeFinder {
|
private static class NodeFinder {
|
||||||
|
|
||||||
@ -58,14 +56,13 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param point
|
* @param point
|
||||||
*
|
|
||||||
* @return the closest node to the given point, or null if no node is "close
|
* @return the closest node to the given point, or null if no node is "close
|
||||||
* enough".
|
* enough".
|
||||||
*/
|
*/
|
||||||
public Node findClosestNode(Point point) {
|
public Node findClosestNode(Point point) {
|
||||||
Node minNode = null;
|
Node minNode = null;
|
||||||
double minDis = Double.POSITIVE_INFINITY;
|
double minDis = Double.POSITIVE_INFINITY;
|
||||||
for (Node node: graph.getNodes()) {
|
for (Node node : graph.getNodes()) {
|
||||||
double dlon = point.getLongitude() - node.getPoint().getLongitude();
|
double dlon = point.getLongitude() - node.getPoint().getLongitude();
|
||||||
double dlat = point.getLatitude() - node.getPoint().getLatitude();
|
double dlat = point.getLatitude() - node.getPoint().getLatitude();
|
||||||
double dis = dlon * dlon + dlat * dlat; // No need to square
|
double dis = dlon * dlon + dlat * dlat; // No need to square
|
||||||
@ -81,12 +78,11 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Event data send when a node input has changed.
|
* Event data send when a node input has changed.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class InputChangedEvent extends ActionEvent {
|
public class InputChangedEvent extends ActionEvent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 3440024811352247731L;
|
private static final long serialVersionUID = 3440024811352247731L;
|
||||||
|
|
||||||
@ -98,7 +94,8 @@ public class NodesInputPanel extends JPanel
|
|||||||
List<Node> nodes;
|
List<Node> nodes;
|
||||||
|
|
||||||
public InputChangedEvent(List<Node> nodes2) {
|
public InputChangedEvent(List<Node> nodes2) {
|
||||||
super(NodesInputPanel.this, ALL_INPUT_FILLED_EVENT_ID, ALL_INPUT_FILLED_EVENT_COMMAND);
|
super(NodesInputPanel.this, ALL_INPUT_FILLED_EVENT_ID,
|
||||||
|
ALL_INPUT_FILLED_EVENT_COMMAND);
|
||||||
this.nodes = nodes2;
|
this.nodes = nodes2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +107,8 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
// Node inputs and markers.
|
// Node inputs and markers.
|
||||||
private final ArrayList<JTextField> nodeInputs = new ArrayList<>();
|
private final ArrayList<JTextField> nodeInputs = new ArrayList<>();
|
||||||
private final Map<JTextField, MarkerOverlay> markerTrackers = new IdentityHashMap<JTextField, MarkerOverlay>();
|
private final Map<JTextField, MarkerOverlay> markerTrackers =
|
||||||
|
new IdentityHashMap<JTextField, MarkerOverlay>();
|
||||||
|
|
||||||
// Component that can be enabled/disabled.
|
// Component that can be enabled/disabled.
|
||||||
private ArrayList<JComponent> components = new ArrayList<>();
|
private ArrayList<JComponent> components = new ArrayList<>();
|
||||||
@ -126,7 +124,6 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new NodesInputPanel.
|
* Create a new NodesInputPanel.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public NodesInputPanel() {
|
public NodesInputPanel() {
|
||||||
super(new GridBagLayout());
|
super(new GridBagLayout());
|
||||||
@ -134,12 +131,11 @@ public class NodesInputPanel extends JPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an InputChanged listener to this panel. This listener will be notified by
|
* Add an InputChanged listener to this panel. This listener will be notified by a
|
||||||
* a {@link InputChangedEvent} each time an input in this panel change (click,
|
* {@link InputChangedEvent} each time an input in this panel change (click, clear,
|
||||||
* clear, manual input).
|
* manual input).
|
||||||
*
|
*
|
||||||
* @param listener Listener to add.
|
* @param listener Listener to add.
|
||||||
*
|
|
||||||
* @see InputChangedEvent
|
* @see InputChangedEvent
|
||||||
*/
|
*/
|
||||||
public void addInputChangedListener(ActionListener listener) {
|
public void addInputChangedListener(ActionListener listener) {
|
||||||
@ -149,7 +145,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
@Override
|
@Override
|
||||||
public void setVisible(boolean visible) {
|
public void setVisible(boolean visible) {
|
||||||
super.setVisible(visible);
|
super.setVisible(visible);
|
||||||
for (JTextField input: nodeInputs) {
|
for (JTextField input : nodeInputs) {
|
||||||
MarkerOverlay marker = markerTrackers.getOrDefault(input, null);
|
MarkerOverlay marker = markerTrackers.getOrDefault(input, null);
|
||||||
if (marker != null) {
|
if (marker != null) {
|
||||||
marker.setVisible(visible && !input.getText().trim().isEmpty());
|
marker.setVisible(visible && !input.getText().trim().isEmpty());
|
||||||
@ -159,7 +155,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setEnabled(boolean enabled) {
|
public void setEnabled(boolean enabled) {
|
||||||
for (JComponent component: components) {
|
for (JComponent component : components) {
|
||||||
component.setEnabled(enabled);
|
component.setEnabled(enabled);
|
||||||
}
|
}
|
||||||
super.setEnabled(enabled);
|
super.setEnabled(enabled);
|
||||||
@ -176,7 +172,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
for (JTextField field: nodeInputs) {
|
for (JTextField field : nodeInputs) {
|
||||||
field.setText("");
|
field.setText("");
|
||||||
markerTrackers.put(field, null);
|
markerTrackers.put(field, null);
|
||||||
}
|
}
|
||||||
@ -248,8 +244,8 @@ public class NodesInputPanel extends JPanel
|
|||||||
MarkerOverlay tracker = markerTrackers.getOrDefault(textField, null);
|
MarkerOverlay tracker = markerTrackers.getOrDefault(textField, null);
|
||||||
if (curnode != null) {
|
if (curnode != null) {
|
||||||
if (tracker == null) {
|
if (tracker == null) {
|
||||||
tracker = drawing.drawMarker(curnode.getPoint(), markerColor, Color.BLACK,
|
tracker = drawing.drawMarker(curnode.getPoint(), markerColor,
|
||||||
AlphaMode.TRANSPARENT);
|
Color.BLACK, AlphaMode.TRANSPARENT);
|
||||||
markerTrackers.put(textField, tracker);
|
markerTrackers.put(textField, tracker);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -268,7 +264,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
List<Node> nodes = getNodeForInputs();
|
List<Node> nodes = getNodeForInputs();
|
||||||
|
|
||||||
// Trigger change event.
|
// Trigger change event.
|
||||||
for (ActionListener lis: inputChangeListeners) {
|
for (ActionListener lis : inputChangeListeners) {
|
||||||
lis.actionPerformed(new InputChangedEvent(nodes));
|
lis.actionPerformed(new InputChangedEvent(nodes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -317,21 +313,21 @@ public class NodesInputPanel extends JPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return List of nodes associated with the input. Some nodes may be null if
|
* @return List of nodes associated with the input. Some nodes may be null if their
|
||||||
* their associated input is invalid.
|
* associated input is invalid.
|
||||||
*/
|
*/
|
||||||
public List<Node> getNodeForInputs() {
|
public List<Node> getNodeForInputs() {
|
||||||
List<Node> nodes = new ArrayList<>(nodeInputs.size());
|
List<Node> nodes = new ArrayList<>(nodeInputs.size());
|
||||||
for (JTextField input: nodeInputs) {
|
for (JTextField input : nodeInputs) {
|
||||||
nodes.add(getNodeForInput(input));
|
nodes.add(getNodeForInput(input));
|
||||||
}
|
}
|
||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the next input that should be filled by a click, or null if none should
|
* Get the next input that should be filled by a click, or null if none should be
|
||||||
* be filled.
|
* filled.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected JTextField getInputToFill() {
|
protected JTextField getInputToFill() {
|
||||||
@ -350,7 +346,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the next input to fill to the given text field.
|
* Set the next input to fill to the given text field.
|
||||||
*
|
*
|
||||||
* @param input
|
* @param input
|
||||||
*/
|
*/
|
||||||
protected void setInputToFill(JTextField input) {
|
protected void setInputToFill(JTextField input) {
|
||||||
@ -410,7 +406,7 @@ public class NodesInputPanel extends JPanel
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRedrawRequest() {
|
public void onRedrawRequest() {
|
||||||
for (JTextField input: nodeInputs) {
|
for (JTextField input : nodeInputs) {
|
||||||
MarkerOverlay tracker = markerTrackers.getOrDefault(input, null);
|
MarkerOverlay tracker = markerTrackers.getOrDefault(input, null);
|
||||||
if (tracker != null) {
|
if (tracker != null) {
|
||||||
MarkerOverlay newMarker = this.drawing.drawMarker(tracker.getPoint(),
|
MarkerOverlay newMarker = this.drawing.drawMarker(tracker.getPoint(),
|
||||||
|
@ -41,23 +41,23 @@ import org.insa.graphs.model.Graph;
|
|||||||
import org.insa.graphs.model.Path;
|
import org.insa.graphs.model.Path;
|
||||||
import org.insa.graphs.model.io.BinaryPathWriter;
|
import org.insa.graphs.model.io.BinaryPathWriter;
|
||||||
|
|
||||||
public class PathsPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
public class PathsPanel extends JPanel
|
||||||
|
implements DrawingChangeListener, GraphChangeListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private class PathPanel extends JPanel {
|
private class PathPanel extends JPanel {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple icon that represents a unicolor rectangle.
|
* Simple icon that represents a unicolor rectangle.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
protected class ColorIcon implements Icon {
|
protected class ColorIcon implements Icon {
|
||||||
|
|
||||||
@ -103,11 +103,9 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
/**
|
/**
|
||||||
* Create a new bundle with the given path and create a new overlay
|
* Create a new bundle with the given path and create a new overlay
|
||||||
* corresponding to the path.
|
* corresponding to the path.
|
||||||
*
|
*
|
||||||
* @param path Path for this bundle, must not be null.
|
* @param path Path for this bundle, must not be null.
|
||||||
*
|
|
||||||
* @throws IOException If a resource was not found.
|
* @throws IOException If a resource was not found.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public PathPanel(Path path, Color color) throws IOException {
|
public PathPanel(Path path, Color color) throws IOException {
|
||||||
super();
|
super();
|
||||||
@ -181,21 +179,24 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
chooser.getSelectionModel().addChangeListener(new ChangeListener() {
|
chooser.getSelectionModel().addChangeListener(new ChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void stateChanged(ChangeEvent e) {
|
public void stateChanged(ChangeEvent e) {
|
||||||
icon.setColor(chooser.getSelectionModel().getSelectedColor());
|
icon.setColor(
|
||||||
|
chooser.getSelectionModel().getSelectedColor());
|
||||||
colorButton.repaint();
|
colorButton.repaint();
|
||||||
overlay.setColor(chooser.getSelectionModel().getSelectedColor());
|
overlay.setColor(
|
||||||
|
chooser.getSelectionModel().getSelectedColor());
|
||||||
overlay.redraw();
|
overlay.redraw();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
JColorChooser.createDialog(getTopLevelAncestor(), "Pick a new color", true,
|
JColorChooser.createDialog(getTopLevelAncestor(),
|
||||||
chooser, new ActionListener() {
|
"Pick a new color", true, chooser, new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
icon.setColor(chooser.getSelectionModel().getSelectedColor());
|
icon.setColor(chooser.getSelectionModel()
|
||||||
|
.getSelectedColor());
|
||||||
colorButton.repaint();
|
colorButton.repaint();
|
||||||
overlay.setColor(
|
overlay.setColor(chooser.getSelectionModel()
|
||||||
chooser.getSelectionModel().getSelectedColor());
|
.getSelectedColor());
|
||||||
overlay.redraw();
|
overlay.redraw();
|
||||||
}
|
}
|
||||||
}, new ActionListener() {
|
}, new ActionListener() {
|
||||||
@ -206,14 +207,14 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
overlay.setColor(originalColor);
|
overlay.setColor(originalColor);
|
||||||
overlay.redraw();
|
overlay.redraw();
|
||||||
}
|
}
|
||||||
}).setVisible(true);
|
}).setVisible(true);;
|
||||||
;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Image saveImg = ImageIO.read(getClass().getResourceAsStream("/save-icon.png"))
|
Image saveImg =
|
||||||
.getScaledInstance(14, 14, java.awt.Image.SCALE_SMOOTH);
|
ImageIO.read(getClass().getResourceAsStream("/save-icon.png"))
|
||||||
|
.getScaledInstance(14, 14, java.awt.Image.SCALE_SMOOTH);
|
||||||
JButton saveButton = new JButton(new ImageIcon(saveImg));
|
JButton saveButton = new JButton(new ImageIcon(saveImg));
|
||||||
saveButton.setFocusPainted(false);
|
saveButton.setFocusPainted(false);
|
||||||
saveButton.setFocusable(false);
|
saveButton.setFocusable(false);
|
||||||
@ -224,16 +225,18 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
String filepath = String.format("path_%s_%d_%d.path",
|
String filepath = String.format("path_%s_%d_%d.path",
|
||||||
path.getGraph().getMapId().toLowerCase().replaceAll("[^a-z0-9_]", ""),
|
path.getGraph().getMapId().toLowerCase()
|
||||||
|
.replaceAll("[^a-z0-9_]", ""),
|
||||||
path.getOrigin().getId(), path.getDestination().getId());
|
path.getOrigin().getId(), path.getDestination().getId());
|
||||||
JFileChooser chooser = FileUtils.createFileChooser(FolderType.PathOutput,
|
JFileChooser chooser = FileUtils
|
||||||
filepath);
|
.createFileChooser(FolderType.PathOutput, filepath);
|
||||||
|
|
||||||
if (chooser
|
if (chooser.showSaveDialog(
|
||||||
.showSaveDialog(getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) {
|
getTopLevelAncestor()) == JFileChooser.APPROVE_OPTION) {
|
||||||
File file = chooser.getSelectedFile();
|
File file = chooser.getSelectedFile();
|
||||||
try (BinaryPathWriter writer = new BinaryPathWriter(new DataOutputStream(
|
try (BinaryPathWriter writer = new BinaryPathWriter(
|
||||||
new BufferedOutputStream(new FileOutputStream(file))))) {
|
new DataOutputStream(new BufferedOutputStream(
|
||||||
|
new FileOutputStream(file))))) {
|
||||||
writer.writePath(path);
|
writer.writePath(path);
|
||||||
}
|
}
|
||||||
catch (IOException e1) {
|
catch (IOException e1) {
|
||||||
@ -245,8 +248,9 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Image newimg = ImageIO.read(getClass().getResourceAsStream("/delete-icon.png"))
|
Image newimg =
|
||||||
.getScaledInstance(14, 14, java.awt.Image.SCALE_SMOOTH);
|
ImageIO.read(getClass().getResourceAsStream("/delete-icon.png"))
|
||||||
|
.getScaledInstance(14, 14, java.awt.Image.SCALE_SMOOTH);
|
||||||
JButton deleteButton = new JButton(new ImageIcon(newimg));
|
JButton deleteButton = new JButton(new ImageIcon(newimg));
|
||||||
deleteButton.setFocusPainted(false);
|
deleteButton.setFocusPainted(false);
|
||||||
deleteButton.setFocusable(false);
|
deleteButton.setFocusable(false);
|
||||||
@ -273,7 +277,6 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Re-draw the current overlay (if any) on the new drawing.
|
* Re-draw the current overlay (if any) on the new drawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void updateOverlay() {
|
public void updateOverlay() {
|
||||||
PathOverlay oldOverlay = this.overlay;
|
PathOverlay oldOverlay = this.overlay;
|
||||||
@ -287,7 +290,7 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see java.lang.Object#toString()
|
* @see java.lang.Object#toString()
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
@ -312,7 +315,8 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
|
|
||||||
public void addPath(Path path) {
|
public void addPath(Path path) {
|
||||||
try {
|
try {
|
||||||
this.add(new PathPanel(path, ColorUtils.getColor(this.getComponentCount())));
|
this.add(
|
||||||
|
new PathPanel(path, ColorUtils.getColor(this.getComponentCount())));
|
||||||
this.setVisible(true);
|
this.setVisible(true);
|
||||||
this.revalidate();
|
this.revalidate();
|
||||||
this.repaint();
|
this.repaint();
|
||||||
@ -333,7 +337,7 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void newGraphLoaded(Graph graph) {
|
public void newGraphLoaded(Graph graph) {
|
||||||
for (Component c: this.getComponents()) {
|
for (Component c : this.getComponents()) {
|
||||||
if (c instanceof PathPanel) {
|
if (c instanceof PathPanel) {
|
||||||
((PathPanel) c).overlay.delete();
|
((PathPanel) c).overlay.delete();
|
||||||
}
|
}
|
||||||
@ -351,7 +355,7 @@ public class PathsPanel extends JPanel implements DrawingChangeListener, GraphCh
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRedrawRequest() {
|
public void onRedrawRequest() {
|
||||||
for (Component c: this.getComponents()) {
|
for (Component c : this.getComponents()) {
|
||||||
if (c instanceof PathPanel) {
|
if (c instanceof PathPanel) {
|
||||||
((PathPanel) c).updateOverlay();
|
((PathPanel) c).updateOverlay();
|
||||||
}
|
}
|
||||||
|
@ -26,10 +26,11 @@ import org.insa.graphs.gui.drawing.overlays.PathOverlay;
|
|||||||
import org.insa.graphs.model.Graph;
|
import org.insa.graphs.model.Graph;
|
||||||
import org.insa.graphs.model.Path;
|
import org.insa.graphs.model.Path;
|
||||||
|
|
||||||
public class SolutionPanel extends JPanel implements DrawingChangeListener, GraphChangeListener {
|
public class SolutionPanel extends JPanel
|
||||||
|
implements DrawingChangeListener, GraphChangeListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -44,9 +45,8 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
/**
|
/**
|
||||||
* Create a new bundle with the given solution and create a new overlay
|
* Create a new bundle with the given solution and create a new overlay
|
||||||
* corresponding to the solution (if the solution is feasible).
|
* corresponding to the solution (if the solution is feasible).
|
||||||
*
|
*
|
||||||
* @param solution Solution for this bundle, must not be null.
|
* @param solution Solution for this bundle, must not be null.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public SolutionBundle(AbstractSolution solution, boolean createOverlays) {
|
public SolutionBundle(AbstractSolution solution, boolean createOverlays) {
|
||||||
this.solution = solution;
|
this.solution = solution;
|
||||||
@ -85,7 +85,6 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Re-draw the current overlay (if any) on the new drawing.
|
* Re-draw the current overlay (if any) on the new drawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void updateOverlays() {
|
public void updateOverlays() {
|
||||||
if (this.overlays.isEmpty()) {
|
if (this.overlays.isEmpty()) {
|
||||||
@ -102,7 +101,7 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
List<PathOverlay> overlays = new ArrayList<>();
|
List<PathOverlay> overlays = new ArrayList<>();
|
||||||
if (solution.isFeasible()) {
|
if (solution.isFeasible()) {
|
||||||
Method[] methods = this.solution.getClass().getDeclaredMethods();
|
Method[] methods = this.solution.getClass().getDeclaredMethods();
|
||||||
for (Method method: methods) {
|
for (Method method : methods) {
|
||||||
if (method.getReturnType().equals(Path.class)
|
if (method.getReturnType().equals(Path.class)
|
||||||
&& method.getParameterCount() == 0) {
|
&& method.getParameterCount() == 0) {
|
||||||
try {
|
try {
|
||||||
@ -122,7 +121,7 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see java.lang.Object#toString()
|
* @see java.lang.Object#toString()
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
@ -145,7 +144,8 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
public SolutionPanel(Component parent) {
|
public SolutionPanel(Component parent) {
|
||||||
super();
|
super();
|
||||||
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
||||||
setBorder(new CompoundBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY),
|
setBorder(new CompoundBorder(
|
||||||
|
BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY),
|
||||||
new EmptyBorder(10, 0, 10, 0)));
|
new EmptyBorder(10, 0, 10, 0)));
|
||||||
|
|
||||||
solutionSelect = new JComboBox<>();
|
solutionSelect = new JComboBox<>();
|
||||||
@ -167,7 +167,7 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
for (PathOverlay overlay: currentBundle.getOverlays()) {
|
for (PathOverlay overlay : currentBundle.getOverlays()) {
|
||||||
if (overlay.isVisible()) {
|
if (overlay.isVisible()) {
|
||||||
overlay.setVisible(false);
|
overlay.setVisible(false);
|
||||||
clearButton.setText("Show");
|
clearButton.setText("Show");
|
||||||
@ -193,21 +193,23 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
||||||
if (currentBundle != null) {
|
if (currentBundle != null) {
|
||||||
for (PathOverlay overlay: currentBundle.getOverlays()) {
|
for (PathOverlay overlay : currentBundle.getOverlays()) {
|
||||||
overlay.setVisible(false);
|
overlay.setVisible(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SolutionBundle bundle = (SolutionBundle) solutionSelect.getSelectedItem();
|
SolutionBundle bundle =
|
||||||
|
(SolutionBundle) solutionSelect.getSelectedItem();
|
||||||
|
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
|
|
||||||
updateInformationLabel(bundle);
|
updateInformationLabel(bundle);
|
||||||
buttonPanel
|
buttonPanel.setVisible(
|
||||||
.setVisible(bundle.getSolution().isFeasible() && bundle.hasOverlays());
|
bundle.getSolution().isFeasible() && bundle.hasOverlays());
|
||||||
clearButton.setText(bundle.getSolution().isFeasible() ? "Hide" : "Show");
|
clearButton.setText(
|
||||||
|
bundle.getSolution().isFeasible() ? "Hide" : "Show");
|
||||||
|
|
||||||
for (PathOverlay overlay: bundle.getOverlays()) {
|
for (PathOverlay overlay : bundle.getOverlays()) {
|
||||||
overlay.setVisible(true);
|
overlay.setVisible(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -224,10 +226,9 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the given solution to the panel.
|
* Add the given solution to the panel.
|
||||||
*
|
*
|
||||||
* @param solution the solution to add to the panel
|
* @param solution the solution to add to the panel
|
||||||
* @param createOverlays Whether or not overlay should be created for this
|
* @param createOverlays Whether or not overlay should be created for this solution.
|
||||||
* solution.
|
|
||||||
*/
|
*/
|
||||||
public void addSolution(AbstractSolution solution, boolean createOverlays) {
|
public void addSolution(AbstractSolution solution, boolean createOverlays) {
|
||||||
SolutionBundle bundle = new SolutionBundle(solution, createOverlays);
|
SolutionBundle bundle = new SolutionBundle(solution, createOverlays);
|
||||||
@ -251,9 +252,10 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
solutionSelect.setSelectedItem(currentBundle);
|
solutionSelect.setSelectedItem(currentBundle);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SolutionBundle bundle = (SolutionBundle) this.solutionSelect.getSelectedItem();
|
SolutionBundle bundle =
|
||||||
|
(SolutionBundle) this.solutionSelect.getSelectedItem();
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
for (PathOverlay overlay: bundle.getOverlays()) {
|
for (PathOverlay overlay : bundle.getOverlays()) {
|
||||||
overlay.setVisible(false);
|
overlay.setVisible(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -263,7 +265,7 @@ public class SolutionPanel extends JPanel implements DrawingChangeListener, Grap
|
|||||||
@Override
|
@Override
|
||||||
public void newGraphLoaded(Graph graph) {
|
public void newGraphLoaded(Graph graph) {
|
||||||
for (int i = 0; i < this.solutionSelect.getItemCount(); ++i) {
|
for (int i = 0; i < this.solutionSelect.getItemCount(); ++i) {
|
||||||
for (PathOverlay overlay: this.solutionSelect.getItemAt(i).getOverlays()) {
|
for (PathOverlay overlay : this.solutionSelect.getItemAt(i).getOverlays()) {
|
||||||
overlay.delete();
|
overlay.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ public class StreamCapturer extends OutputStream {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new StreamCapturer without prefix.
|
* Create a new StreamCapturer without prefix.
|
||||||
*
|
*
|
||||||
* @param output Output JTextArea to which this stream should print.
|
* @param output Output JTextArea to which this stream should print.
|
||||||
*/
|
*/
|
||||||
public StreamCapturer(JTextArea output) {
|
public StreamCapturer(JTextArea output) {
|
||||||
|
@ -17,28 +17,28 @@ public class BasicGraphPalette implements GraphPalette {
|
|||||||
public Color getColorForArc(Arc arc) {
|
public Color getColorForArc(Arc arc) {
|
||||||
RoadType type = arc.getRoadInformation().getType();
|
RoadType type = arc.getRoadInformation().getType();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOTORWAY:
|
case MOTORWAY:
|
||||||
return MOTORWAY_COLOR;
|
return MOTORWAY_COLOR;
|
||||||
case TRUNK:
|
case TRUNK:
|
||||||
case PRIMARY:
|
case PRIMARY:
|
||||||
case SECONDARY:
|
case SECONDARY:
|
||||||
case MOTORWAY_LINK:
|
case MOTORWAY_LINK:
|
||||||
case TRUNK_LINK:
|
case TRUNK_LINK:
|
||||||
case PRIMARY_LINK:
|
case PRIMARY_LINK:
|
||||||
return BIG_ROAD_COLOR;
|
return BIG_ROAD_COLOR;
|
||||||
case SECONDARY_LINK:
|
case SECONDARY_LINK:
|
||||||
case TERTIARY:
|
case TERTIARY:
|
||||||
case RESIDENTIAL:
|
case RESIDENTIAL:
|
||||||
case UNCLASSIFIED:
|
case UNCLASSIFIED:
|
||||||
case LIVING_STREET:
|
case LIVING_STREET:
|
||||||
case SERVICE:
|
case SERVICE:
|
||||||
case ROUNDABOUT:
|
case ROUNDABOUT:
|
||||||
case PEDESTRIAN:
|
case PEDESTRIAN:
|
||||||
case CYCLEWAY:
|
case CYCLEWAY:
|
||||||
case TRACK:
|
case TRACK:
|
||||||
return SMALL_ROAD_COLOR;
|
return SMALL_ROAD_COLOR;
|
||||||
case COASTLINE:
|
case COASTLINE:
|
||||||
return COASTLINE_COLOR;
|
return COASTLINE_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Color.BLACK;
|
return Color.BLACK;
|
||||||
@ -49,32 +49,32 @@ public class BasicGraphPalette implements GraphPalette {
|
|||||||
RoadType type = arc.getRoadInformation().getType();
|
RoadType type = arc.getRoadInformation().getType();
|
||||||
int width = 1;
|
int width = 1;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOTORWAY:
|
case MOTORWAY:
|
||||||
width = 2;
|
width = 2;
|
||||||
break;
|
break;
|
||||||
case TRUNK:
|
case TRUNK:
|
||||||
case PRIMARY:
|
case PRIMARY:
|
||||||
case SECONDARY:
|
case SECONDARY:
|
||||||
case MOTORWAY_LINK:
|
case MOTORWAY_LINK:
|
||||||
case TRUNK_LINK:
|
case TRUNK_LINK:
|
||||||
case PRIMARY_LINK:
|
case PRIMARY_LINK:
|
||||||
width = 1;
|
width = 1;
|
||||||
break;
|
break;
|
||||||
case SECONDARY_LINK:
|
case SECONDARY_LINK:
|
||||||
case TERTIARY:
|
case TERTIARY:
|
||||||
case RESIDENTIAL:
|
case RESIDENTIAL:
|
||||||
case UNCLASSIFIED:
|
case UNCLASSIFIED:
|
||||||
case LIVING_STREET:
|
case LIVING_STREET:
|
||||||
case SERVICE:
|
case SERVICE:
|
||||||
case ROUNDABOUT:
|
case ROUNDABOUT:
|
||||||
case PEDESTRIAN:
|
case PEDESTRIAN:
|
||||||
case CYCLEWAY:
|
case CYCLEWAY:
|
||||||
case TRACK:
|
case TRACK:
|
||||||
width = 1;
|
width = 1;
|
||||||
break;
|
break;
|
||||||
case COASTLINE:
|
case COASTLINE:
|
||||||
width = 4;
|
width = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,9 @@ import org.insa.graphs.model.Arc;
|
|||||||
public class BlackAndWhiteGraphPalette extends BasicGraphPalette {
|
public class BlackAndWhiteGraphPalette extends BasicGraphPalette {
|
||||||
|
|
||||||
// Road colors (index
|
// Road colors (index
|
||||||
private final static Color[] ROAD_COLOR_FROM_WIDTH = { null, new Color(140, 140, 140),
|
private final static Color[] ROAD_COLOR_FROM_WIDTH =
|
||||||
new Color(80, 80, 80), new Color(40, 40, 40), new Color(30, 30, 30) };
|
{ null, new Color(140, 140, 140), new Color(80, 80, 80),
|
||||||
|
new Color(40, 40, 40), new Color(30, 30, 30) };
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Color getColorForArc(Arc arc) {
|
public Color getColorForArc(Arc arc) {
|
||||||
|
@ -12,8 +12,8 @@ import org.insa.graphs.model.Point;
|
|||||||
public interface Drawing {
|
public interface Drawing {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Available fill mode for the creation of markers, see the documentation of
|
* Available fill mode for the creation of markers, see the documentation of each
|
||||||
* each value for more details.
|
* value for more details.
|
||||||
*/
|
*/
|
||||||
enum AlphaMode {
|
enum AlphaMode {
|
||||||
|
|
||||||
@ -30,14 +30,14 @@ public interface Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a listener to click to this drawing.
|
* Add a listener to click to this drawing.
|
||||||
*
|
*
|
||||||
* @param listener DrawingClickListener to add to this Drawing.
|
* @param listener DrawingClickListener to add to this Drawing.
|
||||||
*/
|
*/
|
||||||
public void addDrawingClickListener(DrawingClickListener listener);
|
public void addDrawingClickListener(DrawingClickListener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given listener from the drawing.
|
* Remove the given listener from the drawing.
|
||||||
*
|
*
|
||||||
* @param listener DrawingClickListener to remove from this Drawing.
|
* @param listener DrawingClickListener to remove from this Drawing.
|
||||||
*/
|
*/
|
||||||
public void removeDrawingClickListener(DrawingClickListener listener);
|
public void removeDrawingClickListener(DrawingClickListener listener);
|
||||||
@ -53,47 +53,43 @@ public interface Drawing {
|
|||||||
public void clearOverlays();
|
public void clearOverlays();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a marker at the given position using the given colors and according to
|
* Draw a marker at the given position using the given colors and according to the
|
||||||
* the given mode.
|
* given mode.
|
||||||
*
|
*
|
||||||
* @param point Position of the marker to draw.
|
* @param point Position of the marker to draw.
|
||||||
* @param outer Color for the outer part of the marker to draw.
|
* @param outer Color for the outer part of the marker to draw.
|
||||||
* @param inner Color for the inner part of the marker to draw.
|
* @param inner Color for the inner part of the marker to draw.
|
||||||
* @param mode Mode for filling the inner par of the marker.
|
* @param mode Mode for filling the inner par of the marker.
|
||||||
*
|
|
||||||
* @return A MarkerOverlay instance representing the newly drawn marker.
|
* @return A MarkerOverlay instance representing the newly drawn marker.
|
||||||
*/
|
*/
|
||||||
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode);
|
public MarkerOverlay drawMarker(Point point, Color outer, Color inner,
|
||||||
|
AlphaMode mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new PointSetOverlay that can be used to add overlay points to this
|
* Create a new PointSetOverlay that can be used to add overlay points to this
|
||||||
* drawing.
|
* drawing. PointSetOverlay are heavy memory resources, do not use one for each
|
||||||
*
|
* point!
|
||||||
* PointSetOverlay are heavy memory resources, do not use one for each point!
|
*
|
||||||
*
|
|
||||||
* @return A new PointSetOverlay for this drawing.
|
* @return A new PointSetOverlay for this drawing.
|
||||||
*/
|
*/
|
||||||
public PointSetOverlay createPointSetOverlay();
|
public PointSetOverlay createPointSetOverlay();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new PointSetOverlay with the given initial width and color that can
|
* Create a new PointSetOverlay with the given initial width and color that can be
|
||||||
* be used to add overlay points to this drawing.
|
* used to add overlay points to this drawing. PointSetOverlay are heavy memory
|
||||||
*
|
* resources, do not use one for each point!
|
||||||
* PointSetOverlay are heavy memory resources, do not use one for each point!
|
*
|
||||||
*
|
|
||||||
* @param width Initial width of points in the overlay.
|
* @param width Initial width of points in the overlay.
|
||||||
* @param color Initial width of points in the overlay.
|
* @param color Initial width of points in the overlay.
|
||||||
*
|
|
||||||
* @return A new PointSetOverlay for this drawing.
|
* @return A new PointSetOverlay for this drawing.
|
||||||
*/
|
*/
|
||||||
public PointSetOverlay createPointSetOverlay(int width, Color color);
|
public PointSetOverlay createPointSetOverlay(int width, Color color);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the given graph using the given palette.
|
* Draw the given graph using the given palette.
|
||||||
*
|
*
|
||||||
* @param graph Graph to draw.
|
* @param graph Graph to draw.
|
||||||
* @param palette Palette to use to draw the graph.
|
* @param palette Palette to use to draw the graph.
|
||||||
*
|
|
||||||
* @see BasicGraphPalette
|
* @see BasicGraphPalette
|
||||||
* @see BlackAndWhiteGraphPalette
|
* @see BlackAndWhiteGraphPalette
|
||||||
*/
|
*/
|
||||||
@ -101,42 +97,37 @@ public interface Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the given graph using a default palette specific to the implementation.
|
* Draw the given graph using a default palette specific to the implementation.
|
||||||
*
|
*
|
||||||
* @param graph Graph to draw.
|
* @param graph Graph to draw.
|
||||||
*/
|
*/
|
||||||
public void drawGraph(Graph graph);
|
public void drawGraph(Graph graph);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a path using the given color.
|
* Draw a path using the given color.
|
||||||
*
|
*
|
||||||
* @param path Path to draw.
|
* @param path Path to draw.
|
||||||
* @param color Color of the path to draw.
|
* @param color Color of the path to draw.
|
||||||
* @param markers true to show origin and destination markers.
|
* @param markers true to show origin and destination markers.
|
||||||
*
|
|
||||||
* @return A PathOverlay instance representing the newly drawn path.
|
* @return A PathOverlay instance representing the newly drawn path.
|
||||||
*/
|
*/
|
||||||
public PathOverlay drawPath(Path path, Color color, boolean markers);
|
public PathOverlay drawPath(Path path, Color color, boolean markers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a path with both origin and destination markers using the given color.
|
* Draw a path with both origin and destination markers using the given color.
|
||||||
*
|
*
|
||||||
* @param path Path to draw.
|
* @param path Path to draw.
|
||||||
* @param color Color of the path to draw.
|
* @param color Color of the path to draw.
|
||||||
*
|
|
||||||
* @return A PathOverlay instance representing the newly drawn path.
|
* @return A PathOverlay instance representing the newly drawn path.
|
||||||
*
|
|
||||||
* @see Drawing#drawPath(Path, Color, boolean)
|
* @see Drawing#drawPath(Path, Color, boolean)
|
||||||
*/
|
*/
|
||||||
public PathOverlay drawPath(Path path, Color color);
|
public PathOverlay drawPath(Path path, Color color);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw a path using a default color specific to the implementation
|
* Draw a path using a default color specific to the implementation
|
||||||
*
|
*
|
||||||
* @param path Path to draw.
|
* @param path Path to draw.
|
||||||
* @param markers true to show origin and destination markers.
|
* @param markers true to show origin and destination markers.
|
||||||
*
|
|
||||||
* @return A PathOverlay instance representing the newly drawn path.
|
* @return A PathOverlay instance representing the newly drawn path.
|
||||||
*
|
|
||||||
* @see Drawing#drawPath(Path, Color, boolean)
|
* @see Drawing#drawPath(Path, Color, boolean)
|
||||||
*/
|
*/
|
||||||
public PathOverlay drawPath(Path path, boolean markers);
|
public PathOverlay drawPath(Path path, boolean markers);
|
||||||
@ -144,12 +135,9 @@ public interface Drawing {
|
|||||||
/**
|
/**
|
||||||
* Draw a path with both origin and destination markers using a default color
|
* Draw a path with both origin and destination markers using a default color
|
||||||
* specific to the implementation
|
* specific to the implementation
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* @param path Path to draw.
|
* @param path Path to draw.
|
||||||
*
|
|
||||||
* @return A PathOverlay instance representing the newly drawn path.
|
* @return A PathOverlay instance representing the newly drawn path.
|
||||||
*
|
|
||||||
* @see Drawing#drawPath(Path, Color, boolean)
|
* @see Drawing#drawPath(Path, Color, boolean)
|
||||||
*/
|
*/
|
||||||
public PathOverlay drawPath(Path path);
|
public PathOverlay drawPath(Path path);
|
||||||
|
@ -6,7 +6,7 @@ public interface DrawingClickListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Event triggered when a click is made on the map.
|
* Event triggered when a click is made on the map.
|
||||||
*
|
*
|
||||||
* @param point Position (on the map) of the mouse click.
|
* @param point Position (on the map) of the mouse click.
|
||||||
*/
|
*/
|
||||||
public void mouseClicked(Point point);
|
public void mouseClicked(Point point);
|
||||||
|
@ -8,14 +8,12 @@ public interface GraphPalette {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param arc Arc for which color should be retrieved.
|
* @param arc Arc for which color should be retrieved.
|
||||||
*
|
|
||||||
* @return Color associated with the given arc.
|
* @return Color associated with the given arc.
|
||||||
*/
|
*/
|
||||||
public Color getColorForArc(Arc arc);
|
public Color getColorForArc(Arc arc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param arc Arc for which width should be retrieved.
|
* @param arc Arc for which width should be retrieved.
|
||||||
*
|
|
||||||
* @return Width associated with the given arc.
|
* @return Width associated with the given arc.
|
||||||
*/
|
*/
|
||||||
public int getWidthForArc(Arc arc);
|
public int getWidthForArc(Arc arc);
|
||||||
|
@ -28,10 +28,10 @@ public class MercatorProjection implements Projection {
|
|||||||
/**
|
/**
|
||||||
* Create a new MercatorProjection corresponding to the given BoundingBox and
|
* Create a new MercatorProjection corresponding to the given BoundingBox and
|
||||||
* maxSize.
|
* maxSize.
|
||||||
*
|
*
|
||||||
* @param boundingBox Box for this projection.
|
* @param boundingBox Box for this projection.
|
||||||
* @param maxSize Maximum size of any side (width / height) of the image to
|
* @param maxSize Maximum size of any side (width / height) of the image to which
|
||||||
* which this projection should draw.
|
* this projection should draw.
|
||||||
*/
|
*/
|
||||||
public MercatorProjection(BoundingBox boundingBox, int maxSize) {
|
public MercatorProjection(BoundingBox boundingBox, int maxSize) {
|
||||||
// Find minimum/maximum longitude and latitude.
|
// Find minimum/maximum longitude and latitude.
|
||||||
@ -51,9 +51,8 @@ public class MercatorProjection implements Projection {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the projection (without scaling) of the given latitude.
|
* Compute the projection (without scaling) of the given latitude.
|
||||||
*
|
*
|
||||||
* @param latitude Latitude to project.
|
* @param latitude Latitude to project.
|
||||||
*
|
|
||||||
* @return Projection of the given latitude (without scaling).
|
* @return Projection of the given latitude (without scaling).
|
||||||
*/
|
*/
|
||||||
private static double projectY(double latitude) {
|
private static double projectY(double latitude) {
|
||||||
@ -62,11 +61,10 @@ public class MercatorProjection implements Projection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the dimension required for drawing a projection of the given box on
|
* Compute the dimension required for drawing a projection of the given box on an
|
||||||
* an image, ensuring that none of the side of image is greater than maxSize.
|
* image, ensuring that none of the side of image is greater than maxSize.
|
||||||
*
|
*
|
||||||
* @param maxSize Maximum side of any side of the image.
|
* @param maxSize Maximum side of any side of the image.
|
||||||
*
|
|
||||||
* @return Dimension corresponding to the preferred size for the image.
|
* @return Dimension corresponding to the preferred size for the image.
|
||||||
*/
|
*/
|
||||||
protected Dimension computeImageSize(int maxSize) {
|
protected Dimension computeImageSize(int maxSize) {
|
||||||
@ -97,7 +95,8 @@ public class MercatorProjection implements Projection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int longitudeToPixelX(float longitude) {
|
public int longitudeToPixelX(float longitude) {
|
||||||
return (int) (width * (longitude - minLongitude) / (maxLongitude - minLongitude));
|
return (int) (width * (longitude - minLongitude)
|
||||||
|
/ (maxLongitude - minLongitude));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,10 +13,10 @@ public class PlateCarreProjection implements Projection {
|
|||||||
/**
|
/**
|
||||||
* Create a new PlateCarreProjection corresponding to the given BoundingBox and
|
* Create a new PlateCarreProjection corresponding to the given BoundingBox and
|
||||||
* maxSize.
|
* maxSize.
|
||||||
*
|
*
|
||||||
* @param boundingBox Box for this projection.
|
* @param boundingBox Box for this projection.
|
||||||
* @param maxSize Maximum size of any side (width / height) of the image to
|
* @param maxSize Maximum size of any side (width / height) of the image to which
|
||||||
* which this projection should draw.
|
* this projection should draw.
|
||||||
*/
|
*/
|
||||||
public PlateCarreProjection(BoundingBox boundingBox, int maxSize) {
|
public PlateCarreProjection(BoundingBox boundingBox, int maxSize) {
|
||||||
// Find minimum/maximum longitude and latitude.
|
// Find minimum/maximum longitude and latitude.
|
||||||
@ -25,7 +25,8 @@ public class PlateCarreProjection implements Projection {
|
|||||||
this.minLatitude = boundingBox.getBottomRightPoint().getLatitude();
|
this.minLatitude = boundingBox.getBottomRightPoint().getLatitude();
|
||||||
this.maxLatitude = boundingBox.getTopLeftPoint().getLatitude();
|
this.maxLatitude = boundingBox.getTopLeftPoint().getLatitude();
|
||||||
|
|
||||||
float diffLon = maxLongitude - minLongitude, diffLat = maxLatitude - minLatitude;
|
float diffLon = maxLongitude - minLongitude,
|
||||||
|
diffLat = maxLatitude - minLatitude;
|
||||||
|
|
||||||
this.width = diffLon < diffLat ? (int) (maxSize * diffLon / diffLat) : maxSize;
|
this.width = diffLon < diffLat ? (int) (maxSize * diffLon / diffLat) : maxSize;
|
||||||
this.height = diffLon < diffLat ? maxSize : (int) (maxSize * diffLat / diffLon);
|
this.height = diffLon < diffLat ? maxSize : (int) (maxSize * diffLat / diffLon);
|
||||||
|
@ -14,36 +14,32 @@ public interface Projection {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Project the given latitude on the image.
|
* Project the given latitude on the image.
|
||||||
*
|
*
|
||||||
* @param latitude Latitude to project.
|
* @param latitude Latitude to project.
|
||||||
*
|
|
||||||
* @return Projected position of the latitude on the image.
|
* @return Projected position of the latitude on the image.
|
||||||
*/
|
*/
|
||||||
public int latitudeToPixelY(float latitude);
|
public int latitudeToPixelY(float latitude);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project the given longitude on the image.
|
* Project the given longitude on the image.
|
||||||
*
|
*
|
||||||
* @param longitude Longitude to project.
|
* @param longitude Longitude to project.
|
||||||
*
|
|
||||||
* @return Projected position of the longitude on the image.
|
* @return Projected position of the longitude on the image.
|
||||||
*/
|
*/
|
||||||
public int longitudeToPixelX(float longitude);
|
public int longitudeToPixelX(float longitude);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the latitude associated to the given projected point.
|
* Retrieve the latitude associated to the given projected point.
|
||||||
*
|
*
|
||||||
* @param py Projected y-position for which latitude should be retrieved.
|
* @param py Projected y-position for which latitude should be retrieved.
|
||||||
*
|
|
||||||
* @return The original latitude of the point.
|
* @return The original latitude of the point.
|
||||||
*/
|
*/
|
||||||
public float pixelYToLatitude(double py);
|
public float pixelYToLatitude(double py);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the longitude associated to the given projected point.
|
* Retrieve the longitude associated to the given projected point.
|
||||||
*
|
*
|
||||||
* @param px Projected x-position for which longitude should be retrieved.
|
* @param px Projected x-position for which longitude should be retrieved.
|
||||||
*
|
|
||||||
* @return The original longitude of the point.
|
* @return The original longitude of the point.
|
||||||
*/
|
*/
|
||||||
public float pixelXToLongitude(double px);
|
public float pixelXToLongitude(double px);
|
||||||
|
@ -45,7 +45,7 @@ import org.insa.graphs.model.GraphStatistics.BoundingBox;
|
|||||||
public class BasicDrawing extends JPanel implements Drawing {
|
public class BasicDrawing extends JPanel implements Drawing {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 96779785877771827L;
|
private static final long serialVersionUID = 96779785877771827L;
|
||||||
|
|
||||||
@ -125,7 +125,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
private Color innerColor;
|
private Color innerColor;
|
||||||
private final AlphaMode alphaMode;
|
private final AlphaMode alphaMode;
|
||||||
|
|
||||||
public BasicMarkerOverlay(Point point, Color color, Color inner, AlphaMode alphaMode) {
|
public BasicMarkerOverlay(Point point, Color color, Color inner,
|
||||||
|
AlphaMode alphaMode) {
|
||||||
super(color);
|
super(color);
|
||||||
this.point = point;
|
this.point = point;
|
||||||
this.image = MarkerUtils.getMarkerForColor(color, inner, alphaMode);
|
this.image = MarkerUtils.getMarkerForColor(color, inner, alphaMode);
|
||||||
@ -146,7 +147,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
public void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
this.innerColor = this.innerColor.equals(this.color) ? color : innerColor;
|
this.innerColor = this.innerColor.equals(this.color) ? color : innerColor;
|
||||||
super.setColor(color);
|
super.setColor(color);
|
||||||
this.image = MarkerUtils.getMarkerForColor(color, this.innerColor, alphaMode);
|
this.image =
|
||||||
|
MarkerUtils.getMarkerForColor(color, this.innerColor, alphaMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -161,8 +163,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
int px = projection.longitudeToPixelX(getPoint().getLongitude());
|
int px = projection.longitudeToPixelX(getPoint().getLongitude());
|
||||||
int py = projection.latitudeToPixelY(getPoint().getLatitude());
|
int py = projection.latitudeToPixelY(getPoint().getLatitude());
|
||||||
|
|
||||||
graphics.drawImage(this.image, px - MARKER_WIDTH / 2, py - MARKER_HEIGHT, MARKER_WIDTH,
|
graphics.drawImage(this.image, px - MARKER_WIDTH / 2, py - MARKER_HEIGHT,
|
||||||
MARKER_HEIGHT, BasicDrawing.this);
|
MARKER_WIDTH, MARKER_HEIGHT, BasicDrawing.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -175,8 +177,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
// Origin / Destination markers.
|
// Origin / Destination markers.
|
||||||
private BasicMarkerOverlay origin, destination;
|
private BasicMarkerOverlay origin, destination;
|
||||||
|
|
||||||
public BasicPathOverlay(List<Point> points, Color color, BasicMarkerOverlay origin,
|
public BasicPathOverlay(List<Point> points, Color color,
|
||||||
BasicMarkerOverlay destination) {
|
BasicMarkerOverlay origin, BasicMarkerOverlay destination) {
|
||||||
super(color);
|
super(color);
|
||||||
this.points = points;
|
this.points = points;
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
@ -244,8 +246,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
public BasicPointSetOverlay() {
|
public BasicPointSetOverlay() {
|
||||||
super(Color.BLACK);
|
super(Color.BLACK);
|
||||||
this.image = new BufferedImage(BasicDrawing.this.width, BasicDrawing.this.height,
|
this.image = new BufferedImage(BasicDrawing.this.width,
|
||||||
BufferedImage.TYPE_4BYTE_ABGR);
|
BasicDrawing.this.height, BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
this.graphics = image.createGraphics();
|
this.graphics = image.createGraphics();
|
||||||
this.graphics.setBackground(new Color(0, 0, 0, 0));
|
this.graphics.setBackground(new Color(0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
@ -307,7 +309,6 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class encapsulating a set of overlays.
|
* Class encapsulating a set of overlays.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private class BasicOverlays {
|
private class BasicOverlays {
|
||||||
|
|
||||||
@ -316,8 +317,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
public synchronized void draw(Graphics2D g) {
|
public synchronized void draw(Graphics2D g) {
|
||||||
// Clear overlays.
|
// Clear overlays.
|
||||||
for (ArrayList<BasicOverlay> arr: this.overlays) {
|
for (ArrayList<BasicOverlay> arr : this.overlays) {
|
||||||
for (BasicOverlay overlay: arr) {
|
for (BasicOverlay overlay : arr) {
|
||||||
overlay.draw(g);
|
overlay.draw(g);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -334,7 +335,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
public void clear(boolean repaint) {
|
public void clear(boolean repaint) {
|
||||||
// Clear overlays.
|
// Clear overlays.
|
||||||
for (ArrayList<BasicOverlay> arr: this.overlays) {
|
for (ArrayList<BasicOverlay> arr : this.overlays) {
|
||||||
arr.clear();
|
arr.clear();
|
||||||
}
|
}
|
||||||
// Repaint if requested.
|
// Repaint if requested.
|
||||||
@ -397,7 +398,6 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BasicDrawing.
|
* Create a new BasicDrawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public BasicDrawing() {
|
public BasicDrawing() {
|
||||||
setLayout(null);
|
setLayout(null);
|
||||||
@ -440,7 +440,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
catch (NoninvertibleTransformException e) {
|
catch (NoninvertibleTransformException e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (DrawingClickListener listener: drawingClickListeners) {
|
for (DrawingClickListener listener : drawingClickListeners) {
|
||||||
listener.mouseClicked(lonlat);
|
listener.mouseClicked(lonlat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -476,7 +476,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.insa.graphics.drawing.Drawing#clear()
|
* @see org.insa.graphics.drawing.Drawing#clear()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -490,7 +490,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -508,16 +508,14 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
/**
|
/**
|
||||||
* Return the longitude and latitude corresponding to the given position of the
|
* Return the longitude and latitude corresponding to the given position of the
|
||||||
* MouseEvent.
|
* MouseEvent.
|
||||||
*
|
*
|
||||||
* @param event MouseEvent from which longitude/latitude should be retrieved.
|
* @param event MouseEvent from which longitude/latitude should be retrieved.
|
||||||
*
|
|
||||||
* @return Point representing the projection of the MouseEvent position in the
|
* @return Point representing the projection of the MouseEvent position in the
|
||||||
* graph/map.
|
* graph/map.
|
||||||
*
|
* @throws NoninvertibleTransformException if the actual transformation is invalid.
|
||||||
* @throws NoninvertibleTransformException if the actual transformation is
|
|
||||||
* invalid.
|
|
||||||
*/
|
*/
|
||||||
protected Point getLongitudeLatitude(MouseEvent event) throws NoninvertibleTransformException {
|
protected Point getLongitudeLatitude(MouseEvent event)
|
||||||
|
throws NoninvertibleTransformException {
|
||||||
// Get the point using the inverse transform of the Zoom/Pan object, this gives
|
// Get the point using the inverse transform of the Zoom/Pan object, this gives
|
||||||
// us
|
// us
|
||||||
// a point within the drawing box (between [0, 0] and [width, height]).
|
// a point within the drawing box (between [0, 0] and [width, height]).
|
||||||
@ -531,9 +529,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see
|
* @see org.insa.graphics.drawing.Drawing#addDrawingClickListener(org.insa.graphics.
|
||||||
* org.insa.graphics.drawing.Drawing#addDrawingClickListener(org.insa.graphics.
|
|
||||||
* drawing.DrawingClickListener)
|
* drawing.DrawingClickListener)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -543,7 +540,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.insa.graphics.drawing.Drawing#removeDrawingClickListener(org.insa.
|
* @see org.insa.graphics.drawing.Drawing#removeDrawingClickListener(org.insa.
|
||||||
* graphics.drawing.DrawingClickListener)
|
* graphics.drawing.DrawingClickListener)
|
||||||
*/
|
*/
|
||||||
@ -552,13 +549,16 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
this.drawingClickListeners.remove(listener);
|
this.drawingClickListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BasicMarkerOverlay createMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
public BasicMarkerOverlay createMarker(Point point, Color outer, Color inner,
|
||||||
|
AlphaMode mode) {
|
||||||
return new BasicMarkerOverlay(point, outer, inner, mode);
|
return new BasicMarkerOverlay(point, outer, inner, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
public MarkerOverlay drawMarker(Point point, Color outer, Color inner,
|
||||||
return (MarkerOverlay) this.overlays.add(createMarker(point, outer, inner, mode));
|
AlphaMode mode) {
|
||||||
|
return (MarkerOverlay) this.overlays
|
||||||
|
.add(createMarker(point, outer, inner, mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -575,17 +575,18 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the given arc.
|
* Draw the given arc.
|
||||||
*
|
*
|
||||||
* @param arc Arc to draw.
|
* @param arc Arc to draw.
|
||||||
* @param palette Palette to use to retrieve color and width for arc, or null to
|
* @param palette Palette to use to retrieve color and width for arc, or null to use
|
||||||
* use current settings.
|
* current settings.
|
||||||
*/
|
*/
|
||||||
protected void drawArc(Arc arc, GraphPalette palette, boolean repaint) {
|
protected void drawArc(Arc arc, GraphPalette palette, boolean repaint) {
|
||||||
List<Point> pts = arc.getPoints();
|
List<Point> pts = arc.getPoints();
|
||||||
if (!pts.isEmpty()) {
|
if (!pts.isEmpty()) {
|
||||||
if (palette != null) {
|
if (palette != null) {
|
||||||
this.graphGraphics.setColor(palette.getColorForArc(arc));
|
this.graphGraphics.setColor(palette.getColorForArc(arc));
|
||||||
this.graphGraphics.setStroke(new BasicStroke(palette.getWidthForArc(arc)));
|
this.graphGraphics
|
||||||
|
.setStroke(new BasicStroke(palette.getWidthForArc(arc)));
|
||||||
}
|
}
|
||||||
Iterator<Point> it1 = pts.iterator();
|
Iterator<Point> it1 = pts.iterator();
|
||||||
Point prev = it1.next();
|
Point prev = it1.next();
|
||||||
@ -608,7 +609,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the drawing for the given graph.
|
* Initialize the drawing for the given graph.
|
||||||
*
|
*
|
||||||
* @param graph
|
* @param graph
|
||||||
*/
|
*/
|
||||||
protected void initialize(Graph graph) {
|
protected void initialize(Graph graph) {
|
||||||
@ -633,7 +634,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
|
|
||||||
// Special projection for non-realistic maps...
|
// Special projection for non-realistic maps...
|
||||||
if (graph.getMapId().startsWith("0x")) {
|
if (graph.getMapId().startsWith("0x")) {
|
||||||
projection = new PlateCarreProjection(extendedBox, MAXIMUM_DRAWING_WIDTH / 4);
|
projection =
|
||||||
|
new PlateCarreProjection(extendedBox, MAXIMUM_DRAWING_WIDTH / 4);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
projection = new MercatorProjection(extendedBox, MAXIMUM_DRAWING_WIDTH);
|
projection = new MercatorProjection(extendedBox, MAXIMUM_DRAWING_WIDTH);
|
||||||
@ -679,8 +681,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
this.removeMouseMotionListener(zoomAndPanListener);
|
this.removeMouseMotionListener(zoomAndPanListener);
|
||||||
this.removeMouseWheelListener(zoomAndPanListener);
|
this.removeMouseWheelListener(zoomAndPanListener);
|
||||||
|
|
||||||
for (Node node: graph.getNodes()) {
|
for (Node node : graph.getNodes()) {
|
||||||
for (Arc arc: node.getSuccessors()) {
|
for (Arc arc : node.getSuccessors()) {
|
||||||
// Draw arcs only if there are one-way arcs or if origin is lower than
|
// Draw arcs only if there are one-way arcs or if origin is lower than
|
||||||
// destination, avoid drawing two-ways arc twice.
|
// destination, avoid drawing two-ways arc twice.
|
||||||
if (arc.getRoadInformation().isOneWay()
|
if (arc.getRoadInformation().isOneWay()
|
||||||
@ -710,7 +712,7 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
List<Point> points = new ArrayList<Point>();
|
List<Point> points = new ArrayList<Point>();
|
||||||
if (!path.isEmpty()) {
|
if (!path.isEmpty()) {
|
||||||
points.add(path.getOrigin().getPoint());
|
points.add(path.getOrigin().getPoint());
|
||||||
for (Arc arc: path.getArcs()) {
|
for (Arc arc : path.getArcs()) {
|
||||||
Iterator<Point> itPoint = arc.getPoints().iterator();
|
Iterator<Point> itPoint = arc.getPoints().iterator();
|
||||||
// Discard origin each time
|
// Discard origin each time
|
||||||
itPoint.next();
|
itPoint.next();
|
||||||
@ -721,7 +723,8 @@ public class BasicDrawing extends JPanel implements Drawing {
|
|||||||
}
|
}
|
||||||
BasicMarkerOverlay origin = null, destination = null;
|
BasicMarkerOverlay origin = null, destination = null;
|
||||||
if (markers && !path.isEmpty()) {
|
if (markers && !path.isEmpty()) {
|
||||||
origin = createMarker(path.getOrigin().getPoint(), color, color, AlphaMode.TRANSPARENT);
|
origin = createMarker(path.getOrigin().getPoint(), color, color,
|
||||||
|
AlphaMode.TRANSPARENT);
|
||||||
destination = createMarker(path.getDestination().getPoint(), color, color,
|
destination = createMarker(path.getDestination().getPoint(), color, color,
|
||||||
AlphaMode.TRANSPARENT);
|
AlphaMode.TRANSPARENT);
|
||||||
}
|
}
|
||||||
|
@ -56,13 +56,12 @@ import org.mapsforge.map.rendertheme.InternalRenderTheme;
|
|||||||
public class MapViewDrawing extends MapView implements Drawing {
|
public class MapViewDrawing extends MapView implements Drawing {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 8606967833704938092L;
|
private static final long serialVersionUID = 8606967833704938092L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base Overlay for MapViewDrawing overlays.
|
* Base Overlay for MapViewDrawing overlays.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private abstract class MapViewOverlay implements Overlay {
|
private abstract class MapViewOverlay implements Overlay {
|
||||||
|
|
||||||
@ -74,7 +73,7 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
public MapViewOverlay(Layer[] layers, Color color) {
|
public MapViewOverlay(Layer[] layers, Color color) {
|
||||||
this.layers = layers;
|
this.layers = layers;
|
||||||
for (Layer layer: this.layers) {
|
for (Layer layer : this.layers) {
|
||||||
MapViewDrawing.this.getLayerManager().getLayers().add(layer);
|
MapViewDrawing.this.getLayerManager().getLayers().add(layer);
|
||||||
}
|
}
|
||||||
this.color = color;
|
this.color = color;
|
||||||
@ -92,7 +91,7 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVisible(boolean visible) {
|
public void setVisible(boolean visible) {
|
||||||
for (Layer layer: layers) {
|
for (Layer layer : layers) {
|
||||||
layer.setVisible(visible);
|
layer.setVisible(visible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,7 +107,7 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
@Override
|
@Override
|
||||||
public void delete() {
|
public void delete() {
|
||||||
Layers mlayers = MapViewDrawing.this.getLayerManager().getLayers();
|
Layers mlayers = MapViewDrawing.this.getLayerManager().getLayers();
|
||||||
for (Layer layer: layers) {
|
for (Layer layer : layers) {
|
||||||
mlayers.remove(layer);
|
mlayers.remove(layer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,7 +120,6 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* MarkerOverlay for MapViewDrawing.
|
* MarkerOverlay for MapViewDrawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private class MapViewMarkerOverlay extends MapViewOverlay implements MarkerOverlay {
|
private class MapViewMarkerOverlay extends MapViewOverlay implements MarkerOverlay {
|
||||||
|
|
||||||
@ -144,10 +142,12 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setColor(Color outer) {
|
public void setColor(Color outer) {
|
||||||
this.innerColor = this.innerColor.equals(this.color) ? outer : this.innerColor;
|
this.innerColor =
|
||||||
|
this.innerColor.equals(this.color) ? outer : this.innerColor;
|
||||||
super.setColor(color);
|
super.setColor(color);
|
||||||
MarkerAutoScaling marker = (MarkerAutoScaling) super.layers[0];
|
MarkerAutoScaling marker = (MarkerAutoScaling) super.layers[0];
|
||||||
marker.setImage(MarkerUtils.getMarkerForColor(color, this.innerColor, this.alphaMode));
|
marker.setImage(MarkerUtils.getMarkerForColor(color, this.innerColor,
|
||||||
|
this.alphaMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -163,7 +163,6 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* PathOverlay for MapViewDrawing.
|
* PathOverlay for MapViewDrawing.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private class MapViewPathOverlay extends MapViewOverlay implements PathOverlay {
|
private class MapViewPathOverlay extends MapViewOverlay implements PathOverlay {
|
||||||
|
|
||||||
@ -180,19 +179,19 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
public void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
super.setColor(color);
|
super.setColor(color);
|
||||||
((PolylineAutoScaling) this.layers[0]).setColor(color);
|
((PolylineAutoScaling) this.layers[0]).setColor(color);
|
||||||
((MarkerAutoScaling) this.layers[1])
|
((MarkerAutoScaling) this.layers[1]).setImage(
|
||||||
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
||||||
((MarkerAutoScaling) this.layers[2])
|
((MarkerAutoScaling) this.layers[2]).setImage(
|
||||||
.setImage(MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
MarkerUtils.getMarkerForColor(color, color, AlphaMode.TRANSPARENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PointSetOverlay for MapViewDrawing - Not currently implemented.
|
* PointSetOverlay for MapViewDrawing - Not currently implemented.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
private class MapViewPointSetOverlay extends MapViewOverlay implements PointSetOverlay {
|
private class MapViewPointSetOverlay extends MapViewOverlay
|
||||||
|
implements PointSetOverlay {
|
||||||
|
|
||||||
private List<Point> points = new ArrayList<>();
|
private List<Point> points = new ArrayList<>();
|
||||||
private final Polygon polygon;
|
private final Polygon polygon;
|
||||||
@ -205,8 +204,9 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
List<Point> h = new ArrayList<>();
|
List<Point> h = new ArrayList<>();
|
||||||
|
|
||||||
// lower hull
|
// lower hull
|
||||||
for (Point pt: p) {
|
for (Point pt : p) {
|
||||||
while (h.size() >= 2 && !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
while (h.size() >= 2
|
||||||
|
&& !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
||||||
h.remove(h.size() - 1);
|
h.remove(h.size() - 1);
|
||||||
}
|
}
|
||||||
h.add(pt);
|
h.add(pt);
|
||||||
@ -216,7 +216,8 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
int t = h.size() + 1;
|
int t = h.size() + 1;
|
||||||
for (int i = p.size() - 1; i >= 0; i--) {
|
for (int i = p.size() - 1; i >= 0; i--) {
|
||||||
Point pt = p.get(i);
|
Point pt = p.get(i);
|
||||||
while (h.size() >= t && !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
while (h.size() >= t
|
||||||
|
&& !ccw(h.get(h.size() - 2), h.get(h.size() - 1), pt)) {
|
||||||
h.remove(h.size() - 1);
|
h.remove(h.size() - 1);
|
||||||
}
|
}
|
||||||
h.add(pt);
|
h.add(pt);
|
||||||
@ -228,13 +229,14 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
// ccw returns true if the three points make a counter-clockwise turn
|
// ccw returns true if the three points make a counter-clockwise turn
|
||||||
private boolean ccw(Point a, Point b, Point c) {
|
private boolean ccw(Point a, Point b, Point c) {
|
||||||
return ((b.getLongitude() - a.getLongitude())
|
return ((b.getLongitude() - a.getLongitude()) * (c.getLatitude()
|
||||||
* (c.getLatitude() - a.getLatitude())) > ((b.getLatitude() - a.getLatitude())
|
- a.getLatitude())) > ((b.getLatitude() - a.getLatitude())
|
||||||
* (c.getLongitude() - a.getLongitude()));
|
* (c.getLongitude() - a.getLongitude()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapViewPointSetOverlay() {
|
public MapViewPointSetOverlay() {
|
||||||
super(new Layer[] { new Polygon(GRAPHIC_FACTORY.createPaint(), null, GRAPHIC_FACTORY) },
|
super(new Layer[] {
|
||||||
|
new Polygon(GRAPHIC_FACTORY.createPaint(), null, GRAPHIC_FACTORY) },
|
||||||
Color.BLACK);
|
Color.BLACK);
|
||||||
polygon = (Polygon) this.layers[0];
|
polygon = (Polygon) this.layers[0];
|
||||||
}
|
}
|
||||||
@ -242,13 +244,12 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
@Override
|
@Override
|
||||||
public void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
super.setColor(color);
|
super.setColor(color);
|
||||||
polygon.getPaintFill().setColor(GRAPHIC_FACTORY.createColor(100, color.getRed(),
|
polygon.getPaintFill().setColor(GRAPHIC_FACTORY.createColor(100,
|
||||||
color.getGreen(), color.getBlue()));
|
color.getRed(), color.getGreen(), color.getBlue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setWidth(int width) {
|
public void setWidth(int width) {}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setWidthAndColor(int width, Color color) {
|
public void setWidthAndColor(int width, Color color) {
|
||||||
@ -260,8 +261,9 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
public void addPoint(Point point) {
|
public void addPoint(Point point) {
|
||||||
points.add(point);
|
points.add(point);
|
||||||
this.points = convexHull(points);
|
this.points = convexHull(points);
|
||||||
polygon.setPoints(this.points.stream().map(MapViewDrawing.this::convertPoint)
|
polygon.setPoints(
|
||||||
.collect(Collectors.toList()));
|
this.points.stream().map(MapViewDrawing.this::convertPoint)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
polygon.requestRedraw();
|
polygon.requestRedraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,14 +342,15 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.mapsforge.map.awt.view.MapView#paint(java.awt.Graphics)
|
* @see org.mapsforge.map.awt.view.MapView#paint(java.awt.Graphics)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void paint(Graphics graphics) {
|
public void paint(Graphics graphics) {
|
||||||
super.paint(graphics);
|
super.paint(graphics);
|
||||||
if (this.zoomControls != null) {
|
if (this.zoomControls != null) {
|
||||||
this.zoomControls.setZoomLevel(this.getModel().mapViewPosition.getZoomLevel());
|
this.zoomControls
|
||||||
|
.setZoomLevel(this.getModel().mapViewPosition.getZoomLevel());
|
||||||
this.zoomControls.draw((Graphics2D) graphics,
|
this.zoomControls.draw((Graphics2D) graphics,
|
||||||
getWidth() - this.zoomControls.getWidth() - 20,
|
getWidth() - this.zoomControls.getWidth() - 20,
|
||||||
this.getHeight() - this.zoomControls.getHeight() - 10, this);
|
this.getHeight() - this.zoomControls.getHeight() - 10, this);
|
||||||
@ -357,7 +360,7 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.insa.graphics.drawing.Drawing#clear()
|
* @see org.insa.graphics.drawing.Drawing#clear()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -368,14 +371,15 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
* @see org.insa.graphics.drawing.Drawing#clearOverlays()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void clearOverlays() {
|
public void clearOverlays() {
|
||||||
Layers layers = getLayerManager().getLayers();
|
Layers layers = getLayerManager().getLayers();
|
||||||
for (Layer layer: layers) {
|
for (Layer layer : layers) {
|
||||||
if (layer instanceof PolylineAutoScaling || layer instanceof MarkerAutoScaling) {
|
if (layer instanceof PolylineAutoScaling
|
||||||
|
|| layer instanceof MarkerAutoScaling) {
|
||||||
getLayerManager().getLayers().remove(layer, false);
|
getLayerManager().getLayers().remove(layer, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -389,22 +393,25 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
private TileRendererLayer createTileRendererLayer(TileCache tileCache,
|
private TileRendererLayer createTileRendererLayer(TileCache tileCache,
|
||||||
MapDataStore mapDataStore, IMapViewPosition mapViewPosition,
|
MapDataStore mapDataStore, IMapViewPosition mapViewPosition,
|
||||||
HillsRenderConfig hillsRenderConfig) {
|
HillsRenderConfig hillsRenderConfig) {
|
||||||
TileRendererLayer tileRendererLayer = new TileRendererLayer(tileCache, mapDataStore,
|
TileRendererLayer tileRendererLayer =
|
||||||
mapViewPosition, false, true, false, GRAPHIC_FACTORY, hillsRenderConfig) {
|
new TileRendererLayer(tileCache, mapDataStore, mapViewPosition, false,
|
||||||
@Override
|
true, false, GRAPHIC_FACTORY, hillsRenderConfig) {
|
||||||
public boolean onTap(LatLong tapLatLong, org.mapsforge.core.model.Point layerXY,
|
@Override
|
||||||
org.mapsforge.core.model.Point tapXY) {
|
public boolean onTap(LatLong tapLatLong,
|
||||||
if (zoomControls.contains(new java.awt.Point((int) tapXY.x, (int) tapXY.y))) {
|
org.mapsforge.core.model.Point layerXY,
|
||||||
return false;
|
org.mapsforge.core.model.Point tapXY) {
|
||||||
}
|
if (zoomControls.contains(
|
||||||
Point pt = new Point((float) tapLatLong.getLongitude(),
|
new java.awt.Point((int) tapXY.x, (int) tapXY.y))) {
|
||||||
(float) tapLatLong.getLatitude());
|
return false;
|
||||||
for (DrawingClickListener listener: MapViewDrawing.this.drawingClickListeners) {
|
}
|
||||||
listener.mouseClicked(pt);
|
Point pt = new Point((float) tapLatLong.getLongitude(),
|
||||||
}
|
(float) tapLatLong.getLatitude());
|
||||||
return true;
|
for (DrawingClickListener listener : MapViewDrawing.this.drawingClickListeners) {
|
||||||
}
|
listener.mouseClicked(pt);
|
||||||
};
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.DEFAULT);
|
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.DEFAULT);
|
||||||
return tileRendererLayer;
|
return tileRendererLayer;
|
||||||
}
|
}
|
||||||
@ -426,9 +433,10 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MarkerOverlay drawMarker(Point point, Color outer, Color inner, AlphaMode mode) {
|
public MarkerOverlay drawMarker(Point point, Color outer, Color inner,
|
||||||
return new MapViewMarkerOverlay(createMarker(point, outer, inner, mode), outer, inner,
|
AlphaMode mode) {
|
||||||
mode);
|
return new MapViewMarkerOverlay(createMarker(point, outer, inner, mode), outer,
|
||||||
|
inner, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -448,24 +456,26 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
// Tile cache
|
// Tile cache
|
||||||
TileCache tileCache = AwtUtil.createTileCache(tileSize,
|
TileCache tileCache = AwtUtil.createTileCache(tileSize,
|
||||||
getModel().frameBufferModel.getOverdrawFactor(), 1024,
|
getModel().frameBufferModel.getOverdrawFactor(), 1024,
|
||||||
new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()));
|
new File(System.getProperty("java.io.tmpdir"),
|
||||||
|
UUID.randomUUID().toString()));
|
||||||
|
|
||||||
// Layers
|
// Layers
|
||||||
Layers layers = getLayerManager().getLayers();
|
Layers layers = getLayerManager().getLayers();
|
||||||
|
|
||||||
MapDataStore mapDataStore = new MapFile(file);
|
MapDataStore mapDataStore = new MapFile(file);
|
||||||
TileRendererLayer tileRendererLayer = createTileRendererLayer(tileCache, mapDataStore,
|
TileRendererLayer tileRendererLayer = createTileRendererLayer(tileCache,
|
||||||
getModel().mapViewPosition, null);
|
mapDataStore, getModel().mapViewPosition, null);
|
||||||
layers.add(tileRendererLayer);
|
layers.add(tileRendererLayer);
|
||||||
BoundingBox boundingBox = mapDataStore.boundingBox();
|
BoundingBox boundingBox = mapDataStore.boundingBox();
|
||||||
|
|
||||||
final Model model = getModel();
|
final Model model = getModel();
|
||||||
if (model.mapViewPosition.getZoomLevel() == 0
|
if (model.mapViewPosition.getZoomLevel() == 0
|
||||||
|| !boundingBox.contains(model.mapViewPosition.getCenter())) {
|
|| !boundingBox.contains(model.mapViewPosition.getCenter())) {
|
||||||
byte zoomLevel = LatLongUtils.zoomForBounds(model.mapViewDimension.getDimension(),
|
byte zoomLevel =
|
||||||
boundingBox, model.displayModel.getTileSize());
|
LatLongUtils.zoomForBounds(model.mapViewDimension.getDimension(),
|
||||||
model.mapViewPosition
|
boundingBox, model.displayModel.getTileSize());
|
||||||
.setMapPosition(new MapPosition(boundingBox.getCenterPoint(), zoomLevel));
|
model.mapViewPosition.setMapPosition(
|
||||||
|
new MapPosition(boundingBox.getCenterPoint(), zoomLevel));
|
||||||
zoomControls.setZoomLevel(zoomLevel);
|
zoomControls.setZoomLevel(zoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,16 +495,17 @@ public class MapViewDrawing extends MapView implements Drawing {
|
|||||||
public PathOverlay drawPath(Path path, Color color, boolean markers) {
|
public PathOverlay drawPath(Path path, Color color, boolean markers) {
|
||||||
PolylineAutoScaling line = new PolylineAutoScaling(1, color);
|
PolylineAutoScaling line = new PolylineAutoScaling(1, color);
|
||||||
ArrayList<Point> points = new ArrayList<>(path.getArcs().size() * 4);
|
ArrayList<Point> points = new ArrayList<>(path.getArcs().size() * 4);
|
||||||
for (Arc arc: path.getArcs()) {
|
for (Arc arc : path.getArcs()) {
|
||||||
points.addAll(arc.getPoints());
|
points.addAll(arc.getPoints());
|
||||||
}
|
}
|
||||||
line.addAll(points);
|
line.addAll(points);
|
||||||
PathOverlay overlay = null;
|
PathOverlay overlay = null;
|
||||||
if (markers) {
|
if (markers) {
|
||||||
MarkerAutoScaling origin = createMarker(path.getOrigin().getPoint(), color, color,
|
MarkerAutoScaling origin =
|
||||||
AlphaMode.TRANSPARENT),
|
createMarker(path.getOrigin().getPoint(), color, color,
|
||||||
destination = createMarker(path.getDestination().getPoint(), color, color,
|
AlphaMode.TRANSPARENT),
|
||||||
AlphaMode.TRANSPARENT);
|
destination = createMarker(path.getDestination().getPoint(), color,
|
||||||
|
color, AlphaMode.TRANSPARENT);
|
||||||
overlay = new MapViewPathOverlay(line, origin, destination);
|
overlay = new MapViewPathOverlay(line, origin, destination);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -61,8 +61,8 @@ public class MapZoomControls {
|
|||||||
private final List<ActionListener> zoomInListeners = new ArrayList<>();
|
private final List<ActionListener> zoomInListeners = new ArrayList<>();
|
||||||
private final List<ActionListener> zoomOutListeners = new ArrayList<>();
|
private final List<ActionListener> zoomOutListeners = new ArrayList<>();
|
||||||
|
|
||||||
public MapZoomControls(Component component, final int defaultZoom, final int minZoom,
|
public MapZoomControls(Component component, final int defaultZoom,
|
||||||
final int maxZoom) throws IOException {
|
final int minZoom, final int maxZoom) throws IOException {
|
||||||
|
|
||||||
zoomIn = ImageIO.read(getClass().getResourceAsStream("/zoomIn.png"))
|
zoomIn = ImageIO.read(getClass().getResourceAsStream("/zoomIn.png"))
|
||||||
.getScaledInstance(DEFAULT_HEIGHT, DEFAULT_HEIGHT, Image.SCALE_SMOOTH);
|
.getScaledInstance(DEFAULT_HEIGHT, DEFAULT_HEIGHT, Image.SCALE_SMOOTH);
|
||||||
@ -76,7 +76,8 @@ public class MapZoomControls {
|
|||||||
component.addMouseMotionListener(new MouseAdapter() {
|
component.addMouseMotionListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseMoved(MouseEvent e) {
|
public void mouseMoved(MouseEvent e) {
|
||||||
if (zoomInRect.contains(e.getPoint()) || zoomOutRect.contains(e.getPoint())) {
|
if (zoomInRect.contains(e.getPoint())
|
||||||
|
|| zoomOutRect.contains(e.getPoint())) {
|
||||||
component.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
component.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -90,16 +91,17 @@ public class MapZoomControls {
|
|||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
if (zoomInRect.contains(e.getPoint()) && currentLevel < maxLevel) {
|
if (zoomInRect.contains(e.getPoint()) && currentLevel < maxLevel) {
|
||||||
currentLevel += 1;
|
currentLevel += 1;
|
||||||
for (ActionListener al: zoomInListeners) {
|
for (ActionListener al : zoomInListeners) {
|
||||||
al.actionPerformed(
|
al.actionPerformed(new ActionEvent(this, ZOOM_IN_ACTION_ID,
|
||||||
new ActionEvent(this, ZOOM_IN_ACTION_ID, ZOOM_IN_ACTION_NAME));
|
ZOOM_IN_ACTION_NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (zoomOutRect.contains(e.getPoint()) && currentLevel > minLevel) {
|
else if (zoomOutRect.contains(e.getPoint())
|
||||||
|
&& currentLevel > minLevel) {
|
||||||
currentLevel -= 1;
|
currentLevel -= 1;
|
||||||
for (ActionListener al: zoomOutListeners) {
|
for (ActionListener al : zoomOutListeners) {
|
||||||
al.actionPerformed(
|
al.actionPerformed(new ActionEvent(this, ZOOM_OUT_ACTION_ID,
|
||||||
new ActionEvent(this, ZOOM_OUT_ACTION_ID, ZOOM_OUT_ACTION_NAME));
|
ZOOM_OUT_ACTION_NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
component.repaint();
|
component.repaint();
|
||||||
@ -109,7 +111,7 @@ public class MapZoomControls {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a zoom-in listener.
|
* Add a zoom-in listener.
|
||||||
*
|
*
|
||||||
* @param listener Zoom-in listener to add to this MapZoomControls instance.
|
* @param listener Zoom-in listener to add to this MapZoomControls instance.
|
||||||
*/
|
*/
|
||||||
public void addZoomInListener(ActionListener listener) {
|
public void addZoomInListener(ActionListener listener) {
|
||||||
@ -118,7 +120,7 @@ public class MapZoomControls {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a zoom-out listener.
|
* Add a zoom-out listener.
|
||||||
*
|
*
|
||||||
* @param listener Zoom-out listener to add to this MapZoomControls instance.
|
* @param listener Zoom-out listener to add to this MapZoomControls instance.
|
||||||
*/
|
*/
|
||||||
public void addZoomOutListener(ActionListener listener) {
|
public void addZoomOutListener(ActionListener listener) {
|
||||||
@ -134,7 +136,7 @@ public class MapZoomControls {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current zoom level without requesting a redraw.
|
* Set the current zoom level without requesting a redraw.
|
||||||
*
|
*
|
||||||
* @param level Zoom level to set.
|
* @param level Zoom level to set.
|
||||||
*/
|
*/
|
||||||
public void setZoomLevel(int level) {
|
public void setZoomLevel(int level) {
|
||||||
@ -152,24 +154,23 @@ public class MapZoomControls {
|
|||||||
* @return Width of this "component" when drawn.
|
* @return Width of this "component" when drawn.
|
||||||
*/
|
*/
|
||||||
public int getWidth() {
|
public int getWidth() {
|
||||||
return DEFAULT_HEIGHT + 2 + (this.maxLevel - this.minLevel) * DEFAULT_SPACING + 1 + 2
|
return DEFAULT_HEIGHT + 2 + (this.maxLevel - this.minLevel) * DEFAULT_SPACING
|
||||||
+ DEFAULT_HEIGHT;
|
+ 1 + 2 + DEFAULT_HEIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a point is contained inside an element of this zoom controls, useful
|
* Check if a point is contained inside an element of this zoom controls, useful to
|
||||||
* to avoid spurious click listeners.
|
* avoid spurious click listeners.
|
||||||
*
|
*
|
||||||
* @param point Point to check.
|
* @param point Point to check.
|
||||||
*
|
* @return true if the given point correspond to an element of this zoom controls.
|
||||||
* @return true if the given point correspond to an element of this zoom
|
|
||||||
* controls.
|
|
||||||
*/
|
*/
|
||||||
public boolean contains(Point point) {
|
public boolean contains(Point point) {
|
||||||
return zoomInRect.contains(point) || zoomOutRect.contains(point);
|
return zoomInRect.contains(point) || zoomOutRect.contains(point);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void draw(Graphics2D g, int xoffset, int yoffset, ImageObserver observer) {
|
protected void draw(Graphics2D g, int xoffset, int yoffset,
|
||||||
|
ImageObserver observer) {
|
||||||
|
|
||||||
int height = getHeight();
|
int height = getHeight();
|
||||||
|
|
||||||
|
@ -11,7 +11,8 @@ import java.awt.geom.AffineTransform;
|
|||||||
import java.awt.geom.NoninvertibleTransformException;
|
import java.awt.geom.NoninvertibleTransformException;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
|
||||||
public class ZoomAndPanListener implements MouseListener, MouseMotionListener, MouseWheelListener {
|
public class ZoomAndPanListener
|
||||||
|
implements MouseListener, MouseMotionListener, MouseWheelListener {
|
||||||
public static final int DEFAULT_MIN_ZOOM_LEVEL = -20;
|
public static final int DEFAULT_MIN_ZOOM_LEVEL = -20;
|
||||||
public static final int DEFAULT_MAX_ZOOM_LEVEL = 10;
|
public static final int DEFAULT_MAX_ZOOM_LEVEL = 10;
|
||||||
public static final double DEFAULT_ZOOM_MULTIPLICATION_FACTOR = 1.2;
|
public static final double DEFAULT_ZOOM_MULTIPLICATION_FACTOR = 1.2;
|
||||||
@ -31,8 +32,8 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
this.targetComponent = targetComponent;
|
this.targetComponent = targetComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZoomAndPanListener(Component targetComponent, int minZoomLevel, int maxZoomLevel,
|
public ZoomAndPanListener(Component targetComponent, int minZoomLevel,
|
||||||
double zoomMultiplicationFactor) {
|
int maxZoomLevel, double zoomMultiplicationFactor) {
|
||||||
this.targetComponent = targetComponent;
|
this.targetComponent = targetComponent;
|
||||||
this.minZoomLevel = minZoomLevel;
|
this.minZoomLevel = minZoomLevel;
|
||||||
this.maxZoomLevel = maxZoomLevel;
|
this.maxZoomLevel = maxZoomLevel;
|
||||||
@ -44,25 +45,20 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {}
|
||||||
}
|
|
||||||
|
|
||||||
public void mousePressed(MouseEvent e) {
|
public void mousePressed(MouseEvent e) {
|
||||||
dragStartScreen = e.getPoint();
|
dragStartScreen = e.getPoint();
|
||||||
dragEndScreen = null;
|
dragEndScreen = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseReleased(MouseEvent e) {
|
public void mouseReleased(MouseEvent e) {}
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseEntered(MouseEvent e) {
|
public void mouseEntered(MouseEvent e) {}
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseExited(MouseEvent e) {
|
public void mouseExited(MouseEvent e) {}
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseMoved(MouseEvent e) {
|
public void mouseMoved(MouseEvent e) {}
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseDragged(MouseEvent e) {
|
public void mouseDragged(MouseEvent e) {
|
||||||
moveCamera(e);
|
moveCamera(e);
|
||||||
@ -97,9 +93,11 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
if (zoomLevel < maxZoomLevel) {
|
if (zoomLevel < maxZoomLevel) {
|
||||||
zoomLevel++;
|
zoomLevel++;
|
||||||
Point2D p1 = transformPoint(p);
|
Point2D p1 = transformPoint(p);
|
||||||
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
coordTransform.scale(zoomMultiplicationFactor,
|
||||||
|
zoomMultiplicationFactor);
|
||||||
Point2D p2 = transformPoint(p);
|
Point2D p2 = transformPoint(p);
|
||||||
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
coordTransform.translate(p2.getX() - p1.getX(),
|
||||||
|
p2.getY() - p1.getY());
|
||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,7 +108,8 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
coordTransform.scale(1 / zoomMultiplicationFactor,
|
coordTransform.scale(1 / zoomMultiplicationFactor,
|
||||||
1 / zoomMultiplicationFactor);
|
1 / zoomMultiplicationFactor);
|
||||||
Point2D p2 = transformPoint(p);
|
Point2D p2 = transformPoint(p);
|
||||||
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
coordTransform.translate(p2.getX() - p1.getX(),
|
||||||
|
p2.getY() - p1.getY());
|
||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +119,8 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Point2D.Float transformPoint(Point p1) throws NoninvertibleTransformException {
|
private Point2D.Float transformPoint(Point p1)
|
||||||
|
throws NoninvertibleTransformException {
|
||||||
|
|
||||||
AffineTransform inverse = coordTransform.createInverse();
|
AffineTransform inverse = coordTransform.createInverse();
|
||||||
|
|
||||||
@ -139,7 +139,8 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
|
|
||||||
public void zoomIn() {
|
public void zoomIn() {
|
||||||
try {
|
try {
|
||||||
Point p = new Point(targetComponent.getWidth() / 2, targetComponent.getHeight() / 2);
|
Point p = new Point(targetComponent.getWidth() / 2,
|
||||||
|
targetComponent.getHeight() / 2);
|
||||||
zoomLevel++;
|
zoomLevel++;
|
||||||
Point2D p1 = transformPoint(p);
|
Point2D p1 = transformPoint(p);
|
||||||
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
coordTransform.scale(zoomMultiplicationFactor, zoomMultiplicationFactor);
|
||||||
@ -154,10 +155,12 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
|
|
||||||
public void zoomOut() {
|
public void zoomOut() {
|
||||||
try {
|
try {
|
||||||
Point p = new Point(targetComponent.getWidth() / 2, targetComponent.getHeight() / 2);
|
Point p = new Point(targetComponent.getWidth() / 2,
|
||||||
|
targetComponent.getHeight() / 2);
|
||||||
zoomLevel--;
|
zoomLevel--;
|
||||||
Point2D p1 = transformPoint(p);
|
Point2D p1 = transformPoint(p);
|
||||||
coordTransform.scale(1 / zoomMultiplicationFactor, 1 / zoomMultiplicationFactor);
|
coordTransform.scale(1 / zoomMultiplicationFactor,
|
||||||
|
1 / zoomMultiplicationFactor);
|
||||||
Point2D p2 = transformPoint(p);
|
Point2D p2 = transformPoint(p);
|
||||||
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
coordTransform.translate(p2.getX() - p1.getX(), p2.getY() - p1.getY());
|
||||||
targetComponent.repaint();
|
targetComponent.repaint();
|
||||||
@ -174,4 +177,4 @@ public class ZoomAndPanListener implements MouseListener, MouseMotionListener, M
|
|||||||
public void setCoordTransform(AffineTransform coordTransform) {
|
public void setCoordTransform(AffineTransform coordTransform) {
|
||||||
this.coordTransform = coordTransform;
|
this.coordTransform = coordTransform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,12 +12,10 @@ import org.mapsforge.map.awt.graphics.AwtBitmap;
|
|||||||
import org.mapsforge.map.layer.overlay.Marker;
|
import org.mapsforge.map.layer.overlay.Marker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class extending the default Mapsforge's {@link Marker} with auto-scaling.
|
* Class extending the default Mapsforge's {@link Marker} with auto-scaling. Mapsforge's
|
||||||
*
|
* Markers do not scale with zoom level, this class aims at correcting this. Internally,
|
||||||
* Mapsforge's Markers do not scale with zoom level, this class aims at
|
* this image stores an {@link Image} instance and scale it when a redraw is requested.
|
||||||
* correcting this. Internally, this image stores an {@link Image} instance and
|
*
|
||||||
* scale it when a redraw is requested.
|
|
||||||
*
|
|
||||||
* @see MarkerUtils#getMarkerForColor(java.awt.Color, java.awt.Color,
|
* @see MarkerUtils#getMarkerForColor(java.awt.Color, java.awt.Color,
|
||||||
* org.insa.graphics.drawing.Drawing.AlphaMode)
|
* org.insa.graphics.drawing.Drawing.AlphaMode)
|
||||||
* @see PaintUtils#getStrokeWidth(int, byte)
|
* @see PaintUtils#getStrokeWidth(int, byte)
|
||||||
@ -29,7 +27,7 @@ public class MarkerAutoScaling extends Marker {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new MarkerAutoScaling at the given position with the given image.
|
* Create a new MarkerAutoScaling at the given position with the given image.
|
||||||
*
|
*
|
||||||
* @param latLong Initial position of the marker.
|
* @param latLong Initial position of the marker.
|
||||||
* @param image Image for this marker.
|
* @param image Image for this marker.
|
||||||
*/
|
*/
|
||||||
@ -40,7 +38,7 @@ public class MarkerAutoScaling extends Marker {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a new image for this marker overlay
|
* Set a new image for this marker overlay
|
||||||
*
|
*
|
||||||
* @param image New image to set.
|
* @param image New image to set.
|
||||||
*/
|
*/
|
||||||
public void setImage(Image image) {
|
public void setImage(Image image) {
|
||||||
@ -55,15 +53,15 @@ public class MarkerAutoScaling extends Marker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas,
|
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel,
|
||||||
Point topLeftPoint) {
|
Canvas canvas, Point topLeftPoint) {
|
||||||
int width = (int) PaintUtils.getStrokeWidth(8, zoomLevel),
|
int width = (int) PaintUtils.getStrokeWidth(8, zoomLevel),
|
||||||
height = (int) PaintUtils.getStrokeWidth(16, zoomLevel);
|
height = (int) PaintUtils.getStrokeWidth(16, zoomLevel);
|
||||||
BufferedImage bfd = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
|
BufferedImage bfd =
|
||||||
|
new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
|
||||||
Graphics2D g = bfd.createGraphics();
|
Graphics2D g = bfd.createGraphics();
|
||||||
g.drawImage(
|
g.drawImage(this.image.getScaledInstance(bfd.getWidth(), bfd.getHeight(),
|
||||||
this.image.getScaledInstance(bfd.getWidth(), bfd.getHeight(), Image.SCALE_SMOOTH),
|
Image.SCALE_SMOOTH), 0, 0, null);
|
||||||
0, 0, null);
|
|
||||||
setBitmap(new AwtBitmap(bfd));
|
setBitmap(new AwtBitmap(bfd));
|
||||||
|
|
||||||
setVerticalOffset(-height / 2);
|
setVerticalOffset(-height / 2);
|
||||||
|
@ -11,7 +11,7 @@ public interface MarkerOverlay extends Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Move this marker to the specified location.
|
* Move this marker to the specified location.
|
||||||
*
|
*
|
||||||
* @param point New position for the marker.
|
* @param point New position for the marker.
|
||||||
*/
|
*/
|
||||||
public void moveTo(Point point);
|
public void moveTo(Point point);
|
||||||
|
@ -12,11 +12,10 @@ public class MarkerUtils {
|
|||||||
/**
|
/**
|
||||||
* Create an image to represent a marker using the given color for the outer and
|
* Create an image to represent a marker using the given color for the outer and
|
||||||
* inner part, and the given mode for the inner part.
|
* inner part, and the given mode for the inner part.
|
||||||
*
|
*
|
||||||
* @param outer Outer color of the marker.
|
* @param outer Outer color of the marker.
|
||||||
* @param inner Inner color of the marker.
|
* @param inner Inner color of the marker.
|
||||||
* @param mode Mode to use to fill the inner part of the marker.
|
* @param mode Mode to use to fill the inner part of the marker.
|
||||||
*
|
|
||||||
* @return An image representing a marker.
|
* @return An image representing a marker.
|
||||||
*/
|
*/
|
||||||
public static Image getMarkerForColor(Color outer, Color inner, AlphaMode mode) {
|
public static Image getMarkerForColor(Color outer, Color inner, AlphaMode mode) {
|
||||||
@ -31,23 +30,28 @@ public class MarkerUtils {
|
|||||||
for (int j = 0; j < image.getWidth(); ++j) {
|
for (int j = 0; j < image.getWidth(); ++j) {
|
||||||
|
|
||||||
// If we are in the "inner" part of the marker...
|
// If we are in the "inner" part of the marker...
|
||||||
if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER && j < MAX_X_CENTER
|
if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER
|
||||||
&& mask[i][j] != MAXIMUM_INNER_MASK_VALUE) {
|
&& j < MAX_X_CENTER && mask[i][j] != MAXIMUM_INNER_MASK_VALUE) {
|
||||||
// Don't ask... https://stackoverflow.com/a/29321264/2666289
|
// Don't ask... https://stackoverflow.com/a/29321264/2666289
|
||||||
// Basically, this compute a "middle" color between outer and inner depending on
|
// Basically, this compute a "middle" color between outer and inner
|
||||||
|
// depending on
|
||||||
// the current mask value.
|
// the current mask value.
|
||||||
double t = 1 - (mask[i][j] - MINIMUM_INNER_MASK_VALUE)
|
double t = 1 - (mask[i][j] - MINIMUM_INNER_MASK_VALUE)
|
||||||
/ (double) (MAXIMUM_INNER_MASK_VALUE - MINIMUM_INNER_MASK_VALUE);
|
/ (double) (MAXIMUM_INNER_MASK_VALUE
|
||||||
|
- MINIMUM_INNER_MASK_VALUE);
|
||||||
int r = (int) Math.sqrt((1 - t) * outer.getRed() * outer.getRed()
|
int r = (int) Math.sqrt((1 - t) * outer.getRed() * outer.getRed()
|
||||||
+ t * inner.getRed() * inner.getRed());
|
+ t * inner.getRed() * inner.getRed());
|
||||||
int g = (int) Math.sqrt((1 - t) * outer.getGreen() * outer.getGreen()
|
int g = (int) Math
|
||||||
+ t * inner.getGreen() * inner.getGreen());
|
.sqrt((1 - t) * outer.getGreen() * outer.getGreen()
|
||||||
|
+ t * inner.getGreen() * inner.getGreen());
|
||||||
int b = (int) Math.sqrt((1 - t) * outer.getBlue() * outer.getBlue()
|
int b = (int) Math.sqrt((1 - t) * outer.getBlue() * outer.getBlue()
|
||||||
+ t * inner.getBlue() * inner.getBlue());
|
+ t * inner.getBlue() * inner.getBlue());
|
||||||
int a = mode == AlphaMode.OPAQUE ? MAXIMUM_INNER_MASK_VALUE : mask[i][j];
|
int a = mode == AlphaMode.OPAQUE ? MAXIMUM_INNER_MASK_VALUE
|
||||||
|
: mask[i][j];
|
||||||
image.setRGB(j, i, (a << 24) | (r << 16) | (g << 8) | b);
|
image.setRGB(j, i, (a << 24) | (r << 16) | (g << 8) | b);
|
||||||
}
|
}
|
||||||
// Otherwize, just fill with the outer color and set the alpha value properly.
|
// Otherwize, just fill with the outer color and set the alpha value
|
||||||
|
// properly.
|
||||||
else {
|
else {
|
||||||
image.setRGB(j, i, outerRGB | (mask[i][j] << 24));
|
image.setRGB(j, i, outerRGB | (mask[i][j] << 24));
|
||||||
}
|
}
|
||||||
@ -64,7 +68,8 @@ public class MarkerUtils {
|
|||||||
// with a different color.
|
// with a different color.
|
||||||
private static final int MIN_X_CENTER = 40, MAX_X_CENTER = 101, MIN_Y_CENTER = 40,
|
private static final int MIN_X_CENTER = 40, MAX_X_CENTER = 101, MIN_Y_CENTER = 40,
|
||||||
MAX_Y_CENTER = 100;
|
MAX_Y_CENTER = 100;
|
||||||
private static final int MINIMUM_INNER_MASK_VALUE = 116, MAXIMUM_INNER_MASK_VALUE = 249;
|
private static final int MINIMUM_INNER_MASK_VALUE = 116,
|
||||||
|
MAXIMUM_INNER_MASK_VALUE = 249;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Retrieve the mask from the mask file or from the cache.
|
* @return Retrieve the mask from the mask file or from the cache.
|
||||||
|
@ -6,7 +6,7 @@ public interface Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the color of this overlay.
|
* Set the color of this overlay.
|
||||||
*
|
*
|
||||||
* @param color New color for the overlay.
|
* @param color New color for the overlay.
|
||||||
*/
|
*/
|
||||||
public void setColor(Color color);
|
public void setColor(Color color);
|
||||||
@ -18,7 +18,7 @@ public interface Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Show or hide this marker - A marker should be visible when created.
|
* Show or hide this marker - A marker should be visible when created.
|
||||||
*
|
*
|
||||||
* @param visible true to show the marker, false to hide.
|
* @param visible true to show the marker, false to hide.
|
||||||
*/
|
*/
|
||||||
public void setVisible(boolean visible);
|
public void setVisible(boolean visible);
|
||||||
|
@ -14,21 +14,19 @@ public class PaintUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the given AWT color to a mapsforge compatible color.
|
* Convert the given AWT color to a mapsforge compatible color.
|
||||||
*
|
*
|
||||||
* @param color AWT color to convert.
|
* @param color AWT color to convert.
|
||||||
*
|
|
||||||
* @return Integer value representing a corresponding mapsforge color.
|
* @return Integer value representing a corresponding mapsforge color.
|
||||||
*/
|
*/
|
||||||
public static int convertColor(Color color) {
|
public static int convertColor(Color color) {
|
||||||
return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(), color.getGreen(),
|
return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(),
|
||||||
color.getBlue());
|
color.getGreen(), color.getBlue());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the given mapsforge color to an AWT Color.
|
* Convert the given mapsforge color to an AWT Color.
|
||||||
*
|
*
|
||||||
* @param color Integer value representing a mapsforge color.
|
* @param color Integer value representing a mapsforge color.
|
||||||
*
|
|
||||||
* @return AWT color corresponding to the given value.
|
* @return AWT color corresponding to the given value.
|
||||||
*/
|
*/
|
||||||
public static Color convertColor(int color) {
|
public static Color convertColor(int color) {
|
||||||
@ -37,12 +35,11 @@ public class PaintUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute an updated value for the given width at the given zoom level. This
|
* Compute an updated value for the given width at the given zoom level. This
|
||||||
* function can be used to automatically scale {@link Polyline} or
|
* function can be used to automatically scale {@link Polyline} or {@link Marker}
|
||||||
* {@link Marker} when zooming (which is not done by default in Mapsforge).
|
* when zooming (which is not done by default in Mapsforge).
|
||||||
*
|
*
|
||||||
* @param width Original width to convert.
|
* @param width Original width to convert.
|
||||||
* @param zoomLevel Zoom level for which the width should be computed.
|
* @param zoomLevel Zoom level for which the width should be computed.
|
||||||
*
|
|
||||||
* @return Actual width at the given zoom level.
|
* @return Actual width at the given zoom level.
|
||||||
*/
|
*/
|
||||||
public static float getStrokeWidth(int width, byte zoomLevel) {
|
public static float getStrokeWidth(int width, byte zoomLevel) {
|
||||||
|
@ -8,14 +8,14 @@ public interface PointSetOverlay extends Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the width of this overlay for future addPoint().
|
* Set the width of this overlay for future addPoint().
|
||||||
*
|
*
|
||||||
* @param width New default width for this overlay.
|
* @param width New default width for this overlay.
|
||||||
*/
|
*/
|
||||||
public void setWidth(int width);
|
public void setWidth(int width);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set color and width for this overlay for future addPoint().
|
* Set color and width for this overlay for future addPoint().
|
||||||
*
|
*
|
||||||
* @param width New default width for this overlay.
|
* @param width New default width for this overlay.
|
||||||
* @param color New default color for this overlay.
|
* @param color New default color for this overlay.
|
||||||
*/
|
*/
|
||||||
@ -23,9 +23,8 @@ public interface PointSetOverlay extends Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new point using the current width and color.
|
* Add a new point using the current width and color.
|
||||||
*
|
*
|
||||||
* @param point Position of the point to add.
|
* @param point Position of the point to add.
|
||||||
*
|
|
||||||
* @see #setWidth(int)
|
* @see #setWidth(int)
|
||||||
* @see #setColor(Color)
|
* @see #setColor(Color)
|
||||||
*/
|
*/
|
||||||
@ -33,10 +32,9 @@ public interface PointSetOverlay extends Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current width and then add a new point.
|
* Set the current width and then add a new point.
|
||||||
*
|
*
|
||||||
* @param point Position of the point to add.
|
* @param point Position of the point to add.
|
||||||
* @param width New default width for this overlay.
|
* @param width New default width for this overlay.
|
||||||
*
|
|
||||||
* @see #setWidth(int)
|
* @see #setWidth(int)
|
||||||
* @see PointSetOverlay#addPoint(Point)
|
* @see PointSetOverlay#addPoint(Point)
|
||||||
*/
|
*/
|
||||||
@ -44,23 +42,21 @@ public interface PointSetOverlay extends Overlay {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current color and then add a new point.
|
* Set the current color and then add a new point.
|
||||||
*
|
*
|
||||||
* @param point Position of the point to add.
|
* @param point Position of the point to add.
|
||||||
* @param color New default color for this overlay.
|
* @param color New default color for this overlay.
|
||||||
*
|
|
||||||
* @see #setColor(Color)
|
* @see #setColor(Color)
|
||||||
* @see PointSetOverlay#addPoint(Point)
|
* @see PointSetOverlay#addPoint(Point)
|
||||||
*/
|
*/
|
||||||
public void addPoint(Point point, Color color);
|
public void addPoint(Point point, Color color);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new point at the given location, with the given color and width, and
|
* Add a new point at the given location, with the given color and width, and update
|
||||||
* update the current width and color.
|
* the current width and color.
|
||||||
*
|
*
|
||||||
* @param point Position of the point to add.
|
* @param point Position of the point to add.
|
||||||
* @param width New default width for this overlay.
|
* @param width New default width for this overlay.
|
||||||
* @param color New default color for this overlay.
|
* @param color New default color for this overlay.
|
||||||
*
|
|
||||||
* @see #setWidth(int)
|
* @see #setWidth(int)
|
||||||
* @see #setColor(Color)
|
* @see #setColor(Color)
|
||||||
* @see PointSetOverlay#addPoint(Point)
|
* @see PointSetOverlay#addPoint(Point)
|
||||||
|
@ -15,11 +15,10 @@ import org.mapsforge.map.layer.overlay.Polyline;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class extending the default Mapsforge's {@link Polyline} with auto-scaling.
|
* Class extending the default Mapsforge's {@link Polyline} with auto-scaling.
|
||||||
*
|
* Mapsforge's Polylines do not scale with zoom level, this class aims at correcting
|
||||||
* Mapsforge's Polylines do not scale with zoom level, this class aims at
|
* this. When a redraw is requested, the width of the line is recomputed for the current
|
||||||
* correcting this. When a redraw is requested, the width of the line is
|
* zoom level.
|
||||||
* recomputed for the current zoom level.
|
*
|
||||||
*
|
|
||||||
* @see PaintUtils#getStrokeWidth(int, byte)
|
* @see PaintUtils#getStrokeWidth(int, byte)
|
||||||
*/
|
*/
|
||||||
public class PolylineAutoScaling extends Polyline {
|
public class PolylineAutoScaling extends Polyline {
|
||||||
@ -32,10 +31,9 @@ public class PolylineAutoScaling extends Polyline {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new PolylineAutoScaling with the given width and color.
|
* Create a new PolylineAutoScaling with the given width and color.
|
||||||
*
|
*
|
||||||
* @param width Original width of the line (independent of the zoom level).
|
* @param width Original width of the line (independent of the zoom level).
|
||||||
* @param color Color of the line.
|
* @param color Color of the line.
|
||||||
*
|
|
||||||
* @see PaintUtils#getStrokeWidth(int, byte)
|
* @see PaintUtils#getStrokeWidth(int, byte)
|
||||||
*/
|
*/
|
||||||
public PolylineAutoScaling(int width, Color color) {
|
public PolylineAutoScaling(int width, Color color) {
|
||||||
@ -47,7 +45,7 @@ public class PolylineAutoScaling extends Polyline {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the color for this polyline.
|
* Set the color for this polyline.
|
||||||
*
|
*
|
||||||
* @param color New color for this polyline.
|
* @param color New color for this polyline.
|
||||||
*/
|
*/
|
||||||
public void setColor(Color color) {
|
public void setColor(Color color) {
|
||||||
@ -73,18 +71,19 @@ public class PolylineAutoScaling extends Polyline {
|
|||||||
*/
|
*/
|
||||||
public void addAll(Collection<? extends Point> points) {
|
public void addAll(Collection<? extends Point> points) {
|
||||||
ArrayList<LatLong> latlongs = new ArrayList<>(points.size());
|
ArrayList<LatLong> latlongs = new ArrayList<>(points.size());
|
||||||
for (Point point: points) {
|
for (Point point : points) {
|
||||||
latlongs.add(new LatLong(point.getLatitude(), point.getLongitude()));
|
latlongs.add(new LatLong(point.getLatitude(), point.getLongitude()));
|
||||||
}
|
}
|
||||||
getLatLongs().addAll(latlongs);
|
getLatLongs().addAll(latlongs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas,
|
public synchronized void draw(BoundingBox boundingBox, byte zoomLevel,
|
||||||
org.mapsforge.core.model.Point topLeftPoint) {
|
Canvas canvas, org.mapsforge.core.model.Point topLeftPoint) {
|
||||||
|
|
||||||
// Update paint stroke with width for level
|
// Update paint stroke with width for level
|
||||||
this.getPaintStroke().setStrokeWidth(PaintUtils.getStrokeWidth(width, zoomLevel));
|
this.getPaintStroke()
|
||||||
|
.setStrokeWidth(PaintUtils.getStrokeWidth(width, zoomLevel));
|
||||||
|
|
||||||
super.draw(boundingBox, zoomLevel, canvas, topLeftPoint);
|
super.draw(boundingBox, zoomLevel, canvas, topLeftPoint);
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,11 @@ import org.insa.graphs.gui.drawing.Drawing;
|
|||||||
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
import org.insa.graphs.gui.drawing.overlays.PointSetOverlay;
|
||||||
import org.insa.graphs.model.Node;
|
import org.insa.graphs.model.Node;
|
||||||
|
|
||||||
public class WeaklyConnectedComponentGraphicObserver implements WeaklyConnectedComponentObserver {
|
public class WeaklyConnectedComponentGraphicObserver
|
||||||
|
implements WeaklyConnectedComponentObserver {
|
||||||
|
|
||||||
private static final Color[] COLORS = { Color.BLUE, Color.ORANGE, Color.GREEN, Color.YELLOW,
|
private static final Color[] COLORS =
|
||||||
Color.RED };
|
{ Color.BLUE, Color.ORANGE, Color.GREEN, Color.YELLOW, Color.RED };
|
||||||
|
|
||||||
// Drawing + Graph drawing
|
// Drawing + Graph drawing
|
||||||
private PointSetOverlay grPoints;
|
private PointSetOverlay grPoints;
|
||||||
|
@ -14,11 +14,11 @@ import javax.swing.filechooser.FileNameExtensionFilter;
|
|||||||
public class FileUtils {
|
public class FileUtils {
|
||||||
|
|
||||||
// Preferences
|
// Preferences
|
||||||
private static Preferences preferences = Preferences.userRoot().node(FileUtils.class.getName());
|
private static Preferences preferences =
|
||||||
|
Preferences.userRoot().node(FileUtils.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type of folder with associated preferred folder and path filters.
|
* Type of folder with associated preferred folder and path filters.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public enum FolderType {
|
public enum FolderType {
|
||||||
|
|
||||||
@ -49,34 +49,35 @@ public class FileUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Map folder type -> PreferencesEntry
|
// Map folder type -> PreferencesEntry
|
||||||
private static final Map<FolderType, PreferencesEntry> folderToEntry = new EnumMap<>(
|
private static final Map<FolderType, PreferencesEntry> folderToEntry =
|
||||||
FolderType.class);
|
new EnumMap<>(FolderType.class);
|
||||||
|
|
||||||
// Map folder type -> File Filter
|
// Map folder type -> File Filter
|
||||||
private static final Map<FolderType, FileFilter> folderToFilter = new EnumMap<>(
|
private static final Map<FolderType, FileFilter> folderToFilter =
|
||||||
FolderType.class);
|
new EnumMap<>(FolderType.class);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// Populate folderToEntry
|
// Populate folderToEntry
|
||||||
folderToEntry.put(FolderType.Map, new PreferencesEntry("DefaultMapFolder",
|
folderToEntry.put(FolderType.Map, new PreferencesEntry("DefaultMapFolder",
|
||||||
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps"));
|
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps"));
|
||||||
folderToEntry.put(FolderType.PathInput, new PreferencesEntry("DefaultPathInputFolder",
|
folderToEntry.put(FolderType.PathInput,
|
||||||
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths"));
|
new PreferencesEntry("DefaultPathInputFolder",
|
||||||
|
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths"));
|
||||||
folderToEntry.put(FolderType.PathOutput,
|
folderToEntry.put(FolderType.PathOutput,
|
||||||
new PreferencesEntry("DefaultPathOutputsFolder", "paths"));
|
new PreferencesEntry("DefaultPathOutputsFolder", "paths"));
|
||||||
|
|
||||||
// Populate folderToFilter
|
// Populate folderToFilter
|
||||||
folderToFilter.put(FolderType.Map, new FileNameExtensionFilter("Graph files", "mapgr"));
|
folderToFilter.put(FolderType.Map,
|
||||||
folderToFilter.put(FolderType.PathInput, new FileNameExtensionFilter("Path files", "path"));
|
new FileNameExtensionFilter("Graph files", "mapgr"));
|
||||||
|
folderToFilter.put(FolderType.PathInput,
|
||||||
|
new FileNameExtensionFilter("Path files", "path"));
|
||||||
folderToFilter.put(FolderType.PathOutput,
|
folderToFilter.put(FolderType.PathOutput,
|
||||||
new FileNameExtensionFilter("Path files", "path"));
|
new FileNameExtensionFilter("Path files", "path"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param folderType Type of folder to retrieve.
|
* @param folderType Type of folder to retrieve.
|
||||||
*
|
|
||||||
* @return A File instance pointing to the preferred folder for the given type.
|
* @return A File instance pointing to the preferred folder for the given type.
|
||||||
*
|
|
||||||
* @see FolderType
|
* @see FolderType
|
||||||
*/
|
*/
|
||||||
public static File getPreferredFolder(FolderType folderType) {
|
public static File getPreferredFolder(FolderType folderType) {
|
||||||
@ -92,14 +93,14 @@ public class FileUtils {
|
|||||||
* @param folderType Type of folder to update.
|
* @param folderType Type of folder to update.
|
||||||
* @param newPreferredFolder New preferred folder.
|
* @param newPreferredFolder New preferred folder.
|
||||||
*/
|
*/
|
||||||
public static void updatePreferredFolder(FolderType folderType, File newPreferredFolder) {
|
public static void updatePreferredFolder(FolderType folderType,
|
||||||
|
File newPreferredFolder) {
|
||||||
PreferencesEntry entry = folderToEntry.get(folderType);
|
PreferencesEntry entry = folderToEntry.get(folderType);
|
||||||
preferences.put(entry.key, newPreferredFolder.getAbsolutePath());
|
preferences.put(entry.key, newPreferredFolder.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param folderType Type of folder for which the filter should be retrieved.
|
* @param folderType Type of folder for which the filter should be retrieved.
|
||||||
*
|
|
||||||
* @return A FileFilter corresponding to input graph files.
|
* @return A FileFilter corresponding to input graph files.
|
||||||
*/
|
*/
|
||||||
public static FileFilter getFileFilter(FolderType folderType) {
|
public static FileFilter getFileFilter(FolderType folderType) {
|
||||||
@ -108,18 +109,18 @@ public class FileUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param folderType Type of folder for which a file chooser should be created.
|
* @param folderType Type of folder for which a file chooser should be created.
|
||||||
* @param defaultFileName Default file name to show, or null to not show any
|
* @param defaultFileName Default file name to show, or null to not show any file.
|
||||||
* file.
|
|
||||||
*
|
|
||||||
* @return A new JFileChooser pointing to the preferred folder for the given
|
* @return A new JFileChooser pointing to the preferred folder for the given
|
||||||
* folderType, with the given default file selected (if given).
|
* folderType, with the given default file selected (if given).
|
||||||
*/
|
*/
|
||||||
public static JFileChooser createFileChooser(FolderType folderType, String defaultFileName) {
|
public static JFileChooser createFileChooser(FolderType folderType,
|
||||||
|
String defaultFileName) {
|
||||||
JFileChooser chooser = new JFileChooser();
|
JFileChooser chooser = new JFileChooser();
|
||||||
chooser.setCurrentDirectory(getPreferredFolder(folderType));
|
chooser.setCurrentDirectory(getPreferredFolder(folderType));
|
||||||
if (defaultFileName != null) {
|
if (defaultFileName != null) {
|
||||||
chooser.setSelectedFile(new File(chooser.getCurrentDirectory().getAbsolutePath()
|
chooser.setSelectedFile(
|
||||||
+ File.separator + defaultFileName));
|
new File(chooser.getCurrentDirectory().getAbsolutePath()
|
||||||
|
+ File.separator + defaultFileName));
|
||||||
}
|
}
|
||||||
chooser.setFileFilter(getFileFilter(folderType));
|
chooser.setFileFilter(getFileFilter(folderType));
|
||||||
chooser.addActionListener(new ActionListener() {
|
chooser.addActionListener(new ActionListener() {
|
||||||
@ -138,10 +139,8 @@ public class FileUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param folderType Type of folder for which a file chooser should be created.
|
* @param folderType Type of folder for which a file chooser should be created.
|
||||||
*
|
|
||||||
* @return A new JFileChooser pointing to the preferred folder for the given
|
* @return A new JFileChooser pointing to the preferred folder for the given
|
||||||
* folderType.
|
* folderType.
|
||||||
*
|
|
||||||
* @see #createFileChooser(FolderType, String)
|
* @see #createFileChooser(FolderType, String)
|
||||||
*/
|
*/
|
||||||
public static JFileChooser createFileChooser(FolderType folderType) {
|
public static JFileChooser createFileChooser(FolderType folderType) {
|
||||||
|
@ -1,17 +1,14 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<project
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
|
||||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
<artifactId>be-graphes-all</artifactId>
|
<artifactId>be-graphes-all</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>be-graphes-model</artifactId>
|
<artifactId>be-graphes-model</artifactId>
|
||||||
<name>be-graphes-model</name>
|
<name>be-graphes-model</name>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -7,18 +7,15 @@ import java.util.EnumSet;
|
|||||||
* <p>
|
* <p>
|
||||||
* Class containing access restrictions for roads/arcs.
|
* Class containing access restrictions for roads/arcs.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* This class maps transport modes to their restriction and provide interface
|
* This class maps transport modes to their restriction and provide interface based on
|
||||||
* based on EnumSet to query restrictions.
|
* EnumSet to query restrictions.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* To each transport is associated at most one restriction per road (no
|
* To each transport is associated at most one restriction per road (no restriction
|
||||||
* restriction corresponds to {@link AccessRestriction#UNKNOWN} but a road can
|
* corresponds to {@link AccessRestriction#UNKNOWN} but a road can have different
|
||||||
* have different restrictions for different modes.
|
* restrictions for different modes.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class AccessRestrictions {
|
public class AccessRestrictions {
|
||||||
|
|
||||||
@ -73,24 +70,20 @@ public class AccessRestrictions {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code EnumSet} containing all possible transport modes.
|
* {@code EnumSet} containing all possible transport modes.
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final EnumSet<AccessMode> ALL = EnumSet.allOf(AccessMode.class);
|
public static final EnumSet<AccessMode> ALL = EnumSet.allOf(AccessMode.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code EnumSet} containing all vehicle transport modes.
|
* {@code EnumSet} containing all vehicle transport modes.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final EnumSet<AccessMode> VEHICLE = EnumSet.range(AccessMode.BICYCLE,
|
public static final EnumSet<AccessMode> VEHICLE =
|
||||||
AccessMode.PUBLIC_TRANSPORT);
|
EnumSet.range(AccessMode.BICYCLE, AccessMode.PUBLIC_TRANSPORT);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code EnumSet} containing all motorized vehicle transport modes.
|
* {@code EnumSet} containing all motorized vehicle transport modes.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final EnumSet<AccessMode> MOTOR_VEHICLE = EnumSet
|
public static final EnumSet<AccessMode> MOTOR_VEHICLE =
|
||||||
.range(AccessMode.SMALL_MOTORCYCLE, AccessMode.PUBLIC_TRANSPORT);
|
EnumSet.range(AccessMode.SMALL_MOTORCYCLE, AccessMode.PUBLIC_TRANSPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,53 +96,52 @@ public class AccessRestrictions {
|
|||||||
public enum AccessRestriction {
|
public enum AccessRestriction {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ALLOWED,
|
ALLOWED,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
FORBIDDEN,
|
FORBIDDEN,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
PRIVATE,
|
PRIVATE,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
DESTINATION,
|
DESTINATION,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
DELIVERY,
|
DELIVERY,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
CUSTOMERS,
|
CUSTOMERS,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
FORESTRY,
|
FORESTRY,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
UNKNOWN;
|
UNKNOWN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code EnumSet} corresponding to restrictions that are not totally private.
|
* {@code EnumSet} corresponding to restrictions that are not totally private.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final EnumSet<AccessRestriction> ALLOWED_FOR_SOMETHING = EnumSet.of(
|
public static final EnumSet<AccessRestriction> ALLOWED_FOR_SOMETHING =
|
||||||
AccessRestriction.ALLOWED, AccessRestriction.DESTINATION,
|
EnumSet.of(AccessRestriction.ALLOWED, AccessRestriction.DESTINATION,
|
||||||
AccessRestriction.DESTINATION, AccessRestriction.DELIVERY,
|
AccessRestriction.DESTINATION, AccessRestriction.DELIVERY,
|
||||||
AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY);
|
AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,16 +153,15 @@ public class AccessRestrictions {
|
|||||||
*/
|
*/
|
||||||
public AccessRestrictions() {
|
public AccessRestrictions() {
|
||||||
this.restrictions = new EnumMap<>(AccessMode.class);
|
this.restrictions = new EnumMap<>(AccessMode.class);
|
||||||
for (AccessMode mode: AccessMode.values()) {
|
for (AccessMode mode : AccessMode.values()) {
|
||||||
this.restrictions.put(mode, AccessRestriction.UNKNOWN);
|
this.restrictions.put(mode, AccessRestriction.UNKNOWN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new AccessRestrictions instances with the given restrictions.
|
* Create a new AccessRestrictions instances with the given restrictions.
|
||||||
*
|
*
|
||||||
* @param restrictions Map of restrictions for this instance of
|
* @param restrictions Map of restrictions for this instance of AccessRestrictions.
|
||||||
* AccessRestrictions.
|
|
||||||
*/
|
*/
|
||||||
public AccessRestrictions(EnumMap<AccessMode, AccessRestriction> restrictions) {
|
public AccessRestrictions(EnumMap<AccessMode, AccessRestriction> restrictions) {
|
||||||
this.restrictions = restrictions;
|
this.restrictions = restrictions;
|
||||||
@ -178,9 +169,8 @@ public class AccessRestrictions {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the restriction corresponding to the given mode.
|
* Retrieve the restriction corresponding to the given mode.
|
||||||
*
|
*
|
||||||
* @param mode Mode for which the restriction should be retrieved.
|
* @param mode Mode for which the restriction should be retrieved.
|
||||||
*
|
|
||||||
* @return Restriction for the given mode.
|
* @return Restriction for the given mode.
|
||||||
*/
|
*/
|
||||||
public AccessRestriction getRestrictionFor(AccessMode mode) {
|
public AccessRestriction getRestrictionFor(AccessMode mode) {
|
||||||
@ -190,24 +180,22 @@ public class AccessRestrictions {
|
|||||||
/**
|
/**
|
||||||
* Check if the restriction associated with the given mode is one of the given
|
* Check if the restriction associated with the given mode is one of the given
|
||||||
* restrictions.
|
* restrictions.
|
||||||
*
|
*
|
||||||
* @param mode Mode for which to check the restrictions.
|
* @param mode Mode for which to check the restrictions.
|
||||||
* @param restrictions List of queried restrictions for the mode.
|
* @param restrictions List of queried restrictions for the mode.
|
||||||
*
|
|
||||||
* @return {@code true} if the restriction of the given mode is one of the given
|
* @return {@code true} if the restriction of the given mode is one of the given
|
||||||
* restrictions.
|
* restrictions.
|
||||||
*/
|
*/
|
||||||
public boolean isAllowedForAny(AccessMode mode, EnumSet<AccessRestriction> restrictions) {
|
public boolean isAllowedForAny(AccessMode mode,
|
||||||
|
EnumSet<AccessRestriction> restrictions) {
|
||||||
return restrictions.contains(getRestrictionFor(mode));
|
return restrictions.contains(getRestrictionFor(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the restriction for the given mode corresponds to the given
|
* Check if the restriction for the given mode corresponds to the given restriction.
|
||||||
* restriction.
|
*
|
||||||
*
|
* @param mode Mode for which the restriction should be checked.
|
||||||
* @param mode Mode for which the restriction should be checked.
|
|
||||||
* @param restriction Restriction to check against.
|
* @param restriction Restriction to check against.
|
||||||
*
|
|
||||||
* @return {@code true} if the restriction of the given mode corresponds to the
|
* @return {@code true} if the restriction of the given mode corresponds to the
|
||||||
* given restriction.
|
* given restriction.
|
||||||
*/
|
*/
|
||||||
@ -218,10 +206,9 @@ public class AccessRestrictions {
|
|||||||
/**
|
/**
|
||||||
* Check if the restriction associated to each given mode is one of the
|
* Check if the restriction associated to each given mode is one of the
|
||||||
* restrictions. The restriction may not be the same for all modes.
|
* restrictions. The restriction may not be the same for all modes.
|
||||||
*
|
*
|
||||||
* @param modes Modes for which restrictions should be checked.
|
* @param modes Modes for which restrictions should be checked.
|
||||||
* @param restrictions Set of wanted restrictions for the modes.
|
* @param restrictions Set of wanted restrictions for the modes.
|
||||||
*
|
|
||||||
* @return {@code true} if all the given modes are allowed for any of the given
|
* @return {@code true} if all the given modes are allowed for any of the given
|
||||||
* restrictions.
|
* restrictions.
|
||||||
*/
|
*/
|
||||||
|
@ -4,18 +4,16 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Interface representing an arc in the graph. {@code Arc} is an interface and
|
* Interface representing an arc in the graph. {@code Arc} is an interface and not a
|
||||||
* not a class to allow us to represent two-ways roads in a memory efficient
|
* class to allow us to represent two-ways roads in a memory efficient manner (without
|
||||||
* manner (without having to duplicate attributes).
|
* having to duplicate attributes).
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* Arc should never be created manually but always using the
|
* Arc should never be created manually but always using the
|
||||||
* {@link Node#linkNodes(Node, Node, float, RoadInformation, java.util.ArrayList)}
|
* {@link Node#linkNodes(Node, Node, float, RoadInformation, java.util.ArrayList)}
|
||||||
* method to ensure proper instantiation of the {@link ArcForward} and
|
* method to ensure proper instantiation of the {@link ArcForward} and
|
||||||
* {@link ArcBackward} classes.
|
* {@link ArcBackward} classes.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public abstract class Arc {
|
public abstract class Arc {
|
||||||
|
|
||||||
@ -36,9 +34,8 @@ public abstract class Arc {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the time required to travel this arc if moving at the given speed.
|
* Compute the time required to travel this arc if moving at the given speed.
|
||||||
*
|
*
|
||||||
* @param speed Speed to compute the travel time.
|
* @param speed Speed to compute the travel time.
|
||||||
*
|
|
||||||
* @return Time (in seconds) required to travel this arc at the given speed (in
|
* @return Time (in seconds) required to travel this arc at the given speed (in
|
||||||
* kilometers-per-hour).
|
* kilometers-per-hour).
|
||||||
*/
|
*/
|
||||||
@ -49,9 +46,8 @@ public abstract class Arc {
|
|||||||
/**
|
/**
|
||||||
* Compute and return the minimum time required to travel this arc, or the time
|
* Compute and return the minimum time required to travel this arc, or the time
|
||||||
* required to travel this arc at the maximum speed allowed.
|
* required to travel this arc at the maximum speed allowed.
|
||||||
*
|
*
|
||||||
* @return Minimum time required to travel this arc, in seconds.
|
* @return Minimum time required to travel this arc, in seconds.
|
||||||
*
|
|
||||||
* @see Arc#getTravelTime(double)
|
* @see Arc#getTravelTime(double)
|
||||||
*/
|
*/
|
||||||
public double getMinimumTravelTime() {
|
public double getMinimumTravelTime() {
|
||||||
|
@ -5,10 +5,8 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of Arc that represents a "backward" arc in a graph, i.e., an
|
* Implementation of Arc that represents a "backward" arc in a graph, i.e., an arc that
|
||||||
* arc that is the reverse of another one. This arc only holds a reference to
|
* is the reverse of another one. This arc only holds a reference to the original arc.
|
||||||
* the original arc.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
class ArcBackward extends Arc {
|
class ArcBackward extends Arc {
|
||||||
|
|
||||||
@ -16,9 +14,8 @@ class ArcBackward extends Arc {
|
|||||||
private final Arc originalArc;
|
private final Arc originalArc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new backward arc which corresponds to the reverse arc of the given
|
* Create a new backward arc which corresponds to the reverse arc of the given arc.
|
||||||
* arc.
|
*
|
||||||
*
|
|
||||||
* @param originalArc Original forwarc arc corresponding to this backward arc.
|
* @param originalArc Original forwarc arc corresponding to this backward arc.
|
||||||
*/
|
*/
|
||||||
protected ArcBackward(Arc originalArc) {
|
protected ArcBackward(Arc originalArc) {
|
||||||
|
@ -4,9 +4,8 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of Arc that represents a "forward" arc in a graph, this is the
|
* Implementation of Arc that represents a "forward" arc in a graph, this is the arc
|
||||||
* arc implementation that stores data relative to the arc.
|
* implementation that stores data relative to the arc.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
class ArcForward extends Arc {
|
class ArcForward extends Arc {
|
||||||
|
|
||||||
@ -24,15 +23,15 @@ class ArcForward extends Arc {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ArcForward with the given attributes.
|
* Create a new ArcForward with the given attributes.
|
||||||
*
|
*
|
||||||
* @param origin Origin of this arc.
|
* @param origin Origin of this arc.
|
||||||
* @param dest Destination of this arc.
|
* @param dest Destination of this arc.
|
||||||
* @param length Length of this arc (in meters).
|
* @param length Length of this arc (in meters).
|
||||||
* @param roadInformation Road information for this arc.
|
* @param roadInformation Road information for this arc.
|
||||||
* @param points Points representing this arc.
|
* @param points Points representing this arc.
|
||||||
*/
|
*/
|
||||||
protected ArcForward(Node origin, Node dest, float length, RoadInformation roadInformation,
|
protected ArcForward(Node origin, Node dest, float length,
|
||||||
List<Point> points) {
|
RoadInformation roadInformation, List<Point> points) {
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
this.destination = dest;
|
this.destination = dest;
|
||||||
this.length = length;
|
this.length = length;
|
||||||
|
@ -8,12 +8,10 @@ import java.util.List;
|
|||||||
* <p>
|
* <p>
|
||||||
* Main graph class.
|
* Main graph class.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* This class acts as a object-oriented <b>adjacency list</b> for a graph, i.e.,
|
* This class acts as a object-oriented <b>adjacency list</b> for a graph, i.e., it
|
||||||
* it holds a list of nodes and each node holds a list of its successors.
|
* holds a list of nodes and each node holds a list of its successors.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class Graph {
|
public final class Graph {
|
||||||
|
|
||||||
@ -31,13 +29,14 @@ public final class Graph {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new graph with the given ID, name, nodes and information.
|
* Create a new graph with the given ID, name, nodes and information.
|
||||||
*
|
*
|
||||||
* @param mapId ID of the map corresponding to this graph.
|
* @param mapId ID of the map corresponding to this graph.
|
||||||
* @param mapName Name of the map corresponding to this graph.
|
* @param mapName Name of the map corresponding to this graph.
|
||||||
* @param nodes List of nodes for this graph.
|
* @param nodes List of nodes for this graph.
|
||||||
* @param graphStatistics Information for this graph.
|
* @param graphStatistics Information for this graph.
|
||||||
*/
|
*/
|
||||||
public Graph(String mapId, String mapName, List<Node> nodes, GraphStatistics graphStatistics) {
|
public Graph(String mapId, String mapName, List<Node> nodes,
|
||||||
|
GraphStatistics graphStatistics) {
|
||||||
this.mapId = mapId;
|
this.mapId = mapId;
|
||||||
this.mapName = mapName;
|
this.mapName = mapName;
|
||||||
this.nodes = Collections.unmodifiableList(nodes);
|
this.nodes = Collections.unmodifiableList(nodes);
|
||||||
@ -52,12 +51,9 @@ public final class Graph {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch the node with the given ID.
|
* Fetch the node with the given ID. Complexity: O(1).
|
||||||
*
|
*
|
||||||
* Complexity: O(1).
|
|
||||||
*
|
|
||||||
* @param id ID of the node to fetch.
|
* @param id ID of the node to fetch.
|
||||||
*
|
|
||||||
* @return Node with the given ID.
|
* @return Node with the given ID.
|
||||||
*/
|
*/
|
||||||
public Node get(int id) {
|
public Node get(int id) {
|
||||||
@ -73,7 +69,6 @@ public final class Graph {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return List of nodes in this graph (unmodifiable).
|
* @return List of nodes in this graph (unmodifiable).
|
||||||
*
|
|
||||||
* @see Collections#unmodifiableList(List)
|
* @see Collections#unmodifiableList(List)
|
||||||
*/
|
*/
|
||||||
public List<Node> getNodes() {
|
public List<Node> getNodes() {
|
||||||
@ -99,16 +94,17 @@ public final class Graph {
|
|||||||
*/
|
*/
|
||||||
public Graph transpose() {
|
public Graph transpose() {
|
||||||
final ArrayList<Node> trNodes = new ArrayList<>(nodes.size());
|
final ArrayList<Node> trNodes = new ArrayList<>(nodes.size());
|
||||||
for (Node node: nodes) {
|
for (Node node : nodes) {
|
||||||
trNodes.add(new Node(node.getId(), node.getPoint()));
|
trNodes.add(new Node(node.getId(), node.getPoint()));
|
||||||
}
|
}
|
||||||
for (Node node: nodes) {
|
for (Node node : nodes) {
|
||||||
final Node orig = trNodes.get(node.getId());
|
final Node orig = trNodes.get(node.getId());
|
||||||
for (Arc arc: node.getSuccessors()) {
|
for (Arc arc : node.getSuccessors()) {
|
||||||
if (arc.getRoadInformation().isOneWay()) {
|
if (arc.getRoadInformation().isOneWay()) {
|
||||||
final Node dest = trNodes.get(arc.getDestination().getId());
|
final Node dest = trNodes.get(arc.getDestination().getId());
|
||||||
dest.addSuccessor(new ArcBackward(new ArcForward(orig, dest, arc.getLength(),
|
dest.addSuccessor(
|
||||||
arc.getRoadInformation(), arc.getPoints())));
|
new ArcBackward(new ArcForward(orig, dest, arc.getLength(),
|
||||||
|
arc.getRoadInformation(), arc.getPoints())));
|
||||||
}
|
}
|
||||||
else if (arc instanceof ArcForward) {
|
else if (arc instanceof ArcForward) {
|
||||||
final Node dest = trNodes.get(arc.getDestination().getId());
|
final Node dest = trNodes.get(arc.getDestination().getId());
|
||||||
@ -124,8 +120,8 @@ public final class Graph {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("%s[id=%s, name=%s, #nodes=%d]", getClass().getCanonicalName(),
|
return String.format("%s[id=%s, name=%s, #nodes=%d]",
|
||||||
getMapId(), getMapName(), size());
|
getClass().getCanonicalName(), getMapId(), getMapName(), size());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,30 +2,24 @@ package org.insa.graphs.model;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Utility class that stores some statistics of graphs that are not easy to
|
* Utility class that stores some statistics of graphs that are not easy to access.
|
||||||
* access.
|
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* This class is used to provide constant ({@code O(1)}) access to information
|
* This class is used to provide constant ({@code O(1)}) access to information in graph
|
||||||
* in graph that do not change, and that usually require linear complexity to
|
* that do not change, and that usually require linear complexity to compute.
|
||||||
* compute.
|
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class GraphStatistics {
|
public class GraphStatistics {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special value used to indicate that the graph has no maximum speed limit
|
* Special value used to indicate that the graph has no maximum speed limit (some
|
||||||
* (some roads are not limited).
|
* roads are not limited).
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final int NO_MAXIMUM_SPEED = -1;
|
public static final int NO_MAXIMUM_SPEED = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing a bounding box for a graph (a rectangle that contains all
|
* Class representing a bounding box for a graph (a rectangle that contains all
|
||||||
* nodes in the graph).
|
* nodes in the graph).
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static class BoundingBox {
|
public static class BoundingBox {
|
||||||
|
|
||||||
@ -34,7 +28,7 @@ public class GraphStatistics {
|
|||||||
/**
|
/**
|
||||||
* Create a new BoundingBox represented by the given top-left and bottom-right
|
* Create a new BoundingBox represented by the given top-left and bottom-right
|
||||||
* points.
|
* points.
|
||||||
*
|
*
|
||||||
* @param topLeft Top left corner of the bounding box.
|
* @param topLeft Top left corner of the bounding box.
|
||||||
* @param bottomRight Bottom right corner of the bounding box.
|
* @param bottomRight Bottom right corner of the bounding box.
|
||||||
*/
|
*/
|
||||||
@ -60,17 +54,17 @@ public class GraphStatistics {
|
|||||||
/**
|
/**
|
||||||
* Create a new bounding box by extending the current one according to the given
|
* Create a new bounding box by extending the current one according to the given
|
||||||
* value for each side.
|
* value for each side.
|
||||||
*
|
*
|
||||||
* @param left Extra size to add to the left of the box.
|
* @param left Extra size to add to the left of the box.
|
||||||
* @param top Extra size to add to the top of the box.
|
* @param top Extra size to add to the top of the box.
|
||||||
* @param right Extra size to add to the right of the box.
|
* @param right Extra size to add to the right of the box.
|
||||||
* @param bottom Extra size to add to the bottom of the box.
|
* @param bottom Extra size to add to the bottom of the box.
|
||||||
*
|
|
||||||
* @return New bounding box corresponding to an extension of the current one.
|
* @return New bounding box corresponding to an extension of the current one.
|
||||||
*/
|
*/
|
||||||
public BoundingBox extend(float left, float top, float right, float bottom) {
|
public BoundingBox extend(float left, float top, float right, float bottom) {
|
||||||
return new BoundingBox(
|
return new BoundingBox(
|
||||||
new Point(this.topLeft.getLongitude() - left, this.topLeft.getLatitude() + top),
|
new Point(this.topLeft.getLongitude() - left,
|
||||||
|
this.topLeft.getLatitude() + top),
|
||||||
new Point(this.bottomRight.getLongitude() + right,
|
new Point(this.bottomRight.getLongitude() + right,
|
||||||
this.bottomRight.getLatitude() - bottom));
|
this.bottomRight.getLatitude() - bottom));
|
||||||
}
|
}
|
||||||
@ -78,9 +72,8 @@ public class GraphStatistics {
|
|||||||
/**
|
/**
|
||||||
* Create a new bounding box by extending the current one according by the given
|
* Create a new bounding box by extending the current one according by the given
|
||||||
* value on each side.
|
* value on each side.
|
||||||
*
|
*
|
||||||
* @param size Extra size to add to each side of this box.
|
* @param size Extra size to add to each side of this box.
|
||||||
*
|
|
||||||
* @return New bounding box corresponding to an extension of the current one.
|
* @return New bounding box corresponding to an extension of the current one.
|
||||||
*/
|
*/
|
||||||
public BoundingBox extend(float size) {
|
public BoundingBox extend(float size) {
|
||||||
@ -89,7 +82,6 @@ public class GraphStatistics {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param point Point to check
|
* @param point Point to check
|
||||||
*
|
|
||||||
* @return true if this box contains the given point.
|
* @return true if this box contains the given point.
|
||||||
*/
|
*/
|
||||||
public boolean contains(Point point) {
|
public boolean contains(Point point) {
|
||||||
@ -101,7 +93,6 @@ public class GraphStatistics {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param other Box to intersect.
|
* @param other Box to intersect.
|
||||||
*
|
|
||||||
* @return true if this box contains the given box.
|
* @return true if this box contains the given box.
|
||||||
*/
|
*/
|
||||||
public boolean contains(BoundingBox other) {
|
public boolean contains(BoundingBox other) {
|
||||||
@ -110,8 +101,8 @@ public class GraphStatistics {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "BoundingBox(topLeft=" + this.topLeft + ", bottomRight=" + this.bottomRight
|
return "BoundingBox(topLeft=" + this.topLeft + ", bottomRight="
|
||||||
+ ")";
|
+ this.bottomRight + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -130,13 +121,13 @@ public class GraphStatistics {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new GraphStatistics instance with the given value.
|
* Create a new GraphStatistics instance with the given value.
|
||||||
*
|
*
|
||||||
* @param boundingBox Bounding-box for the graph.
|
* @param boundingBox Bounding-box for the graph.
|
||||||
* @param nbRoadOneWay Number of one-way roads in the graph.
|
* @param nbRoadOneWay Number of one-way roads in the graph.
|
||||||
* @param nbRoadTwoWays Number of two-ways roads in the graph.
|
* @param nbRoadTwoWays Number of two-ways roads in the graph.
|
||||||
* @param maximumSpeed Maximum speed of any road of the graph. You can use
|
* @param maximumSpeed Maximum speed of any road of the graph. You can use
|
||||||
* {@link #NO_MAXIMUM_SPEED} to indicate that the graph has no maximum
|
* {@link #NO_MAXIMUM_SPEED} to indicate that the graph has no maximum speed
|
||||||
* speed limit.
|
* limit.
|
||||||
* @param maximumLength Maximum length of any arc of the graph.
|
* @param maximumLength Maximum length of any arc of the graph.
|
||||||
*/
|
*/
|
||||||
public GraphStatistics(BoundingBox boundingBox, int nbRoadOneWay, int nbRoadTwoWays,
|
public GraphStatistics(BoundingBox boundingBox, int nbRoadOneWay, int nbRoadTwoWays,
|
||||||
@ -171,7 +162,6 @@ public class GraphStatistics {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Number of arcs in this graph.
|
* @return Number of arcs in this graph.
|
||||||
*
|
|
||||||
* @see #getOneWayRoadCount()
|
* @see #getOneWayRoadCount()
|
||||||
* @see #getTwoWaysRoadCount()
|
* @see #getTwoWaysRoadCount()
|
||||||
*/
|
*/
|
||||||
@ -187,8 +177,8 @@ public class GraphStatistics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Maximum speed of any arc in the graph, or {@link #NO_MAXIMUM_SPEED}
|
* @return Maximum speed of any arc in the graph, or {@link #NO_MAXIMUM_SPEED} if
|
||||||
* if some roads have no speed limitation.
|
* some roads have no speed limitation.
|
||||||
*/
|
*/
|
||||||
public int getMaximumSpeed() {
|
public int getMaximumSpeed() {
|
||||||
return this.maximumSpeed;
|
return this.maximumSpeed;
|
||||||
|
@ -8,16 +8,13 @@ import java.util.List;
|
|||||||
* <p>
|
* <p>
|
||||||
* Class representing a Node in a {@link Graph}.
|
* Class representing a Node in a {@link Graph}.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* This class holds information regarding nodes in the graph together with the
|
* This class holds information regarding nodes in the graph together with the
|
||||||
* successors associated to the nodes.
|
* successors associated to the nodes.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* Nodes are comparable based on their ID.
|
* Nodes are comparable based on their ID.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class Node implements Comparable<Node> {
|
public final class Node implements Comparable<Node> {
|
||||||
|
|
||||||
@ -26,19 +23,17 @@ public final class Node implements Comparable<Node> {
|
|||||||
* Link the two given nodes with one or two arcs (depending on roadInformation),
|
* Link the two given nodes with one or two arcs (depending on roadInformation),
|
||||||
* with the given attributes.
|
* with the given attributes.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* If {@code roadInformation.isOneWay()} is {@code true}, only a forward arc is
|
* If {@code roadInformation.isOneWay()} is {@code true}, only a forward arc is
|
||||||
* created (origin to destination) and added to origin. Otherwise, a
|
* created (origin to destination) and added to origin. Otherwise, a corresponding
|
||||||
* corresponding backward arc is created and add to destination.
|
* backward arc is created and add to destination.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param origin Origin of the arc.
|
* @param origin Origin of the arc.
|
||||||
* @param destination Destination of the arc.
|
* @param destination Destination of the arc.
|
||||||
* @param length Length of the arc.
|
* @param length Length of the arc.
|
||||||
* @param roadInformation Information corresponding to the arc.
|
* @param roadInformation Information corresponding to the arc.
|
||||||
* @param points Points for the arc.
|
* @param points Points for the arc.
|
||||||
*
|
|
||||||
* @return The newly created forward arc (origin to destination).
|
* @return The newly created forward arc (origin to destination).
|
||||||
*/
|
*/
|
||||||
public static Arc linkNodes(Node origin, Node destination, float length,
|
public static Arc linkNodes(Node origin, Node destination, float length,
|
||||||
@ -51,12 +46,14 @@ public final class Node implements Comparable<Node> {
|
|||||||
else {
|
else {
|
||||||
final Arc d2o;
|
final Arc d2o;
|
||||||
if (origin.getId() < destination.getId()) {
|
if (origin.getId() < destination.getId()) {
|
||||||
arc = new ArcForward(origin, destination, length, roadInformation, points);
|
arc = new ArcForward(origin, destination, length, roadInformation,
|
||||||
|
points);
|
||||||
d2o = new ArcBackward(arc);
|
d2o = new ArcBackward(arc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Collections.reverse(points);
|
Collections.reverse(points);
|
||||||
d2o = new ArcForward(destination, origin, length, roadInformation, points);
|
d2o = new ArcForward(destination, origin, length, roadInformation,
|
||||||
|
points);
|
||||||
arc = new ArcBackward(d2o);
|
arc = new ArcBackward(d2o);
|
||||||
}
|
}
|
||||||
origin.addSuccessor(arc);
|
origin.addSuccessor(arc);
|
||||||
@ -77,8 +74,8 @@ public final class Node implements Comparable<Node> {
|
|||||||
/**
|
/**
|
||||||
* Create a new Node with the given ID corresponding to the given Point with an
|
* Create a new Node with the given ID corresponding to the given Point with an
|
||||||
* empty list of successors.
|
* empty list of successors.
|
||||||
*
|
*
|
||||||
* @param id ID of the node.
|
* @param id ID of the node.
|
||||||
* @param point Position of the node.
|
* @param point Position of the node.
|
||||||
*/
|
*/
|
||||||
public Node(int id, Point point) {
|
public Node(int id, Point point) {
|
||||||
@ -89,7 +86,7 @@ public final class Node implements Comparable<Node> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a successor to this node.
|
* Add a successor to this node.
|
||||||
*
|
*
|
||||||
* @param arc Arc to the successor.
|
* @param arc Arc to the successor.
|
||||||
*/
|
*/
|
||||||
protected void addSuccessor(Arc arc) {
|
protected void addSuccessor(Arc arc) {
|
||||||
@ -119,7 +116,6 @@ public final class Node implements Comparable<Node> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return List of successors of this node (unmodifiable list).
|
* @return List of successors of this node (unmodifiable list).
|
||||||
*
|
|
||||||
* @see Collections#unmodifiableList(List)
|
* @see Collections#unmodifiableList(List)
|
||||||
*/
|
*/
|
||||||
public List<Arc> getSuccessors() {
|
public List<Arc> getSuccessors() {
|
||||||
@ -146,9 +142,8 @@ public final class Node implements Comparable<Node> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare the ID of this node with the ID of the given node.
|
* Compare the ID of this node with the ID of the given node.
|
||||||
*
|
*
|
||||||
* @param other Node to compare this node with.
|
* @param other Node to compare this node with.
|
||||||
*
|
|
||||||
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -2,7 +2,6 @@ package org.insa.graphs.model;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing a point (position) on Earth.
|
* Class representing a point (position) on Earth.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class Point {
|
public final class Point {
|
||||||
|
|
||||||
@ -13,10 +12,9 @@ public final class Point {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the distance in meters between the two given points.
|
* Compute the distance in meters between the two given points.
|
||||||
*
|
*
|
||||||
* @param p1 First point.
|
* @param p1 First point.
|
||||||
* @param p2 second point.
|
* @param p2 second point.
|
||||||
*
|
|
||||||
* @return Distance between the two given points (in meters).
|
* @return Distance between the two given points (in meters).
|
||||||
*/
|
*/
|
||||||
public static double distance(Point p1, Point p2) {
|
public static double distance(Point p1, Point p2) {
|
||||||
@ -24,7 +22,8 @@ public final class Point {
|
|||||||
* Math.sin(Math.toRadians(p2.getLatitude()));
|
* Math.sin(Math.toRadians(p2.getLatitude()));
|
||||||
double cosLat = Math.cos(Math.toRadians(p1.getLatitude()))
|
double cosLat = Math.cos(Math.toRadians(p1.getLatitude()))
|
||||||
* Math.cos(Math.toRadians(p2.getLatitude()));
|
* Math.cos(Math.toRadians(p2.getLatitude()));
|
||||||
double cosLong = Math.cos(Math.toRadians(p2.getLongitude() - p1.getLongitude()));
|
double cosLong =
|
||||||
|
Math.cos(Math.toRadians(p2.getLongitude() - p1.getLongitude()));
|
||||||
return EARTH_RADIUS * Math.acos(sinLat + cosLat * cosLong);
|
return EARTH_RADIUS * Math.acos(sinLat + cosLat * cosLong);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +32,7 @@ public final class Point {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new point corresponding to the given (longitude, latitude) position.
|
* Create a new point corresponding to the given (longitude, latitude) position.
|
||||||
*
|
*
|
||||||
* @param longitude Longitude of the point (in degrees).
|
* @param longitude Longitude of the point (in degrees).
|
||||||
* @param latitude Latitude of the point (in degrees).
|
* @param latitude Latitude of the point (in degrees).
|
||||||
*/
|
*/
|
||||||
@ -58,9 +57,8 @@ public final class Point {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the distance from this point to the given point
|
* Compute the distance from this point to the given point
|
||||||
*
|
*
|
||||||
* @param target Target point to compute distance to.
|
* @param target Target point to compute distance to.
|
||||||
*
|
|
||||||
* @return Distance between this point and the target point, in meters.
|
* @return Distance between this point and the target point, in meters.
|
||||||
*/
|
*/
|
||||||
public double distanceTo(Point target) {
|
public double distanceTo(Point target) {
|
||||||
|
@ -4,41 +4,22 @@ package org.insa.graphs.model;
|
|||||||
* <p>
|
* <p>
|
||||||
* Class containing information for road that may be shared by multiple arcs.
|
* Class containing information for road that may be shared by multiple arcs.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* Sharing information between arcs reduces memory footprints of the program (a
|
* Sharing information between arcs reduces memory footprints of the program (a long
|
||||||
* long road is often split into multiple arcs at each intersection).
|
* road is often split into multiple arcs at each intersection).
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class RoadInformation {
|
public class RoadInformation {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enumeration for road types.
|
* Enumeration for road types.
|
||||||
*
|
*
|
||||||
* @see <a href=
|
* @see <a href=
|
||||||
* "https://wiki.openstreetmap.org/wiki/Key:highway#Values">OpenStreetMap
|
* "https://wiki.openstreetmap.org/wiki/Key:highway#Values">OpenStreetMap
|
||||||
* reference for road types.</a>
|
* reference for road types.</a>
|
||||||
*/
|
*/
|
||||||
public enum RoadType {
|
public enum RoadType {
|
||||||
MOTORWAY,
|
MOTORWAY, TRUNK, PRIMARY, SECONDARY, MOTORWAY_LINK, TRUNK_LINK, PRIMARY_LINK, SECONDARY_LINK, TERTIARY, TRACK, RESIDENTIAL, UNCLASSIFIED, LIVING_STREET, SERVICE, ROUNDABOUT, PEDESTRIAN, CYCLEWAY, COASTLINE
|
||||||
TRUNK,
|
|
||||||
PRIMARY,
|
|
||||||
SECONDARY,
|
|
||||||
MOTORWAY_LINK,
|
|
||||||
TRUNK_LINK,
|
|
||||||
PRIMARY_LINK,
|
|
||||||
SECONDARY_LINK,
|
|
||||||
TERTIARY,
|
|
||||||
TRACK,
|
|
||||||
RESIDENTIAL,
|
|
||||||
UNCLASSIFIED,
|
|
||||||
LIVING_STREET,
|
|
||||||
SERVICE,
|
|
||||||
ROUNDABOUT,
|
|
||||||
PEDESTRIAN,
|
|
||||||
CYCLEWAY,
|
|
||||||
COASTLINE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type of the road (see above).
|
// Type of the road (see above).
|
||||||
@ -58,16 +39,15 @@ public class RoadInformation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new RoadInformation instance containing the given parameters.
|
* Create a new RoadInformation instance containing the given parameters.
|
||||||
*
|
*
|
||||||
* @param roadType Type of the road (see {@link RoadType}).
|
* @param roadType Type of the road (see {@link RoadType}).
|
||||||
* @param access Access restrictions for the road (see
|
* @param access Access restrictions for the road (see {@link AccessRestrictions}).
|
||||||
* {@link AccessRestrictions}).
|
|
||||||
* @param isOneWay true if this road is a one way road, false otherwise.
|
* @param isOneWay true if this road is a one way road, false otherwise.
|
||||||
* @param maxSpeed Maximum speed for the road (in kilometers-per-hour).
|
* @param maxSpeed Maximum speed for the road (in kilometers-per-hour).
|
||||||
* @param name Name of the road.
|
* @param name Name of the road.
|
||||||
*/
|
*/
|
||||||
public RoadInformation(RoadType roadType, AccessRestrictions access, boolean isOneWay,
|
public RoadInformation(RoadType roadType, AccessRestrictions access,
|
||||||
int maxSpeed, String name) {
|
boolean isOneWay, int maxSpeed, String name) {
|
||||||
this.type = roadType;
|
this.type = roadType;
|
||||||
this.access = access;
|
this.access = access;
|
||||||
this.oneway = isOneWay;
|
this.oneway = isOneWay;
|
||||||
@ -119,8 +99,8 @@ public class RoadInformation {
|
|||||||
if (getType() == RoadType.MOTORWAY) {
|
if (getType() == RoadType.MOTORWAY) {
|
||||||
typeAsString = "highway";
|
typeAsString = "highway";
|
||||||
}
|
}
|
||||||
return typeAsString + " : " + getName() + " " + (isOneWay() ? " (oneway) " : "") + maxSpeed
|
return typeAsString + " : " + getName() + " " + (isOneWay() ? " (oneway) " : "")
|
||||||
+ " km/h (max.)";
|
+ maxSpeed + " km/h (max.)";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,11 @@ import java.io.IOException;
|
|||||||
/**
|
/**
|
||||||
* Exception thrown when a format-error is detected when reading a graph (e.g.,
|
* Exception thrown when a format-error is detected when reading a graph (e.g.,
|
||||||
* non-matching check bytes).
|
* non-matching check bytes).
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BadFormatException extends IOException {
|
public class BadFormatException extends IOException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1270945933549613579L;
|
private static final long serialVersionUID = 1270945933549613579L;
|
||||||
|
|
||||||
@ -23,7 +22,7 @@ public class BadFormatException extends IOException {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new format exception with the given message.
|
* Create a new format exception with the given message.
|
||||||
*
|
*
|
||||||
* @param message Message for the exception.
|
* @param message Message for the exception.
|
||||||
*/
|
*/
|
||||||
public BadFormatException(String message) {
|
public BadFormatException(String message) {
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
package org.insa.graphs.model.io;
|
package org.insa.graphs.model.io;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception thrown when there is a mismatch between expected and actual magic
|
* Exception thrown when there is a mismatch between expected and actual magic number.
|
||||||
* number.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BadMagicNumberException extends BadFormatException {
|
public class BadMagicNumberException extends BadFormatException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -2176603967548838864L;
|
private static final long serialVersionUID = -2176603967548838864L;
|
||||||
|
|
||||||
@ -18,13 +16,13 @@ public class BadMagicNumberException extends BadFormatException {
|
|||||||
/**
|
/**
|
||||||
* Create a new BadMagicNumberException with the given expected and actual magic
|
* Create a new BadMagicNumberException with the given expected and actual magic
|
||||||
* number.
|
* number.
|
||||||
*
|
*
|
||||||
* @param actualNumber Actual magic number (read from a file).
|
* @param actualNumber Actual magic number (read from a file).
|
||||||
* @param expectedNumber Expected magic number.
|
* @param expectedNumber Expected magic number.
|
||||||
*/
|
*/
|
||||||
public BadMagicNumberException(int actualNumber, int expectedNumber) {
|
public BadMagicNumberException(int actualNumber, int expectedNumber) {
|
||||||
super(String.format("Magic number mismatch, expected %#X, got %#X.", expectedNumber,
|
super(String.format("Magic number mismatch, expected %#X, got %#X.",
|
||||||
actualNumber));
|
expectedNumber, actualNumber));
|
||||||
this.actualNumber = actualNumber;
|
this.actualNumber = actualNumber;
|
||||||
this.expectedNumber = expectedNumber;
|
this.expectedNumber = expectedNumber;
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
package org.insa.graphs.model.io;
|
package org.insa.graphs.model.io;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception thrown when the version of the file is not at least the expected
|
* Exception thrown when the version of the file is not at least the expected one.
|
||||||
* one.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BadVersionException extends BadFormatException {
|
public class BadVersionException extends BadFormatException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 7776317018302386042L;
|
private static final long serialVersionUID = 7776317018302386042L;
|
||||||
|
|
||||||
@ -16,7 +14,6 @@ public class BadVersionException extends BadFormatException {
|
|||||||
private int actualVersion, expectedVersion;
|
private int actualVersion, expectedVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param actualVersion Actual version of the file.
|
* @param actualVersion Actual version of the file.
|
||||||
* @param expectedVersion Expected version of the file.
|
* @param expectedVersion Expected version of the file.
|
||||||
*/
|
*/
|
||||||
|
@ -20,7 +20,6 @@ import org.insa.graphs.model.RoadInformation.RoadType;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link GraphReader} to read graph in binary format.
|
* Implementation of {@link GraphReader} to read graph in binary format.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
||||||
|
|
||||||
@ -36,9 +35,8 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the given long value into a new instance of AccessRestrictions.
|
* Parse the given long value into a new instance of AccessRestrictions.
|
||||||
*
|
*
|
||||||
* @param access The value to parse.
|
* @param access The value to parse.
|
||||||
*
|
|
||||||
* @return New instance of access restrictions parsed from the given value.
|
* @return New instance of access restrictions parsed from the given value.
|
||||||
*/
|
*/
|
||||||
protected static AccessRestrictions toAccessInformation(final long access) {
|
protected static AccessRestrictions toAccessInformation(final long access) {
|
||||||
@ -50,22 +48,25 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
// the order correspond to the 4 bits value (i.e. FORBIDDEN is 0 or PRIVATE is
|
// the order correspond to the 4 bits value (i.e. FORBIDDEN is 0 or PRIVATE is
|
||||||
// 2) - UKNOWN is not included because value above 6 (FORESTRY) are all
|
// 2) - UKNOWN is not included because value above 6 (FORESTRY) are all
|
||||||
// considered unknown.
|
// considered unknown.
|
||||||
final AccessRestriction[] allRestrictions = new AccessRestriction[] {
|
final AccessRestriction[] allRestrictions =
|
||||||
AccessRestriction.FORBIDDEN, AccessRestriction.ALLOWED, AccessRestriction.PRIVATE,
|
new AccessRestriction[] { AccessRestriction.FORBIDDEN,
|
||||||
AccessRestriction.DESTINATION, AccessRestriction.DELIVERY,
|
AccessRestriction.ALLOWED, AccessRestriction.PRIVATE,
|
||||||
AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY };
|
AccessRestriction.DESTINATION, AccessRestriction.DELIVERY,
|
||||||
|
AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY };
|
||||||
|
|
||||||
// The order of values inside this array is VERY IMPORTANT: The order is such
|
// The order of values inside this array is VERY IMPORTANT: The order is such
|
||||||
// that each 4-bits group of the long value is processed in the correct order,
|
// that each 4-bits group of the long value is processed in the correct order,
|
||||||
// i.e. FOOT is processed first (4 lowest bits), and so on.
|
// i.e. FOOT is processed first (4 lowest bits), and so on.
|
||||||
final AccessMode[] allModes = new AccessMode[] { AccessMode.FOOT, null, AccessMode.BICYCLE,
|
final AccessMode[] allModes = new AccessMode[] { AccessMode.FOOT, null,
|
||||||
AccessMode.SMALL_MOTORCYCLE, AccessMode.AGRICULTURAL, AccessMode.MOTORCYCLE,
|
AccessMode.BICYCLE, AccessMode.SMALL_MOTORCYCLE,
|
||||||
AccessMode.MOTORCAR, AccessMode.HEAVY_GOODS, null, AccessMode.PUBLIC_TRANSPORT };
|
AccessMode.AGRICULTURAL, AccessMode.MOTORCYCLE, AccessMode.MOTORCAR,
|
||||||
|
AccessMode.HEAVY_GOODS, null, AccessMode.PUBLIC_TRANSPORT };
|
||||||
|
|
||||||
// fill maps...
|
// fill maps...
|
||||||
final EnumMap<AccessMode, AccessRestriction> restrictions = new EnumMap<>(AccessMode.class);
|
final EnumMap<AccessMode, AccessRestriction> restrictions =
|
||||||
|
new EnumMap<>(AccessMode.class);
|
||||||
long copyAccess = access;
|
long copyAccess = access;
|
||||||
for (AccessMode mode: allModes) {
|
for (AccessMode mode : allModes) {
|
||||||
if (mode == null) {
|
if (mode == null) {
|
||||||
continue; // filling cells
|
continue; // filling cells
|
||||||
}
|
}
|
||||||
@ -84,58 +85,56 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a character to its corresponding road type.
|
* Convert a character to its corresponding road type.
|
||||||
*
|
*
|
||||||
* @param ch Character to convert.
|
* @param ch Character to convert.
|
||||||
*
|
|
||||||
* @return Road type corresponding to the given character.
|
* @return Road type corresponding to the given character.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
protected static RoadType toRoadType(char ch) {
|
protected static RoadType toRoadType(char ch) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'a':
|
case 'a':
|
||||||
return RoadType.MOTORWAY;
|
return RoadType.MOTORWAY;
|
||||||
case 'b':
|
case 'b':
|
||||||
return RoadType.TRUNK;
|
return RoadType.TRUNK;
|
||||||
case 'c':
|
case 'c':
|
||||||
return RoadType.PRIMARY;
|
return RoadType.PRIMARY;
|
||||||
case 'd':
|
case 'd':
|
||||||
return RoadType.SECONDARY;
|
return RoadType.SECONDARY;
|
||||||
case 'e':
|
case 'e':
|
||||||
return RoadType.MOTORWAY_LINK;
|
return RoadType.MOTORWAY_LINK;
|
||||||
case 'f':
|
case 'f':
|
||||||
return RoadType.TRUNK_LINK;
|
return RoadType.TRUNK_LINK;
|
||||||
case 'g':
|
case 'g':
|
||||||
return RoadType.PRIMARY_LINK;
|
return RoadType.PRIMARY_LINK;
|
||||||
case 'h':
|
case 'h':
|
||||||
return RoadType.SECONDARY_LINK;
|
return RoadType.SECONDARY_LINK;
|
||||||
case 'i':
|
case 'i':
|
||||||
return RoadType.TERTIARY;
|
return RoadType.TERTIARY;
|
||||||
case 'j':
|
case 'j':
|
||||||
return RoadType.RESIDENTIAL;
|
return RoadType.RESIDENTIAL;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'l':
|
case 'l':
|
||||||
return RoadType.UNCLASSIFIED;
|
return RoadType.UNCLASSIFIED;
|
||||||
case 'm':
|
case 'm':
|
||||||
return RoadType.LIVING_STREET;
|
return RoadType.LIVING_STREET;
|
||||||
case 'n':
|
case 'n':
|
||||||
return RoadType.SERVICE;
|
return RoadType.SERVICE;
|
||||||
case 'o':
|
case 'o':
|
||||||
return RoadType.ROUNDABOUT;
|
return RoadType.ROUNDABOUT;
|
||||||
case 'p':
|
case 'p':
|
||||||
return RoadType.PEDESTRIAN;
|
return RoadType.PEDESTRIAN;
|
||||||
case 'r':
|
case 'r':
|
||||||
return RoadType.CYCLEWAY;
|
return RoadType.CYCLEWAY;
|
||||||
case 's':
|
case 's':
|
||||||
return RoadType.TRACK;
|
return RoadType.TRACK;
|
||||||
case 'z':
|
case 'z':
|
||||||
return RoadType.COASTLINE;
|
return RoadType.COASTLINE;
|
||||||
}
|
}
|
||||||
return RoadType.UNCLASSIFIED;
|
return RoadType.UNCLASSIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BinaryGraphReader that read from the given input stream.
|
* Create a new BinaryGraphReader that read from the given input stream.
|
||||||
*
|
*
|
||||||
* @param dis Input stream to read from.
|
* @param dis Input stream to read from.
|
||||||
*/
|
*/
|
||||||
public BinaryGraphReader(DataInputStream dis) {
|
public BinaryGraphReader(DataInputStream dis) {
|
||||||
@ -181,8 +180,10 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
final ArrayList<Node> nodes = new ArrayList<Node>(nbNodes);
|
final ArrayList<Node> nodes = new ArrayList<Node>(nbNodes);
|
||||||
|
|
||||||
// Read nodes.
|
// Read nodes.
|
||||||
float minLongitude = Float.POSITIVE_INFINITY, minLatitude = Float.POSITIVE_INFINITY,
|
float minLongitude = Float.POSITIVE_INFINITY,
|
||||||
maxLongitude = Float.NEGATIVE_INFINITY, maxLatitude = Float.NEGATIVE_INFINITY;
|
minLatitude = Float.POSITIVE_INFINITY,
|
||||||
|
maxLongitude = Float.NEGATIVE_INFINITY,
|
||||||
|
maxLatitude = Float.NEGATIVE_INFINITY;
|
||||||
observers.forEach((observer) -> observer.notifyStartReadingNodes(nbNodes));
|
observers.forEach((observer) -> observer.notifyStartReadingNodes(nbNodes));
|
||||||
for (int node = 0; node < nbNodes; ++node) {
|
for (int node = 0; node < nbNodes; ++node) {
|
||||||
// Read longitude / latitude.
|
// Read longitude / latitude.
|
||||||
@ -230,7 +231,8 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
float maxLength = 0;
|
float maxLength = 0;
|
||||||
final int copyNbTotalSuccesors = nbTotalSuccessors; // Stupid Java...
|
final int copyNbTotalSuccesors = nbTotalSuccessors; // Stupid Java...
|
||||||
int nbOneWayRoad = 0;
|
int nbOneWayRoad = 0;
|
||||||
observers.forEach((observer) -> observer.notifyStartReadingArcs(copyNbTotalSuccesors));
|
observers.forEach(
|
||||||
|
(observer) -> observer.notifyStartReadingArcs(copyNbTotalSuccesors));
|
||||||
for (int node = 0; node < nbNodes; ++node) {
|
for (int node = 0; node < nbNodes; ++node) {
|
||||||
for (int succ = 0; succ < nbSuccessors[node]; ++succ) {
|
for (int succ = 0; succ < nbSuccessors[node]; ++succ) {
|
||||||
|
|
||||||
@ -250,8 +252,9 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
}
|
}
|
||||||
maxLength = Math.max(length, maxLength);
|
maxLength = Math.max(length, maxLength);
|
||||||
|
|
||||||
length = Math.max(length, (float) Point.distance(nodes.get(node).getPoint(),
|
length = Math.max(length,
|
||||||
nodes.get(destNode).getPoint()));
|
(float) Point.distance(nodes.get(node).getPoint(),
|
||||||
|
nodes.get(destNode).getPoint()));
|
||||||
|
|
||||||
// Number of segments.
|
// Number of segments.
|
||||||
final int nbSegments = dis.readUnsignedShort();
|
final int nbSegments = dis.readUnsignedShort();
|
||||||
@ -294,14 +297,14 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
new GraphStatistics(
|
new GraphStatistics(
|
||||||
new BoundingBox(new Point(minLongitude, maxLatitude),
|
new BoundingBox(new Point(minLongitude, maxLatitude),
|
||||||
new Point(maxLongitude, minLatitude)),
|
new Point(maxLongitude, minLatitude)),
|
||||||
nbOneWayRoad, nbTotalSuccessors - nbOneWayRoad, maxSpeed, maxLength));
|
nbOneWayRoad, nbTotalSuccessors - nbOneWayRoad, maxSpeed,
|
||||||
|
maxLength));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the next road information from the stream.
|
* Read the next road information from the stream.
|
||||||
*
|
*
|
||||||
* @return The next RoadInformation in the stream.
|
* @return The next RoadInformation in the stream.
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading from the stream.
|
* @throws IOException if an error occurs while reading from the stream.
|
||||||
*/
|
*/
|
||||||
private RoadInformation readRoadInformation() throws IOException {
|
private RoadInformation readRoadInformation() throws IOException {
|
||||||
@ -315,8 +318,8 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader {
|
|||||||
// TODO: Try to create something...
|
// TODO: Try to create something...
|
||||||
dis.readUnsignedShort();
|
dis.readUnsignedShort();
|
||||||
}
|
}
|
||||||
return new RoadInformation(toRoadType(type), access, (x & 0x80) > 0, (x & 0x7F) * 5,
|
return new RoadInformation(toRoadType(type), access, (x & 0x80) > 0,
|
||||||
dis.readUTF());
|
(x & 0x7F) * 5, dis.readUTF());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import org.insa.graphs.model.Path;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link PathReader} to read paths in binary format.
|
* Implementation of {@link PathReader} to read paths in binary format.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BinaryPathReader extends BinaryReader implements PathReader {
|
public class BinaryPathReader extends BinaryReader implements PathReader {
|
||||||
|
|
||||||
@ -20,7 +19,7 @@ public class BinaryPathReader extends BinaryReader implements PathReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BinaryPathReader that read from the given input stream.
|
* Create a new BinaryPathReader that read from the given input stream.
|
||||||
*
|
*
|
||||||
* @param dis Input stream to read from.
|
* @param dis Input stream to read from.
|
||||||
*/
|
*/
|
||||||
public BinaryPathReader(DataInputStream dis) {
|
public BinaryPathReader(DataInputStream dis) {
|
||||||
@ -35,7 +34,8 @@ public class BinaryPathReader extends BinaryReader implements PathReader {
|
|||||||
checkVersionOrThrow(dis.readInt());
|
checkVersionOrThrow(dis.readInt());
|
||||||
|
|
||||||
// Read map ID and check against graph.
|
// Read map ID and check against graph.
|
||||||
final String mapId = readFixedLengthString(BinaryGraphReader.MAP_ID_FIELD_LENGTH, "UTF-8");
|
final String mapId =
|
||||||
|
readFixedLengthString(BinaryGraphReader.MAP_ID_FIELD_LENGTH, "UTF-8");
|
||||||
|
|
||||||
if (!mapId.equals(graph.getMapId())) {
|
if (!mapId.equals(graph.getMapId())) {
|
||||||
throw new MapMismatchException(mapId, graph.getMapId());
|
throw new MapMismatchException(mapId, graph.getMapId());
|
||||||
@ -59,12 +59,10 @@ public class BinaryPathReader extends BinaryReader implements PathReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a node from the input stream and returns it.
|
* Read a node from the input stream and returns it.
|
||||||
*
|
*
|
||||||
* @param graph Graph containing the nodes.
|
* @param graph Graph containing the nodes.
|
||||||
*
|
|
||||||
* @return The next node in the input stream.
|
* @return The next node in the input stream.
|
||||||
*
|
* @throws IOException if something occurs while reading the note.
|
||||||
* @throws IOException if something occurs while reading the note.
|
|
||||||
* @throws IndexOutOfBoundsException if the node is not in the graph.
|
* @throws IndexOutOfBoundsException if the node is not in the graph.
|
||||||
*/
|
*/
|
||||||
protected Node readNode(Graph graph) throws IOException {
|
protected Node readNode(Graph graph) throws IOException {
|
||||||
|
@ -9,13 +9,12 @@ import org.insa.graphs.model.Path;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link PathWriter} to write paths in binary format.
|
* Implementation of {@link PathWriter} to write paths in binary format.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class BinaryPathWriter extends BinaryWriter implements PathWriter {
|
public class BinaryPathWriter extends BinaryWriter implements PathWriter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BinaryPathWriter that writes to the given output stream.
|
* Create a new BinaryPathWriter that writes to the given output stream.
|
||||||
*
|
*
|
||||||
* @param dos Output stream to write to.
|
* @param dos Output stream to write to.
|
||||||
*/
|
*/
|
||||||
public BinaryPathWriter(DataOutputStream dos) {
|
public BinaryPathWriter(DataOutputStream dos) {
|
||||||
@ -43,7 +42,7 @@ public class BinaryPathWriter extends BinaryWriter implements PathWriter {
|
|||||||
|
|
||||||
// Write nodes.
|
// Write nodes.
|
||||||
dos.writeInt(path.getOrigin().getId());
|
dos.writeInt(path.getOrigin().getId());
|
||||||
for (Arc arc: path.getArcs()) {
|
for (Arc arc : path.getArcs()) {
|
||||||
dos.writeInt(arc.getDestination().getId());
|
dos.writeInt(arc.getDestination().getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@ import java.io.IOException;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for writing binary file.
|
* Base class for writing binary file.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public abstract class BinaryReader implements AutoCloseable, Closeable {
|
public abstract class BinaryReader implements AutoCloseable, Closeable {
|
||||||
|
|
||||||
@ -19,12 +18,12 @@ public abstract class BinaryReader implements AutoCloseable, Closeable {
|
|||||||
protected final DataInputStream dis;
|
protected final DataInputStream dis;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BinaryReader that reads from the given stream and that expected
|
* Create a new BinaryReader that reads from the given stream and that expected the
|
||||||
* the given magic number and at least the given minimum version.
|
* given magic number and at least the given minimum version.
|
||||||
*
|
*
|
||||||
* @param magicNumber Magic number of files to be read.
|
* @param magicNumber Magic number of files to be read.
|
||||||
* @param minVersion Minimum version of files to be read.
|
* @param minVersion Minimum version of files to be read.
|
||||||
* @param dis Input stream from which to read.
|
* @param dis Input stream from which to read.
|
||||||
*/
|
*/
|
||||||
protected BinaryReader(int magicNumber, int minVersion, DataInputStream dis) {
|
protected BinaryReader(int magicNumber, int minVersion, DataInputStream dis) {
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = magicNumber;
|
||||||
@ -38,13 +37,12 @@ public abstract class BinaryReader implements AutoCloseable, Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given version is greater than the minimum version, and update
|
* Check if the given version is greater than the minimum version, and update the
|
||||||
* the current version if it is.
|
* current version if it is.
|
||||||
*
|
*
|
||||||
* @param version Version to check.
|
* @param version Version to check.
|
||||||
*
|
* @throws BadVersionException if the given version is not greater than the minimum
|
||||||
* @throws BadVersionException if the given version is not greater than the
|
* version.
|
||||||
* minimum version.
|
|
||||||
*/
|
*/
|
||||||
protected void checkVersionOrThrow(int version) throws BadVersionException {
|
protected void checkVersionOrThrow(int version) throws BadVersionException {
|
||||||
if (version < this.minVersion) {
|
if (version < this.minVersion) {
|
||||||
@ -62,25 +60,23 @@ public abstract class BinaryReader implements AutoCloseable, Closeable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given number matches the expected magic number.
|
* Check if the given number matches the expected magic number.
|
||||||
*
|
*
|
||||||
* @param magicNumber The magic number to check.
|
* @param magicNumber The magic number to check.
|
||||||
*
|
|
||||||
* @throws BadMagicNumberException If the two magic numbers are not equal.
|
* @throws BadMagicNumberException If the two magic numbers are not equal.
|
||||||
*/
|
*/
|
||||||
protected void checkMagicNumberOrThrow(int magicNumber) throws BadMagicNumberException {
|
protected void checkMagicNumberOrThrow(int magicNumber)
|
||||||
|
throws BadMagicNumberException {
|
||||||
if (this.magicNumber != magicNumber) {
|
if (this.magicNumber != magicNumber) {
|
||||||
throw new BadMagicNumberException(magicNumber, this.magicNumber);
|
throw new BadMagicNumberException(magicNumber, this.magicNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the next byte in the input stream correspond to the given byte.
|
* Check if the next byte in the input stream correspond to the given byte. This
|
||||||
*
|
* function consumes the next byte in the input stream.
|
||||||
* This function consumes the next byte in the input stream.
|
*
|
||||||
*
|
|
||||||
* @param b Byte to check.
|
* @param b Byte to check.
|
||||||
*
|
* @throws IOException if an error occurs while reading the byte.
|
||||||
* @throws IOException if an error occurs while reading the byte.
|
|
||||||
* @throws BadFormatException if the byte read is not the expected one.
|
* @throws BadFormatException if the byte read is not the expected one.
|
||||||
*/
|
*/
|
||||||
protected void checkByteOrThrow(int b) throws IOException {
|
protected void checkByteOrThrow(int b) throws IOException {
|
||||||
@ -90,17 +86,16 @@ public abstract class BinaryReader implements AutoCloseable, Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a byte array of fixed length from the input and convert it to a string
|
* Read a byte array of fixed length from the input and convert it to a string using
|
||||||
* using the given charset, removing any trailing '\0'.
|
* the given charset, removing any trailing '\0'.
|
||||||
*
|
*
|
||||||
* @param length Number of bytes to read.
|
* @param length Number of bytes to read.
|
||||||
* @param charset Charset to use to convert the bytes into a string.
|
* @param charset Charset to use to convert the bytes into a string.
|
||||||
*
|
|
||||||
* @return The convert string.
|
* @return The convert string.
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading or converting.
|
* @throws IOException if an error occurs while reading or converting.
|
||||||
*/
|
*/
|
||||||
protected String readFixedLengthString(int length, String charset) throws IOException {
|
protected String readFixedLengthString(int length, String charset)
|
||||||
|
throws IOException {
|
||||||
byte[] bytes = new byte[length];
|
byte[] bytes = new byte[length];
|
||||||
this.dis.read(bytes);
|
this.dis.read(bytes);
|
||||||
return new String(bytes, "UTF-8").trim();
|
return new String(bytes, "UTF-8").trim();
|
||||||
@ -109,9 +104,8 @@ public abstract class BinaryReader implements AutoCloseable, Closeable {
|
|||||||
/**
|
/**
|
||||||
* Read 24 bits in BigEndian order from the stream and return the corresponding
|
* Read 24 bits in BigEndian order from the stream and return the corresponding
|
||||||
* integer value.
|
* integer value.
|
||||||
*
|
*
|
||||||
* @return Integer value read from the next 24 bits of the stream.
|
* @return Integer value read from the next 24 bits of the stream.
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading from the stream.
|
* @throws IOException if an error occurs while reading from the stream.
|
||||||
*/
|
*/
|
||||||
protected int read24bits() throws IOException {
|
protected int read24bits() throws IOException {
|
||||||
|
@ -6,7 +6,6 @@ import java.io.IOException;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for writing binary file.
|
* Base class for writing binary file.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public abstract class BinaryWriter implements AutoCloseable, Closeable {
|
public abstract class BinaryWriter implements AutoCloseable, Closeable {
|
||||||
|
|
||||||
@ -15,7 +14,7 @@ public abstract class BinaryWriter implements AutoCloseable, Closeable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new BinaryWriter that writes to the given output stream.
|
* Create a new BinaryWriter that writes to the given output stream.
|
||||||
*
|
*
|
||||||
* @param dos Stream to write to.
|
* @param dos Stream to write to.
|
||||||
*/
|
*/
|
||||||
protected BinaryWriter(DataOutputStream dos) {
|
protected BinaryWriter(DataOutputStream dos) {
|
||||||
@ -29,9 +28,8 @@ public abstract class BinaryWriter implements AutoCloseable, Closeable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a 24-bits integer in BigEndian order to the output stream.
|
* Write a 24-bits integer in BigEndian order to the output stream.
|
||||||
*
|
*
|
||||||
* @param value Value to write.
|
* @param value Value to write.
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while writing to the stream.
|
* @throws IOException if an error occurs while writing to the stream.
|
||||||
*/
|
*/
|
||||||
protected void write24bits(int value) throws IOException {
|
protected void write24bits(int value) throws IOException {
|
||||||
|
@ -7,32 +7,28 @@ import org.insa.graphs.model.Graph;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base interface for classes that can read graph.
|
* Base interface for classes that can read graph.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface GraphReader extends AutoCloseable, Closeable {
|
public interface GraphReader extends AutoCloseable, Closeable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new observer to this graph reader.
|
* Add a new observer to this graph reader.
|
||||||
*
|
*
|
||||||
* @param observer Observer to add.
|
* @param observer Observer to add.
|
||||||
*/
|
*/
|
||||||
public void addObserver(GraphReaderObserver observer);
|
public void addObserver(GraphReaderObserver observer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a graph an returns it.
|
* Read a graph an returns it.
|
||||||
*
|
*
|
||||||
* @return The graph read.
|
* @return The graph read.
|
||||||
*
|
|
||||||
* @throws IOException if an exception occurs while reading the graph.
|
* @throws IOException if an exception occurs while reading the graph.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public Graph read() throws IOException;
|
public Graph read() throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close this graph reader.
|
* Close this graph reader.
|
||||||
*
|
*
|
||||||
* @throws IOException if an exception occurs while closing the reader.
|
* @throws IOException if an exception occurs while closing the reader.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void close() throws IOException;
|
public void close() throws IOException;
|
||||||
|
|
||||||
|
@ -5,16 +5,15 @@ import org.insa.graphs.model.Node;
|
|||||||
import org.insa.graphs.model.RoadInformation;
|
import org.insa.graphs.model.RoadInformation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base interface that should be implemented by classes that want to observe the
|
* Base interface that should be implemented by classes that want to observe the reading
|
||||||
* reading of a graph by a {@link GraphReader}.
|
* of a graph by a {@link GraphReader}.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface GraphReaderObserver {
|
public interface GraphReaderObserver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify observer about information on the graph, this method is always the
|
* Notify observer about information on the graph, this method is always the first
|
||||||
* first called
|
* called
|
||||||
*
|
*
|
||||||
* @param mapId ID of the graph.
|
* @param mapId ID of the graph.
|
||||||
*/
|
*/
|
||||||
public void notifyStartReading(String mapId);
|
public void notifyStartReading(String mapId);
|
||||||
@ -26,42 +25,42 @@ public interface GraphReaderObserver {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that the reader is starting to read node.
|
* Notify that the reader is starting to read node.
|
||||||
*
|
*
|
||||||
* @param nNodes Number of nodes to read.
|
* @param nNodes Number of nodes to read.
|
||||||
*/
|
*/
|
||||||
public void notifyStartReadingNodes(int nNodes);
|
public void notifyStartReadingNodes(int nNodes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that a new nodes has been read.
|
* Notify that a new nodes has been read.
|
||||||
*
|
*
|
||||||
* @param node read.
|
* @param node read.
|
||||||
*/
|
*/
|
||||||
public void notifyNewNodeRead(Node node);
|
public void notifyNewNodeRead(Node node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that the reader is starting to read descriptor/road informations.
|
* Notify that the reader is starting to read descriptor/road informations.
|
||||||
*
|
*
|
||||||
* @param nDesc Number of descriptors to read.
|
* @param nDesc Number of descriptors to read.
|
||||||
*/
|
*/
|
||||||
public void notifyStartReadingDescriptors(int nDesc);
|
public void notifyStartReadingDescriptors(int nDesc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that a new descriptor has been read.
|
* Notify that a new descriptor has been read.
|
||||||
*
|
*
|
||||||
* @param desc Descriptor read.
|
* @param desc Descriptor read.
|
||||||
*/
|
*/
|
||||||
public void notifyNewDescriptorRead(RoadInformation desc);
|
public void notifyNewDescriptorRead(RoadInformation desc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that the reader is starting to read arcs.
|
* Notify that the reader is starting to read arcs.
|
||||||
*
|
*
|
||||||
* @param nArcs Number of arcs to read (!= number of arcs in the graph).
|
* @param nArcs Number of arcs to read (!= number of arcs in the graph).
|
||||||
*/
|
*/
|
||||||
public void notifyStartReadingArcs(int nArcs);
|
public void notifyStartReadingArcs(int nArcs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify that a new arc has been read.
|
* Notify that a new arc has been read.
|
||||||
*
|
*
|
||||||
* @param arc Arc read.
|
* @param arc Arc read.
|
||||||
*/
|
*/
|
||||||
public void notifyNewArcRead(Arc arc);
|
public void notifyNewArcRead(Arc arc);
|
||||||
|
@ -3,14 +3,13 @@ package org.insa.graphs.model.io;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception thrown when there is mismatch between the expected map ID and the
|
* Exception thrown when there is mismatch between the expected map ID and the actual
|
||||||
* actual map ID when reading a graph.
|
* map ID when reading a graph.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class MapMismatchException extends IOException {
|
public class MapMismatchException extends IOException {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -19,8 +18,8 @@ public class MapMismatchException extends IOException {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new MapMismatchException with the given IDs.
|
* Create a new MapMismatchException with the given IDs.
|
||||||
*
|
*
|
||||||
* @param actualMapId Actual map ID found when reading the path.
|
* @param actualMapId Actual map ID found when reading the path.
|
||||||
* @param expectedMapId Expected map ID from the graph.
|
* @param expectedMapId Expected map ID from the graph.
|
||||||
*/
|
*/
|
||||||
public MapMismatchException(String actualMapId, String expectedMapId) {
|
public MapMismatchException(String actualMapId, String expectedMapId) {
|
||||||
|
@ -8,26 +8,22 @@ import org.insa.graphs.model.Path;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base interface that should be implemented by class used to read paths.
|
* Base interface that should be implemented by class used to read paths.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface PathReader extends AutoCloseable, Closeable {
|
public interface PathReader extends AutoCloseable, Closeable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a path of the given graph and returns it.
|
* Read a path of the given graph and returns it.
|
||||||
*
|
*
|
||||||
* @param graph Graph of the path.
|
* @param graph Graph of the path.
|
||||||
*
|
|
||||||
* @return Path read.
|
* @return Path read.
|
||||||
*
|
|
||||||
* @throws IOException When an error occurs while reading the path.
|
* @throws IOException When an error occurs while reading the path.
|
||||||
*/
|
*/
|
||||||
public Path readPath(Graph graph) throws IOException;
|
public Path readPath(Graph graph) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close this graph reader.
|
* Close this graph reader.
|
||||||
*
|
*
|
||||||
* @throws IOException if an exception occurs while closing the reader.
|
* @throws IOException if an exception occurs while closing the reader.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void close() throws IOException;
|
public void close() throws IOException;
|
||||||
|
|
||||||
|
@ -7,24 +7,21 @@ import org.insa.graphs.model.Path;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base interface that should be implemented by class used to write paths.
|
* Base interface that should be implemented by class used to write paths.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface PathWriter extends AutoCloseable, Closeable {
|
public interface PathWriter extends AutoCloseable, Closeable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the given path.
|
* Write the given path.
|
||||||
*
|
*
|
||||||
* @param path Path to write.
|
* @param path Path to write.
|
||||||
*
|
|
||||||
* @throws IOException When an error occurs while writing the path.
|
* @throws IOException When an error occurs while writing the path.
|
||||||
*/
|
*/
|
||||||
public void writePath(Path path) throws IOException;
|
public void writePath(Path path) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close this graph reader.
|
* Close this graph reader.
|
||||||
*
|
*
|
||||||
* @throws IOException if an exception occurs while closing the reader.
|
* @throws IOException if an exception occurs while closing the reader.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void close() throws IOException;
|
public void close() throws IOException;
|
||||||
|
|
||||||
|
@ -39,23 +39,29 @@ public class GraphTest {
|
|||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[0], nodes[4], 0,
|
Node.linkNodes(nodes[0], nodes[4], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[1], nodes[2], 0,
|
Node.linkNodes(nodes[1], nodes[2], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[3], nodes[0], 0,
|
Node.linkNodes(nodes[3], nodes[0], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[3], nodes[4], 0,
|
Node.linkNodes(nodes[3], nodes[4], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[4], nodes[0], 0,
|
Node.linkNodes(nodes[4], nodes[0], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
|
|
||||||
graph = new Graph("ID", "", Arrays.asList(nodes), null);
|
graph = new Graph("ID", "", Arrays.asList(nodes), null);
|
||||||
|
|
||||||
@ -66,7 +72,7 @@ public class GraphTest {
|
|||||||
*/
|
*/
|
||||||
private List<Arc> getArcsBetween(Node a, Node b) {
|
private List<Arc> getArcsBetween(Node a, Node b) {
|
||||||
List<Arc> arcs = new ArrayList<>();
|
List<Arc> arcs = new ArrayList<>();
|
||||||
for (Arc arc: a.getSuccessors()) {
|
for (Arc arc : a.getSuccessors()) {
|
||||||
if (arc.getDestination().equals(b)) {
|
if (arc.getDestination().equals(b)) {
|
||||||
arcs.add(arc);
|
arcs.add(arc);
|
||||||
}
|
}
|
||||||
|
@ -33,23 +33,29 @@ public class NodeTest {
|
|||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[0], nodes[4], 0,
|
Node.linkNodes(nodes[0], nodes[4], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[1], nodes[2], 0,
|
Node.linkNodes(nodes[1], nodes[2], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[2], nodes[3], 0,
|
Node.linkNodes(nodes[2], nodes[3], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[3], nodes[0], 0,
|
Node.linkNodes(nodes[3], nodes[0], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
new RoadInformation(RoadType.UNCLASSIFIED, null, false, 1, null),
|
||||||
new ArrayList<>());
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[3], nodes[4], 0,
|
Node.linkNodes(nodes[3], nodes[4], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
Node.linkNodes(nodes[4], nodes[0], 0,
|
Node.linkNodes(nodes[4], nodes[0], 0,
|
||||||
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null), new ArrayList<>());
|
new RoadInformation(RoadType.UNCLASSIFIED, null, true, 1, null),
|
||||||
|
new ArrayList<>());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +63,7 @@ public class NodeTest {
|
|||||||
* @return The first arc between from a to b, or null.
|
* @return The first arc between from a to b, or null.
|
||||||
*/
|
*/
|
||||||
private Arc getFirstArcBetween(Node a, Node b) {
|
private Arc getFirstArcBetween(Node a, Node b) {
|
||||||
for (Arc arc: a.getSuccessors()) {
|
for (Arc arc : a.getSuccessors()) {
|
||||||
if (arc.getDestination().equals(b)) {
|
if (arc.getDestination().equals(b)) {
|
||||||
return arc;
|
return arc;
|
||||||
}
|
}
|
||||||
|
@ -30,14 +30,15 @@ public class PathTest {
|
|||||||
private static Arc a2b, a2c, a2e, b2c, c2d_1, c2d_2, c2d_3, c2a, d2a, d2e, e2d;
|
private static Arc a2b, a2c, a2e, b2c, c2d_1, c2d_2, c2d_3, c2a, d2a, d2e, e2d;
|
||||||
|
|
||||||
// Some paths...
|
// Some paths...
|
||||||
private static Path emptyPath, singleNodePath, shortPath, longPath, loopPath, longLoopPath,
|
private static Path emptyPath, singleNodePath, shortPath, longPath, loopPath,
|
||||||
invalidPath;
|
longLoopPath, invalidPath;
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void initAll() throws IOException {
|
public static void initAll() throws IOException {
|
||||||
|
|
||||||
// 10 and 20 meters per seconds
|
// 10 and 20 meters per seconds
|
||||||
RoadInformation speed10 = new RoadInformation(RoadType.MOTORWAY, null, true, 36, ""),
|
RoadInformation speed10 =
|
||||||
|
new RoadInformation(RoadType.MOTORWAY, null, true, 36, ""),
|
||||||
speed20 = new RoadInformation(RoadType.MOTORWAY, null, true, 72, "");
|
speed20 = new RoadInformation(RoadType.MOTORWAY, null, true, 72, "");
|
||||||
|
|
||||||
// Create nodes
|
// Create nodes
|
||||||
@ -65,8 +66,8 @@ public class PathTest {
|
|||||||
shortPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1 }));
|
shortPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1 }));
|
||||||
longPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1, d2e }));
|
longPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1, d2e }));
|
||||||
loopPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1, d2a }));
|
loopPath = new Path(graph, Arrays.asList(new Arc[] { a2b, b2c, c2d_1, d2a }));
|
||||||
longLoopPath = new Path(graph,
|
longLoopPath = new Path(graph, Arrays
|
||||||
Arrays.asList(new Arc[] { a2b, b2c, c2d_1, d2a, a2c, c2d_3, d2a, a2b, b2c }));
|
.asList(new Arc[] { a2b, b2c, c2d_1, d2a, a2c, c2d_3, d2a, a2b, b2c }));
|
||||||
invalidPath = new Path(graph, Arrays.asList(new Arc[] { a2b, c2d_1, d2e }));
|
invalidPath = new Path(graph, Arrays.asList(new Arc[] { a2b, c2d_1, d2e }));
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -184,7 +185,8 @@ public class PathTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Trap construction!
|
// Trap construction!
|
||||||
path = Path.createFastestPathFromNodes(graph, Arrays.asList(new Node[] { nodes[1] }));
|
path = Path.createFastestPathFromNodes(graph,
|
||||||
|
Arrays.asList(new Node[] { nodes[1] }));
|
||||||
assertEquals(nodes[1], path.getOrigin());
|
assertEquals(nodes[1], path.getOrigin());
|
||||||
assertEquals(0, path.getArcs().size());
|
assertEquals(0, path.getArcs().size());
|
||||||
|
|
||||||
@ -219,7 +221,8 @@ public class PathTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Trap construction!
|
// Trap construction!
|
||||||
path = Path.createShortestPathFromNodes(graph, Arrays.asList(new Node[] { nodes[1] }));
|
path = Path.createShortestPathFromNodes(graph,
|
||||||
|
Arrays.asList(new Node[] { nodes[1] }));
|
||||||
assertEquals(nodes[1], path.getOrigin());
|
assertEquals(nodes[1], path.getOrigin());
|
||||||
assertEquals(0, path.getArcs().size());
|
assertEquals(0, path.getArcs().size());
|
||||||
|
|
||||||
@ -232,12 +235,14 @@ public class PathTest {
|
|||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void testCreateFastestPathFromNodesException() {
|
public void testCreateFastestPathFromNodesException() {
|
||||||
Path.createFastestPathFromNodes(graph, Arrays.asList(new Node[] { nodes[1], nodes[0] }));
|
Path.createFastestPathFromNodes(graph,
|
||||||
|
Arrays.asList(new Node[] { nodes[1], nodes[0] }));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void testCreateShortestPathFromNodesException() {
|
public void testCreateShortestPathFromNodesException() {
|
||||||
Path.createShortestPathFromNodes(graph, Arrays.asList(new Node[] { nodes[1], nodes[0] }));
|
Path.createShortestPathFromNodes(graph,
|
||||||
|
Arrays.asList(new Node[] { nodes[1], nodes[0] }));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
338
eclipse-java-google-style.xml
Normal file
338
eclipse-java-google-style.xml
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<profiles version="13">
|
||||||
|
<profile kind="CodeFormatterProfile" version="13">
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_prefer_two_fragments" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_comment_inline_tags" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_local_variable_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="1040" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type.count_dependent" value="1585|-1|1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression.count_dependent" value="16|4|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration.count_dependent" value="16|4|48" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration.count_dependent" value="16|4|49" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration.count_dependent" value="16|4|48" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_local_variable_annotation" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants.count_dependent" value="16|5|48" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="88" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation.count_dependent" value="16|4|48" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_type_annotation" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_field_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment_new_line_at_start_of_html_paragraph" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comment_prefix" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_parameter_annotation" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter.count_dependent" value="1040|-1|1040" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package.count_dependent" value="1585|-1|1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.force_if_else_statement_brace" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="2" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_package_annotation" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_new_anonymous_class" value="20" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable.count_dependent" value="1585|-1|1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent" value="1585|-1|1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="88" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration.count_dependent" value="16|4|48" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method.count_dependent" value="1585|-1|1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_member_annotation" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="1585" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments.count_dependent" value="16|-1|16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration.count_dependent" value="16|5|80" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.alignment_for_for_statement" value="16" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false" />
|
||||||
|
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false" />
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
4
pom.xml
4
pom.xml
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>org.insa.graphs</groupId>
|
<groupId>org.insa.graphs</groupId>
|
||||||
|
Loading…
Reference in New Issue
Block a user