From 0d9567534a152ea0e66333b622c90b551853188d Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Mon, 26 Mar 2018 12:11:06 +0200
Subject: [PATCH] =?UTF-8?q?=20#44=20enum=20ParamValueMode=20:=20ajout=20de?=
 =?UTF-8?q?=20la=20valeur=20CALCUL=20pour=20les=20param=C3=A8tres=20"?=
 =?UTF-8?q?=C3=A0=20calculer"=20-=20classe=20ParamValues=20:=20=5FsingleVa?=
 =?UTF-8?q?lue=20number->DefinedNumber,=20mode=20"=C3=A0=20calculer"=20par?=
 =?UTF-8?q?=20d=C3=A9faut,=20ajout=20de=20contr=C3=B4les=20de=20coh=C3=A9r?=
 =?UTF-8?q?ence=20mode/valeur(s)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/param/param-values.ts | 88 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 78 insertions(+), 10 deletions(-)

diff --git a/src/param/param-values.ts b/src/param/param-values.ts
index bd7eb3ef..d6877829 100644
--- a/src/param/param-values.ts
+++ b/src/param/param-values.ts
@@ -1,4 +1,5 @@
 import { Pair } from "../util/pair"
+import { DefinedNumber } from "../util/definedvalue";
 
 /**
  * mode de génération des valeurs
@@ -17,7 +18,12 @@ export enum ParamValueMode {
     /**
      * liste de valeurs discrètes
      */
-    LISTE
+    LISTE,
+
+    /**
+     * la valeur du paramètre est non définie et à calculer
+     */
+    CALCUL
 }
 
 /**
@@ -149,12 +155,12 @@ export class ParamValues {
     /**
      * mode de génération des valeurs : min/max, liste, ...
      */
-    private _valueMode: ParamValueMode = ParamValueMode.MINMAX;
+    private _valueMode: ParamValueMode;
 
     /**
-     * valeur dans le cas ParamValueMode.SINGLE
+     * valeur numérique (éventuellement non définie) dans le mode "valeur unique" (ParamValueMode.SINGLE)
      */
-    private _singleValue: number;
+    private _singleValue: DefinedNumber;
 
     /**
      * valeur min dans le cas ParamValueMode.MINMAX
@@ -176,20 +182,27 @@ export class ParamValues {
      */
     private _valueList: number[];
 
+    constructor() {
+        this._singleValue = new DefinedNumber();
+        this.valueMode = ParamValueMode.CALCUL;
+    }
+
     public setValues(o: number | any, max?: number, step?: number) {
         if (typeof (o) === "number") {
             if (max == undefined) {
-                this._valueMode = ParamValueMode.SINGLE;
-                this._singleValue = o as number;
+                this.valueMode = ParamValueMode.SINGLE;
+                this._singleValue.value = o as number;
             } else {
-                this._valueMode = ParamValueMode.MINMAX;
+                this.valueMode = ParamValueMode.MINMAX;
                 this._minValue = o as number;
                 this._maxValue = max;
                 this._stepValue = step;
             }
         }
-        else if (Array.isArray(o))
+        else if (Array.isArray(o)) {
+            this.valueMode = ParamValueMode.LISTE;
             this._valueList = o;
+        }
         else
             throw new Error(`ParamValues.setValues() :  appel invalide`);
     }
@@ -200,50 +213,104 @@ export class ParamValues {
 
     public set valueMode(m: ParamValueMode) {
         this._valueMode = m;
+        switch (m) {
+            case ParamValueMode.SINGLE:
+                this._minValue = undefined;
+                this._maxValue = undefined;
+                this._stepValue = undefined;
+                this._valueList = undefined;
+                break;
+
+            case ParamValueMode.LISTE:
+                this._singleValue.undefine();
+                this._minValue = undefined;
+                this._maxValue = undefined;
+                this._stepValue = undefined;
+                break;
+
+            case ParamValueMode.MINMAX:
+                this._singleValue.undefine();
+                this._valueList = undefined;
+                break;
+
+            case ParamValueMode.CALCUL:
+                this._singleValue.undefine();
+                this._minValue = undefined;
+                this._maxValue = undefined;
+                this._stepValue = undefined;
+                this._valueList = undefined;
+                break;
+        }
+    }
+
+    private checkValueMode(expected: ParamValueMode) {
+        if (this._valueMode != expected)
+            throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[expected]} incorrect`);
     }
 
     public get singleValue() {
-        return this._singleValue;
+        this.checkValueMode(ParamValueMode.SINGLE);
+        return this._singleValue.value;
+    }
+
+    public get uncheckedValue() {
+        this.checkValueMode(ParamValueMode.SINGLE);
+        return this._singleValue.uncheckedValue;
     }
 
     public set singleValue(v: number) {
-        this._singleValue = v;
+        this._singleValue.value = v;
+        this.valueMode = ParamValueMode.SINGLE;
+    }
+
+    public get isDefined() {
+        this.checkValueMode(ParamValueMode.SINGLE);
+        return this._singleValue.isDefined;
     }
 
     public get min() {
+        this.checkValueMode(ParamValueMode.MINMAX);
         return this._minValue;
     }
 
     public set min(v: number) {
         this._minValue = v;
+        this.valueMode = ParamValueMode.MINMAX;
     }
 
     public get max() {
+        this.checkValueMode(ParamValueMode.MINMAX);
         return this._maxValue;
     }
 
     public set max(v: number) {
         this._maxValue = v;
+        this.valueMode = ParamValueMode.MINMAX;
     }
 
     public get stepRefValue(): Pair {
+        this.checkValueMode(ParamValueMode.MINMAX);
         return new Pair(1e-9, this._maxValue - this._minValue);
     }
 
     public get step() {
+        this.checkValueMode(ParamValueMode.MINMAX);
         return this._stepValue;
     }
 
     public set step(v: number) {
         this._stepValue = v;
+        this.valueMode = ParamValueMode.MINMAX;
     }
 
     public get valueList() {
+        this.checkValueMode(ParamValueMode.LISTE);
         return this._valueList;
     }
 
     public set valueList(l: number[]) {
         this._valueList = l;
+        this.valueMode = ParamValueMode.LISTE;
     }
 
     public getValuesIterator(reverse: boolean = false): ParamValueIterator {
@@ -255,6 +322,7 @@ export class ParamValues {
      */
     public copyMembers(n: ParamValues) {
         n._valueMode = this.valueMode;
+        n._singleValue = new DefinedNumber(this._singleValue.value);
         n._minValue = this._minValue;
         n._maxValue = this._maxValue;
         n._stepValue = this._stepValue;
-- 
GitLab