svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2942 b07ad97e6019
parent 2941 ef13a4007538
child 2943 304e88bae115
equal deleted inserted replaced
2941:ef13a4007538 2942:b07ad97e6019
  1542     <xsl:text>    unsub: foreach_unsubscribe,
  1542     <xsl:text>    unsub: foreach_unsubscribe,
  1543 </xsl:text>
  1543 </xsl:text>
  1544     <xsl:text>    apply_cache: foreach_apply_cache,
  1544     <xsl:text>    apply_cache: foreach_apply_cache,
  1545 </xsl:text>
  1545 </xsl:text>
  1546   </xsl:template>
  1546   </xsl:template>
       
  1547   <epilogue:foreach/>
       
  1548   <xsl:template match="epilogue:foreach">
       
  1549     <xsl:text>function foreach_unsubscribe(){
       
  1550 </xsl:text>
       
  1551     <xsl:text>    for(let item of this.items){
       
  1552 </xsl:text>
       
  1553     <xsl:text>        for(let widget of item) {
       
  1554 </xsl:text>
       
  1555     <xsl:text>            unsubscribe.call(widget);
       
  1556 </xsl:text>
       
  1557     <xsl:text>        }
       
  1558 </xsl:text>
       
  1559     <xsl:text>    }
       
  1560 </xsl:text>
       
  1561     <xsl:text>    this.offset = 0;
       
  1562 </xsl:text>
       
  1563     <xsl:text>}
       
  1564 </xsl:text>
       
  1565     <xsl:text>
       
  1566 </xsl:text>
       
  1567     <xsl:text>function foreach_widgets_do(new_offset, todo){
       
  1568 </xsl:text>
       
  1569     <xsl:text>    this.offset = new_offset;
       
  1570 </xsl:text>
       
  1571     <xsl:text>    for(let i = 0; i &lt; this.items.length; i++) {
       
  1572 </xsl:text>
       
  1573     <xsl:text>        let item = this.items[i];
       
  1574 </xsl:text>
       
  1575     <xsl:text>        let orig_item_index = this.index_pool[i];
       
  1576 </xsl:text>
       
  1577     <xsl:text>        let item_index = this.index_pool[i+this.item_offset];
       
  1578 </xsl:text>
       
  1579     <xsl:text>        let item_index_offset = item_index - orig_item_index;
       
  1580 </xsl:text>
       
  1581     <xsl:text>        for(let widget of item) {
       
  1582 </xsl:text>
       
  1583     <xsl:text>            todo.call(widget, new_offset + item_index_offset);
       
  1584 </xsl:text>
       
  1585     <xsl:text>        }
       
  1586 </xsl:text>
       
  1587     <xsl:text>    }
       
  1588 </xsl:text>
       
  1589     <xsl:text>}
       
  1590 </xsl:text>
       
  1591     <xsl:text>
       
  1592 </xsl:text>
       
  1593     <xsl:text>function foreach_subscribe(new_offset=0){
       
  1594 </xsl:text>
       
  1595     <xsl:text>    foreach_widgets_do.call(this, new_offset, subscribe);
       
  1596 </xsl:text>
       
  1597     <xsl:text>}
       
  1598 </xsl:text>
       
  1599     <xsl:text>
       
  1600 </xsl:text>
       
  1601     <xsl:text>function foreach_apply_cache() {
       
  1602 </xsl:text>
       
  1603     <xsl:text>    foreach_widgets_do.call(this, this.offset, widget_apply_cache);
       
  1604 </xsl:text>
       
  1605     <xsl:text>}
       
  1606 </xsl:text>
       
  1607     <xsl:text>
       
  1608 </xsl:text>
       
  1609     <xsl:text>function foreach_onclick(opstr, evt) {
       
  1610 </xsl:text>
       
  1611     <xsl:text>    new_item_offset = eval(String(this.item_offset)+opstr)
       
  1612 </xsl:text>
       
  1613     <xsl:text>    if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  1614 </xsl:text>
       
  1615     <xsl:text>        if(this.item_offset + this.items.length == this.index_pool.length)
       
  1616 </xsl:text>
       
  1617     <xsl:text>            new_item_offset = 0;
       
  1618 </xsl:text>
       
  1619     <xsl:text>        else
       
  1620 </xsl:text>
       
  1621     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  1622 </xsl:text>
       
  1623     <xsl:text>    } else if(new_item_offset &lt; 0) {
       
  1624 </xsl:text>
       
  1625     <xsl:text>        if(this.item_offset == 0)
       
  1626 </xsl:text>
       
  1627     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  1628 </xsl:text>
       
  1629     <xsl:text>        else
       
  1630 </xsl:text>
       
  1631     <xsl:text>            new_item_offset = 0;
       
  1632 </xsl:text>
       
  1633     <xsl:text>    }
       
  1634 </xsl:text>
       
  1635     <xsl:text>    this.item_offset = new_item_offset;
       
  1636 </xsl:text>
       
  1637     <xsl:text>    off = this.offset;
       
  1638 </xsl:text>
       
  1639     <xsl:text>    foreach_unsubscribe.call(this);
       
  1640 </xsl:text>
       
  1641     <xsl:text>    foreach_subscribe.call(this,off);
       
  1642 </xsl:text>
       
  1643     <xsl:text>    update_subscriptions();
       
  1644 </xsl:text>
       
  1645     <xsl:text>    need_cache_apply.push(this);
       
  1646 </xsl:text>
       
  1647     <xsl:text>    jumps_need_update = true;
       
  1648 </xsl:text>
       
  1649     <xsl:text>    requestHMIAnimation();
       
  1650 </xsl:text>
       
  1651     <xsl:text>}
       
  1652 </xsl:text>
       
  1653     <xsl:text>
       
  1654 </xsl:text>
       
  1655   </xsl:template>
  1547   <xsl:template mode="widget_defs" match="widget[@type='Input']">
  1656   <xsl:template mode="widget_defs" match="widget[@type='Input']">
  1548     <xsl:param name="hmi_element"/>
  1657     <xsl:param name="hmi_element"/>
  1549     <xsl:variable name="value_elt">
  1658     <xsl:variable name="value_elt">
  1550       <xsl:call-template name="defs_by_labels">
  1659       <xsl:call-template name="defs_by_labels">
  1551         <xsl:with-param name="hmi_element" select="$hmi_element"/>
  1660         <xsl:with-param name="hmi_element" select="$hmi_element"/>
  1845           <xsl:text>")</xsl:text>
  1954           <xsl:text>")</xsl:text>
  1846         </xsl:message>
  1955         </xsl:message>
  1847       </xsl:if>
  1956       </xsl:if>
  1848     </xsl:if>
  1957     </xsl:if>
  1849   </xsl:template>
  1958   </xsl:template>
       
  1959   <epilogue:jump/>
       
  1960   <xsl:template match="epilogue:jump">
       
  1961     <xsl:text>var jumps_need_update = false;
       
  1962 </xsl:text>
       
  1963     <xsl:text>var jump_history = [[default_page, undefined]];
       
  1964 </xsl:text>
       
  1965     <xsl:text>
       
  1966 </xsl:text>
       
  1967     <xsl:text>function update_jumps() {
       
  1968 </xsl:text>
       
  1969     <xsl:text>    page_desc[current_visible_page].jumps.map(w=&gt;w.notify_page_change(current_visible_page,current_page_index));
       
  1970 </xsl:text>
       
  1971     <xsl:text>    jumps_need_update = false;
       
  1972 </xsl:text>
       
  1973     <xsl:text>};
       
  1974 </xsl:text>
       
  1975     <xsl:text>
       
  1976 </xsl:text>
       
  1977   </xsl:template>
  1850   <epilogue:keypad/>
  1978   <epilogue:keypad/>
  1851   <xsl:template match="epilogue:keypad">
  1979   <xsl:template match="epilogue:keypad">
  1852     <xsl:text>
  1980     <xsl:text>
  1853 </xsl:text>
  1981 </xsl:text>
  1854     <xsl:text>var keypads = {
  1982     <xsl:text>var keypads = {
  2223 </xsl:text>
  2351 </xsl:text>
  2224           <xsl:text>var updates = {};
  2352           <xsl:text>var updates = {};
  2225 </xsl:text>
  2353 </xsl:text>
  2226           <xsl:text>var need_cache_apply = []; 
  2354           <xsl:text>var need_cache_apply = []; 
  2227 </xsl:text>
  2355 </xsl:text>
  2228           <xsl:text>var jumps_need_update = false;
       
  2229 </xsl:text>
       
  2230           <xsl:text>var jump_history = [[default_page, undefined]];
       
  2231 </xsl:text>
       
  2232           <xsl:text>
  2356           <xsl:text>
  2233 </xsl:text>
  2357 </xsl:text>
  2234           <xsl:text>function dispatch_value_to_widget(widget, index, value, oldval) {
  2358           <xsl:text>function dispatch_value_to_widget(widget, index, value, oldval) {
  2235 </xsl:text>
  2359 </xsl:text>
  2236           <xsl:text>    try {
  2360           <xsl:text>    try {
  2919 </xsl:text>
  3043 </xsl:text>
  2920           <xsl:text>}
  3044           <xsl:text>}
  2921 </xsl:text>
  3045 </xsl:text>
  2922           <xsl:text>
  3046           <xsl:text>
  2923 </xsl:text>
  3047 </xsl:text>
  2924           <xsl:text>function foreach_unsubscribe(){
  3048           <xsl:text>function widget_apply_cache() {
  2925 </xsl:text>
  3049 </xsl:text>
  2926           <xsl:text>    for(let item of this.items){
  3050           <xsl:text>    for(let index of this.indexes){
  2927 </xsl:text>
  3051 </xsl:text>
  2928           <xsl:text>        for(let widget of item) {
  3052           <xsl:text>        /* dispatch current cache in newly opened page widgets */
  2929 </xsl:text>
  3053 </xsl:text>
  2930           <xsl:text>            unsubscribe.call(widget);
  3054           <xsl:text>        let realindex = index+this.offset;
       
  3055 </xsl:text>
       
  3056           <xsl:text>        let cached_val = cache[realindex];
       
  3057 </xsl:text>
       
  3058           <xsl:text>        if(cached_val != undefined)
       
  3059 </xsl:text>
       
  3060           <xsl:text>            dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
  3061 </xsl:text>
       
  3062           <xsl:text>    }
       
  3063 </xsl:text>
       
  3064           <xsl:text>}
       
  3065 </xsl:text>
       
  3066           <xsl:text>
       
  3067 </xsl:text>
       
  3068           <xsl:text>function switch_visible_page(page_name) {
       
  3069 </xsl:text>
       
  3070           <xsl:text>
       
  3071 </xsl:text>
       
  3072           <xsl:text>    let old_desc = page_desc[current_visible_page];
       
  3073 </xsl:text>
       
  3074           <xsl:text>    let new_desc = page_desc[page_name];
       
  3075 </xsl:text>
       
  3076           <xsl:text>
       
  3077 </xsl:text>
       
  3078           <xsl:text>    if(old_desc){
       
  3079 </xsl:text>
       
  3080           <xsl:text>        for(let eltid in old_desc.required_detachables){
       
  3081 </xsl:text>
       
  3082           <xsl:text>            if(!(eltid in new_desc.required_detachables)){
       
  3083 </xsl:text>
       
  3084           <xsl:text>                let [element, parent] = old_desc.required_detachables[eltid];
       
  3085 </xsl:text>
       
  3086           <xsl:text>                parent.removeChild(element);
       
  3087 </xsl:text>
       
  3088           <xsl:text>            }
  2931 </xsl:text>
  3089 </xsl:text>
  2932           <xsl:text>        }
  3090           <xsl:text>        }
  2933 </xsl:text>
  3091 </xsl:text>
       
  3092           <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  3093 </xsl:text>
       
  3094           <xsl:text>            if(!(eltid in old_desc.required_detachables)){
       
  3095 </xsl:text>
       
  3096           <xsl:text>                let [element, parent] = new_desc.required_detachables[eltid];
       
  3097 </xsl:text>
       
  3098           <xsl:text>                parent.appendChild(element);
       
  3099 </xsl:text>
       
  3100           <xsl:text>            }
       
  3101 </xsl:text>
       
  3102           <xsl:text>        }
       
  3103 </xsl:text>
       
  3104           <xsl:text>    }else{
       
  3105 </xsl:text>
       
  3106           <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  3107 </xsl:text>
       
  3108           <xsl:text>            let [element, parent] = new_desc.required_detachables[eltid];
       
  3109 </xsl:text>
       
  3110           <xsl:text>            parent.appendChild(element);
       
  3111 </xsl:text>
       
  3112           <xsl:text>        }
       
  3113 </xsl:text>
  2934           <xsl:text>    }
  3114           <xsl:text>    }
  2935 </xsl:text>
  3115 </xsl:text>
  2936           <xsl:text>    this.offset = 0;
       
  2937 </xsl:text>
       
  2938           <xsl:text>}
       
  2939 </xsl:text>
       
  2940           <xsl:text>
       
  2941 </xsl:text>
       
  2942           <xsl:text>function foreach_widgets_do(new_offset, todo){
       
  2943 </xsl:text>
       
  2944           <xsl:text>    this.offset = new_offset;
       
  2945 </xsl:text>
       
  2946           <xsl:text>    for(let i = 0; i &lt; this.items.length; i++) {
       
  2947 </xsl:text>
       
  2948           <xsl:text>        let item = this.items[i];
       
  2949 </xsl:text>
       
  2950           <xsl:text>        let orig_item_index = this.index_pool[i];
       
  2951 </xsl:text>
       
  2952           <xsl:text>        let item_index = this.index_pool[i+this.item_offset];
       
  2953 </xsl:text>
       
  2954           <xsl:text>        let item_index_offset = item_index - orig_item_index;
       
  2955 </xsl:text>
       
  2956           <xsl:text>        for(let widget of item) {
       
  2957 </xsl:text>
       
  2958           <xsl:text>            todo.call(widget, new_offset + item_index_offset);
       
  2959 </xsl:text>
       
  2960           <xsl:text>        }
       
  2961 </xsl:text>
       
  2962           <xsl:text>    }
       
  2963 </xsl:text>
       
  2964           <xsl:text>}
       
  2965 </xsl:text>
       
  2966           <xsl:text>
       
  2967 </xsl:text>
       
  2968           <xsl:text>function foreach_subscribe(new_offset=0){
       
  2969 </xsl:text>
       
  2970           <xsl:text>    foreach_widgets_do.call(this, new_offset, subscribe);
       
  2971 </xsl:text>
       
  2972           <xsl:text>}
       
  2973 </xsl:text>
       
  2974           <xsl:text>
       
  2975 </xsl:text>
       
  2976           <xsl:text>function widget_apply_cache() {
       
  2977 </xsl:text>
       
  2978           <xsl:text>    for(let index of this.indexes){
       
  2979 </xsl:text>
       
  2980           <xsl:text>        /* dispatch current cache in newly opened page widgets */
       
  2981 </xsl:text>
       
  2982           <xsl:text>        let realindex = index+this.offset;
       
  2983 </xsl:text>
       
  2984           <xsl:text>        let cached_val = cache[realindex];
       
  2985 </xsl:text>
       
  2986           <xsl:text>        if(cached_val != undefined)
       
  2987 </xsl:text>
       
  2988           <xsl:text>            dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
  2989 </xsl:text>
       
  2990           <xsl:text>    }
       
  2991 </xsl:text>
       
  2992           <xsl:text>}
       
  2993 </xsl:text>
       
  2994           <xsl:text>
       
  2995 </xsl:text>
       
  2996           <xsl:text>function foreach_apply_cache() {
       
  2997 </xsl:text>
       
  2998           <xsl:text>    foreach_widgets_do.call(this, this.offset, widget_apply_cache);
       
  2999 </xsl:text>
       
  3000           <xsl:text>}
       
  3001 </xsl:text>
       
  3002           <xsl:text>
       
  3003 </xsl:text>
       
  3004           <xsl:text>function foreach_onclick(opstr, evt) {
       
  3005 </xsl:text>
       
  3006           <xsl:text>    new_item_offset = eval(String(this.item_offset)+opstr)
       
  3007 </xsl:text>
       
  3008           <xsl:text>    if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  3009 </xsl:text>
       
  3010           <xsl:text>        if(this.item_offset + this.items.length == this.index_pool.length)
       
  3011 </xsl:text>
       
  3012           <xsl:text>            new_item_offset = 0;
       
  3013 </xsl:text>
       
  3014           <xsl:text>        else
       
  3015 </xsl:text>
       
  3016           <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  3017 </xsl:text>
       
  3018           <xsl:text>    } else if(new_item_offset &lt; 0) {
       
  3019 </xsl:text>
       
  3020           <xsl:text>        if(this.item_offset == 0)
       
  3021 </xsl:text>
       
  3022           <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  3023 </xsl:text>
       
  3024           <xsl:text>        else
       
  3025 </xsl:text>
       
  3026           <xsl:text>            new_item_offset = 0;
       
  3027 </xsl:text>
       
  3028           <xsl:text>    }
       
  3029 </xsl:text>
       
  3030           <xsl:text>    this.item_offset = new_item_offset;
       
  3031 </xsl:text>
       
  3032           <xsl:text>    off = this.offset;
       
  3033 </xsl:text>
       
  3034           <xsl:text>    foreach_unsubscribe.call(this);
       
  3035 </xsl:text>
       
  3036           <xsl:text>    foreach_subscribe.call(this,off);
       
  3037 </xsl:text>
       
  3038           <xsl:text>    update_subscriptions();
       
  3039 </xsl:text>
       
  3040           <xsl:text>    need_cache_apply.push(this);
       
  3041 </xsl:text>
       
  3042           <xsl:text>    jumps_need_update = true;
       
  3043 </xsl:text>
       
  3044           <xsl:text>    requestHMIAnimation();
       
  3045 </xsl:text>
       
  3046           <xsl:text>}
       
  3047 </xsl:text>
       
  3048           <xsl:text>
       
  3049 </xsl:text>
       
  3050           <xsl:text>
       
  3051 </xsl:text>
       
  3052           <xsl:text>function switch_visible_page(page_name) {
       
  3053 </xsl:text>
       
  3054           <xsl:text>
       
  3055 </xsl:text>
       
  3056           <xsl:text>    let old_desc = page_desc[current_visible_page];
       
  3057 </xsl:text>
       
  3058           <xsl:text>    let new_desc = page_desc[page_name];
       
  3059 </xsl:text>
       
  3060           <xsl:text>
       
  3061 </xsl:text>
       
  3062           <xsl:text>    if(old_desc){
       
  3063 </xsl:text>
       
  3064           <xsl:text>        for(let eltid in old_desc.required_detachables){
       
  3065 </xsl:text>
       
  3066           <xsl:text>            if(!(eltid in new_desc.required_detachables)){
       
  3067 </xsl:text>
       
  3068           <xsl:text>                let [element, parent] = old_desc.required_detachables[eltid];
       
  3069 </xsl:text>
       
  3070           <xsl:text>                parent.removeChild(element);
       
  3071 </xsl:text>
       
  3072           <xsl:text>            }
       
  3073 </xsl:text>
       
  3074           <xsl:text>        }
       
  3075 </xsl:text>
       
  3076           <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  3077 </xsl:text>
       
  3078           <xsl:text>            if(!(eltid in old_desc.required_detachables)){
       
  3079 </xsl:text>
       
  3080           <xsl:text>                let [element, parent] = new_desc.required_detachables[eltid];
       
  3081 </xsl:text>
       
  3082           <xsl:text>                parent.appendChild(element);
       
  3083 </xsl:text>
       
  3084           <xsl:text>            }
       
  3085 </xsl:text>
       
  3086           <xsl:text>        }
       
  3087 </xsl:text>
       
  3088           <xsl:text>    }else{
       
  3089 </xsl:text>
       
  3090           <xsl:text>        for(let eltid in new_desc.required_detachables){
       
  3091 </xsl:text>
       
  3092           <xsl:text>            let [element, parent] = new_desc.required_detachables[eltid];
       
  3093 </xsl:text>
       
  3094           <xsl:text>            parent.appendChild(element);
       
  3095 </xsl:text>
       
  3096           <xsl:text>        }
       
  3097 </xsl:text>
       
  3098           <xsl:text>    }
       
  3099 </xsl:text>
       
  3100           <xsl:text>
  3116           <xsl:text>
  3101 </xsl:text>
  3117 </xsl:text>
  3102           <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
  3118           <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
  3103 </xsl:text>
  3119 </xsl:text>
  3104           <xsl:text>    current_visible_page = page_name;
  3120           <xsl:text>    current_visible_page = page_name;
  3105 </xsl:text>
  3121 </xsl:text>
  3106           <xsl:text>};
  3122           <xsl:text>};
  3107 </xsl:text>
       
  3108           <xsl:text>
       
  3109 </xsl:text>
       
  3110           <xsl:text>function update_jumps() {
       
  3111 </xsl:text>
       
  3112           <xsl:text>    page_desc[current_visible_page].jumps.map(w=&gt;w.notify_page_change(current_visible_page,current_page_index));
       
  3113 </xsl:text>
       
  3114           <xsl:text>    jumps_need_update = false;
       
  3115 </xsl:text>
       
  3116           <xsl:text>};
       
  3117 </xsl:text>
       
  3118           <xsl:text>
       
  3119 </xsl:text>
  3123 </xsl:text>
  3120           <xsl:text>
  3124           <xsl:text>
  3121 </xsl:text>
  3125 </xsl:text>
  3122           <xsl:text>// Once connection established
  3126           <xsl:text>// Once connection established
  3123 </xsl:text>
  3127 </xsl:text>