svghmi/widget_jsontable.ysl2
branchsvghmi
changeset 3031 440d74319a74
parent 3028 72ee99635db7
child 3034 793ce2117258
equal deleted inserted replaced
3030:2d13a4379e2f 3031:440d74319a74
    39 
    39 
    40 
    40 
    41 const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']";
    41 const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']";
    42 const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]";
    42 const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]";
    43 
    43 
       
    44 const "textstylelist_related" foreach "$hmi_textstylelists" list {
       
    45     attrib "listid" value "@id";
       
    46     foreach "func:refered_elements(.)" elt {
       
    47         attrib "eltid" value "@id";
       
    48     }
       
    49 }
       
    50 const "textstylelist_related_ns", "exsl:node-set($textstylelist_related)";
       
    51 
       
    52 def "func:json_expressions" {
       
    53     param "expressions";
       
    54     param "label";
       
    55 
       
    56     // compute javascript expressions to access JSON data
       
    57     // desscribed in given svg element's "label"
       
    58     // knowing that parent element already has given "expressions".
       
    59 
       
    60     choose {
       
    61         when "$label" {
       
    62             const "suffixes", "str:split($label)";
       
    63             const "res" foreach "$suffixes" expression {
       
    64                 const "suffix",".";
       
    65                 const "pos","position()";
       
    66                 // take last available expression (i.e can have more suffixes than expressions)
       
    67                 const "expr","$expressions[position() <= $pos][last()]/expression";
       
    68                 choose {
       
    69                     when "contains($suffix,'=')" {
       
    70                         const "name", "substring-before($suffix,'=')";
       
    71                         if "$expr/@name[. != $name]" 
       
    72                             error > JsonTable : missplaced '=' or inconsistent names in Json data expressions.
       
    73                         attrib "name" value "$name";
       
    74                         attrib "content" > «$expr/@content»«substring-after($suffix,'=')»
       
    75                     }
       
    76                     otherwise {
       
    77                         copy "$expr/@name";
       
    78                         attrib "content" > «$expr/@content»«$suffix»
       
    79                     }
       
    80                 }
       
    81             }
       
    82             result "exsl:node-set($res)";
       
    83         }
       
    84         // Empty labels are ignored, expressions are then passed as-is.
       
    85         otherwise result "$expressions";
       
    86     }
       
    87 
       
    88 }
       
    89 
       
    90 const "initexpr" expression attrib "content" > jdata
       
    91 const "initexpr_ns", "exsl:node-set($initexpr)";
       
    92 
    44 template "svg:use", mode="json_table_elt_render" {
    93 template "svg:use", mode="json_table_elt_render" {
    45     param "value_expr";
    94     param "expressions";
    46     // cloned element must be part of a HMI:List
    95     // cloned element must be part of a HMI:List
    47     const "targetid", "substring-after(@xlink:href,'#')";
    96     const "targetid", "substring-after(@xlink:href,'#')";
    48     const "from_list", "$hmi_lists[(@id | */@id) = $targetid]";
    97     const "from_list", "$hmi_lists[(@id | */@id) = $targetid]";
    49     const "from_textstylelist", "$hmi_textstylelists[(@id | */@id) = $targetid]";
       
    50 
    98 
    51     choose {
    99     choose {
    52         when "count($from_list) > 0" {
   100         when "count($from_list) > 0" {
    53             |         id("«@id»").setAttribute("xlink:href", 
   101             |         id("«@id»").setAttribute("xlink:href", 
    54             // obtain new target id from HMI:List widget
   102             // obtain new target id from HMI:List widget
    55             |             "#"+hmi_widgets["«$from_list/@id»"].items[«$value_expr»]);
   103             |             "#"+hmi_widgets["«$from_list/@id»"].items[«$expressions/expression[1]/@content»]);
    56         }
       
    57         when "count($from_textstylelist) > 0" {
       
    58             |         console.log("from_textsylelist","«@id»", "«$value_expr»", «$value_expr»,
       
    59             // obtain new style from HMI:TextStyleList widget
       
    60             |             hmi_widgets["«$from_textstylelist/@id»"].items[«$value_expr»]);
       
    61         }
   104         }
    62         otherwise
   105         otherwise
    63             warning > Clones (svg:use) in JsonTable Widget must point to a valid HMI:List or HMI:TextStyleList widget or item. Reference "«@xlink:href»" is not valid and will not be updated.
   106             warning > Clones (svg:use) in JsonTable Widget must point to a valid HMI:List widget or item. Reference "«@xlink:href»" is not valid and will not be updated.
    64     }
   107     }
    65 }
   108 }
    66 
   109 
    67 template "svg:text", mode="json_table_elt_render" {
   110 template "svg:text", mode="json_table_elt_render" {
    68     param "value_expr";
   111     param "expressions";
    69     |         id("«@id»").textContent = String(«$value_expr»);
   112     const "value_expr", "$expressions/expression[1]/@content";
       
   113     const "original", "@original";
       
   114     const "from_textstylelist", "$textstylelist_related_ns/list[elt/@eltid = $original]";
       
   115     choose {
       
   116 
       
   117         when "count($from_textstylelist) > 0" {
       
   118             const "content_expr", "$expressions/expression[2]/@content";
       
   119             if "string-length($content_expr) = 0 or $expressions/expression[2]/@name != 'textContent'"
       
   120                 error > Clones (svg:use) in JsonTable Widget pointing to a HMI:TextStyleList widget or item must have a "textContent=.someVal" assignement following value expression in label.
       
   121             |         {
       
   122             |           let elt = id("«@id»");
       
   123             |           elt.textContent = String(«$content_expr»);
       
   124             |           elt.style = hmi_widgets["«$from_textstylelist/@listid»"].styles[«$value_expr»];
       
   125             |         }
       
   126         }
       
   127         otherwise {
       
   128             |         id("«@id»").textContent = String(«$value_expr»);
       
   129         }
       
   130     }
       
   131 }
       
   132 
       
   133 
       
   134 // only labels comming from Json widget are counted in
       
   135 def "func:filter_non_widget_label" {
       
   136     param "elt";
       
   137     param "widget_elts";
       
   138     const "eltid" choose {
       
   139         when "$elt/@original" value "$elt/@original";
       
   140         otherwise value "$elt/@id";
       
   141     }
       
   142     result "$widget_elts[@id=$eltid]/@inkscape:label";
    70 }
   143 }
    71 
   144 
    72 template "svg:*", mode="json_table_render" {
   145 template "svg:*", mode="json_table_render" {
    73     param "objname";
   146     param "expressions";
    74     apply ".", mode="json_table_elt_render" with "value_expr" > «$objname»«substring-before(@inkscape:label, ' ')»
   147     param "widget_elts";
       
   148     const "label", "func:filter_non_widget_label(., $widget_elts)";
       
   149     apply ".", mode="json_table_elt_render" {
       
   150         with "expressions", "func:json_expressions($expressions, $label)";
       
   151     }
    75 }
   152 }
    76 
   153 
    77 template "svg:g", mode="json_table_render" {
   154 template "svg:g", mode="json_table_render" {
    78     param "objname";
   155     param "expressions";
    79     |         let obj_«@id» = «$objname»«substring-before(@inkscape:label, ' ')»;
   156     param "widget_elts";
    80     apply "*[@inkscape:label]", mode="json_table_render" 
   157     /* TODO : use intermediate variables for optimization
    81         with "objname" > obj_«@id»
   158     foreach "$new_expressions"
       
   159     |         let obj_«@id»_«position()» = «.»;
       
   160     */
       
   161     const "label", "func:filter_non_widget_label(., $widget_elts)";
       
   162     apply "*", mode="json_table_render" {
       
   163         with "expressions", "func:json_expressions($expressions, $label)";
       
   164         with "widget_elts", "$widget_elts";
       
   165     }
    82 }
   166 }
    83 
   167 
    84 template "widget[@type='JsonTable']", mode="widget_defs" {
   168 template "widget[@type='JsonTable']", mode="widget_defs" {
    85     param "hmi_element";
   169     param "hmi_element";
    86     labels("data");
   170     labels("data");
    87     optional_labels("forward backward cursor");
   171     optional_labels("forward backward cursor");
    88     const "data_elt", "$result_svg_ns//*[@id = $hmi_element/@id]/*[@inkscape:label = 'data']";
   172     const "data_elt", "$result_svg_ns//*[@id = $hmi_element/@id]/*[@inkscape:label = 'data']";
    89     |     spread_json_data: function(jdata) {
   173     |     spread_json_data: function(jdata) {
    90     apply "$data_elt/*", mode="json_table_render" with "objname","'jdata'";
   174     apply "$data_elt/*", mode="json_table_render" {
       
   175         with "expressions","$initexpr_ns";
       
   176         with "widget_elts","$hmi_element/*[@inkscape:label = 'data']/descendant::svg:*";
       
   177     }
    91     |     }
   178     |     }
    92 }
   179 }