diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQSelect.java @ 2059:522826b41ffa

Compute better step width for W/Q input. flys-artifacts/trunk@3551 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 28 Dec 2011 08:28:13 +0000
parents 355495661a1c
children 3ffb7195173f
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQSelect.java	Tue Dec 27 11:37:23 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQSelect.java	Wed Dec 28 08:28:13 2011 +0000
@@ -45,6 +45,9 @@
     /** The default step width for Qs. */
     public static final String DEFAULT_STEP_W = "30";
 
+    /** The max number of steps for Qs and Ws. */
+    public static final int MAX_STEPS = 30;
+
     /** The name of the 'mode' field. */
     public static final String WQ_MODE = "wq_mode";
 
@@ -237,14 +240,68 @@
         }
         else {
             Element stepW = createItem(
-                cr, new String[] {"stepW", DEFAULT_STEP_W});
+                cr, new String[] {
+                    "stepW",
+                    String.valueOf(getStepsW(minmaxW[0], minmaxW[1]))});
             Element stepQ = createItem(
-                cr, new String[] {"stepQ", DEFAULT_STEP_Q});
+                cr, new String[] {
+                    "stepQ",
+                    String.valueOf(getStepsW(minmaxQ[0], minmaxQ[1]))});
             return new Element[] { stepW, stepQ };
         }
     }
 
 
+    protected static double getStepsW(double min, double max) {
+        double diff = min < max ? max - min : min - max;
+        double step = diff / MAX_STEPS;
+
+        if (step < 1000) {
+            return getSteps(step, 100);
+        }
+        else if (step < 100) {
+            return getSteps(step, 10);
+        }
+        else if (step < 10) {
+            return getSteps(step, 1);
+        }
+        else {
+            return step;
+        }
+    }
+
+
+    protected static double getStepsQ(double min, double max) {
+        double diff = min < max ? max - min : min - max;
+        double step = diff / MAX_STEPS;
+
+        if (step < 1000) {
+            return getSteps(step, 100);
+        }
+        else if (step < 100) {
+            return getSteps(step, 10);
+        }
+        else if (step < 10) {
+            return getSteps(step, 1);
+        }
+        else {
+            return step;
+        }
+    }
+
+
+    protected static double getSteps(double steps, double factor) {
+        int    fac  = (int) steps / 10;
+        double diff = steps - fac * 10;
+
+        if (diff == 0) {
+            return steps;
+        }
+
+        return 10d * (fac + 1);
+    }
+
+
     protected Element createItem(XMLUtils.ElementCreator cr, Object obj) {
         Element item  = ProtocolUtils.createArtNode(cr, "item", null, null);
         Element label = ProtocolUtils.createArtNode(cr, "label", null, null);

http://dive4elements.wald.intevation.org