svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 3141 6d4c1e6560ac
parent 3134 af558c9a5141
child 3147 910290aec533
equal deleted inserted replaced
3140:cae53fe54cf2 3141:6d4c1e6560ac
  1242 </xsl:text>
  1242 </xsl:text>
  1243     <xsl:text>    if(defaultval != undefined) {
  1243     <xsl:text>    if(defaultval != undefined) {
  1244 </xsl:text>
  1244 </xsl:text>
  1245     <xsl:text>        cache[new_index] = defaultval; 
  1245     <xsl:text>        cache[new_index] = defaultval; 
  1246 </xsl:text>
  1246 </xsl:text>
       
  1247     <xsl:text>        updates[new_index] = defaultval;
       
  1248 </xsl:text>
  1247     <xsl:text>        if(persistent_locals.has(varname))
  1249     <xsl:text>        if(persistent_locals.has(varname))
  1248 </xsl:text>
  1250 </xsl:text>
  1249     <xsl:text>            persistent_indexes.set(new_index, varname);
  1251     <xsl:text>            persistent_indexes.set(new_index, varname);
  1250 </xsl:text>
  1252 </xsl:text>
  1251     <xsl:text>    }
  1253     <xsl:text>    }
  1303 </xsl:text>
  1305 </xsl:text>
  1304     <xsl:text>        this.minmaxes = minmaxes;
  1306     <xsl:text>        this.minmaxes = minmaxes;
  1305 </xsl:text>
  1307 </xsl:text>
  1306     <xsl:text>        Object.keys(members).forEach(prop =&gt; this[prop]=members[prop]);
  1308     <xsl:text>        Object.keys(members).forEach(prop =&gt; this[prop]=members[prop]);
  1307 </xsl:text>
  1309 </xsl:text>
       
  1310     <xsl:text>        this.lastapply = indexes.map(() =&gt; undefined);
       
  1311 </xsl:text>
       
  1312     <xsl:text>        this.inhibit = indexes.map(() =&gt; undefined);
       
  1313 </xsl:text>
       
  1314     <xsl:text>        this.pending = indexes.map(() =&gt; undefined);
       
  1315 </xsl:text>
       
  1316     <xsl:text>        this.bound_unhinibit = this.unhinibit.bind(this);
       
  1317 </xsl:text>
  1308     <xsl:text>    }
  1318     <xsl:text>    }
  1309 </xsl:text>
  1319 </xsl:text>
  1310     <xsl:text>
  1320     <xsl:text>
  1311 </xsl:text>
  1321 </xsl:text>
  1312     <xsl:text>    unsub(){
  1322     <xsl:text>    unsub(){
  1315 </xsl:text>
  1325 </xsl:text>
  1316     <xsl:text>        if(!this.unsubscribable)
  1326     <xsl:text>        if(!this.unsubscribable)
  1317 </xsl:text>
  1327 </xsl:text>
  1318     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
  1328     <xsl:text>            for(let i = 0; i &lt; this.indexes.length; i++) {
  1319 </xsl:text>
  1329 </xsl:text>
       
  1330     <xsl:text>                /* flush updates pending because of inhibition */
       
  1331 </xsl:text>
       
  1332     <xsl:text>                let inhibition = this.inhibit[index];
       
  1333 </xsl:text>
       
  1334     <xsl:text>                if(inhibition != undefined){
       
  1335 </xsl:text>
       
  1336     <xsl:text>                    clearTimeout(inhibition);
       
  1337 </xsl:text>
       
  1338     <xsl:text>                    this.lastapply[index] = undefined;
       
  1339 </xsl:text>
       
  1340     <xsl:text>                    this.unhinibit(index);
       
  1341 </xsl:text>
       
  1342     <xsl:text>                }
       
  1343 </xsl:text>
  1320     <xsl:text>                let index = this.indexes[i];
  1344     <xsl:text>                let index = this.indexes[i];
  1321 </xsl:text>
  1345 </xsl:text>
  1322     <xsl:text>                if(this.relativeness[i])
  1346     <xsl:text>                if(this.relativeness[i])
  1323 </xsl:text>
  1347 </xsl:text>
  1324     <xsl:text>                    index += this.offset;
  1348     <xsl:text>                    index += this.offset;
  1469 </xsl:text>
  1493 </xsl:text>
  1470     <xsl:text>    }
  1494     <xsl:text>    }
  1471 </xsl:text>
  1495 </xsl:text>
  1472     <xsl:text>
  1496     <xsl:text>
  1473 </xsl:text>
  1497 </xsl:text>
       
  1498     <xsl:text>    _apply_hmi_value(index, new_val) {
       
  1499 </xsl:text>
       
  1500     <xsl:text>        let realindex = this.get_variable_index(index);
       
  1501 </xsl:text>
       
  1502     <xsl:text>        if(realindex == undefined) return undefined;
       
  1503 </xsl:text>
       
  1504     <xsl:text>        new_val = this.clip_min_max(index, new_val);
       
  1505 </xsl:text>
       
  1506     <xsl:text>        return apply_hmi_value(realindex, new_val);
       
  1507 </xsl:text>
       
  1508     <xsl:text>    }
       
  1509 </xsl:text>
       
  1510     <xsl:text>
       
  1511 </xsl:text>
       
  1512     <xsl:text>    unhinibit(index){
       
  1513 </xsl:text>
       
  1514     <xsl:text>        this.inhibit[index] = undefined;
       
  1515 </xsl:text>
       
  1516     <xsl:text>        let new_val = this.pending[index];
       
  1517 </xsl:text>
       
  1518     <xsl:text>        this.pending[index] = undefined;
       
  1519 </xsl:text>
       
  1520     <xsl:text>        return this.apply_hmi_value(index, new_val);
       
  1521 </xsl:text>
       
  1522     <xsl:text>    }
       
  1523 </xsl:text>
       
  1524     <xsl:text>
       
  1525 </xsl:text>
  1474     <xsl:text>    apply_hmi_value(index, new_val) {
  1526     <xsl:text>    apply_hmi_value(index, new_val) {
  1475 </xsl:text>
  1527 </xsl:text>
  1476     <xsl:text>        let realindex = this.get_variable_index(index);
  1528     <xsl:text>        if(this.inhibit[index] == undefined){
  1477 </xsl:text>
  1529 </xsl:text>
  1478     <xsl:text>        if(realindex == undefined) return undefined;
  1530     <xsl:text>            let now = Date.now();
  1479 </xsl:text>
  1531 </xsl:text>
  1480     <xsl:text>        new_val = this.clip_min_max(index, new_val);
  1532     <xsl:text>            let min_interval = 1000/this.frequency;
  1481 </xsl:text>
  1533 </xsl:text>
  1482     <xsl:text>        return apply_hmi_value(realindex, new_val);
  1534     <xsl:text>            let lastapply = this.lastapply[index];
       
  1535 </xsl:text>
       
  1536     <xsl:text>            if(lastapply == undefined || now &gt; lastapply + min_interval){
       
  1537 </xsl:text>
       
  1538     <xsl:text>                this.lastapply[index] = now;
       
  1539 </xsl:text>
       
  1540     <xsl:text>                return this._apply_hmi_value(index, new_val);
       
  1541 </xsl:text>
       
  1542     <xsl:text>            }
       
  1543 </xsl:text>
       
  1544     <xsl:text>            else {
       
  1545 </xsl:text>
       
  1546     <xsl:text>                let elapsed = now - lastapply;
       
  1547 </xsl:text>
       
  1548     <xsl:text>                this.pending[index] = new_val;
       
  1549 </xsl:text>
       
  1550     <xsl:text>                this.inhibit[index] = setTimeout(this.bound_unhinibit, min_interval - elapsed, index);
       
  1551 </xsl:text>
       
  1552     <xsl:text>            }
       
  1553 </xsl:text>
       
  1554     <xsl:text>        }
       
  1555 </xsl:text>
       
  1556     <xsl:text>        else {
       
  1557 </xsl:text>
       
  1558     <xsl:text>            this.pending[index] = new_val;
       
  1559 </xsl:text>
       
  1560     <xsl:text>            return new_val;
       
  1561 </xsl:text>
       
  1562     <xsl:text>        }
  1483 </xsl:text>
  1563 </xsl:text>
  1484     <xsl:text>    }
  1564     <xsl:text>    }
  1485 </xsl:text>
  1565 </xsl:text>
  1486     <xsl:text>
  1566     <xsl:text>
  1487 </xsl:text>
  1567 </xsl:text>
  5499 </xsl:text>
  5579 </xsl:text>
  5500     </xsl:for-each>
  5580     </xsl:for-each>
  5501     <xsl:text>    ],
  5581     <xsl:text>    ],
  5502 </xsl:text>
  5582 </xsl:text>
  5503   </xsl:template>
  5583   </xsl:template>
       
  5584   <xsl:template mode="widget_class" match="widget[@type='ScrollBar']">
       
  5585     <xsl:text>class ScrollBarWidget extends Widget{
       
  5586 </xsl:text>
       
  5587     <xsl:text>    frequency = 10;
       
  5588 </xsl:text>
       
  5589     <xsl:text>    position = undefined;
       
  5590 </xsl:text>
       
  5591     <xsl:text>    range = undefined;
       
  5592 </xsl:text>
       
  5593     <xsl:text>    size = undefined;
       
  5594 </xsl:text>
       
  5595     <xsl:text>    mincursize = 0.1;
       
  5596 </xsl:text>
       
  5597     <xsl:text>
       
  5598 </xsl:text>
       
  5599     <xsl:text>    dispatch(value,oldval, index) {
       
  5600 </xsl:text>
       
  5601     <xsl:text>        switch(index) {
       
  5602 </xsl:text>
       
  5603     <xsl:text>            case 0:
       
  5604 </xsl:text>
       
  5605     <xsl:text>                if (Math.round(this.position) != value)
       
  5606 </xsl:text>
       
  5607     <xsl:text>                    this.position = value;
       
  5608 </xsl:text>
       
  5609     <xsl:text>                break;
       
  5610 </xsl:text>
       
  5611     <xsl:text>            case 1:
       
  5612 </xsl:text>
       
  5613     <xsl:text>                this.range = value;
       
  5614 </xsl:text>
       
  5615     <xsl:text>                break;
       
  5616 </xsl:text>
       
  5617     <xsl:text>            case 2:
       
  5618 </xsl:text>
       
  5619     <xsl:text>                this.size = value;
       
  5620 </xsl:text>
       
  5621     <xsl:text>                break;
       
  5622 </xsl:text>
       
  5623     <xsl:text>        }
       
  5624 </xsl:text>
       
  5625     <xsl:text>
       
  5626 </xsl:text>
       
  5627     <xsl:text>        this.request_animate();
       
  5628 </xsl:text>
       
  5629     <xsl:text>    }
       
  5630 </xsl:text>
       
  5631     <xsl:text>
       
  5632 </xsl:text>
       
  5633     <xsl:text>    get_ratios() {
       
  5634 </xsl:text>
       
  5635     <xsl:text>        let range = this.range;
       
  5636 </xsl:text>
       
  5637     <xsl:text>        let size = Math.max(this.range * this.mincursize, Math.min(this.size, range));
       
  5638 </xsl:text>
       
  5639     <xsl:text>        let maxh = this.range_elt.height.baseVal.value;
       
  5640 </xsl:text>
       
  5641     <xsl:text>        let pixels = (range - size) * maxh;
       
  5642 </xsl:text>
       
  5643     <xsl:text>        let units = range*range;
       
  5644 </xsl:text>
       
  5645     <xsl:text>        return [size, maxh, range, pixels, units];
       
  5646 </xsl:text>
       
  5647     <xsl:text>    }
       
  5648 </xsl:text>
       
  5649     <xsl:text>
       
  5650 </xsl:text>
       
  5651     <xsl:text>    animate(){
       
  5652 </xsl:text>
       
  5653     <xsl:text>        if(this.position == undefined || this.range == undefined || this.size == undefined)
       
  5654 </xsl:text>
       
  5655     <xsl:text>            return;
       
  5656 </xsl:text>
       
  5657     <xsl:text>        let [size, maxh, range, pixels, units] = this.get_ratios();
       
  5658 </xsl:text>
       
  5659     <xsl:text>
       
  5660 </xsl:text>
       
  5661     <xsl:text>        let new_y = this.range_elt.y.baseVal.value + Math.round(Math.min(this.position,range) * pixels / units);
       
  5662 </xsl:text>
       
  5663     <xsl:text>        let new_height = Math.round(maxh * size/range);
       
  5664 </xsl:text>
       
  5665     <xsl:text>
       
  5666 </xsl:text>
       
  5667     <xsl:text>        this.cursor_elt.y.baseVal.value = new_y;
       
  5668 </xsl:text>
       
  5669     <xsl:text>        this.cursor_elt.height.baseVal.value = new_height;
       
  5670 </xsl:text>
       
  5671     <xsl:text>    }
       
  5672 </xsl:text>
       
  5673     <xsl:text>
       
  5674 </xsl:text>
       
  5675     <xsl:text>    init_mandatory() {
       
  5676 </xsl:text>
       
  5677     <xsl:text>        this.cursor_elt.onpointerdown = () =&gt; this.on_cursor_down();
       
  5678 </xsl:text>
       
  5679     <xsl:text>
       
  5680 </xsl:text>
       
  5681     <xsl:text>        this.bound_drag = this.drag.bind(this);
       
  5682 </xsl:text>
       
  5683     <xsl:text>        this.bound_drop = this.drop.bind(this);
       
  5684 </xsl:text>
       
  5685     <xsl:text>    }
       
  5686 </xsl:text>
       
  5687     <xsl:text>
       
  5688 </xsl:text>
       
  5689     <xsl:text>    apply_position(position){
       
  5690 </xsl:text>
       
  5691     <xsl:text>        this.position = Math.max(Math.min(position, this.range), 0);
       
  5692 </xsl:text>
       
  5693     <xsl:text>        this.apply_hmi_value(0, Math.round(this.position));
       
  5694 </xsl:text>
       
  5695     <xsl:text>    }
       
  5696 </xsl:text>
       
  5697     <xsl:text>
       
  5698 </xsl:text>
       
  5699     <xsl:text>    on_page_click(is_up){
       
  5700 </xsl:text>
       
  5701     <xsl:text>        this.apply_position(is_up ? this.position-this.size
       
  5702 </xsl:text>
       
  5703     <xsl:text>                                  : this.position+this.size);
       
  5704 </xsl:text>
       
  5705     <xsl:text>    }
       
  5706 </xsl:text>
       
  5707     <xsl:text>
       
  5708 </xsl:text>
       
  5709     <xsl:text>    on_cursor_down(e){
       
  5710 </xsl:text>
       
  5711     <xsl:text>        // get scrollbar -&gt; root transform
       
  5712 </xsl:text>
       
  5713     <xsl:text>        let ctm = this.range_elt.getCTM();
       
  5714 </xsl:text>
       
  5715     <xsl:text>        // relative motion -&gt; discard translation
       
  5716 </xsl:text>
       
  5717     <xsl:text>        ctm.e = 0;
       
  5718 </xsl:text>
       
  5719     <xsl:text>        ctm.f = 0;
       
  5720 </xsl:text>
       
  5721     <xsl:text>        // root -&gt; scrollbar transform
       
  5722 </xsl:text>
       
  5723     <xsl:text>        this.invctm = ctm.inverse();
       
  5724 </xsl:text>
       
  5725     <xsl:text>        svg_root.addEventListener("pointerup", this.bound_drop, true);
       
  5726 </xsl:text>
       
  5727     <xsl:text>        svg_root.addEventListener("pointermove", this.bound_drag, true);
       
  5728 </xsl:text>
       
  5729     <xsl:text>    }
       
  5730 </xsl:text>
       
  5731     <xsl:text>
       
  5732 </xsl:text>
       
  5733     <xsl:text>    drop(e) {
       
  5734 </xsl:text>
       
  5735     <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_drop, true);
       
  5736 </xsl:text>
       
  5737     <xsl:text>        svg_root.removeEventListener("pointermove", this.bound_drag, true);
       
  5738 </xsl:text>
       
  5739     <xsl:text>    }
       
  5740 </xsl:text>
       
  5741     <xsl:text>
       
  5742 </xsl:text>
       
  5743     <xsl:text>    drag(e) {
       
  5744 </xsl:text>
       
  5745     <xsl:text>        let [size, maxh, range, pixels, units] = this.get_ratios();
       
  5746 </xsl:text>
       
  5747     <xsl:text>        if(pixels == 0) return;
       
  5748 </xsl:text>
       
  5749     <xsl:text>        let point = new DOMPoint(e.movementX, e.movementY);
       
  5750 </xsl:text>
       
  5751     <xsl:text>        let movement = point.matrixTransform(this.invctm).y;
       
  5752 </xsl:text>
       
  5753     <xsl:text>        this.apply_position(this.position + movement * units / pixels);
       
  5754 </xsl:text>
       
  5755     <xsl:text>    }
       
  5756 </xsl:text>
       
  5757     <xsl:text>}
       
  5758 </xsl:text>
       
  5759   </xsl:template>
       
  5760   <xsl:template mode="widget_defs" match="widget[@type='ScrollBar']">
       
  5761     <xsl:param name="hmi_element"/>
       
  5762     <xsl:call-template name="defs_by_labels">
       
  5763       <xsl:with-param name="hmi_element" select="$hmi_element"/>
       
  5764       <xsl:with-param name="labels">
       
  5765         <xsl:text>cursor range</xsl:text>
       
  5766       </xsl:with-param>
       
  5767     </xsl:call-template>
       
  5768     <xsl:variable name="pagebuttons">
       
  5769       <xsl:call-template name="defs_by_labels">
       
  5770         <xsl:with-param name="hmi_element" select="$hmi_element"/>
       
  5771         <xsl:with-param name="labels">
       
  5772           <xsl:text>pageup pagedown</xsl:text>
       
  5773         </xsl:with-param>
       
  5774         <xsl:with-param name="mandatory" select="'no'"/>
       
  5775       </xsl:call-template>
       
  5776     </xsl:variable>
       
  5777     <xsl:variable name="have_pagebuttons" select="string-length($pagebuttons)&gt;0"/>
       
  5778     <xsl:value-of select="$pagebuttons"/>
       
  5779     <xsl:text>    init: function() {
       
  5780 </xsl:text>
       
  5781     <xsl:text>        this.init_mandatory();
       
  5782 </xsl:text>
       
  5783     <xsl:if test="$have_pagebuttons">
       
  5784       <xsl:text>        this.pageup_elt.onclick = () =&gt; this.on_page_click(true);
       
  5785 </xsl:text>
       
  5786       <xsl:text>        this.pagedown_elt.onclick = () =&gt; this.on_page_click(false);
       
  5787 </xsl:text>
       
  5788     </xsl:if>
       
  5789     <xsl:text>    },
       
  5790 </xsl:text>
       
  5791   </xsl:template>
  5504   <xsl:template mode="widget_class" match="widget[@type='Slider']">
  5792   <xsl:template mode="widget_class" match="widget[@type='Slider']">
  5505     <xsl:text>class SliderWidget extends Widget{
  5793     <xsl:text>class SliderWidget extends Widget{
  5506 </xsl:text>
  5794 </xsl:text>
  5507     <xsl:text>    frequency = 5;
  5795     <xsl:text>    frequency = 5;
  5508 </xsl:text>
  5796 </xsl:text>
  6962 </xsl:text>
  7250 </xsl:text>
  6963           <xsl:text>        if(persistent_indexes.has(index)){
  7251           <xsl:text>        if(persistent_indexes.has(index)){
  6964 </xsl:text>
  7252 </xsl:text>
  6965           <xsl:text>            let varname = persistent_indexes.get(index);
  7253           <xsl:text>            let varname = persistent_indexes.get(index);
  6966 </xsl:text>
  7254 </xsl:text>
  6967           <xsl:text>            console.log(varname+"="+value+"; max-age=3153600000");
       
  6968 </xsl:text>
       
  6969           <xsl:text>            document.cookie = varname+"="+value+"; max-age=3153600000";
  7255           <xsl:text>            document.cookie = varname+"="+value+"; max-age=3153600000";
  6970 </xsl:text>
  7256 </xsl:text>
  6971           <xsl:text>        }
  7257           <xsl:text>        }
  6972 </xsl:text>
  7258 </xsl:text>
  6973           <xsl:text>
  7259           <xsl:text>