# HG changeset patch # User Ingo Weinzierl # Date 1307453184 0 # Node ID 6050d49eaba35dcc934552769cf2cd8f47d6d3b6 # Parent 13c7f90917fcd8278db2da3450ed1138cb0bdde2 Adapted the ChartInfoService to return more information about charts than before. In addition, the PanControl is added to the chart toolbar. flys-client/trunk@2066 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/ChangeLog --- a/flys-client/ChangeLog Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/ChangeLog Tue Jun 07 13:26:24 2011 +0000 @@ -1,3 +1,29 @@ +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Axis.java: New. + This class should represent an axis in a chart. + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java: + New. This class is used by the ChartInfoService to retrieve more + information about a Chart that just the Transform2D object to reproject + points. It currently stores x and y axes and the Transform2D object of a + chart. + + * src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java: + Changed the return value of this service from Transform2D to ChartInfo. + The Transform2D object is included in this new ChartInfo. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Implements the PanHandler interface. If a PanEvent is fired by the + PanControl, a new chart range is computed using the axes information + provided by the ChartInfo object (that has been retrieved by the + ChartInfoService). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added the PanControl to the toolbar. + 2011-06-07 Ingo Weinzierl * src/main/java/de/intevation/flys/client/client/event/HasPanHandlers.java, diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java Tue Jun 07 13:26:24 2011 +0000 @@ -5,8 +5,8 @@ import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; -import de.intevation.flys.client.shared.Transform2D; import de.intevation.flys.client.shared.exceptions.ServerException; +import de.intevation.flys.client.shared.model.ChartInfo; import de.intevation.flys.client.shared.model.Collection; /** @@ -15,7 +15,7 @@ @RemoteServiceRelativePath("chart-info") public interface ChartInfoService extends RemoteService { - Transform2D getChartInfo( + ChartInfo getChartInfo( Collection collection, String url, String locale, diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java Tue Jun 07 13:26:24 2011 +0000 @@ -4,7 +4,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; -import de.intevation.flys.client.shared.Transform2D; +import de.intevation.flys.client.shared.model.ChartInfo; import de.intevation.flys.client.shared.model.Collection; @@ -19,6 +19,6 @@ String locale, String type, Map attr, - AsyncCallback callback); + AsyncCallback callback); } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java Tue Jun 07 13:26:24 2011 +0000 @@ -17,11 +17,15 @@ import com.smartgwt.client.widgets.events.ResizedHandler; import de.intevation.flys.client.shared.Transform2D; +import de.intevation.flys.client.shared.model.Axis; +import de.intevation.flys.client.shared.model.ChartInfo; import de.intevation.flys.client.shared.model.Collection; import de.intevation.flys.client.shared.model.OutputMode; import de.intevation.flys.client.client.Config; import de.intevation.flys.client.client.event.OutputParameterChangeEvent; import de.intevation.flys.client.client.event.OutputParameterChangeHandler; +import de.intevation.flys.client.client.event.PanEvent; +import de.intevation.flys.client.client.event.PanHandler; import de.intevation.flys.client.client.event.ZoomEvent; import de.intevation.flys.client.client.event.ZoomHandler; import de.intevation.flys.client.client.services.ChartInfoService; @@ -35,7 +39,8 @@ */ public class ChartOutputTab extends OutputTab -implements ResizedHandler, OutputParameterChangeHandler, ZoomHandler +implements ResizedHandler, OutputParameterChangeHandler, ZoomHandler, + PanHandler { public static final int DEFAULT_CHART_WIDTH = 600; public static final int DEFAULT_CHART_HEIGHT = 500; @@ -46,6 +51,11 @@ /** The service that is used to fetch chart information.*/ protected ChartInfoServiceAsync info = GWT.create(ChartInfoService.class); + + /** The ChartInfo object that provides information about the current + * chart.*/ + protected ChartInfo chartInfo; + /** The transformer used to transform image pixels into chart coordinates.*/ protected Transform2D transformer; @@ -163,12 +173,44 @@ } + public void onPan(PanEvent event) { + int[] start = event.getStartPos(); + int[] end = event.getEndPos(); + + double[] startPos = transformer.transform(start[0], start[1]); + double[] endPos = transformer.transform(end[0], end[1]); + + double diffX = startPos[0] - endPos[0]; + double diffY = startPos[1] - endPos[1]; + + panTo(diffX, diffY); + } + + + /** + * This method pans to chart with a given factor. + */ + public void panTo(double diffX, double diffY) { + Axis xAxis = chartInfo.getXAxis(0); + Axis yAxis = chartInfo.getYAxis(0); + + xrange[0] = xAxis.getFrom() + diffX; + xrange[1] = xAxis.getTo() + diffX; + yrange[0] = yAxis.getFrom() + diffY; + yrange[1] = yAxis.getTo() + diffY; + + updateTransformer(); + updateChartPanel(); + } + + public void resetRanges() { xrange[0] = 0; xrange[1] = 0; yrange[0] = 0; yrange[1] = 0; + updateTransformer(); updateChartPanel(); } @@ -191,6 +233,7 @@ yrange[0] -= yadd; yrange[1] += yadd; + updateTransformer(); updateChartPanel(); } @@ -209,13 +252,13 @@ locale, mode.getName(), getChartAttributes(), - new AsyncCallback() { + new AsyncCallback() { public void onFailure(Throwable caught) { GWT.log("ERROR: " + caught.getMessage()); } - public void onSuccess(Transform2D transformer) { - setTransformer(transformer); + public void onSuccess(ChartInfo chartInfo) { + setChartInfo(chartInfo); } }); } @@ -248,6 +291,17 @@ } + public ChartInfo getChartInfo() { + return chartInfo; + } + + + protected void setChartInfo(ChartInfo chartInfo) { + this.chartInfo = chartInfo; + setTransformer(chartInfo.getTransformer()); + } + + /** * Returns the Transform2D object used to transform image coordinates into * chart coordinates. diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java Tue Jun 07 13:26:24 2011 +0000 @@ -44,6 +44,8 @@ protected ImgButton zoomOut; + protected PanControl panControl; + public ChartToolbar(CollectionView view, ChartOutputTab chartTab) { @@ -57,6 +59,7 @@ zoombox = new ZoomboxControl(chartTab, MSG.zoom_in()); zoomToMaxExtent = new ImgButton(); zoomOut = new ImgButton(); + panControl = new PanControl(chartTab, MSG.pan()); datacage.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { @@ -97,6 +100,18 @@ }); zoombox.addZoomHandler(chartTab); + zoombox.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + panControl.deselect(); + } + }); + + panControl.addPanHandler(chartTab); + panControl.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + zoombox.deselect(); + } + }); initLayout(); } @@ -128,6 +143,7 @@ addMember(zoomToMaxExtent); addMember(zoomOut); addMember(zoombox); + addMember(panControl); addMember(spacer); addMember(position); } diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java --- a/flys-client/src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java Tue Jun 07 13:07:27 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java Tue Jun 07 13:26:24 2011 +0000 @@ -8,6 +8,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @@ -20,6 +21,8 @@ import de.intevation.flys.client.shared.Transform2D; import de.intevation.flys.client.shared.exceptions.ServerException; +import de.intevation.flys.client.shared.model.Axis; +import de.intevation.flys.client.shared.model.ChartInfo; import de.intevation.flys.client.shared.model.Collection; import de.intevation.flys.client.client.services.ChartInfoService; @@ -38,10 +41,16 @@ public static final String XPATH_TRANSFORM_MATRIX = "/art:chartinfo/art:transformation-matrix"; + public static final String XPATH_X_AXES = + "/art:chartinfo/art:axes/art:domain"; + + public static final String XPATH_Y_AXES = + "/art:chartinfo/art:axes/art:range"; + public static final String EXCEPTION_STRING = "error_chart_info_service"; - public Transform2D getChartInfo( + public ChartInfo getChartInfo( Collection collection, String url, String locale, @@ -78,6 +87,86 @@ } + protected ChartInfo parseInfoDocument(Document doc) { + Transform2D transformer = parseTransformationMatrix(doc); + Axis[] xAxes = parseXAxes(doc); + Axis[] yAxes = parseYAxes(doc); + + de.intevation.flys.client.server.XMLDebug.out(doc); + + return new ChartInfo(xAxes, yAxes, transformer); + } + + + protected Axis[] parseXAxes(Document doc) { + System.out.println("ChartInfoServiceImpl.parseXAxes"); + + NodeList axes = (NodeList) XMLUtils.xpath( + doc, + XPATH_X_AXES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + return parseAxes(axes); + } + + + protected Axis[] parseYAxes(Document doc) { + System.out.println("ChartInfoServiceImpl.parseYAxes"); + + NodeList axes = (NodeList) XMLUtils.xpath( + doc, + XPATH_Y_AXES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + return parseAxes(axes); + } + + + protected Axis[] parseAxes(NodeList axes) { + System.out.println("ChartInfoServiceImpl.parseAxes"); + + int count = axes != null ? axes.getLength() : 0; + + System.out.println("Chart has " + count + " axes."); + + if (count == 0) { + return null; + } + + Axis[] result = new Axis[count]; + + for (int i = 0; i < count; i++) { + Node node = axes.item(i); + + String posStr = XMLUtils.xpathString( + node, "@art:pos", ArtifactNamespaceContext.INSTANCE); + + String fromStr = XMLUtils.xpathString( + node, "@art:from", ArtifactNamespaceContext.INSTANCE); + + String toStr = XMLUtils.xpathString( + node, "@art:to", ArtifactNamespaceContext.INSTANCE); + + try { + int pos = Integer.parseInt(posStr); + double from = Double.parseDouble(fromStr); + double to = Double.parseDouble(toStr); + + result[pos] = new Axis(pos, from, to); + } + catch (NumberFormatException nfe) { + nfe.printStackTrace(); + } + } + + System.out.println("Parsed " + result.length + " axes"); + + return result; + } + + /** * Parses the chart info document and extract the Transform2D values. * @@ -86,8 +175,8 @@ * @return a Transform2D object to transfrom pixel coordinates into chart * coordinates. */ - protected Transform2D parseInfoDocument(Document doc) { - System.out.println("ChartInfoServiceImpl.parseInfoDocument"); + protected Transform2D parseTransformationMatrix(Document doc) { + System.out.println("ChartInfoServiceImpl.parseTransformationMatrix"); Node matrix = (Node) XMLUtils.xpath( doc, diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/shared/model/Axis.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/Axis.java Tue Jun 07 13:26:24 2011 +0000 @@ -0,0 +1,42 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public class Axis implements Serializable { + + protected int pos; + + protected double from; + protected double to; + + + public Axis() { + } + + + public Axis(int pos, double from, double to) { + this.pos = pos; + this.from = from; + this.to = to; + } + + + public int getPos() { + return pos; + } + + + public double getFrom() { + return from; + } + + + public double getTo() { + return to; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 13c7f90917fc -r 6050d49eaba3 flys-client/src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java Tue Jun 07 13:26:24 2011 +0000 @@ -0,0 +1,62 @@ +package de.intevation.flys.client.shared.model; + +import java.io.Serializable; + +import de.intevation.flys.client.shared.Transform2D; + + +/** + * @author Ingo Weinzierl + */ +public class ChartInfo implements Serializable { + + protected Axis[] xAxes; + protected Axis[] yAxes; + + protected Transform2D transformer; + + + public ChartInfo() { + } + + + public ChartInfo(Axis[] xAxes, Axis[] yAxes, Transform2D transformer) { + this.xAxes = xAxes; + this.yAxes = yAxes; + this.transformer = transformer; + } + + + public Transform2D getTransformer() { + return transformer; + } + + + public int getXAxisCount() { + return xAxes.length; + } + + + public int getYAxisCount() { + return yAxes.length; + } + + + public Axis getXAxis(int pos) { + if (pos >= 0 && pos < xAxes.length) { + return xAxes[pos]; + } + + return null; + } + + + public Axis getYAxis(int pos) { + if (pos >= 0 && pos < yAxes.length) { + return yAxes[pos]; + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :