package org.visico.neighborhoodpss.gwt.client;
import java.util.ArrayList;
import org.visico.neighborhoodpss.gwt.shared.patterns.ScenarioEditMediator;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.control.LargeMapControl;
import com.google.gwt.maps.client.event.MapClickHandler;
import com.google.gwt.maps.client.event.MapRightClickHandler;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.Point;
import com.google.gwt.maps.client.geom.Size;
import com.google.gwt.maps.client.overlay.Icon;
import com.google.gwt.maps.client.overlay.Marker;
import com.google.gwt.maps.client.overlay.MarkerOptions;
import com.google.gwt.maps.client.overlay.Overlay;
import com.google.gwt.user.client.ui.Composite;
public class Map extends Composite implements MapClickHandler
{
public enum editmodes
{
NO_NETWORK,
SELECTION,
ADD_BUILDING,
ADD_NODE,
ADD_EDGE
};
private editmodes mode;
private MapWidget theMap;
ScenarioEditMediator med;
private static MarkerOptions options = MarkerOptions.newInstance();
private static NodeMarker firstPickedNode = null;
private static Icon nodeIcon = null;
private ArrayList<NodeMarker> buildingnodes = new ArrayList<NodeMarker>();
NodeMarker firstBuildingNode = null;
public Map(ScenarioEditMediator med)
{
nodeIcon = Icon.newInstance("res/node.png");
nodeIcon.setIconSize(Size.newInstance(8, 8));
nodeIcon.setIconAnchor(Point.newInstance(4, 4));
options.setIcon(nodeIcon);
this.med = med;
med.registerMap(this);
LatLng position = LatLng.newInstance(med.getLatitude(), med.getLongitude());
theMap = new MapWidget(position, 2);
theMap.setSize("100%", "100%");
theMap.setZoomLevel(14);
theMap.setDoubleClickZoom(false);
// Add some controls for the zoom level
theMap.addControl(new LargeMapControl());
theMap.addMapClickHandler(this);
mode = editmodes.SELECTION;
this.initWidget(theMap);
}
public MapWidget getMap()
{
return theMap;
}
public editmodes getMode() {
return mode;
}
public void setMode(editmodes mode) {
this.mode = mode;
// delete all temporary objects
firstBuildingNode = null;
for (int i=0; i<buildingnodes.size(); i++)
{
theMap.removeOverlay(buildingnodes.get(i));
}
buildingnodes.clear();
firstPickedNode = null;
}
@Override
public void onClick(MapClickEvent event)
{
MapWidget sender = event.getSender();
Overlay overlay = event.getOverlay();
LatLng point = event.getLatLng();
if (mode == editmodes.SELECTION)
{
if (overlay != null)
med.addMapSelection(overlay);
}
if (mode != editmodes.NO_NETWORK)
{
if (mode == editmodes.ADD_NODE)
{
NodeMarker node = new NodeMarker(point, options);
sender.addOverlay(node);
med.addNewNode(node);
}
else if (mode == editmodes.ADD_EDGE)
{
if (overlay instanceof NodeMarker)
{
if (firstPickedNode == null)
firstPickedNode = (NodeMarker)overlay;
else
{
LatLng points[] = new LatLng[2];
points[0] = firstPickedNode.getLatLng(); points[1] = ((NodeMarker)overlay).getLatLng();
NetworkEdge edge = new NetworkEdge(firstPickedNode, (NodeMarker)overlay, points, med.getActiveNetworkColor());
sender.addOverlay(edge);
firstPickedNode = null;
med.addNewEdge(edge);
}
}
}
}
if (mode == editmodes.ADD_BUILDING)
{
if (overlay == null)
{
NodeMarker node = new NodeMarker(point, options);
sender.addOverlay(node);
buildingnodes.add(node);
if (firstBuildingNode == null)
firstBuildingNode = node;
}
else if (overlay == firstBuildingNode)
{
LatLng[] polyLatLng = new LatLng[buildingnodes.size()];
for (int i = 0; i<buildingnodes.size(); i++)
{
NodeMarker node = buildingnodes.get(i);
polyLatLng[i] = node.getLatLng();
sender.removeOverlay(node);
}
BuildingPolygon b = new BuildingPolygon(polyLatLng);
sender.addOverlay(b);
med.addNewBuilding(b);
firstBuildingNode = null;
buildingnodes.clear();
}
}
}
public static MarkerOptions getOptions() {
return options;
}
public static void setOptions(MarkerOptions options) {
Map.options = options;
}
// variable used to mark whether a polygonal object in the drawings is closed
boolean isClosed = false;
}