svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2922 ddce4ebdf010
parent 2921 2670f5c53caf
child 2923 5ec1c07ce582
equal deleted inserted replaced
2921:2670f5c53caf 2922:ddce4ebdf010
   815       </xsl:otherwise>
   815       </xsl:otherwise>
   816     </xsl:choose>
   816     </xsl:choose>
   817     <xsl:text>    },
   817     <xsl:text>    },
   818 </xsl:text>
   818 </xsl:text>
   819   </xsl:template>
   819   </xsl:template>
       
   820   <xsl:template mode="widget_defs" match="widget[@type='DropDown']">
       
   821     <xsl:param name="hmi_element"/>
       
   822     <xsl:call-template name="defs_by_labels">
       
   823       <xsl:with-param name="hmi_element" select="$hmi_element"/>
       
   824       <xsl:with-param name="labels">
       
   825         <xsl:text>text box</xsl:text>
       
   826       </xsl:with-param>
       
   827     </xsl:call-template>
       
   828     <xsl:text>    dispatch: function(value) {
       
   829 </xsl:text>
       
   830     <xsl:text>        this.text_elt.textContent = String(value);
       
   831 </xsl:text>
       
   832     <xsl:text>    },
       
   833 </xsl:text>
       
   834     <xsl:text>    init: function() {
       
   835 </xsl:text>
       
   836     <xsl:text>        this.element.setAttribute("onclick", "hmi_widgets['</xsl:text>
       
   837     <xsl:value-of select="$hmi_element/@id"/>
       
   838     <xsl:text>'].on_click()");
       
   839 </xsl:text>
       
   840     <xsl:text>    },
       
   841 </xsl:text>
       
   842     <xsl:variable name="box_elt" select="$hmi_element/*[@inkscape:label='box'][1]"/>
       
   843     <xsl:variable name="g" select="$geometry[@Id = $box_elt/@id]"/>
       
   844     <xsl:text>    original_box: [</xsl:text>
       
   845     <xsl:value-of select="$g/@x"/>
       
   846     <xsl:text>, </xsl:text>
       
   847     <xsl:value-of select="$g/@y"/>
       
   848     <xsl:text>, </xsl:text>
       
   849     <xsl:value-of select="$g/@w"/>
       
   850     <xsl:text>, </xsl:text>
       
   851     <xsl:value-of select="$g/@h"/>
       
   852     <xsl:text>],
       
   853 </xsl:text>
       
   854     <xsl:text>    on_click: function() {
       
   855 </xsl:text>
       
   856     <xsl:text>        let [x,y,w,h] = page_desc[current_visible_page].bbox;
       
   857 </xsl:text>
       
   858     <xsl:text>        let p = new DOMPoint(this.box_elt.x.baseVal.value, this.box_elt.y.baseVal.value);
       
   859 </xsl:text>
       
   860     <xsl:text>        let k = DOMMatrix.fromMatrix(this.box_elt.getCTM());
       
   861 </xsl:text>
       
   862     <xsl:text>        let l = DOMMatrix.fromMatrix(this.box_elt.getScreenCTM());
       
   863 </xsl:text>
       
   864     <xsl:text>        console.log(p, k.transformPoint(p), l.transformPoint(p));
       
   865 </xsl:text>
       
   866     <xsl:text>    },
       
   867 </xsl:text>
       
   868   </xsl:template>
   820   <xsl:template mode="widget_defs" match="widget[@type='ForEach']">
   869   <xsl:template mode="widget_defs" match="widget[@type='ForEach']">
   821     <xsl:param name="hmi_element"/>
   870     <xsl:param name="hmi_element"/>
   822     <xsl:variable name="widgets" select="func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]"/>
   871     <xsl:variable name="widgets" select="func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]"/>
   823     <xsl:variable name="class" select="arg[1]/@value"/>
   872     <xsl:variable name="class" select="arg[1]/@value"/>
   824     <xsl:variable name="base_path" select="path/@value"/>
   873     <xsl:variable name="base_path" select="path/@value"/>
  2155 </xsl:text>
  2204 </xsl:text>
  2156     <xsl:text>function apply_hmi_value(index, new_val) {
  2205     <xsl:text>function apply_hmi_value(index, new_val) {
  2157 </xsl:text>
  2206 </xsl:text>
  2158     <xsl:text>    let old_val = cache[index]
  2207     <xsl:text>    let old_val = cache[index]
  2159 </xsl:text>
  2208 </xsl:text>
  2160     <xsl:text>    console.log("apply", index, new_val);
  2209     <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val)
  2161 </xsl:text>
       
  2162     <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val){
       
  2163 </xsl:text>
       
  2164     <xsl:text>        console.log("sending", new_val);
       
  2165 </xsl:text>
  2210 </xsl:text>
  2166     <xsl:text>        send_hmi_value(index, new_val);
  2211     <xsl:text>        send_hmi_value(index, new_val);
  2167 </xsl:text>
  2212 </xsl:text>
       
  2213     <xsl:text>    return new_val;
       
  2214 </xsl:text>
       
  2215     <xsl:text>}
       
  2216 </xsl:text>
       
  2217     <xsl:text>
       
  2218 </xsl:text>
       
  2219     <xsl:text>function change_hmi_value(index, opstr) {
       
  2220 </xsl:text>
       
  2221     <xsl:text>    let op = opstr[0];
       
  2222 </xsl:text>
       
  2223     <xsl:text>    let given_val = opstr.slice(1);
       
  2224 </xsl:text>
       
  2225     <xsl:text>    let old_val = cache[index]
       
  2226 </xsl:text>
       
  2227     <xsl:text>    let new_val;
       
  2228 </xsl:text>
       
  2229     <xsl:text>    switch(op){
       
  2230 </xsl:text>
       
  2231     <xsl:text>      case "=":
       
  2232 </xsl:text>
       
  2233     <xsl:text>        eval("new_val"+opstr);
       
  2234 </xsl:text>
       
  2235     <xsl:text>        break;
       
  2236 </xsl:text>
       
  2237     <xsl:text>      case "+":
       
  2238 </xsl:text>
       
  2239     <xsl:text>      case "-":
       
  2240 </xsl:text>
       
  2241     <xsl:text>      case "*":
       
  2242 </xsl:text>
       
  2243     <xsl:text>      case "/":
       
  2244 </xsl:text>
       
  2245     <xsl:text>        if(old_val != undefined)
       
  2246 </xsl:text>
       
  2247     <xsl:text>            new_val = eval("old_val"+opstr);
       
  2248 </xsl:text>
       
  2249     <xsl:text>        break;
       
  2250 </xsl:text>
  2168     <xsl:text>    }
  2251     <xsl:text>    }
  2169 </xsl:text>
  2252 </xsl:text>
       
  2253     <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val)
       
  2254 </xsl:text>
       
  2255     <xsl:text>        send_hmi_value(index, new_val);
       
  2256 </xsl:text>
  2170     <xsl:text>    return new_val;
  2257     <xsl:text>    return new_val;
  2171 </xsl:text>
  2258 </xsl:text>
  2172     <xsl:text>}
  2259     <xsl:text>}
  2173 </xsl:text>
  2260 </xsl:text>
  2174     <xsl:text>
  2261     <xsl:text>
  2175 </xsl:text>
  2262 </xsl:text>
  2176     <xsl:text>function change_hmi_value(index, opstr) {
  2263     <xsl:text>var current_visible_page;
  2177 </xsl:text>
  2264 </xsl:text>
  2178     <xsl:text>    let op = opstr[0];
  2265     <xsl:text>var current_subscribed_page;
  2179 </xsl:text>
  2266 </xsl:text>
  2180     <xsl:text>    let given_val = opstr.slice(1);
  2267     <xsl:text>var current_page_index;
  2181 </xsl:text>
  2268 </xsl:text>
  2182     <xsl:text>    let old_val = cache[index]
  2269     <xsl:text>
  2183 </xsl:text>
  2270 </xsl:text>
  2184     <xsl:text>    let new_val;
  2271     <xsl:text>function prepare_svg() {
  2185 </xsl:text>
  2272 </xsl:text>
  2186     <xsl:text>    switch(op){
  2273     <xsl:text>    for(let eltid in detachable_elements){
  2187 </xsl:text>
  2274 </xsl:text>
  2188     <xsl:text>      case "=":
  2275     <xsl:text>        let [element,parent] = detachable_elements[eltid];
  2189 </xsl:text>
  2276 </xsl:text>
  2190     <xsl:text>        eval("new_val"+opstr);
  2277     <xsl:text>        parent.removeChild(element);
  2191 </xsl:text>
       
  2192     <xsl:text>        break;
       
  2193 </xsl:text>
       
  2194     <xsl:text>      case "+":
       
  2195 </xsl:text>
       
  2196     <xsl:text>      case "-":
       
  2197 </xsl:text>
       
  2198     <xsl:text>      case "*":
       
  2199 </xsl:text>
       
  2200     <xsl:text>      case "/":
       
  2201 </xsl:text>
       
  2202     <xsl:text>        if(old_val != undefined)
       
  2203 </xsl:text>
       
  2204     <xsl:text>            new_val = eval("old_val"+opstr);
       
  2205 </xsl:text>
       
  2206     <xsl:text>        break;
       
  2207 </xsl:text>
  2278 </xsl:text>
  2208     <xsl:text>    }
  2279     <xsl:text>    }
  2209 </xsl:text>
  2280 </xsl:text>
  2210     <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val)
  2281     <xsl:text>};
  2211 </xsl:text>
  2282 </xsl:text>
  2212     <xsl:text>        send_hmi_value(index, new_val);
  2283     <xsl:text>
  2213 </xsl:text>
  2284 </xsl:text>
  2214     <xsl:text>    return new_val;
  2285     <xsl:text>function switch_page(page_name, page_index) {
       
  2286 </xsl:text>
       
  2287     <xsl:text>    if(current_subscribed_page != current_visible_page){
       
  2288 </xsl:text>
       
  2289     <xsl:text>        /* page switch already going */
       
  2290 </xsl:text>
       
  2291     <xsl:text>        /* TODO LOG ERROR */
       
  2292 </xsl:text>
       
  2293     <xsl:text>        return false;
       
  2294 </xsl:text>
       
  2295     <xsl:text>    }
       
  2296 </xsl:text>
       
  2297     <xsl:text>
       
  2298 </xsl:text>
       
  2299     <xsl:text>    if(page_name == undefined)
       
  2300 </xsl:text>
       
  2301     <xsl:text>        page_name = current_subscribed_page;
       
  2302 </xsl:text>
       
  2303     <xsl:text>
       
  2304 </xsl:text>
       
  2305     <xsl:text>
       
  2306 </xsl:text>
       
  2307     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
       
  2308 </xsl:text>
       
  2309     <xsl:text>    let new_desc = page_desc[page_name];
       
  2310 </xsl:text>
       
  2311     <xsl:text>
       
  2312 </xsl:text>
       
  2313     <xsl:text>    if(new_desc == undefined){
       
  2314 </xsl:text>
       
  2315     <xsl:text>        /* TODO LOG ERROR */
       
  2316 </xsl:text>
       
  2317     <xsl:text>        return false;
       
  2318 </xsl:text>
       
  2319     <xsl:text>    }
       
  2320 </xsl:text>
       
  2321     <xsl:text>
       
  2322 </xsl:text>
       
  2323     <xsl:text>    if(page_index == undefined){
       
  2324 </xsl:text>
       
  2325     <xsl:text>        page_index = new_desc.page_index;
       
  2326 </xsl:text>
       
  2327     <xsl:text>    }
       
  2328 </xsl:text>
       
  2329     <xsl:text>
       
  2330 </xsl:text>
       
  2331     <xsl:text>    if(old_desc){
       
  2332 </xsl:text>
       
  2333     <xsl:text>        old_desc.absolute_widgets.map(w=&gt;w.unsub());
       
  2334 </xsl:text>
       
  2335     <xsl:text>        old_desc.relative_widgets.map(w=&gt;w.unsub());
       
  2336 </xsl:text>
       
  2337     <xsl:text>    }
       
  2338 </xsl:text>
       
  2339     <xsl:text>    new_desc.absolute_widgets.map(w=&gt;w.sub());
       
  2340 </xsl:text>
       
  2341     <xsl:text>    var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
       
  2342 </xsl:text>
       
  2343     <xsl:text>    new_desc.relative_widgets.map(w=&gt;w.sub(new_offset));
       
  2344 </xsl:text>
       
  2345     <xsl:text>
       
  2346 </xsl:text>
       
  2347     <xsl:text>    update_subscriptions();
       
  2348 </xsl:text>
       
  2349     <xsl:text>
       
  2350 </xsl:text>
       
  2351     <xsl:text>    current_subscribed_page = page_name;
       
  2352 </xsl:text>
       
  2353     <xsl:text>    current_page_index = page_index;
       
  2354 </xsl:text>
       
  2355     <xsl:text>
       
  2356 </xsl:text>
       
  2357     <xsl:text>    jumps_need_update = true;
       
  2358 </xsl:text>
       
  2359     <xsl:text>
       
  2360 </xsl:text>
       
  2361     <xsl:text>    requestHMIAnimation();
       
  2362 </xsl:text>
       
  2363     <xsl:text>
       
  2364 </xsl:text>
       
  2365     <xsl:text>    jump_history.push([page_name, page_index]);
       
  2366 </xsl:text>
       
  2367     <xsl:text>    if(jump_history.length &gt; 42)
       
  2368 </xsl:text>
       
  2369     <xsl:text>        jump_history.shift();
       
  2370 </xsl:text>
       
  2371     <xsl:text>
       
  2372 </xsl:text>
       
  2373     <xsl:text>    return true;
       
  2374 </xsl:text>
       
  2375     <xsl:text>};
       
  2376 </xsl:text>
       
  2377     <xsl:text>
       
  2378 </xsl:text>
       
  2379     <xsl:text>function* chain(a,b){
       
  2380 </xsl:text>
       
  2381     <xsl:text>    yield* a;
       
  2382 </xsl:text>
       
  2383     <xsl:text>    yield* b;
       
  2384 </xsl:text>
       
  2385     <xsl:text>};
       
  2386 </xsl:text>
       
  2387     <xsl:text>
       
  2388 </xsl:text>
       
  2389     <xsl:text>function unsubscribe(){
       
  2390 </xsl:text>
       
  2391     <xsl:text>    /* remove subsribers */
       
  2392 </xsl:text>
       
  2393     <xsl:text>    for(let index of this.indexes){
       
  2394 </xsl:text>
       
  2395     <xsl:text>        let idx = index + this.offset;
       
  2396 </xsl:text>
       
  2397     <xsl:text>        subscribers[idx].delete(this);
       
  2398 </xsl:text>
       
  2399     <xsl:text>    }
       
  2400 </xsl:text>
       
  2401     <xsl:text>    this.offset = 0;
  2215 </xsl:text>
  2402 </xsl:text>
  2216     <xsl:text>}
  2403     <xsl:text>}
  2217 </xsl:text>
  2404 </xsl:text>
  2218     <xsl:text>
  2405     <xsl:text>
  2219 </xsl:text>
  2406 </xsl:text>
  2220     <xsl:text>var current_visible_page;
  2407     <xsl:text>function subscribe(new_offset=0){
  2221 </xsl:text>
  2408 </xsl:text>
  2222     <xsl:text>var current_subscribed_page;
  2409     <xsl:text>    /* set the offset because relative */
  2223 </xsl:text>
  2410 </xsl:text>
  2224     <xsl:text>var current_page_index;
  2411     <xsl:text>    this.offset = new_offset;
  2225 </xsl:text>
  2412 </xsl:text>
  2226     <xsl:text>
  2413     <xsl:text>    /* add this's subsribers */
  2227 </xsl:text>
  2414 </xsl:text>
  2228     <xsl:text>function prepare_svg() {
  2415     <xsl:text>    for(let index of this.indexes){
  2229 </xsl:text>
  2416 </xsl:text>
  2230     <xsl:text>    for(let eltid in detachable_elements){
  2417     <xsl:text>        subscribers[index + new_offset].add(this);
  2231 </xsl:text>
       
  2232     <xsl:text>        let [element,parent] = detachable_elements[eltid];
       
  2233 </xsl:text>
       
  2234     <xsl:text>        parent.removeChild(element);
       
  2235 </xsl:text>
  2418 </xsl:text>
  2236     <xsl:text>    }
  2419     <xsl:text>    }
  2237 </xsl:text>
  2420 </xsl:text>
       
  2421     <xsl:text>    need_cache_apply.push(this); 
       
  2422 </xsl:text>
       
  2423     <xsl:text>}
       
  2424 </xsl:text>
       
  2425     <xsl:text>
       
  2426 </xsl:text>
       
  2427     <xsl:text>function foreach_unsubscribe(){
       
  2428 </xsl:text>
       
  2429     <xsl:text>    for(let item of this.items){
       
  2430 </xsl:text>
       
  2431     <xsl:text>        for(let widget of item) {
       
  2432 </xsl:text>
       
  2433     <xsl:text>            unsubscribe.call(widget);
       
  2434 </xsl:text>
       
  2435     <xsl:text>        }
       
  2436 </xsl:text>
       
  2437     <xsl:text>    }
       
  2438 </xsl:text>
       
  2439     <xsl:text>    this.offset = 0;
       
  2440 </xsl:text>
       
  2441     <xsl:text>}
       
  2442 </xsl:text>
       
  2443     <xsl:text>
       
  2444 </xsl:text>
       
  2445     <xsl:text>function foreach_widgets_do(new_offset, todo){
       
  2446 </xsl:text>
       
  2447     <xsl:text>    this.offset = new_offset;
       
  2448 </xsl:text>
       
  2449     <xsl:text>    for(let i = 0; i &lt; this.items.length; i++) {
       
  2450 </xsl:text>
       
  2451     <xsl:text>        let item = this.items[i];
       
  2452 </xsl:text>
       
  2453     <xsl:text>        let orig_item_index = this.index_pool[i];
       
  2454 </xsl:text>
       
  2455     <xsl:text>        let item_index = this.index_pool[i+this.item_offset];
       
  2456 </xsl:text>
       
  2457     <xsl:text>        let item_index_offset = item_index - orig_item_index;
       
  2458 </xsl:text>
       
  2459     <xsl:text>        for(let widget of item) {
       
  2460 </xsl:text>
       
  2461     <xsl:text>            todo.call(widget, new_offset + item_index_offset);
       
  2462 </xsl:text>
       
  2463     <xsl:text>        }
       
  2464 </xsl:text>
       
  2465     <xsl:text>    }
       
  2466 </xsl:text>
       
  2467     <xsl:text>}
       
  2468 </xsl:text>
       
  2469     <xsl:text>
       
  2470 </xsl:text>
       
  2471     <xsl:text>function foreach_subscribe(new_offset=0){
       
  2472 </xsl:text>
       
  2473     <xsl:text>    foreach_widgets_do.call(this, new_offset, subscribe);
       
  2474 </xsl:text>
       
  2475     <xsl:text>}
       
  2476 </xsl:text>
       
  2477     <xsl:text>
       
  2478 </xsl:text>
       
  2479     <xsl:text>function widget_apply_cache() {
       
  2480 </xsl:text>
       
  2481     <xsl:text>    for(let index of this.indexes){
       
  2482 </xsl:text>
       
  2483     <xsl:text>        /* dispatch current cache in newly opened page widgets */
       
  2484 </xsl:text>
       
  2485     <xsl:text>        let realindex = index+this.offset;
       
  2486 </xsl:text>
       
  2487     <xsl:text>        let cached_val = cache[realindex];
       
  2488 </xsl:text>
       
  2489     <xsl:text>        if(cached_val != undefined)
       
  2490 </xsl:text>
       
  2491     <xsl:text>            dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
  2492 </xsl:text>
       
  2493     <xsl:text>    }
       
  2494 </xsl:text>
       
  2495     <xsl:text>}
       
  2496 </xsl:text>
       
  2497     <xsl:text>
       
  2498 </xsl:text>
       
  2499     <xsl:text>function foreach_apply_cache() {
       
  2500 </xsl:text>
       
  2501     <xsl:text>    foreach_widgets_do.call(this, this.offset, widget_apply_cache);
       
  2502 </xsl:text>
       
  2503     <xsl:text>}
       
  2504 </xsl:text>
       
  2505     <xsl:text>
       
  2506 </xsl:text>
       
  2507     <xsl:text>function foreach_onclick(opstr, evt) {
       
  2508 </xsl:text>
       
  2509     <xsl:text>    new_item_offset = eval(String(this.item_offset)+opstr)
       
  2510 </xsl:text>
       
  2511     <xsl:text>    if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  2512 </xsl:text>
       
  2513     <xsl:text>        if(this.item_offset + this.items.length == this.index_pool.length)
       
  2514 </xsl:text>
       
  2515     <xsl:text>            new_item_offset = 0;
       
  2516 </xsl:text>
       
  2517     <xsl:text>        else
       
  2518 </xsl:text>
       
  2519     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  2520 </xsl:text>
       
  2521     <xsl:text>    } else if(new_item_offset &lt; 0) {
       
  2522 </xsl:text>
       
  2523     <xsl:text>        if(this.item_offset == 0)
       
  2524 </xsl:text>
       
  2525     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  2526 </xsl:text>
       
  2527     <xsl:text>        else
       
  2528 </xsl:text>
       
  2529     <xsl:text>            new_item_offset = 0;
       
  2530 </xsl:text>
       
  2531     <xsl:text>    }
       
  2532 </xsl:text>
       
  2533     <xsl:text>    this.item_offset = new_item_offset;
       
  2534 </xsl:text>
       
  2535     <xsl:text>    off = this.offset;
       
  2536 </xsl:text>
       
  2537     <xsl:text>    foreach_unsubscribe.call(this);
       
  2538 </xsl:text>
       
  2539     <xsl:text>    foreach_subscribe.call(this,off);
       
  2540 </xsl:text>
       
  2541     <xsl:text>    update_subscriptions();
       
  2542 </xsl:text>
       
  2543     <xsl:text>    need_cache_apply.push(this);
       
  2544 </xsl:text>
       
  2545     <xsl:text>    jumps_need_update = true;
       
  2546 </xsl:text>
       
  2547     <xsl:text>    requestHMIAnimation();
       
  2548 </xsl:text>
       
  2549     <xsl:text>}
       
  2550 </xsl:text>
       
  2551     <xsl:text>
       
  2552 </xsl:text>
       
  2553     <xsl:text>
       
  2554 </xsl:text>
       
  2555     <xsl:text>function switch_visible_page(page_name) {
       
  2556 </xsl:text>
       
  2557     <xsl:text>
       
  2558 </xsl:text>
       
  2559     <xsl:text>    let old_desc = page_desc[current_visible_page];
       
  2560 </xsl:text>
       
  2561     <xsl:text>    let new_desc = page_desc[page_name];
       
  2562 </xsl:text>
       
  2563     <xsl:text>
       
  2564 </xsl:text>
       
  2565     <xsl:text>    if(old_desc){
       
  2566 </xsl:text>
       
  2567     <xsl:text>        for(let eltid in old_desc.required_detachables){
       
  2568 </xsl:text>
       
  2569     <xsl:text>            if(!(eltid in new_desc.required_detachables)){
       
  2570 </xsl:text>
       
  2571     <xsl:text>                let [element, parent] = old_desc.required_detachables[eltid];
       
  2572 </xsl:text>
       
  2573     <xsl:text>                parent.removeChild(element);
       
  2574 </xsl:text>
       
  2575     <xsl:text>            }
       
  2576 </xsl:text>
       
  2577     <xsl:text>        }
       
  2578 </xsl:text>
       
  2579     <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  2580 </xsl:text>
       
  2581     <xsl:text>            if(!(eltid in old_desc.required_detachables)){
       
  2582 </xsl:text>
       
  2583     <xsl:text>                let [element, parent] = new_desc.required_detachables[eltid];
       
  2584 </xsl:text>
       
  2585     <xsl:text>                parent.appendChild(element);
       
  2586 </xsl:text>
       
  2587     <xsl:text>            }
       
  2588 </xsl:text>
       
  2589     <xsl:text>        }
       
  2590 </xsl:text>
       
  2591     <xsl:text>    }else{
       
  2592 </xsl:text>
       
  2593     <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  2594 </xsl:text>
       
  2595     <xsl:text>            let [element, parent] = new_desc.required_detachables[eltid];
       
  2596 </xsl:text>
       
  2597     <xsl:text>            parent.appendChild(element);
       
  2598 </xsl:text>
       
  2599     <xsl:text>        }
       
  2600 </xsl:text>
       
  2601     <xsl:text>    }
       
  2602 </xsl:text>
       
  2603     <xsl:text>
       
  2604 </xsl:text>
       
  2605     <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
       
  2606 </xsl:text>
       
  2607     <xsl:text>    current_visible_page = page_name;
       
  2608 </xsl:text>
  2238     <xsl:text>};
  2609     <xsl:text>};
  2239 </xsl:text>
  2610 </xsl:text>
  2240     <xsl:text>
  2611     <xsl:text>
  2241 </xsl:text>
  2612 </xsl:text>
  2242     <xsl:text>function switch_page(page_name, page_index) {
  2613     <xsl:text>function update_jumps() {
  2243 </xsl:text>
  2614 </xsl:text>
  2244     <xsl:text>    if(current_subscribed_page != current_visible_page){
  2615     <xsl:text>    page_desc[current_visible_page].jumps.map(w=&gt;w.notify_page_change(current_visible_page,current_page_index));
  2245 </xsl:text>
  2616 </xsl:text>
  2246     <xsl:text>        /* page switch already going */
  2617     <xsl:text>    jumps_need_update = false;
  2247 </xsl:text>
       
  2248     <xsl:text>        /* TODO LOG ERROR */
       
  2249 </xsl:text>
       
  2250     <xsl:text>        return false;
       
  2251 </xsl:text>
       
  2252     <xsl:text>    }
       
  2253 </xsl:text>
       
  2254     <xsl:text>
       
  2255 </xsl:text>
       
  2256     <xsl:text>    if(page_name == undefined)
       
  2257 </xsl:text>
       
  2258     <xsl:text>        page_name = current_subscribed_page;
       
  2259 </xsl:text>
       
  2260     <xsl:text>
       
  2261 </xsl:text>
       
  2262     <xsl:text>
       
  2263 </xsl:text>
       
  2264     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
       
  2265 </xsl:text>
       
  2266     <xsl:text>    let new_desc = page_desc[page_name];
       
  2267 </xsl:text>
       
  2268     <xsl:text>
       
  2269 </xsl:text>
       
  2270     <xsl:text>    if(new_desc == undefined){
       
  2271 </xsl:text>
       
  2272     <xsl:text>        /* TODO LOG ERROR */
       
  2273 </xsl:text>
       
  2274     <xsl:text>        return false;
       
  2275 </xsl:text>
       
  2276     <xsl:text>    }
       
  2277 </xsl:text>
       
  2278     <xsl:text>
       
  2279 </xsl:text>
       
  2280     <xsl:text>    if(page_index == undefined){
       
  2281 </xsl:text>
       
  2282     <xsl:text>        page_index = new_desc.page_index;
       
  2283 </xsl:text>
       
  2284     <xsl:text>    }
       
  2285 </xsl:text>
       
  2286     <xsl:text>
       
  2287 </xsl:text>
       
  2288     <xsl:text>    if(old_desc){
       
  2289 </xsl:text>
       
  2290     <xsl:text>        old_desc.absolute_widgets.map(w=&gt;w.unsub());
       
  2291 </xsl:text>
       
  2292     <xsl:text>        old_desc.relative_widgets.map(w=&gt;w.unsub());
       
  2293 </xsl:text>
       
  2294     <xsl:text>    }
       
  2295 </xsl:text>
       
  2296     <xsl:text>    new_desc.absolute_widgets.map(w=&gt;w.sub());
       
  2297 </xsl:text>
       
  2298     <xsl:text>    var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
       
  2299 </xsl:text>
       
  2300     <xsl:text>    new_desc.relative_widgets.map(w=&gt;w.sub(new_offset));
       
  2301 </xsl:text>
       
  2302     <xsl:text>
       
  2303 </xsl:text>
       
  2304     <xsl:text>    update_subscriptions();
       
  2305 </xsl:text>
       
  2306     <xsl:text>
       
  2307 </xsl:text>
       
  2308     <xsl:text>    current_subscribed_page = page_name;
       
  2309 </xsl:text>
       
  2310     <xsl:text>    current_page_index = page_index;
       
  2311 </xsl:text>
       
  2312     <xsl:text>
       
  2313 </xsl:text>
       
  2314     <xsl:text>    jumps_need_update = true;
       
  2315 </xsl:text>
       
  2316     <xsl:text>
       
  2317 </xsl:text>
       
  2318     <xsl:text>    requestHMIAnimation();
       
  2319 </xsl:text>
       
  2320     <xsl:text>
       
  2321 </xsl:text>
       
  2322     <xsl:text>    jump_history.push([page_name, page_index]);
       
  2323 </xsl:text>
       
  2324     <xsl:text>    if(jump_history.length &gt; 42)
       
  2325 </xsl:text>
       
  2326     <xsl:text>        jump_history.shift();
       
  2327 </xsl:text>
       
  2328     <xsl:text>
       
  2329 </xsl:text>
       
  2330     <xsl:text>    return true;
       
  2331 </xsl:text>
  2618 </xsl:text>
  2332     <xsl:text>};
  2619     <xsl:text>};
  2333 </xsl:text>
  2620 </xsl:text>
  2334     <xsl:text>
  2621     <xsl:text>
  2335 </xsl:text>
  2622 </xsl:text>
  2336     <xsl:text>function* chain(a,b){
  2623     <xsl:text>
  2337 </xsl:text>
  2624 </xsl:text>
  2338     <xsl:text>    yield* a;
  2625     <xsl:text>// Once connection established
  2339 </xsl:text>
  2626 </xsl:text>
  2340     <xsl:text>    yield* b;
  2627     <xsl:text>ws.onopen = function (evt) {
       
  2628 </xsl:text>
       
  2629     <xsl:text>    init_widgets();
       
  2630 </xsl:text>
       
  2631     <xsl:text>    send_reset();
       
  2632 </xsl:text>
       
  2633     <xsl:text>    // show main page
       
  2634 </xsl:text>
       
  2635     <xsl:text>    prepare_svg();
       
  2636 </xsl:text>
       
  2637     <xsl:text>    switch_page(default_page);
  2341 </xsl:text>
  2638 </xsl:text>
  2342     <xsl:text>};
  2639     <xsl:text>};
  2343 </xsl:text>
  2640 </xsl:text>
  2344     <xsl:text>
  2641     <xsl:text>
  2345 </xsl:text>
  2642 </xsl:text>
  2346     <xsl:text>function unsubscribe(){
  2643     <xsl:text>ws.onclose = function (evt) {
  2347 </xsl:text>
  2644 </xsl:text>
  2348     <xsl:text>    /* remove subsribers */
  2645     <xsl:text>    // TODO : add visible notification while waiting for reload
  2349 </xsl:text>
  2646 </xsl:text>
  2350     <xsl:text>    for(let index of this.indexes){
  2647     <xsl:text>    console.log("Connection closed. code:"+evt.code+" reason:"+evt.reason+" wasClean:"+evt.wasClean+" Reload in 10s.");
  2351 </xsl:text>
  2648 </xsl:text>
  2352     <xsl:text>        let idx = index + this.offset;
  2649     <xsl:text>    // TODO : re-enable auto reload when not in debug
  2353 </xsl:text>
  2650 </xsl:text>
  2354     <xsl:text>        subscribers[idx].delete(this);
  2651     <xsl:text>    //window.setTimeout(() =&gt; location.reload(true), 10000);
  2355 </xsl:text>
  2652 </xsl:text>
  2356     <xsl:text>    }
  2653     <xsl:text>    alert("Connection closed. code:"+evt.code+" reason:"+evt.reason+" wasClean:"+evt.wasClean+".");
  2357 </xsl:text>
  2654 </xsl:text>
  2358     <xsl:text>    this.offset = 0;
  2655     <xsl:text>
  2359 </xsl:text>
       
  2360     <xsl:text>}
       
  2361 </xsl:text>
       
  2362     <xsl:text>
       
  2363 </xsl:text>
       
  2364     <xsl:text>function subscribe(new_offset=0){
       
  2365 </xsl:text>
       
  2366     <xsl:text>    /* set the offset because relative */
       
  2367 </xsl:text>
       
  2368     <xsl:text>    this.offset = new_offset;
       
  2369 </xsl:text>
       
  2370     <xsl:text>    /* add this's subsribers */
       
  2371 </xsl:text>
       
  2372     <xsl:text>    for(let index of this.indexes){
       
  2373 </xsl:text>
       
  2374     <xsl:text>        subscribers[index + new_offset].add(this);
       
  2375 </xsl:text>
       
  2376     <xsl:text>    }
       
  2377 </xsl:text>
       
  2378     <xsl:text>    need_cache_apply.push(this); 
       
  2379 </xsl:text>
       
  2380     <xsl:text>}
       
  2381 </xsl:text>
       
  2382     <xsl:text>
       
  2383 </xsl:text>
       
  2384     <xsl:text>function foreach_unsubscribe(){
       
  2385 </xsl:text>
       
  2386     <xsl:text>    for(let item of this.items){
       
  2387 </xsl:text>
       
  2388     <xsl:text>        for(let widget of item) {
       
  2389 </xsl:text>
       
  2390     <xsl:text>            unsubscribe.call(widget);
       
  2391 </xsl:text>
       
  2392     <xsl:text>        }
       
  2393 </xsl:text>
       
  2394     <xsl:text>    }
       
  2395 </xsl:text>
       
  2396     <xsl:text>    this.offset = 0;
       
  2397 </xsl:text>
       
  2398     <xsl:text>}
       
  2399 </xsl:text>
       
  2400     <xsl:text>
       
  2401 </xsl:text>
       
  2402     <xsl:text>function foreach_widgets_do(new_offset, todo){
       
  2403 </xsl:text>
       
  2404     <xsl:text>    this.offset = new_offset;
       
  2405 </xsl:text>
       
  2406     <xsl:text>    for(let i = 0; i &lt; this.items.length; i++) {
       
  2407 </xsl:text>
       
  2408     <xsl:text>        let item = this.items[i];
       
  2409 </xsl:text>
       
  2410     <xsl:text>        let orig_item_index = this.index_pool[i];
       
  2411 </xsl:text>
       
  2412     <xsl:text>        let item_index = this.index_pool[i+this.item_offset];
       
  2413 </xsl:text>
       
  2414     <xsl:text>        let item_index_offset = item_index - orig_item_index;
       
  2415 </xsl:text>
       
  2416     <xsl:text>        for(let widget of item) {
       
  2417 </xsl:text>
       
  2418     <xsl:text>            todo.call(widget, new_offset + item_index_offset);
       
  2419 </xsl:text>
       
  2420     <xsl:text>        }
       
  2421 </xsl:text>
       
  2422     <xsl:text>    }
       
  2423 </xsl:text>
       
  2424     <xsl:text>}
       
  2425 </xsl:text>
       
  2426     <xsl:text>
       
  2427 </xsl:text>
       
  2428     <xsl:text>function foreach_subscribe(new_offset=0){
       
  2429 </xsl:text>
       
  2430     <xsl:text>    foreach_widgets_do.call(this, new_offset, subscribe);
       
  2431 </xsl:text>
       
  2432     <xsl:text>}
       
  2433 </xsl:text>
       
  2434     <xsl:text>
       
  2435 </xsl:text>
       
  2436     <xsl:text>function widget_apply_cache() {
       
  2437 </xsl:text>
       
  2438     <xsl:text>    for(let index of this.indexes){
       
  2439 </xsl:text>
       
  2440     <xsl:text>        /* dispatch current cache in newly opened page widgets */
       
  2441 </xsl:text>
       
  2442     <xsl:text>        let realindex = index+this.offset;
       
  2443 </xsl:text>
       
  2444     <xsl:text>        let cached_val = cache[realindex];
       
  2445 </xsl:text>
       
  2446     <xsl:text>        if(cached_val != undefined)
       
  2447 </xsl:text>
       
  2448     <xsl:text>            dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
  2449 </xsl:text>
       
  2450     <xsl:text>    }
       
  2451 </xsl:text>
       
  2452     <xsl:text>}
       
  2453 </xsl:text>
       
  2454     <xsl:text>
       
  2455 </xsl:text>
       
  2456     <xsl:text>function foreach_apply_cache() {
       
  2457 </xsl:text>
       
  2458     <xsl:text>    foreach_widgets_do.call(this, this.offset, widget_apply_cache);
       
  2459 </xsl:text>
       
  2460     <xsl:text>}
       
  2461 </xsl:text>
       
  2462     <xsl:text>
       
  2463 </xsl:text>
       
  2464     <xsl:text>function foreach_onclick(opstr, evt) {
       
  2465 </xsl:text>
       
  2466     <xsl:text>    new_item_offset = eval(String(this.item_offset)+opstr)
       
  2467 </xsl:text>
       
  2468     <xsl:text>    if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  2469 </xsl:text>
       
  2470     <xsl:text>        if(this.item_offset + this.items.length == this.index_pool.length)
       
  2471 </xsl:text>
       
  2472     <xsl:text>            new_item_offset = 0;
       
  2473 </xsl:text>
       
  2474     <xsl:text>        else
       
  2475 </xsl:text>
       
  2476     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  2477 </xsl:text>
       
  2478     <xsl:text>    } else if(new_item_offset &lt; 0) {
       
  2479 </xsl:text>
       
  2480     <xsl:text>        if(this.item_offset == 0)
       
  2481 </xsl:text>
       
  2482     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  2483 </xsl:text>
       
  2484     <xsl:text>        else
       
  2485 </xsl:text>
       
  2486     <xsl:text>            new_item_offset = 0;
       
  2487 </xsl:text>
       
  2488     <xsl:text>    }
       
  2489 </xsl:text>
       
  2490     <xsl:text>    this.item_offset = new_item_offset;
       
  2491 </xsl:text>
       
  2492     <xsl:text>    off = this.offset;
       
  2493 </xsl:text>
       
  2494     <xsl:text>    foreach_unsubscribe.call(this);
       
  2495 </xsl:text>
       
  2496     <xsl:text>    foreach_subscribe.call(this,off);
       
  2497 </xsl:text>
       
  2498     <xsl:text>    update_subscriptions();
       
  2499 </xsl:text>
       
  2500     <xsl:text>    need_cache_apply.push(this);
       
  2501 </xsl:text>
       
  2502     <xsl:text>    jumps_need_update = true;
       
  2503 </xsl:text>
       
  2504     <xsl:text>    requestHMIAnimation();
       
  2505 </xsl:text>
       
  2506     <xsl:text>}
       
  2507 </xsl:text>
       
  2508     <xsl:text>
       
  2509 </xsl:text>
       
  2510     <xsl:text>
       
  2511 </xsl:text>
       
  2512     <xsl:text>function switch_visible_page(page_name) {
       
  2513 </xsl:text>
       
  2514     <xsl:text>
       
  2515 </xsl:text>
       
  2516     <xsl:text>    let old_desc = page_desc[current_visible_page];
       
  2517 </xsl:text>
       
  2518     <xsl:text>    let new_desc = page_desc[page_name];
       
  2519 </xsl:text>
       
  2520     <xsl:text>
       
  2521 </xsl:text>
       
  2522     <xsl:text>    if(old_desc){
       
  2523 </xsl:text>
       
  2524     <xsl:text>        for(let eltid in old_desc.required_detachables){
       
  2525 </xsl:text>
       
  2526     <xsl:text>            if(!(eltid in new_desc.required_detachables)){
       
  2527 </xsl:text>
       
  2528     <xsl:text>                let [element, parent] = old_desc.required_detachables[eltid];
       
  2529 </xsl:text>
       
  2530     <xsl:text>                parent.removeChild(element);
       
  2531 </xsl:text>
       
  2532     <xsl:text>            }
       
  2533 </xsl:text>
       
  2534     <xsl:text>        }
       
  2535 </xsl:text>
       
  2536     <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  2537 </xsl:text>
       
  2538     <xsl:text>            if(!(eltid in old_desc.required_detachables)){
       
  2539 </xsl:text>
       
  2540     <xsl:text>                let [element, parent] = new_desc.required_detachables[eltid];
       
  2541 </xsl:text>
       
  2542     <xsl:text>                parent.appendChild(element);
       
  2543 </xsl:text>
       
  2544     <xsl:text>            }
       
  2545 </xsl:text>
       
  2546     <xsl:text>        }
       
  2547 </xsl:text>
       
  2548     <xsl:text>    }else{
       
  2549 </xsl:text>
       
  2550     <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  2551 </xsl:text>
       
  2552     <xsl:text>            let [element, parent] = new_desc.required_detachables[eltid];
       
  2553 </xsl:text>
       
  2554     <xsl:text>            parent.appendChild(element);
       
  2555 </xsl:text>
       
  2556     <xsl:text>        }
       
  2557 </xsl:text>
       
  2558     <xsl:text>    }
       
  2559 </xsl:text>
       
  2560     <xsl:text>
       
  2561 </xsl:text>
       
  2562     <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
       
  2563 </xsl:text>
       
  2564     <xsl:text>    current_visible_page = page_name;
       
  2565 </xsl:text>
  2656 </xsl:text>
  2566     <xsl:text>};
  2657     <xsl:text>};
  2567 </xsl:text>
  2658 </xsl:text>
  2568     <xsl:text>
  2659     <xsl:text>
  2569 </xsl:text>
  2660 </xsl:text>
  2570     <xsl:text>function update_jumps() {
  2661     <xsl:text>var xmlns = "http://www.w3.org/2000/svg";
  2571 </xsl:text>
  2662 </xsl:text>
  2572     <xsl:text>    page_desc[current_visible_page].jumps.map(w=&gt;w.notify_page_change(current_visible_page,current_page_index));
  2663     <xsl:text>var edit_callback;
  2573 </xsl:text>
  2664 </xsl:text>
  2574     <xsl:text>    jumps_need_update = false;
  2665     <xsl:text>function edit_value(path, valuetype, callback, initial) {
       
  2666 </xsl:text>
       
  2667     <xsl:text>
       
  2668 </xsl:text>
       
  2669     <xsl:text>    let [keypadid, xcoord, ycoord] = keypads[valuetype];
       
  2670 </xsl:text>
       
  2671     <xsl:text>    console.log('XXX TODO : Edit value', path, valuetype, callback, initial, keypadid);
       
  2672 </xsl:text>
       
  2673     <xsl:text>    edit_callback = callback;
       
  2674 </xsl:text>
       
  2675     <xsl:text>    let widget = hmi_widgets[keypadid];
       
  2676 </xsl:text>
       
  2677     <xsl:text>    widget.start_edit(path, valuetype, callback, initial);
  2575 </xsl:text>
  2678 </xsl:text>
  2576     <xsl:text>};
  2679     <xsl:text>};
  2577 </xsl:text>
  2680 </xsl:text>
  2578     <xsl:text>
  2681     <xsl:text>
  2579 </xsl:text>
  2682 </xsl:text>
  2580     <xsl:text>
  2683     <xsl:text>var current_modal; /* TODO stack ?*/
  2581 </xsl:text>
  2684 </xsl:text>
  2582     <xsl:text>// Once connection established
  2685     <xsl:text>
  2583 </xsl:text>
  2686 </xsl:text>
  2584     <xsl:text>ws.onopen = function (evt) {
  2687     <xsl:text>function show_modal() {
  2585 </xsl:text>
  2688 </xsl:text>
  2586     <xsl:text>    init_widgets();
  2689     <xsl:text>    let [element, parent] = detachable_elements[this.element.id];
  2587 </xsl:text>
  2690 </xsl:text>
  2588     <xsl:text>    send_reset();
  2691     <xsl:text>
  2589 </xsl:text>
  2692 </xsl:text>
  2590     <xsl:text>    // show main page
  2693     <xsl:text>    tmpgrp = document.createElementNS(xmlns,"g");
  2591 </xsl:text>
  2694 </xsl:text>
  2592     <xsl:text>    prepare_svg();
  2695     <xsl:text>    tmpgrpattr = document.createAttribute("transform");
  2593 </xsl:text>
  2696 </xsl:text>
  2594     <xsl:text>    switch_page(default_page);
  2697     <xsl:text>
       
  2698 </xsl:text>
       
  2699     <xsl:text>    let [xcoord,ycoord] = this.coordinates;
       
  2700 </xsl:text>
       
  2701     <xsl:text>    let [xdest,ydest] = page_desc[current_visible_page].bbox;
       
  2702 </xsl:text>
       
  2703     <xsl:text>    tmpgrpattr.value = "translate("+String(xdest-xcoord)+","+String(ydest-ycoord)+")";
       
  2704 </xsl:text>
       
  2705     <xsl:text>    tmpgrp.setAttributeNode(tmpgrpattr);
       
  2706 </xsl:text>
       
  2707     <xsl:text>
       
  2708 </xsl:text>
       
  2709     <xsl:text>    tmpgrp.appendChild(element);
       
  2710 </xsl:text>
       
  2711     <xsl:text>    parent.appendChild(tmpgrp);
       
  2712 </xsl:text>
       
  2713     <xsl:text>
       
  2714 </xsl:text>
       
  2715     <xsl:text>    current_modal = [this.element.id, tmpgrp];
  2595 </xsl:text>
  2716 </xsl:text>
  2596     <xsl:text>};
  2717     <xsl:text>};
  2597 </xsl:text>
  2718 </xsl:text>
  2598     <xsl:text>
  2719     <xsl:text>
  2599 </xsl:text>
  2720 </xsl:text>
  2600     <xsl:text>ws.onclose = function (evt) {
  2721     <xsl:text>function end_modal() {
  2601 </xsl:text>
  2722 </xsl:text>
  2602     <xsl:text>    // TODO : add visible notification while waiting for reload
  2723     <xsl:text>    let [eltid, tmpgrp] = current_modal;
  2603 </xsl:text>
  2724 </xsl:text>
  2604     <xsl:text>    console.log("Connection closed. code:"+evt.code+" reason:"+evt.reason+" wasClean:"+evt.wasClean+" Reload in 10s.");
  2725     <xsl:text>    let [element, parent] = detachable_elements[this.element.id];
  2605 </xsl:text>
  2726 </xsl:text>
  2606     <xsl:text>    // TODO : re-enable auto reload when not in debug
  2727     <xsl:text>
  2607 </xsl:text>
  2728 </xsl:text>
  2608     <xsl:text>    //window.setTimeout(() =&gt; location.reload(true), 10000);
  2729     <xsl:text>    parent.removeChild(tmpgrp);
  2609 </xsl:text>
  2730 </xsl:text>
  2610     <xsl:text>    alert("Connection closed. code:"+evt.code+" reason:"+evt.reason+" wasClean:"+evt.wasClean+".");
  2731     <xsl:text>
  2611 </xsl:text>
  2732 </xsl:text>
  2612     <xsl:text>
  2733     <xsl:text>    current_modal = undefined;
  2613 </xsl:text>
  2734 </xsl:text>
  2614     <xsl:text>};
  2735     <xsl:text>};
  2615 </xsl:text>
  2736 </xsl:text>
  2616     <xsl:text>
  2737     <xsl:text>
  2617 </xsl:text>
  2738 </xsl:text>
  2618     <xsl:text>var xmlns = "http://www.w3.org/2000/svg";
  2739     <xsl:text>function widget_active_activable(eltsub) {
  2619 </xsl:text>
  2740 </xsl:text>
  2620     <xsl:text>var edit_callback;
  2741     <xsl:text>    if(eltsub.inactive_style === undefined)
  2621 </xsl:text>
  2742 </xsl:text>
  2622     <xsl:text>function edit_value(path, valuetype, callback, initial) {
  2743     <xsl:text>        eltsub.inactive_style = eltsub.inactive.getAttribute("style");
  2623 </xsl:text>
  2744 </xsl:text>
  2624     <xsl:text>
  2745     <xsl:text>    eltsub.inactive.setAttribute("style", "display:none");
  2625 </xsl:text>
  2746 </xsl:text>
  2626     <xsl:text>    let [keypadid, xcoord, ycoord] = keypads[valuetype];
  2747     <xsl:text>    if(eltsub.active_style !== undefined)
  2627 </xsl:text>
  2748 </xsl:text>
  2628     <xsl:text>    console.log('XXX TODO : Edit value', path, valuetype, callback, initial, keypadid);
  2749     <xsl:text>            eltsub.active.setAttribute("style", eltsub.active_style);
  2629 </xsl:text>
  2750 </xsl:text>
  2630     <xsl:text>    edit_callback = callback;
  2751     <xsl:text>    console.log("active", eltsub);
  2631 </xsl:text>
       
  2632     <xsl:text>    let widget = hmi_widgets[keypadid];
       
  2633 </xsl:text>
       
  2634     <xsl:text>    widget.start_edit(path, valuetype, callback, initial);
       
  2635 </xsl:text>
  2752 </xsl:text>
  2636     <xsl:text>};
  2753     <xsl:text>};
  2637 </xsl:text>
  2754 </xsl:text>
  2638     <xsl:text>
  2755     <xsl:text>function widget_inactive_activable(eltsub) {
  2639 </xsl:text>
  2756 </xsl:text>
  2640     <xsl:text>var current_modal; /* TODO stack ?*/
  2757     <xsl:text>    if(eltsub.active_style === undefined)
  2641 </xsl:text>
  2758 </xsl:text>
  2642     <xsl:text>
  2759     <xsl:text>        eltsub.active_style = eltsub.active.getAttribute("style");
  2643 </xsl:text>
  2760 </xsl:text>
  2644     <xsl:text>function show_modal() {
  2761     <xsl:text>    eltsub.active.setAttribute("style", "display:none");
  2645 </xsl:text>
  2762 </xsl:text>
  2646     <xsl:text>    let [element, parent] = detachable_elements[this.element.id];
  2763     <xsl:text>    if(eltsub.inactive_style !== undefined)
  2647 </xsl:text>
  2764 </xsl:text>
  2648     <xsl:text>
  2765     <xsl:text>            eltsub.inactive.setAttribute("style", eltsub.inactive_style);
  2649 </xsl:text>
  2766 </xsl:text>
  2650     <xsl:text>    tmpgrp = document.createElementNS(xmlns,"g");
  2767     <xsl:text>    console.log("inactive", eltsub);
  2651 </xsl:text>
       
  2652     <xsl:text>    tmpgrpattr = document.createAttribute("transform");
       
  2653 </xsl:text>
       
  2654     <xsl:text>
       
  2655 </xsl:text>
       
  2656     <xsl:text>    let [xcoord,ycoord] = this.coordinates;
       
  2657 </xsl:text>
       
  2658     <xsl:text>    let [xdest,ydest] = page_desc[current_visible_page].bbox;
       
  2659 </xsl:text>
       
  2660     <xsl:text>    tmpgrpattr.value = "translate("+String(xdest-xcoord)+","+String(ydest-ycoord)+")";
       
  2661 </xsl:text>
       
  2662     <xsl:text>    tmpgrp.setAttributeNode(tmpgrpattr);
       
  2663 </xsl:text>
       
  2664     <xsl:text>
       
  2665 </xsl:text>
       
  2666     <xsl:text>    tmpgrp.appendChild(element);
       
  2667 </xsl:text>
       
  2668     <xsl:text>    parent.appendChild(tmpgrp);
       
  2669 </xsl:text>
       
  2670     <xsl:text>
       
  2671 </xsl:text>
       
  2672     <xsl:text>    current_modal = [this.element.id, tmpgrp];
       
  2673 </xsl:text>
  2768 </xsl:text>
  2674     <xsl:text>};
  2769     <xsl:text>};
  2675 </xsl:text>
  2770 </xsl:text>
  2676     <xsl:text>
       
  2677 </xsl:text>
       
  2678     <xsl:text>function end_modal() {
       
  2679 </xsl:text>
       
  2680     <xsl:text>    let [eltid, tmpgrp] = current_modal;
       
  2681 </xsl:text>
       
  2682     <xsl:text>    let [element, parent] = detachable_elements[this.element.id];
       
  2683 </xsl:text>
       
  2684     <xsl:text>
       
  2685 </xsl:text>
       
  2686     <xsl:text>    parent.removeChild(tmpgrp);
       
  2687 </xsl:text>
       
  2688     <xsl:text>
       
  2689 </xsl:text>
       
  2690     <xsl:text>    current_modal = undefined;
       
  2691 </xsl:text>
       
  2692     <xsl:text>};
       
  2693 </xsl:text>
       
  2694     <xsl:text>
       
  2695 </xsl:text>
       
  2696     <xsl:text>function widget_active_activable(eltsub) {
       
  2697 </xsl:text>
       
  2698     <xsl:text>    if(eltsub.inactive_style === undefined)
       
  2699 </xsl:text>
       
  2700     <xsl:text>        eltsub.inactive_style = eltsub.inactive.getAttribute("style");
       
  2701 </xsl:text>
       
  2702     <xsl:text>    eltsub.inactive.setAttribute("style", "display:none");
       
  2703 </xsl:text>
       
  2704     <xsl:text>    if(eltsub.active_style !== undefined)
       
  2705 </xsl:text>
       
  2706     <xsl:text>            eltsub.active.setAttribute("style", eltsub.active_style);
       
  2707 </xsl:text>
       
  2708     <xsl:text>    console.log("active", eltsub);
       
  2709 </xsl:text>
       
  2710     <xsl:text>};
       
  2711 </xsl:text>
       
  2712     <xsl:text>function widget_inactive_activable(eltsub) {
       
  2713 </xsl:text>
       
  2714     <xsl:text>    if(eltsub.active_style === undefined)
       
  2715 </xsl:text>
       
  2716     <xsl:text>        eltsub.active_style = eltsub.active.getAttribute("style");
       
  2717 </xsl:text>
       
  2718     <xsl:text>    eltsub.active.setAttribute("style", "display:none");
       
  2719 </xsl:text>
       
  2720     <xsl:text>    if(eltsub.inactive_style !== undefined)
       
  2721 </xsl:text>
       
  2722     <xsl:text>            eltsub.inactive.setAttribute("style", eltsub.inactive_style);
       
  2723 </xsl:text>
       
  2724     <xsl:text>    console.log("inactive", eltsub);
       
  2725 </xsl:text>
       
  2726     <xsl:text>};
       
  2727 </xsl:text>
       
  2728   </xsl:template>
  2771   </xsl:template>
  2729 </xsl:stylesheet>
  2772 </xsl:stylesheet>