teichmann@5835: package org.dive4elements.river.client.client.ui.map; ingo@1315: ingo@1315: import com.google.gwt.core.client.GWT; ingo@1315: import com.google.gwt.i18n.client.NumberFormat; ingo@1315: ingo@1315: import com.smartgwt.client.types.Alignment; ingo@1315: import com.smartgwt.client.types.SelectionStyle; ingo@1315: import com.smartgwt.client.types.SortArrow; ingo@1315: import com.smartgwt.client.types.SortDirection; ingo@1315: import com.smartgwt.client.util.SC; ingo@1315: import com.smartgwt.client.widgets.Label; ingo@1315: import com.smartgwt.client.widgets.IButton; ingo@1315: import com.smartgwt.client.widgets.Window; ingo@1315: import com.smartgwt.client.widgets.events.ClickEvent; ingo@1315: import com.smartgwt.client.widgets.events.ClickHandler; raimund@1619: import com.smartgwt.client.widgets.events.CloseClickEvent; ingo@1315: import com.smartgwt.client.widgets.events.CloseClickHandler; ingo@1315: import com.smartgwt.client.widgets.layout.HLayout; ingo@1315: import com.smartgwt.client.widgets.layout.VLayout; ingo@1315: import com.smartgwt.client.widgets.grid.ListGrid; ingo@1315: import com.smartgwt.client.widgets.grid.ListGridField; ingo@1315: import com.smartgwt.client.widgets.grid.ListGridRecord; ingo@1315: import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; ingo@1315: import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; ingo@1315: import com.smartgwt.client.widgets.grid.events.RowOutEvent; ingo@1315: import com.smartgwt.client.widgets.grid.events.RowOutHandler; ingo@1315: import com.smartgwt.client.widgets.grid.events.RowOverEvent; ingo@1315: import com.smartgwt.client.widgets.grid.events.RowOverHandler; ingo@1315: ingo@1315: import org.gwtopenmaps.openlayers.client.Style; ingo@1315: import org.gwtopenmaps.openlayers.client.feature.VectorFeature; ingo@1315: import org.gwtopenmaps.openlayers.client.geometry.Geometry; ingo@1315: import org.gwtopenmaps.openlayers.client.geometry.LinearRing; ingo@1315: import org.gwtopenmaps.openlayers.client.geometry.LineString; ingo@1315: import org.gwtopenmaps.openlayers.client.geometry.Point; ingo@1315: import org.gwtopenmaps.openlayers.client.geometry.Polygon; ingo@1315: import org.gwtopenmaps.openlayers.client.layer.Vector; ingo@1315: import org.gwtopenmaps.openlayers.client.layer.VectorOptions; ingo@1315: import org.gwtopenmaps.openlayers.client.util.Attributes; ingo@1315: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; ingo@1315: ingo@1315: ingo@1315: ingo@1315: public class ElevationWindow extends Window { ingo@1315: ingo@1315: public static FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@1315: ingo@1315: public static final int WINDOW_WIDTH = 250; ingo@1315: public static final int WINDOW_HEIGHT = 250; ingo@1315: ingo@1315: protected FloodMap floodmap; ingo@1315: protected Vector layer; ingo@1315: protected VectorFeature feature; ingo@1315: ingo@1315: protected ListGrid grid; ingo@1315: ingo@1315: ingo@1315: private class PointRecord extends ListGridRecord { ingo@1315: protected VectorFeature point; ingo@1315: ingo@1315: public PointRecord(VectorFeature point, double x, double y, String z) { ingo@1315: super(); ingo@1315: ingo@1315: this.point = point; ingo@1315: setAttribute("x", x); ingo@1315: setAttribute("y", y); ingo@1315: setAttribute("z", z); ingo@1315: } ingo@1315: ingo@1315: public VectorFeature getPoint() { ingo@1315: return point; ingo@1315: } ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public ElevationWindow(FloodMap floodmap, VectorFeature feature) { ingo@1315: super(); ingo@1315: this.feature = feature; ingo@1315: this.floodmap = floodmap; ingo@1315: ingo@1315: init(); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected void init() { ingo@1315: addCloseClickHandler(new CloseClickHandler() { raimund@1619: public void onCloseClick(CloseClickEvent evt) { ingo@1315: doClose(); ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: initLayout(); ingo@1315: initEdit(); ingo@1315: updateGrid(); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected void initLayout() { ingo@1315: setWidth(WINDOW_WIDTH); ingo@1315: setHeight(WINDOW_HEIGHT); ingo@1315: setTitle(MSG.ele_window_title()); ingo@1315: ingo@1315: VLayout root = new VLayout(); ingo@1315: root.setMembersMargin(5); ingo@1315: root.setPadding(5); ingo@1315: ingo@1315: root.addMember(getLabel()); ingo@1315: root.addMember(getGrid()); ingo@1315: root.addMember(getButtonBar()); ingo@1315: ingo@1315: addItem(root); ingo@1315: centerInPage(); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected void initEdit() { ingo@1315: VectorOptions opts = new VectorOptions(); ingo@1315: opts.setProjection(floodmap.getRiverProjection()); ingo@1315: opts.setMaxExtent(floodmap.getMaxExtent()); ingo@1315: ingo@1315: layer = new Vector("tmp", opts); ingo@1315: layer.setIsBaseLayer(false); ingo@1315: ingo@1315: floodmap.getMap().addLayer(layer); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public Style getStyle() { ingo@1315: Style style = new Style(); ingo@1315: style.setStrokeColor("#000000"); ingo@1315: style.setStrokeWidth(1); ingo@1315: style.setFillColor("#FF0000"); ingo@1315: style.setFillOpacity(0.5); ingo@1315: style.setPointRadius(5); ingo@1315: style.setStrokeOpacity(1.0); ingo@1315: return style; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public Style getHighStyle() { ingo@1315: Style style = new Style(); ingo@1315: style.setStrokeColor("#000000"); ingo@1315: style.setStrokeWidth(1); ingo@1315: style.setFillColor("#FFFF22"); ingo@1315: style.setFillOpacity(0.5); ingo@1315: style.setPointRadius(5); ingo@1315: style.setStrokeOpacity(1.0); ingo@1315: return style; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected Label getLabel() { ingo@1315: Label label = new Label(MSG.ele_window_label()); ingo@1315: label.setHeight(25); ingo@1315: ingo@1315: return label; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected ListGrid getGrid() { ingo@1315: if (grid == null) { ingo@1315: grid = new ListGrid(); ingo@1315: grid.setCanEdit(true); ingo@1315: grid.setCanReorderFields(false); ingo@1315: grid.setAutoFitMaxWidth(WINDOW_WIDTH); ingo@1315: grid.setShowHeaderContextMenu(false); ingo@1315: grid.setShowSortArrow(SortArrow.NONE); ingo@1315: grid.setSortDirection(SortDirection.DESCENDING); ingo@1315: grid.setSelectionType(SelectionStyle.NONE); ingo@1315: ingo@1315: ListGridField x = new ListGridField("x", MSG.ele_window_x_col()); ingo@1315: x.setCanEdit(false); ingo@1315: ingo@1315: ListGridField y = new ListGridField("y", MSG.ele_window_y_col()); ingo@1315: y.setCanEdit(false); ingo@1315: ingo@1315: ListGridField z = new ListGridField("z", MSG.ele_window_z_col()); ingo@1315: z.setCanEdit(true); ingo@1315: ingo@1315: grid.setFields(x, y, z); ingo@1315: ingo@1315: grid.addRowOverHandler(new RowOverHandler() { ingo@1315: public void onRowOver(RowOverEvent evt) { ingo@1315: PointRecord pr = (PointRecord) evt.getRecord(); ingo@1315: VectorFeature p = pr.getPoint(); ingo@1315: ingo@1315: p.setStyle(getHighStyle()); ingo@1315: layer.redraw(); ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: grid.addRowOutHandler(new RowOutHandler() { ingo@1315: public void onRowOut(RowOutEvent evt) { ingo@1315: PointRecord pr = (PointRecord) evt.getRecord(); ingo@1315: VectorFeature p = pr.getPoint(); ingo@1315: ingo@1315: p.setStyle(getStyle()); ingo@1315: layer.redraw(); ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: grid.addEditCompleteHandler(new EditCompleteHandler() { ingo@1315: public void onEditComplete(EditCompleteEvent evt) { ingo@1315: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@1315: String z = (String) evt.getNewValues().get("z"); ingo@1315: ingo@1315: try { ingo@1315: nf.parse(z); ingo@1315: } ingo@1315: catch (NumberFormatException nfe) { ingo@1315: SC.warn(MSG.ele_window_format_error() + " " + z); ingo@1315: ingo@1315: PointRecord old = (PointRecord) evt.getOldRecord(); ingo@1315: ingo@1315: ListGridRecord[] records = grid.getRecords(); ingo@1315: records[evt.getRowNum()] = old; ingo@1315: ingo@1315: grid.setRecords(records); ingo@1315: } ingo@1315: ingo@1315: } ingo@1315: }); ingo@1315: } ingo@1315: ingo@1315: return grid; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected HLayout getButtonBar() { ingo@1315: HLayout bar = new HLayout(); ingo@1315: bar.setAlign(Alignment.CENTER); ingo@1315: bar.setHeight(25); ingo@1315: bar.setMembersMargin(15); ingo@1315: ingo@1315: bar.addMember(getOKButton()); ingo@1315: bar.addMember(getCancelButton()); ingo@1315: ingo@1315: return bar; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected IButton getOKButton() { ingo@1315: IButton btn = new IButton(MSG.ele_window_ok_button()); ingo@1315: ingo@1315: btn.addClickHandler(new ClickHandler() { ingo@1315: public void onClick(ClickEvent evt) { ingo@1315: if (saveElevation()) { ingo@1315: doClose(); ingo@1315: } ingo@1315: ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: return btn; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected IButton getCancelButton() { ingo@1315: IButton btn = new IButton(MSG.ele_window_cancel_button()); ingo@1315: ingo@1315: btn.addClickHandler(new ClickHandler() { ingo@1315: public void onClick(ClickEvent evt) { ingo@1315: doClose(); ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: return btn; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public void updateGrid() { ingo@1315: Attributes attr = feature.getAttributes(); ingo@1315: Geometry geom = feature.getGeometry(); ingo@1315: ingo@1315: String barrierType = null; ingo@1315: ingo@1315: if (attr != null) { ingo@1315: barrierType = attr.getAttributeAsString("typ"); ingo@1315: } ingo@1315: else { ingo@1315: barrierType = DrawControl.BARRIER_DAM_VALUE; ingo@1315: } ingo@1315: ingo@1315: GWT.log("Geometry is from type: " + geom.getClassName()); ingo@1315: GWT.log("Barrier is from type: " + barrierType); ingo@1315: ingo@1315: double[][] points = getPointsFromGeometry(geom); ingo@1315: double[] ele = extractElevations(attr); ingo@1315: ingo@1315: if (points == null) { ingo@1315: return; ingo@1315: } ingo@1315: ingo@1315: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@1315: ingo@1315: ListGrid grid = getGrid(); ingo@1315: ingo@1315: int zLen = ele != null ? ele.length : 0; ingo@1315: ingo@1315: for (int i = 0, len = points.length; i < len; i++) { ingo@1315: double[] point = points[i]; ingo@1315: VectorFeature p = addPoint(point[0], point[1]); ingo@1315: ingo@1315: String value = null; ingo@1315: ingo@1315: if (zLen > i) { ingo@1315: value = nf.format(ele[i]); ingo@1315: } ingo@1315: else if (barrierType.equals(DrawControl.BARRIER_DITCH_VALUE)) { ingo@1315: value = "-9999"; ingo@1315: } ingo@1315: else { ingo@1315: value = "9999"; ingo@1315: } ingo@1315: ingo@1315: grid.addData(new PointRecord(p, point[0], point[1], value)); ingo@1315: } ingo@1315: ingo@1315: grid.redraw(); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public static double[] extractElevations(Attributes attr) { ingo@1315: if (attr == null) { ingo@1315: return null; ingo@1315: } ingo@1315: ingo@1315: String elevationStr = attr.getAttributeAsString("elevation"); ingo@1315: ingo@1315: if (elevationStr == null || elevationStr.length() == 0) { ingo@1315: return null; ingo@1315: } ingo@1315: ingo@1315: String[] elevations = elevationStr.split(" "); ingo@1315: ingo@1315: int len = elevations != null ? elevations.length : 0; ingo@1315: ingo@1315: if (len == 0) { ingo@1315: return null; ingo@1315: } ingo@1315: ingo@1315: double[] res = new double[len]; ingo@1315: ingo@1315: for (int i = 0; i < len; i++) { ingo@1315: try { ingo@1315: res[i] = Double.valueOf(elevations[i]); ingo@1315: } ingo@1315: catch (NumberFormatException nfe) { ingo@1315: // go on ingo@1315: } ingo@1315: } ingo@1315: ingo@1315: return res; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public static double[][] getPointsFromGeometry(Geometry geom) { ingo@1315: String clazz = geom.getClassName(); ingo@1315: ingo@1315: if (clazz != null && clazz.equals(Geometry.LINESTRING_CLASS_NAME)) { ingo@1315: return getPointsFromLineString( ingo@1315: LineString.narrowToLineString(geom.getJSObject())); ingo@1315: } ingo@1315: else if (clazz != null && clazz.equals(Geometry.POLYGON_CLASS_NAME)) { ingo@1315: return getPointsFromPolygon( ingo@1315: Polygon.narrowToPolygon(geom.getJSObject())); ingo@1315: } ingo@1315: else { ingo@1315: SC.warn(MSG.ele_window_geometry_error() + " " + clazz); ingo@1315: } ingo@1315: ingo@1315: return null; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public static double[][] getPointsFromLineString(LineString line) { ingo@1315: return line.getCoordinateArray(); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: public static double[][] getPointsFromPolygon(Polygon polygon) { ingo@1315: LinearRing[] rings = polygon.getComponents(); ingo@1315: ingo@1315: return getPointsFromLineString(rings[0]); ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected VectorFeature addPoint(double x, double y) { ingo@1315: VectorFeature point = new VectorFeature(new Point(x, y), getStyle()); ingo@1315: layer.addFeature(point); ingo@1315: ingo@1315: return point; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected boolean saveElevation() { ingo@1315: ListGridRecord[] records = grid.getRecords(); ingo@1315: ingo@1315: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@1315: ingo@1315: StringBuilder sb = new StringBuilder(); ingo@1315: ingo@1315: for (ListGridRecord record: records) { ingo@1315: PointRecord pr = (PointRecord) record; ingo@1315: String value = pr.getAttributeAsString("z"); ingo@1315: ingo@1315: try { ingo@1315: double z = nf.parse(value); ingo@1315: sb.append(String.valueOf(z)); ingo@1315: } ingo@1315: catch (NumberFormatException nfe) { ingo@1315: SC.warn(MSG.ele_window_save_error()); ingo@1315: return false; ingo@1315: } ingo@1315: ingo@1315: sb.append(" "); ingo@1315: } ingo@1315: ingo@1315: Attributes attr = feature.getAttributes(); ingo@1315: attr.setAttribute("elevation", sb.toString()); ingo@1315: ingo@1315: return true; ingo@1315: } ingo@1315: ingo@1315: ingo@1315: protected void doClose() { ingo@1315: floodmap.getMap().removeLayer(layer); ingo@1315: destroy(); ingo@1315: } ingo@1315: } ingo@1315: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :