mirror of https://github.com/webbukkit/dynmap.git
382 lines
11 KiB
Java
382 lines
11 KiB
Java
package org.dynmap.markers.impl;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import org.dynmap.Client;
|
|
import org.dynmap.ConfigurationNode;
|
|
import org.dynmap.DynmapWorld;
|
|
import org.dynmap.markers.PolyLineMarker;
|
|
import org.dynmap.markers.MarkerSet;
|
|
import org.dynmap.markers.impl.MarkerAPIImpl.MarkerUpdate;
|
|
|
|
class PolyLineMarkerImpl implements PolyLineMarker {
|
|
private String markerid;
|
|
private String label;
|
|
private boolean markup;
|
|
private String desc;
|
|
private MarkerSetImpl markerset;
|
|
private String world;
|
|
private String normalized_world;
|
|
private boolean ispersistent;
|
|
private ArrayList<Coord> corners;
|
|
private int lineweight = 3;
|
|
private double lineopacity = 0.8;
|
|
private int linecolor = 0xFF0000;
|
|
private int minzoom;
|
|
private int maxzoom;
|
|
|
|
private static class Coord {
|
|
double x, y, z;
|
|
Coord(double x, double y, double z) {
|
|
this.x = x; this.y = y; this.z = z;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create poly-line marker
|
|
* @param id - marker ID
|
|
* @param lbl - label
|
|
* @param markup - if true, label is HTML markup
|
|
* @param world - world id
|
|
* @param x - x coord list
|
|
* @param y - y coord list
|
|
* @param z - z coord list
|
|
* @param persistent - true if persistent
|
|
* @param set - marker set
|
|
*/
|
|
PolyLineMarkerImpl(String id, String lbl, boolean markup, String world, double x[], double[] y, double z[], boolean persistent, MarkerSetImpl set) {
|
|
markerid = id;
|
|
if(lbl != null)
|
|
label = markup ? lbl : Client.encodeForHTML(lbl);
|
|
else
|
|
label = markup ? id : Client.encodeForHTML(id);
|
|
label = Client.sanitizeHTML(label);
|
|
this.markup = markup;
|
|
this.corners = new ArrayList<Coord>();
|
|
for(int i = 0; i < x.length; i++) {
|
|
this.corners.add(new Coord(x[i], y[i], z[i]));
|
|
}
|
|
this.world = world;
|
|
this.normalized_world = DynmapWorld.normalizeWorldName(world);
|
|
this.desc = null;
|
|
this.minzoom = -1;
|
|
this.maxzoom = -1;
|
|
ispersistent = persistent;
|
|
markerset = set;
|
|
}
|
|
/**
|
|
* Make bare poly-line marker - used for persistence load
|
|
* @param id - marker ID
|
|
* @param set - marker set
|
|
*/
|
|
PolyLineMarkerImpl(String id, MarkerSetImpl set) {
|
|
markerid = id;
|
|
markerset = set;
|
|
label = Client.sanitizeHTML(Client.encodeForHTML(id));
|
|
markup = false;
|
|
desc = null;
|
|
corners = new ArrayList<Coord>();
|
|
this.minzoom = -1;
|
|
this.maxzoom = -1;
|
|
world = normalized_world = "world";
|
|
}
|
|
/**
|
|
* Load marker from configuration node
|
|
* @param node - configuration node
|
|
*/
|
|
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
|
|
markup = node.getBoolean("markup", false);
|
|
label = MarkerAPIImpl.escapeForHTMLIfNeeded(node.getString("label", markerid), markup);
|
|
if (!isSafe) label = Client.sanitizeHTML(label);
|
|
List<Double> xx = node.getList("x");
|
|
List<Double> yy = node.getList("y");
|
|
List<Double> zz = node.getList("z");
|
|
corners.clear();
|
|
if((xx != null) && (yy != null) && (zz != null)) {
|
|
int sz = Math.min(xx.size(), Math.min(yy.size(), zz.size()));
|
|
for(int i = 0; i < sz; i++)
|
|
corners.add(new Coord(xx.get(i), yy.get(i), zz.get(i)));
|
|
}
|
|
world = node.getString("world", "world");
|
|
normalized_world = DynmapWorld.normalizeWorldName(world);
|
|
desc = node.getString("desc", null);
|
|
if (!isSafe) desc = Client.sanitizeHTML(desc);
|
|
lineweight = node.getInteger("strokeWeight", -1);
|
|
if(lineweight == -1) { /* Handle typo-saved value */
|
|
lineweight = node.getInteger("stokeWeight", 3);
|
|
}
|
|
lineopacity = node.getDouble("strokeOpacity", 0.8);
|
|
linecolor = node.getInteger("strokeColor", 0xFF0000);
|
|
this.minzoom = node.getInteger("minzoom", -1);
|
|
this.maxzoom = node.getInteger("maxzoom", -1);
|
|
ispersistent = true; /* Loaded from config, so must be */
|
|
|
|
return true;
|
|
}
|
|
|
|
void cleanup() {
|
|
corners.clear();
|
|
markerset = null;
|
|
}
|
|
|
|
@Override
|
|
public String getUniqueMarkerID() {
|
|
if (markerset != null) {
|
|
return markerset + ":poly:" + markerid;
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getMarkerID() {
|
|
return markerid;
|
|
}
|
|
|
|
@Override
|
|
public MarkerSet getMarkerSet() {
|
|
return markerset;
|
|
}
|
|
|
|
@Override
|
|
public void deleteMarker() {
|
|
if(markerset == null) return;
|
|
markerset.removePolyLineMarker(this); /* Remove from our marker set (notified by set) */
|
|
cleanup();
|
|
}
|
|
|
|
@Override
|
|
public boolean isPersistentMarker() {
|
|
return ispersistent;
|
|
}
|
|
|
|
@Override
|
|
public String getLabel() {
|
|
return label;
|
|
}
|
|
|
|
@Override
|
|
public void setLabel(String lbl) {
|
|
setLabel(lbl, false);
|
|
}
|
|
|
|
@Override
|
|
public void setLabel(String lbl, boolean markup) {
|
|
if(markerset == null) return;
|
|
label = markup ? Client.sanitizeHTML(lbl) : Client.encodeForHTML(lbl);
|
|
this.markup = markup;
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
|
|
/**
|
|
* Get configuration node to be saved
|
|
* @return node
|
|
*/
|
|
Map<String, Object> getPersistentData() {
|
|
if(!ispersistent) /* Nothing if not persistent */
|
|
return null;
|
|
HashMap<String, Object> node = new HashMap<String, Object>();
|
|
node.put("label", label);
|
|
node.put("markup", markup);
|
|
List<Double> xx = new ArrayList<Double>();
|
|
List<Double> yy = new ArrayList<Double>();
|
|
List<Double> zz = new ArrayList<Double>();
|
|
for(int i = 0; i < corners.size(); i++) {
|
|
Coord c = corners.get(i);
|
|
xx.add(c.x);
|
|
yy.add(c.y);
|
|
zz.add(c.z);
|
|
}
|
|
node.put("x", xx);
|
|
node.put("y", yy);
|
|
node.put("z", zz);
|
|
node.put("world", world);
|
|
if(desc != null)
|
|
node.put("desc", desc);
|
|
node.put("strokeWeight", lineweight);
|
|
node.put("strokeOpacity", lineopacity);
|
|
node.put("strokeColor", linecolor);
|
|
if (minzoom >= 0) {
|
|
node.put("minzoom", minzoom);
|
|
}
|
|
if (maxzoom >= 0) {
|
|
node.put("maxzoom", maxzoom);
|
|
}
|
|
|
|
return node;
|
|
}
|
|
@Override
|
|
public String getWorld() {
|
|
return world;
|
|
}
|
|
@Override
|
|
public String getNormalizedWorld() {
|
|
return normalized_world;
|
|
}
|
|
@Override
|
|
public boolean isLabelMarkup() {
|
|
return markup;
|
|
}
|
|
@Override
|
|
public void setDescription(String desc) {
|
|
if(markerset == null) return;
|
|
desc = Client.sanitizeHTML(desc);
|
|
if((this.desc == null) || (this.desc.equals(desc) == false)) {
|
|
this.desc = desc;
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
}
|
|
/**
|
|
* Get marker description
|
|
* @return descrption
|
|
*/
|
|
public String getDescription() {
|
|
return this.desc;
|
|
}
|
|
@Override
|
|
public int getCornerCount() {
|
|
return corners.size();
|
|
}
|
|
@Override
|
|
public double getCornerX(int n) {
|
|
Coord c = corners.get(n);
|
|
if(c != null)
|
|
return c.x;
|
|
return 0;
|
|
}
|
|
@Override
|
|
public double getCornerY(int n) {
|
|
Coord c = corners.get(n);
|
|
if(c != null)
|
|
return c.y;
|
|
return 0;
|
|
}
|
|
@Override
|
|
public double getCornerZ(int n) {
|
|
Coord c = corners.get(n);
|
|
if(c != null)
|
|
return c.z;
|
|
return 0;
|
|
}
|
|
@Override
|
|
public void setCornerLocation(int n, double x, double y, double z) {
|
|
if(markerset == null) return;
|
|
Coord c;
|
|
if(n >= corners.size()) {
|
|
corners.add(new Coord(x, y, z));
|
|
}
|
|
else {
|
|
c = corners.get(n);
|
|
if((c.x == x) && (c.y == y) && (c.z == z))
|
|
return;
|
|
c.x = x;
|
|
c.y = y;
|
|
c.z = z;
|
|
}
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
@Override
|
|
public void deleteCorner(int n) {
|
|
if(markerset == null) return;
|
|
if(n < corners.size()) {
|
|
corners.remove(n);
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
}
|
|
@Override
|
|
public void setCornerLocations(double[] x, double[] y, double[] z) {
|
|
if(markerset == null) return;
|
|
/* Check if equals */
|
|
int sz = Math.min(x.length, Math.min(y.length, z.length));
|
|
if(sz == corners.size()) {
|
|
boolean match = true;
|
|
for(int i = 0; i < sz; i++) {
|
|
Coord c = corners.get(i);
|
|
if((c.x != x[i]) || (c.y != y[i]) || (c.z != z[i])) {
|
|
match = false;
|
|
break;
|
|
}
|
|
}
|
|
if(match)
|
|
return;
|
|
}
|
|
corners.clear();
|
|
for(int i = 0; i < sz; i++) {
|
|
corners.add(new Coord(x[i], y[i], z[i]));
|
|
}
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
@Override
|
|
public void setLineStyle(int weight, double opacity, int color) {
|
|
if(markerset == null) return;
|
|
if((weight != lineweight) || (opacity != lineopacity) || (color != linecolor)) {
|
|
lineweight = weight;
|
|
lineopacity = opacity;
|
|
linecolor = color;
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
}
|
|
@Override
|
|
public int getLineWeight() {
|
|
return lineweight;
|
|
}
|
|
@Override
|
|
public double getLineOpacity() {
|
|
return lineopacity;
|
|
}
|
|
@Override
|
|
public int getLineColor() {
|
|
return linecolor;
|
|
}
|
|
@Override
|
|
public void setMarkerSet(MarkerSet newset) {
|
|
if(markerset != null) {
|
|
markerset.removePolyLineMarker(this); /* Remove from our marker set (notified by set) */
|
|
}
|
|
markerset = (MarkerSetImpl)newset;
|
|
markerset.insertPolyLineMarker(this);
|
|
}
|
|
@Override
|
|
public int getMinZoom() {
|
|
return minzoom;
|
|
}
|
|
@Override
|
|
public void setMinZoom(int zoom) {
|
|
if (zoom < 0) zoom = -1;
|
|
if (this.minzoom == zoom) return;
|
|
this.minzoom = zoom;
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
@Override
|
|
public int getMaxZoom() {
|
|
return maxzoom;
|
|
}
|
|
@Override
|
|
public void setMaxZoom(int zoom) {
|
|
if (zoom < 0) zoom = -1;
|
|
if (this.maxzoom == zoom) return;
|
|
this.maxzoom = zoom;
|
|
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
|
|
if(ispersistent)
|
|
MarkerAPIImpl.saveMarkers();
|
|
}
|
|
}
|