[NUI] Support Nullable type in Xaml (#1432)
authorAdunFang <30402408+AdunFang@users.noreply.github.com>
Wed, 26 Feb 2020 04:00:07 +0000 (12:00 +0800)
committerGitHub <noreply@github.com>
Wed, 26 Feb 2020 04:00:07 +0000 (13:00 +0900)
* [NUI] Fix the crash issue of create Popup

* [NUI] Support nullable type in Xaml

src/Tizen.NUI/src/internal/Xaml/TypeConversionExtensions.cs
src/Tizen.NUI/src/internal/Xaml/XamlLoader.cs
src/Tizen.NUI/src/internal/Xaml/XamlParser.cs
src/Tizen.NUI/src/internal/XamlBinding/PositionTypeConverter.cs

index 80341ae..94e4a96 100755 (executable)
@@ -62,16 +62,31 @@ namespace Tizen.NUI.Xaml
         {
             Func<object> getConverter = () =>
             {
-                MemberInfo memberInfo;
+                string converterTypeName = null;
+                Type realType = toType;
+
+                if (true == realType.IsGenericType && typeof(Nullable<>) == realType.GetGenericTypeDefinition())
+                {
+                    realType = realType.GetGenericArguments()[0];
+                }
+
+                converterTypeName = realType.CustomAttributes.GetTypeConverterTypeName();
 
-                var converterTypeName = toType.GetTypeInfo().CustomAttributes.GetTypeConverterTypeName();
-                if (minfoRetriever != null && (memberInfo = minfoRetriever()) != null)
-                    converterTypeName = memberInfo.CustomAttributes.GetTypeConverterTypeName() ?? converterTypeName;
                 if (converterTypeName == null)
-                    return null;
+                {
+                    converterTypeName = toType.FullName + "TypeConverter";
+                }
 
                 var convertertype = Type.GetType(converterTypeName);
-                return Activator.CreateInstance(convertertype);
+
+                if (null == convertertype)
+                {
+                    return null;
+                }
+                else
+                {
+                    return Activator.CreateInstance(convertertype);
+                }
             };
 
             return ConvertTo(value, toType, getConverter, serviceProvider);
index c3c8bc6..97f71f2 100755 (executable)
@@ -268,6 +268,41 @@ namespace Tizen.NUI.Xaml
                     throw new XamlParseException(string.Format("Can't find type {0}", type.FullName), new XmlLineInfo());
                 }
             }
+            else
+            {
+                Assembly assembly = type.Assembly;
+
+                Stream stream = null;
+
+                foreach (string str in assembly.GetManifestResourceNames())
+                {
+                    string resourceClassName = str.Substring(0, str.LastIndexOf('.'));
+                    int index = resourceClassName.LastIndexOf('.');
+                    if (0 <= index && index < resourceClassName.Length)
+                    {
+                        resourceClassName = resourceClassName.Substring(index + 1);
+
+                        if (resourceClassName == type.Name)
+                        {
+                            stream = assembly.GetManifestResourceStream(str);
+                            break;
+                        }
+                    }
+                }
+
+                if (null == stream)
+                {
+                    throw new XamlParseException(string.Format("Can't find type {0} in embedded resource", type.FullName), new XmlLineInfo());
+                }
+                else
+                {
+                    Byte[] buffer = new byte[stream.Length];
+                    stream.Read(buffer, 0, (int)stream.Length);
+
+                    string ret = System.Text.Encoding.Default.GetString(buffer);
+                    return ret;
+                }
+            }
 
             return null;
         }
index fa00be6..183d61e 100755 (executable)
@@ -363,8 +363,23 @@ namespace Tizen.NUI.Xaml
             Type type = null;
             foreach (var asm in lookupAssemblies) {
                 foreach (var name in lookupNames)
+                {
                     if ((type = Type.GetType($"{asm.ClrNamespace}.{name}, {asm.AssemblyName}")) != null)
                         break;
+
+                    if ('?' == name.Last())
+                    {
+                        string nameOfNotNull = name.Substring(0, name.Length - 1);
+                        Type typeofNotNull = Type.GetType($"{asm.ClrNamespace}.{nameOfNotNull}, {asm.AssemblyName}");
+
+                        if (null != typeofNotNull)
+                        {
+                            type = typeof(Nullable<>).MakeGenericType(new Type[] { typeofNotNull });
+                            break;
+                        }
+                    }
+                }
+
                 if (type != null)
                     break;
             }
index f059ae4..cd3bc41 100755 (executable)
@@ -59,6 +59,12 @@ namespace Tizen.NUI.Binding
                     int z = (int)GraphicsTypeManager.Instance.ConvertScriptToPixel(parts[2].Trim());
                     return new Position(x, y, z);
                 }
+                else if (parts.Length == 2)
+                {
+                    int x = (int)GraphicsTypeManager.Instance.ConvertScriptToPixel(parts[0].Trim());
+                    int y = (int)GraphicsTypeManager.Instance.ConvertScriptToPixel(parts[1].Trim());
+                    return new Position(x, y);
+                }
             }
 
             throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Position)}");