--- /dev/null
+package tim.prune.function.compress;
+
+import tim.prune.App;
+import tim.prune.UpdateMessageBroker;
+import tim.prune.data.DataPoint;
+
+/**
+ * Function to mark all the points in the selected rectangle
+ */
+public class MarkPointsInRectangleFunction extends MarkAndDeleteFunction
+{
+ /** Minimum and maximum latitude values of rectangle */
+ private double _minLat = 0.0, _maxLat = 0.0;
+ /** Minimum and maximum longitude values of rectangle */
+ private double _minLon = 0.0, _maxLon = 0.0;
+
+
+ /**
+ * Constructor
+ * @param inApp App object
+ */
+ public MarkPointsInRectangleFunction(App inApp)
+ {
+ super(inApp);
+ }
+
+ /** @return name key */
+ public String getNameKey() {
+ return "menu.track.markrectangle";
+ }
+
+ /**
+ * Set the coordinates of the rectangle
+ * @param inLon1 first longitude value
+ * @param inLat1 first latitude value
+ * @param inLon2 second longitude value
+ * @param inLat2 second latitude value
+ */
+ public void setRectCoords(double inLon1, double inLat1, double inLon2, double inLat2)
+ {
+ if (inLon1 == inLon2 || inLat1 == inLat2)
+ {
+ // Coordinates not valid
+ _minLat = _maxLat = _minLon = _maxLon = 0.0;
+ }
+ else
+ {
+ if (inLon2 > inLon1) {
+ _minLon = inLon1; _maxLon = inLon2;
+ }
+ else {
+ _minLon = inLon2; _maxLon = inLon1;
+ }
+ if (inLat2 > inLat1) {
+ _minLat = inLat1; _maxLat = inLat2;
+ }
+ else {
+ _minLat = inLat2; _maxLat = inLat1;
+ }
+ }
+ }
+
+ /**
+ * Begin the function using the set parameters
+ */
+ public void begin()
+ {
+ if (_maxLon == _minLon || _maxLat == _minLat) {
+ return;
+ }
+
+ // Loop over all points in track
+ final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
+ int numMarked = 0;
+ for (int i=0; i<numPoints; i++)
+ {
+ DataPoint point = _app.getTrackInfo().getTrack().getPoint(i);
+ // For each point, see if it's within the rectangle
+ final double pointLon = point.getLongitude().getDouble();
+ final double pointLat = point.getLatitude().getDouble();
+ final boolean insideRect = (pointLon >= _minLon && pointLon <= _maxLon
+ && pointLat >= _minLat && pointLat <= _maxLat);
+ // Mark it accordingly (also resetting points outside the rect to false)
+ point.setMarkedForDeletion(insideRect);
+ if (insideRect) {
+ numMarked++;
+ }
+ }
+
+ // Inform subscribers to update display
+ UpdateMessageBroker.informSubscribers();
+ // Confirm message showing how many marked
+ if (numMarked > 0)
+ {
+ optionallyDeleteMarkedPoints(numMarked);
+ }
+ }
+}