/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.plugin.editing.gwt.client.handler;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.Window;
import org.geomajas.geometry.Coordinate;
import org.geomajas.geometry.Geometry;
import org.geomajas.geometry.service.GeometryService;
import org.geomajas.gwt.client.util.DistanceFormat;
import org.geomajas.gwt.client.util.HtmlBuilder;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.plugin.editing.client.event.GeometryEditStartEvent;
import org.geomajas.plugin.editing.client.event.GeometryEditStartHandler;
import org.geomajas.plugin.editing.client.event.GeometryEditStopEvent;
import org.geomajas.plugin.editing.client.event.GeometryEditStopHandler;
import org.geomajas.plugin.editing.client.service.GeometryEditService;
import org.geomajas.plugin.editing.gwt.client.gfx.InfoProvider;
import java.util.ArrayList;
import java.util.List;
/**
* Editing handler that shows a draggable/closeable window with geometry information.
*
* @author Jan De Moerloose
*
*/
public class InfoDragLineHandlerShowingWindow extends BaseDragLineHandler implements GeometryEditStartHandler,
GeometryEditStopHandler {
private HTMLFlow label;
private Window window;
private MapWidget map;
private InfoProvider infoProvider = new DefaultInfoProvider();
private String lengthA;
private String lengthB;
private static final String STYLE_NAME = "width:150px;border-width: 1px;" + "padding: 2px;" + "border-style:solid;"
+ "text-align:left;" + "font-family: Arial,Verdana,sans-serif;" + "font-size: 11px;" + "border-color:gray;"
+ "background-color:#FFFFFF";
private static final String STYLE_VALUE = "width:150px;" + "border-width: 1px;" + "padding: 2px;"
+ "border-style:solid;" + "font-family: Arial,Verdana,sans-serif;" + "font-size: 11px;"
+ "text-align:left;" + "border-color:gray;" + "background-color:#FFFFFF";
private static final String STYLE_TABLE = "width:300px;border-width: 0;" + "border-collapse:collapse;"
+ "background-color:#FFFFFF";
/**
* Construct a handler.
*
* @param map the map
* @param editService the editing service
*/
public InfoDragLineHandlerShowingWindow(MapWidget map, GeometryEditService editService) {
super(editService);
this.map = map;
}
public void register() {
if (window == null) {
createWindow();
}
super.register();
registrations.add(editService.addGeometryEditStartHandler(this));
registrations.add(editService.addGeometryEditStopHandler(this));
// show initial state
onDrag(null, null, null);
window.show();
}
public void unregister() {
if (window == null) {
createWindow();
}
window.hide();
super.unregister();
}
public void setVisible(boolean visible) {
window.setVisible(visible);
}
public boolean isVisible() {
return window.isVisible();
}
public void setInfoProvider(InfoProvider infoProvider) {
this.infoProvider = infoProvider;
if (window != null) {
window.setTitle(infoProvider.getTitle());
}
}
public void setShowClose(boolean showClose) {
window.setShowCloseButton(showClose);
}
@Override
protected void onDrag(Coordinate dragPoint, Coordinate startA, Coordinate startB) {
label.setContents(infoProvider.getHtml(editService.getGeometry(), dragPoint, startA, startB));
}
@Override
protected void onDragStopped() {
label.setContents(infoProvider.getHtml(editService.getGeometry(), null, null, null));
}
@Override
public void onGeometryEditStop(GeometryEditStopEvent event) {
window.hide();
}
@Override
public void onGeometryEditStart(GeometryEditStartEvent event) {
// show initial state
onDrag(null, null, null);
window.show();
}
protected double length(Coordinate[] edge) {
return Math.hypot(edge[1].getX() - edge[0].getX(), edge[1].getY() - edge[0].getY());
}
private void createWindow() {
window = new Window();
window.hide();
label = new HTMLFlow(infoProvider.getHtml(editService.getGeometry(), null, null, null));
label.setAlign(Alignment.LEFT);
window.setTitle(infoProvider.getTitle());
window.setAutoSize(true);
window.setCanDragReposition(true);
window.setCanDragResize(true);
window.addItem(label);
window.setTop(25);
window.setLeft(25);
map.addChild(window);
}
/**
* Default implementation of {@link org.geomajas.plugin.editing.gwt.client.gfx.InfoProvider}.
*
* @author Jan De Moerloose
*
*/
class DefaultInfoProvider implements InfoProvider {
@Override
public String getHtml(Geometry geometry, Coordinate dragPoint, Coordinate startA, Coordinate startB) {
List<String> rows = new ArrayList<String>();
boolean empty = (geometry == null);
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "Type"),
HtmlBuilder.tdStyle(STYLE_VALUE, (empty ? "" : geometry.getGeometryType()))));
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "Number of points"),
HtmlBuilder.tdStyle(STYLE_VALUE, "" + (empty ? "" : GeometryService.getNumPoints(geometry)))));
String area = (empty ? "" : DistanceFormat.asMapArea(map, GeometryService.getArea(geometry)));
area = area.replaceAll("²", "²");
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "Area"),
HtmlBuilder.tdStyle(STYLE_VALUE, area)));
String length = (empty ? "" : DistanceFormat.asMapLength(map, GeometryService.getLength(geometry)));
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "Length"),
HtmlBuilder.tdStyle(STYLE_VALUE, length)));
lengthA = "";
lengthB = "";
if (startA != null) {
double llen = length(new Coordinate[] { dragPoint, startA });
lengthA = DistanceFormat.asMapLength(map, llen);
}
if (startB != null) {
double rlen = length(new Coordinate[] { dragPoint, startB });
lengthB = DistanceFormat.asMapLength(map, rlen);
}
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "A"),
HtmlBuilder.tdStyle(STYLE_VALUE, lengthA)));
rows.add(HtmlBuilder.trHtmlContent(HtmlBuilder.tdStyle(STYLE_NAME, "B"),
HtmlBuilder.tdStyle(STYLE_VALUE, lengthB)));
String htmlContent = HtmlBuilder.tableStyleHtmlContent(STYLE_TABLE, rows.toArray(new String[rows.size()]));
return htmlContent;
}
@Override
public String getTitle() {
return "Geometry information";
}
}
}