[NUI][XamlBuild] 1.Support DP value, 2.Support DataTemplate in EXaml
authorFang Xiaohui <xiaohui.fang@samsung.com>
Mon, 7 Mar 2022 07:55:39 +0000 (15:55 +0800)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Tue, 8 Mar 2022 09:33:39 +0000 (18:33 +0900)
16 files changed:
pkg/Tizen.NET.API9/xamlbuild/Tizen.NUI.XamlBuild.dll
pkg/Tizen.NET.API9/xamlbuild/Tizen.NUI.XamlBuild.targets
src/Tizen.NUI.XamlBuild/src/public/EXamlBuild/EXaml/EXamlCreateObject/EXamlCreateDPObject.cs
src/Tizen.NUI.XamlBuild/src/public/EXamlBuild/EXamlContext.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/BoundsTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/ExtentsTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/PositionTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/RectangleTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/SizeTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/CompiledConverters/ThicknessTypeConverter.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/NodeILExtensions.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/XamlCTask.cs
src/Tizen.NUI.XamlBuild/src/public/XamlBuild/XamlTask.cs
src/Tizen.NUI/src/internal/EXaml/Action/RootAction.cs
src/Tizen.NUI/src/internal/EXaml/LoadEXaml.cs
src/Tizen.NUI/src/internal/EXaml/Operation/CreateDPObject.cs [new file with mode: 0755]

index 8c14dea..6e22191 100644 (file)
Binary files a/pkg/Tizen.NET.API9/xamlbuild/Tizen.NUI.XamlBuild.dll and b/pkg/Tizen.NET.API9/xamlbuild/Tizen.NUI.XamlBuild.dll differ
index 4091eef..c9ba6b7 100755 (executable)
@@ -48,6 +48,7 @@
                        OptimizeIL = "true"
                        DebugSymbols = "$(DebugSymbols)"
                        DebugType = "$(DebugType)"
+                       NeedDebug = "$(NeedDebug)"
                        UseInjection = "$(NeedInjection)"
                        KeepXamlResources = "$(XFKeepXamlResources)" />
                <Touch Files="$(IntermediateOutputPath)XamlC.stamp" AlwaysCreate="True" />
index b872363..dfd8595 100755 (executable)
@@ -24,10 +24,10 @@ namespace Tizen.NUI.EXaml
 {
     internal class EXamlCreateDPObject : EXamlCreateObject
     {
-        public EXamlCreateDPObject(EXamlContext context, object value, TypeReference type, string prefix) : base(context, null, type)
+        public EXamlCreateDPObject(EXamlContext context, object value, TypeReference type, string subfix) : base(context, null, type)
         {
             this.value = value;
-            this.prefix = prefix;
+            this.subfix = subfix;
         }
 
         internal override string Write()
@@ -39,14 +39,14 @@ namespace Tizen.NUI.EXaml
 
             string ret = String.Format("({0} ({1} {2}))\n",
                          eXamlContext.GetValueString((int)EXamlOperationType.CreateDPObject),
-                         eXamlContext.GetValueString(value.ToString() + prefix),
+                         eXamlContext.GetValueString(value.ToString() + subfix),
                          eXamlContext.GetValueString(eXamlContext.GetTypeIndex(Type)));
 
             return ret;
         }
 
         private object value;
-        private string prefix;
+        private string subfix;
     }
 }
  
index 2c4de0c..375eab8 100755 (executable)
@@ -374,9 +374,7 @@ namespace Tizen.NUI.EXaml.Build.Tasks
 
             if (0 < longStrings.Length)
             {
-                ret += String.Format("({0} ({1}))\n",
-                                GetValueString((int)EXamlOperationType.GetLongString),
-                                GetValueString(longStrings));
+                ret += String.Format("/{0}\n", longStrings);
             }
 
             return ret;
index b7d1981..830db1c 100755 (executable)
@@ -41,7 +41,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
             foreach (var thick in xywh)
             {
-                if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                if (null != NodeILExtensions.GetDPValueSubFix(thick))
                 {
                     return null;
                 }
index 2d496d8..fdbdffd 100755 (executable)
@@ -49,7 +49,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
                 foreach (var thick in thickness)
                 {
-                    if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                    if (null != NodeILExtensions.GetDPValueSubFix(thick))
                     {
                         return null;
                     }
index 715d181..db5c2de 100755 (executable)
@@ -84,7 +84,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
             foreach (var thick in thickness)
             {
-                if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                if (null != NodeILExtensions.GetDPValueSubFix(thick))
                 {
                     return null;
                 }
@@ -150,7 +150,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
                 foreach (var thick in thickness)
                 {
-                    if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                    if (null != NodeILExtensions.GetDPValueSubFix(thick))
                     {
                         return null;
                     }
index 59b19e9..2c2b82b 100755 (executable)
@@ -38,7 +38,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
             foreach (var thick in xywh)
             {
-                if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                if (null != NodeILExtensions.GetDPValueSubFix(thick))
                 {
                     return null;
                 }
index cd39e26..0ea880b 100755 (executable)
@@ -47,7 +47,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
                 foreach (var thick in thickness)
                 {
-                    if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                    if (null != NodeILExtensions.GetDPValueSubFix(thick))
                     {
                         return null;
                     }
@@ -98,7 +98,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
                 foreach (var thick in thickness)
                 {
-                    if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                    if (null != NodeILExtensions.GetDPValueSubFix(thick))
                     {
                         return null;
                     }
index 77f89b2..5dd229b 100755 (executable)
@@ -38,7 +38,7 @@ namespace Tizen.NUI.Xaml.Core.XamlC
 
                 foreach (var thick in thickness)
                 {
-                    if (thick.EndsWith("dp") || thick.EndsWith("px"))
+                    if (null != NodeILExtensions.GetDPValueSubFix(thick))
                     {
                         return null;
                     }
index 788b988..e945f33 100755 (executable)
@@ -245,6 +245,20 @@ namespace Tizen.NUI.Xaml.Build.Tasks
             return null;
         }
 
+        private static string[] dpValueSubFixes = { "dp", "sp", "pt", "px"};
+        internal static string GetDPValueSubFix(string valueStr)
+        {
+            foreach (var subFix in dpValueSubFixes)
+            {
+                if (valueStr.EndsWith(subFix))
+                {
+                    return subFix;
+                }
+            }
+
+            return null;
+        }
+
         public static object GetBaseValue(this ValueNode node, EXamlContext context, TypeReference targetTypeRef)
         {
             var str = (string)node.Value;
@@ -252,15 +266,12 @@ namespace Tizen.NUI.Xaml.Build.Tasks
 
             if ("System.String" != targetTypeRef.FullName)
             {
-                if (str.EndsWith("dp"))
-                {
-                    var value = GetBaseValue(context, str.Substring(0, str.Length - "dp".Length), targetTypeRef);
-                    ret = new EXamlCreateDPObject(context, value, targetTypeRef, "dp");
-                }
-                else if (str.EndsWith("px"))
+                string subFix = GetDPValueSubFix(str);
+
+                if (null != subFix)
                 {
-                    var value = GetBaseValue(context, str.Substring(0, str.Length - "px".Length), targetTypeRef);
-                    ret = new EXamlCreateDPObject(context, value, targetTypeRef, "px");
+                        var value = GetBaseValue(context, str.Substring(0, str.Length - subFix.Length), targetTypeRef);
+                        ret = new EXamlCreateDPObject(context, value, targetTypeRef, subFix);
                 }
             }
 
@@ -419,7 +430,7 @@ namespace Tizen.NUI.Xaml.Build.Tasks
                 yield return Instruction.Create(OpCodes.Ldc_I4, SByte.Parse(str, CultureInfo.InvariantCulture));
             else if (targetTypeRef.FullName == "System.Int16")
             {
-                if (str.EndsWith("dp") || str.EndsWith("px"))
+                if (null != GetDPValueSubFix(str))
                 {
                     var insOfDPValue = GetDPValue(module, node, targetTypeRef, str);
 
index 4464dc3..b112b62 100755 (executable)
@@ -207,6 +207,7 @@ namespace Tizen.NUI.Xaml.Build.Tasks
             {
                 AssemblyResolver = resolver,
                 ReadWrite = !ReadOnly,
+                ReadSymbols = NeedDebug,
             };
 
             using (var assemblyDefinition = AssemblyDefinition.ReadAssembly(System.IO.Path.GetFullPath(Assembly), readerParameters))
@@ -355,6 +356,7 @@ namespace Tizen.NUI.Xaml.Build.Tasks
                 {
                     assemblyDefinition.Write(new WriterParameters
                     {
+                        WriteSymbols = NeedDebug,
                     });
                     LoggingHelper.LogMessage(Low, $"{new string(' ', 2)}done.");
                 }
index dce3b49..dcb2dc5 100755 (executable)
@@ -54,6 +54,7 @@ namespace Tizen.NUI.Xaml.Build.Tasks
         public bool DebugSymbols { get; set; }
         public string DebugType { get; set; }
         public string XamlFilePath { get; set; }
+        public bool NeedDebug { get; set; } = false;
 
         protected TaskLoggingHelper LoggingHelper { get; }
 
index 32192f3..30051cf 100755 (executable)
@@ -232,6 +232,12 @@ namespace Tizen.NUI.EXaml
             {
                 globalDataList.LongStrings = opInfo[0] as string;
             };
+
+            createOperations[(int)EXamlOperationType.CreateDPObject] = (GlobalDataList globalDataList, List<object> opInfo) =>
+            {
+                var operation = new CreateDPObject(globalDataList, opInfo);
+                globalDataList.Operations.Add(operation);
+            };
         }
     }
 }
index 17fcd87..4c0e688 100755 (executable)
@@ -27,10 +27,27 @@ namespace Tizen.NUI.EXaml
             var globalDataList = new GlobalDataList();
 
             Action currentAction = new RootAction(globalDataList);
+            var rootAction = currentAction;
 
-            foreach (char c in xaml)
+            int index = 0;
+
+            for (; index < xaml.Length; index++)
+            {
+                var c = xaml[index];
+
+                if (currentAction == rootAction && '/' == c)
+                {
+                    break;
+                }
+                else
+                {
+                    currentAction = currentAction.DealChar(c);
+                }
+            }
+
+            for (index++; index < xaml.Length; index++)
             {
-                currentAction = currentAction.DealChar(c);
+                globalDataList.LongStrings += xaml[index];
             }
 
             foreach (var op in globalDataList.PreLoadOperations)
diff --git a/src/Tizen.NUI/src/internal/EXaml/Operation/CreateDPObject.cs b/src/Tizen.NUI/src/internal/EXaml/Operation/CreateDPObject.cs
new file mode 100755 (executable)
index 0000000..80d49cf
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright(c) 2021 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+using Tizen.NUI.Binding.Internals;
+using Tizen.NUI.Xaml;
+
+namespace Tizen.NUI.EXaml
+{
+    internal class CreateDPObject : Operation
+    {
+        public CreateDPObject(GlobalDataList globalDataList, List<object> operationInfos)
+        {
+            this.valueStr = operationInfos[0] as string;
+            this.typeIndex = (int)operationInfos[1];
+            this.globalDataList = globalDataList;
+        }
+
+        private GlobalDataList globalDataList;
+
+        public void Do()
+        {
+            if (0 > typeIndex)
+            {
+                object dpValue = null;
+
+                switch (typeIndex)
+                {
+                    case -3:
+                        dpValue = Convert.ToInt16(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -4:
+                        dpValue = Convert.ToInt32(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -5:
+                        dpValue = Convert.ToInt64(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -7:
+                        dpValue = Convert.ToUInt16(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -8:
+                        dpValue = Convert.ToUInt32(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -9:
+                        dpValue = Convert.ToUInt64(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -15:
+                        dpValue = Convert.ToSingle(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+
+                    case -16:
+                        dpValue = Convert.ToDouble(GraphicsTypeManager.Instance.ConvertScriptToPixel(valueStr));
+                        break;
+                }
+
+                if (null == dpValue)
+                {
+                    throw new Exception($"Can't convert {valueStr} to DP value of typeIndex {typeIndex}");
+                }
+
+                globalDataList.GatheredInstances.Add(dpValue);
+            }
+            else
+            {
+                var type = globalDataList.GatheredTypes[typeIndex];
+                throw new Exception($"Can't convert DP value of type {type.FullName}");
+            }
+        }
+
+        private int typeIndex;
+        private string valueStr;
+    }
+}