From 53472f046e2568b581a5b23c153ce6c4204cbb7c Mon Sep 17 00:00:00 2001 From: Edward Stangler Date: Sun, 19 Sep 2021 17:32:50 -0500 Subject: [PATCH] Moved some (non-MX) changes from PR #1127. Add support for XML data in several areas, especially around sorting and grids. --- .../royale/html/util/getLabelFromData.as | 64 +++++++++++++++++-- .../org/apache/royale/utils/Language.as | 33 ++++++++-- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/util/getLabelFromData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/util/getLabelFromData.as index f5853b416d..48e1edb17a 100644 --- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/util/getLabelFromData.as +++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/util/getLabelFromData.as @@ -32,13 +32,65 @@ package org.apache.royale.html.util if (data is String) return "" + data; if(!data) return ""; - if (obj["labelField"]) return "" + data[obj["labelField"]]; - if (obj["dataField"]) return "" + data[obj["dataField"]]; - var label:String = data["label"]; - if(label != null){ - return label; + var labelField:String; + var value:String; + + if (obj["labelField"]) + { + labelField = obj["labelField"]; + value = "" + data[labelField]; + COMPILE::JS + { + // support XML data in JS (in libraries without access to XML class) + if (value == "undefined") + { + if (labelField.charAt(0) == '@') + { + var fal:* = data["attribute"]; + if (fal && typeof(fal) === "function") + value = fal.call(data, labelField); + } + else + { + var fcl:* = data["child"]; + if (fcl && typeof(fcl) === "function") + value = fcl.call(data, labelField).toString(); + } + } + } + return value; } - return "" + data; + if (obj["dataField"]) + { + labelField = obj["dataField"]; + value = "" + data[labelField]; + COMPILE::JS + { + // support XML data in JS (in libraries without access to XML class) + if (value == "undefined") + { + if (labelField.charAt(0) == '@') + { + var fad:* = data["attribute"]; + if (fad && typeof(fad) === "function") + value = fad.call(data, labelField); + } + else + { + var fcd:* = data["child"]; + if (fcd && typeof(fcd) === "function") + value = fcd.call(data, labelField).toString(); + } + } + } + return value; + } + + value = data["label"]; + if (value != null) + return value; + + return "" + data; } } diff --git a/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as b/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as index 7da70554d4..cef9cf3636 100644 --- a/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as +++ b/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as @@ -512,11 +512,36 @@ package org.apache.royale.utils return sorted; } + private static function getValue(obj:Object, n:String):* + { + var value:* = obj[n]; + COMPILE::JS + { + // support XML data in JS (in libraries without access to XML class) + if (value == null) + { + if (n.charAt(0) == '@') + { + var fa:* = obj["attribute"]; + if (fa && typeof(fa) === "function") + value = fa.call(obj, n); + } + else + { + var fc:* = obj["child"]; + if (fc && typeof(fc) === "function") + value = fc.call(obj, n).toString(); + } + } + } + return value; + } + private static function compareStringCaseinsensitive(a:Object, b:Object):int { for each(var n:String in sortNames) { - var v:int = (a[n] || zeroStr).toString().toLowerCase().localeCompare((b[n] || zeroStr).toString().toLowerCase()); + var v:int = (getValue(a, n) || zeroStr).toString().toLowerCase().localeCompare((getValue(b, n) || zeroStr).toString().toLowerCase()); if (v != 0) { return v * muler; @@ -529,7 +554,7 @@ package org.apache.royale.utils { for each(var n:String in sortNames) { - var v:int = (a[n] || zeroStr).toString().localeCompare((b[n] || zeroStr).toString()); + var v:int = (getValue(a, n) || zeroStr).toString().localeCompare((getValue(b, n) || zeroStr).toString()); if (v != 0) { return v * muler; @@ -542,10 +567,10 @@ package org.apache.royale.utils { for each(var n:String in sortNames) { - if (Number(a[n]) > Number(b[n])) + if (Number(getValue(a, n)) > Number(getValue(b, n))) { return muler; - } else if (Number(a[n]) < Number(b[n])) + } else if (Number(getValue(a, n)) < Number(getValue(b, n))) { return -muler; }