From 7cdc2fbdb4cbb1b55274278e51222bbb874dcf13 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 11 Jan 2013 22:25:38 +1300 Subject: Polish map panel and fix few bugs --- .../web/client/view/MapPositionRenderer.java | 80 +++++++++++++--------- .../traccar/web/client/view/MarkerIconFactory.java | 10 ++- 2 files changed, 55 insertions(+), 35 deletions(-) (limited to 'src/org/traccar/web/client/view') diff --git a/src/org/traccar/web/client/view/MapPositionRenderer.java b/src/org/traccar/web/client/view/MapPositionRenderer.java index bbe932a..f1bf57c 100644 --- a/src/org/traccar/web/client/view/MapPositionRenderer.java +++ b/src/org/traccar/web/client/view/MapPositionRenderer.java @@ -33,40 +33,38 @@ import org.traccar.web.shared.model.Position; public class MapPositionRenderer { private final MapView mapView; - private final Vector vectorLayer; - private final Markers markerLayer; private final MarkerIconFactory.IconType iconType; + protected Vector getVectorLayer() { + return mapView.getVectorLayer(); + } + + protected Markers getMarkerLayer() { + return mapView.getMarkerLayer(); + } + public MapPositionRenderer(MapView mapView, MarkerIconFactory.IconType iconType) { this.mapView = mapView; - vectorLayer = mapView.getVectorLayer(); - markerLayer = mapView.getMarkerLayer(); this.iconType = iconType; } - /* - * TODO: a lot of mess here - * 1. changeMarkerIcon doesn't save new marker - * 2. if device selected save device instead of position - * 3. find way to change marker icon - * 4. shorter cleaner methods - * ... maybe something else - */ - - private void changeMarkerIcon(Marker marker, Icon icon) { - Marker newMarker = new Marker(marker.getLonLat(), icon); - markerLayer.removeMarker(marker); - markerLayer.addMarker(newMarker); + private void changeMarkerIcon(Long positionId, Icon icon) { + Marker oldMarker = markerMap.get(positionId); + Marker newMarker = new Marker(oldMarker.getLonLat(), icon); + markerMap.put(positionId, newMarker); + getMarkerLayer().addMarker(newMarker); + getMarkerLayer().removeMarker(oldMarker); } private Map markerMap = new HashMap(); // Position.id -> Marker private Map deviceMap = new HashMap(); // Device.id -> Position.id private Long selectedPositionId; + private Long selectedDeviceId; public void showPositions(List positions) { for (Marker marker : markerMap.values()) { - markerLayer.removeMarker(marker); + getMarkerLayer().removeMarker(marker); } markerMap.clear(); deviceMap.clear(); @@ -77,16 +75,24 @@ public class MapPositionRenderer { MarkerIconFactory.getIcon(iconType, false)); markerMap.put(position.getId(), marker); deviceMap.put(position.getDevice().getId(), position.getId()); - markerLayer.addMarker(marker); + getMarkerLayer().addMarker(marker); } if (selectedPositionId != null) { - selectPosition(null, selectedPositionId, false); + if (!selectPosition(null, selectedPositionId, false)) { + selectedPositionId = null; + } + } + + if (selectedDeviceId != null) { + if (!selectPosition(null, deviceMap.get(selectedDeviceId), false)) { + selectedDeviceId = null; + } } } public void showTrack(List positions) { - vectorLayer.destroyFeatures(); + getVectorLayer().destroyFeatures(); if (!positions.isEmpty()) { Point[] linePoints = new Point[positions.size()]; @@ -97,33 +103,43 @@ public class MapPositionRenderer { } LineString lineString = new LineString(linePoints); - vectorLayer.addFeature(new VectorFeature(lineString)); + getVectorLayer().addFeature(new VectorFeature(lineString)); //mapView.getMap().zoomToExtent(lineString.getBounds()); } } public void selectPosition(Position position, boolean center) { - selectPosition(selectedPositionId, position.getId(), center); + Long oldPositionId = selectedPositionId; + Long newPositionId = (position != null) ? position.getId() : null; + if (selectPosition(oldPositionId, newPositionId, center)) { + selectedPositionId = position.getId(); + } else { + selectedPositionId = null; + } } public void selectDevice(Device device, boolean center) { - Long positionId = (device != null) ? deviceMap.get(device.getId()) : null; - selectPosition(selectedPositionId, positionId, center); + Long oldPositionId = (selectedDeviceId != null) ? deviceMap.get(selectedDeviceId) : null; + Long newPositionId = (device != null) ? deviceMap.get(device.getId()) : null; + if (selectPosition(oldPositionId, newPositionId, center)) { + selectedDeviceId = device.getId(); + } else { + selectedDeviceId = null; + } } - private void selectPosition(Long oldPositionId, Long newPositionId, boolean center) { + private boolean selectPosition(Long oldPositionId, Long newPositionId, boolean center) { if (oldPositionId != null && markerMap.containsKey(oldPositionId)) { - changeMarkerIcon(markerMap.get(oldPositionId), MarkerIconFactory.getIcon(iconType, false)); - selectedPositionId = null; + changeMarkerIcon(oldPositionId, MarkerIconFactory.getIcon(iconType, false)); } if (newPositionId != null && markerMap.containsKey(newPositionId)) { - Marker marker = markerMap.get(newPositionId); - changeMarkerIcon(marker, MarkerIconFactory.getIcon(iconType, true)); + changeMarkerIcon(newPositionId, MarkerIconFactory.getIcon(iconType, true)); if (center) { - mapView.getMap().panTo(marker.getLonLat()); + mapView.getMap().panTo(markerMap.get(newPositionId).getLonLat()); } - selectedPositionId = newPositionId; + return true; } + return false; } } diff --git a/src/org/traccar/web/client/view/MarkerIconFactory.java b/src/org/traccar/web/client/view/MarkerIconFactory.java index 35ae886..bc850bd 100644 --- a/src/org/traccar/web/client/view/MarkerIconFactory.java +++ b/src/org/traccar/web/client/view/MarkerIconFactory.java @@ -35,13 +35,17 @@ class MarkerIconFactory { iconArchive }; - public static Icon getIcon(IconType type, boolean selected) { + public static String getIconUrl(IconType type, boolean selected) { if (type == IconType.iconLatest) { - return new Icon(selected ? iconGreen : iconRed, iconSize, iconOffset); + return selected ? iconGreen : iconRed; } else if (type == IconType.iconArchive) { - return new Icon(selected ? iconGold : iconBlue, iconSize, iconOffset); + return selected ? iconGold : iconBlue; } return null; } + public static Icon getIcon(IconType type, boolean selected) { + return new Icon(getIconUrl(type, selected), iconSize, iconOffset); + } + } -- cgit v1.2.3