Mercurial > dive4elements > river
diff flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java @ 1597:8bbaa0d173cf
Save zoom parameters as Number; added new Axis types NumberAxis and DateAxis.
flys-client/trunk@3923 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Mon, 06 Feb 2012 13:27:05 +0000 |
parents | 637481aeae43 |
children | 3c8ae5605a51 |
line wrap: on
line diff
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java Mon Feb 06 12:38:48 2012 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java Mon Feb 06 13:27:05 2012 +0000 @@ -92,7 +92,7 @@ /** Stack of ZoomObj to allow 'redo last zoom'-kind of actions. */ protected Stack<ZoomObj> zoomStack; - protected double[] zoom; + protected Number[] zoom; /** @@ -116,9 +116,12 @@ right = new Canvas(); xrange = new int[2]; yrange = new int[2]; - zoom = new double[4]; zoomStack = new Stack<ZoomObj>(); + zoom = new Number[] { + new Integer(0), new Integer(1), + new Integer(0), new Integer(1) }; + left.setBorder("1px solid black"); left.setWidth(THEMEPANEL_MIN_WIDTH); left.setMinWidth(THEMEPANEL_MIN_WIDTH); @@ -223,7 +226,7 @@ } - protected double[] translateCoordinates() { + protected Number[] translateCoordinates() { if (xrange == null || (xrange[0] == 0 && xrange[1] == 0)) { zoom[0] = 0d; zoom[1] = 1d; @@ -247,34 +250,34 @@ protected void translateXCoordinates() { Axis xAxis = chartInfo.getXAxis(0); - double xmin = xAxis.getMin(); - double xmax = xAxis.getMax(); - double xRange = xmax - xmin; + Number xmin = xAxis.getMin(); + Number xmax = xAxis.getMax(); + Number xRange = subtract(xmax, xmin); Transform2D transformer = getTransformer(0); double[] start = transformer.transform(xrange[0], yrange[0]); double[] end = transformer.transform(xrange[1], yrange[1]); - zoom[0] = (start[0] - xmin) / xRange; - zoom[1] = (end[0] - xmin) / xRange; + zoom[0] = divide(subtract(start[0], xmin), xRange); + zoom[1] = divide(subtract(end[0], xmin), xRange); } protected void translateYCoordinates() { Axis yAxis = chartInfo.getYAxis(0); - double ymin = yAxis.getMin(); - double ymax = yAxis.getMax(); - double yRange = ymax - ymin; + Number ymin = yAxis.getMin(); + Number ymax = yAxis.getMax(); + Number yRange = subtract(ymax, ymin); Transform2D transformer = getTransformer(0); double[] start = transformer.transform(xrange[0], yrange[0]); double[] end = transformer.transform(xrange[1], yrange[1]); - zoom[2] = (start[1] - ymin) / yRange; - zoom[3] = (end[1] - ymin) / yRange; + zoom[2] = divide(subtract(start[1], ymin), yRange); + zoom[3] = divide(subtract(end[1], ymin), yRange); } @@ -297,8 +300,8 @@ Axis xAxis = chartInfo.getXAxis(0); Axis yAxis = chartInfo.getYAxis(0); - double[] x = panAxis(xAxis, diffX); - double[] y = panAxis(yAxis, diffY); + Number[] x = panAxis(xAxis, diffX); + Number[] y = panAxis(yAxis, diffY); zoom[0] = x[0]; zoom[1] = x[1]; @@ -310,12 +313,12 @@ } - protected double[] panAxis(Axis axis, double diff) { - double min = axis.getFrom(); - double max = axis.getTo(); + protected Number[] panAxis(Axis axis, double diff) { + Number min = axis.getFrom(); + Number max = axis.getTo(); - min += diff; - max += diff; + min = add(min, diff); + max = add(max, diff); return computeZoom(axis, min, max); } @@ -349,8 +352,8 @@ Axis xAxis = chartInfo.getXAxis(0); Axis yAxis = chartInfo.getYAxis(0); - double[] x = zoomAxis(xAxis, factor); - double[] y = zoomAxis(yAxis, factor); + Number[] x = zoomAxis(xAxis, factor); + Number[] y = zoomAxis(yAxis, factor); zoom[0] = x[0]; zoom[1] = x[1]; @@ -379,17 +382,19 @@ } - public double[] zoomAxis(Axis axis, int factor) { + public Number[] zoomAxis(Axis axis, int factor) { GWT.log("Prepare Axis for zooming (factor: " + factor + ")"); - double min = axis.getMin(); - double max = axis.getMax(); - double range = max > min ? max - min : min - max; + Number min = axis.getMin(); + Number max = axis.getMax(); + Number range = isBigger(max, min) ? subtract(max, min) : subtract(min, max); - double curFrom = axis.getFrom(); - double curTo = axis.getTo(); + Number curFrom = axis.getFrom(); + Number curTo = axis.getTo(); - double diff = curTo > curFrom ? curTo - curFrom : curFrom - curTo; + Number diff = isBigger(curTo, curFrom) + ? subtract(curTo, curFrom) + : subtract(curFrom, curTo); GWT.log(" max from : " + min); GWT.log(" max to : " + max); @@ -398,28 +403,30 @@ GWT.log(" current to : " + curTo); GWT.log(" current diff: " + diff); - double newFrom = curFrom - (diff * factor / 100); - double newTo = curTo + (diff * factor / 100); + Number newFrom = subtract(curFrom, divide(multi(diff, factor), 100)); + Number newTo = add(curTo, divide(multi(diff, factor), 100)); GWT.log(" new from: " + newFrom); GWT.log(" new to : " + newTo); - return new double[] { - (newFrom - min) / range, - (newTo - min) / range + return new Number[] { + divide(subtract(newFrom, min), range), + divide(subtract(newTo, min), range) }; } - public static double[] computeZoom(Axis axis, double min, double max) { - double[] zoom = new double[2]; + public static Number[] computeZoom(Axis axis, Number min, Number max) { + Number[] zoom = new Number[2]; - double absMin = axis.getMin(); - double absMax = axis.getMax(); - double diff = absMax > absMin ? absMax - absMin : absMin - absMax; + Number absMin = axis.getMin(); + Number absMax = axis.getMax(); + Number diff = isBigger(absMax, absMin) + ? subtract(absMax, absMin) + : subtract(absMin, absMax); - zoom[0] = (min - absMin) / diff; - zoom[1] = (max - absMin) / diff; + zoom[0] = divide(subtract(min, absMin), diff); + zoom[1] = divide(subtract(max, absMin), diff); return zoom; } @@ -577,20 +584,20 @@ imgUrl += "&width=" + Integer.toString(width); imgUrl += "&height=" + Integer.toString(height); - double[] zoom = getZoomValues(); + Number[] zoom = getZoomValues(); if (zoom != null) { - if (zoom[0] != 0 || zoom[1] != 1) { + if (zoom[0].intValue() != 0 || zoom[1].intValue() != 1) { // a zoom range of 0-1 means displaying the whole range. In such // case we don't need to zoom. - imgUrl += "&minx=" + Double.toString(zoom[0]); - imgUrl += "&maxx=" + Double.toString(zoom[1]); + imgUrl += "&minx=" + zoom[0]; + imgUrl += "&maxx=" + zoom[1]; } - if (zoom[2] != 0 || zoom[3] != 1) { + if (zoom[2].intValue() != 0 || zoom[3].intValue() != 1) { // a zoom range of 0-1 means displaying the whole range. In such // case we don't need to zoom. - imgUrl += "&miny=" + Double.toString(zoom[2]); - imgUrl += "&maxy=" + Double.toString(zoom[3]); + imgUrl += "&miny=" + zoom[2]; + imgUrl += "&maxy=" + zoom[3]; } } @@ -614,20 +621,20 @@ attr.put("width", chart.getWidth().toString()); attr.put("height", chart.getHeight().toString()); - double[] zoom = getZoomValues(); + Number[] zoom = getZoomValues(); if (zoom != null) { - if (zoom[0] != 0 || zoom[1] != 1) { + if (zoom[0].intValue() != 0 || zoom[1].intValue() != 1) { // a zoom range of 0-1 means displaying the whole range. In such // case we don't need to zoom. - attr.put("minx", Double.toString(zoom[0])); - attr.put("maxx", Double.toString(zoom[1])); + attr.put("minx", zoom[0].toString()); + attr.put("maxx", zoom[1].toString()); } - if (zoom[2] != 0 || zoom[3] != 1) { + if (zoom[2].intValue() != 0 || zoom[3].intValue() != 1) { // a zoom range of 0-1 means displaying the whole range. In such // case we don't need to zoom. - attr.put("miny", Double.toString(zoom[2])); - attr.put("maxy", Double.toString(zoom[3])); + attr.put("miny", zoom[2].toString()); + attr.put("maxy", zoom[3].toString()); } } @@ -635,7 +642,7 @@ } - protected double[] getZoomValues() { + protected Number[] getZoomValues() { return zoom; } @@ -644,5 +651,70 @@ public CollectionView getView() { return this.view; } + + + public static Number subtract(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() - right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() - right.longValue()); + } + else { + return new Integer(left.intValue() - right.intValue()); + } + } + + + public static Number add(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() + right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() + right.longValue()); + } + else { + return new Integer(left.intValue() + right.intValue()); + } + } + + + public static Number divide(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() / right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() / right.longValue()); + } + else { + return new Integer(left.intValue() / right.intValue()); + } + } + + + public static Number multi(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() * right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() * right.longValue()); + } + else { + return new Integer(left.intValue() * right.intValue()); + } + } + + + public static boolean isBigger(Number left, Number right) { + if (left instanceof Double) { + return left.doubleValue() > right.doubleValue(); + } + else if (left instanceof Long) { + return left.longValue() > right.longValue(); + } + else { + return left.intValue() > right.intValue(); + } + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :