Esempio n. 1
0
 protected override NativeView CreateNativeView(IShibaContext context)
 {
     return(new NativeView()
     {
         TextWrapping = TextWrapping.Wrap,
     });
 }
Esempio n. 2
0
        protected virtual TNativeView Map(ShibaView view, IShibaContext context)
        {
            var target = CreateNativeView(context);

            if (view.DefaultValue != null && DefaultPropertyMap != null && HasDefaultProperty)
            {
                SetValue(context, view.DefaultValue, DefaultPropertyMap, target);
            }

            foreach (var property in view.Properties)
            {
                var propertyCache = _propertyCache.Value.LastOrDefault(it => it.Name == property.Name);
                if (propertyCache != null)
                {
                    SetValue(context, property.Value, propertyCache, target);
                }
                else
                {
                    var eventCache = _eventCache.Value.LastOrDefault(it => it.Name == property.Name);
                    if (eventCache != null && property.Value is string name)
                    {
                        eventCache.Setter.Invoke(target, name, context);
                    }
                }
            }

            return(target);
        }
Esempio n. 3
0
        private ShibaFunction ParseFunction(ShibaFunction item, IShibaContext context)
        {
            for (var i = 0; i < item.Parameters.Count; i++)
            {
                var parameter = item.Parameters[i];
                switch (parameter)
                {
                case ShibaFunction function:
                    item.Parameters[i] = ParseFunction(function, context);
                    break;

                case ShibaExtension extension:
                    var executor = ShibaApp.Instance.Configuration.ExtensionExecutors
                                   .FirstOrDefault(it => it.Name == extension.Type);
                    if (executor is IMutableExtensionExecutor)
                    {
                        item.Parameters[i] = executor.ProvideValue(context, extension);
                    }
                    break;

                default:
                    item.Parameters[i] = DynamicVisit(parameter, context);
                    break;
                }
            }

            return(item);
        }
Esempio n. 4
0
        private object Visit(JavaScriptValue value, IShibaContext context)
        {
            switch (value.ValueType)
            {
            case JavaScriptValueType.Error:
            case JavaScriptValueType.Object:
                return(VisitJavascriptObject(value));

            case JavaScriptValueType.Array:
                return(VisitJavascriptArray(value));

            case JavaScriptValueType.Boolean:
                return(value.ToBoolean());

            case JavaScriptValueType.Null:
                return(null);

            case JavaScriptValueType.Number:
                return(value.ToDouble());

            case JavaScriptValueType.String:
                return(value.ToString());

            case JavaScriptValueType.Undefined:
            case JavaScriptValueType.Function:
            default:
                return(value);
            }
        }
Esempio n. 5
0
        private NativeBinding Visit(ShibaFunction item, IShibaContext context)
        {
            var function   = ParseFunction(item, context);
            var extensions = GetExtensions(function)?.ToList();

            if (extensions == null || !extensions.Any())
            {
                return new NativeBinding
                       {
                           ConverterParameter = Singleton <ShibaFunctionExecutor> .Instance.Execute(function, null),
                           Converter          = Singleton <RawDataConverter> .Instance
                       }
            }
            ;

            if (extensions.Count == 1)
            {
                var extension = extensions.FirstOrDefault();

                var extensionValue = DynamicVisit(extension, context);

                switch (extensionValue)
                {
                case NativeBinding binding:
                    if (binding.Converter != null)
                    {
                        binding.ConverterParameter = new ShibaConverterParameter
                        {
                            InnerConverter = binding.Converter,
                            InnerParameter = binding.ConverterParameter,
                            Function       = function
                        }
                    }
                    ;
                    else
                    {
                        binding.ConverterParameter = function;
                    }
                    binding.Converter = Singleton <SingleBindingFunctionConverter> .Instance;
                    return(binding);

                default:
                    return(new NativeBinding
                    {
                        ConverterParameter =
                            Singleton <SingleBindingShibaFunctionExecutor> .Instance.Execute(function,
                                                                                             extensionValue),
                        Converter = Singleton <RawDataConverter> .Instance
                    });
                }
            }

            if (extensions.Count > 1)
            {
                throw new ArgumentOutOfRangeException("Currently only support single ShibaExtension");
            }

            throw new ArgumentOutOfRangeException($"Can not handle function call ${item}");
        }
Esempio n. 6
0
 public object DynamicVisit(object obj, IShibaContext context)
 {
     if (obj == null)
     {
         return(null);
     }
     return(Visit((dynamic)obj, context));
 }
Esempio n. 7
0
 protected override MarkdownTextBlock CreateNativeView(IShibaContext context)
 {
     return(base.CreateNativeView(context).Also(it =>
     {
         it.ImageMaxHeight = 14;
         it.Background = new SolidColorBrush(Colors.Transparent);
         it.TextWrapping = TextWrapping.Wrap;
     }));
 }
Esempio n. 8
0
        public static NativeView RenderFromFunction(string name, IShibaContext context)
        {
            var result = ShibaApp.Instance.Configuration.ScriptRuntime.CallFunction(name);

            if (result is JavaScriptValue javaScriptValue)
            {
                return(Render(Singleton <JSViewVisitor> .Instance.Visit(javaScriptValue) as View, context));
            }
            return(null);
        }
Esempio n. 9
0
 protected override ItemsRepeater CreateNativeView(IShibaContext context)
 {
     return(new ItemsRepeater().Also(it =>
     {
         it.SetBinding(ItemsRepeater.DataContextProperty, new Binding
         {
             Source = context,
             Path = new PropertyPath(nameof(context.DataContext)),
         });
     }));
 }
Esempio n. 10
0
 protected override ContentControl CreateNativeView(IShibaContext context)
 {
     return(new ContentControl().Also(it =>
     {
         it.SetBinding(ContentControl.ContentProperty, new Binding
         {
             Source = context,
             Path = new PropertyPath(nameof(context.DataContext))
         });
     }));
 }
Esempio n. 11
0
        private ShibaObject Visit(JObject item, IShibaContext context)
        {
            var dic = new ShibaObject();

            foreach (var(key, value) in item)
            {
                dic.TryAdd(key, DynamicVisit(value, context));
            }

            return(dic);
        }
Esempio n. 12
0
        protected override ShibaHost Map(View view, IShibaContext context)
        {
            var target = CreateNativeView(context);

            foreach (var property in view.Properties)
            {
                var cache = _propertyCache.Value.LastOrDefault(it => it.Name == property.Name);
                if (cache != null)
                {
                    SetValue(context, property.Value, cache, target);
                }
            }

            return(target);
        }
Esempio n. 13
0
        public virtual NativeBinding ProvideNativeBinding(IShibaContext context, ShibaExtension value)
        {
            var dataContextPath =
                nameof(context.DataContext);
            var targetPath = value.Value;
            var path       = string.IsNullOrEmpty(targetPath)
                ? dataContextPath
                : $"{dataContextPath}.{targetPath}";

            return(new NativeBinding
            {
                Source = context,
                Path = new PropertyPath(path),
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            });
        }
Esempio n. 14
0
        public override NativeBinding ProvideNativeBinding(IShibaContext context, ShibaExtension value)
        {
            var dataContextPath =
                nameof(context.DataContext);
            var targetPath = value.Value;
            var path       = dataContextPath;

            return(new NativeBinding
            {
                Converter = Singleton <JsonConverter> .Instance,
                ConverterParameter = targetPath,
                Source = context,
                Path = new PropertyPath(path),
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            });
        }
Esempio n. 15
0
        private object Visit(ShibaExtension item, IShibaContext context)
        {
            var executor =
                ShibaApp.Instance.Configuration.ExtensionExecutors.FirstOrDefault(it => it.Name == item.Type);

            if (executor != null)
            {
                var value = executor.ProvideValue(context, item);
                if (string.IsNullOrEmpty(item.ScriptName))
                {
                    return(value);
                }

                var func = new ShibaFunction(item.ScriptName)
                {
                    Parameters = { item }
                };
                if (value is NativeBinding binding)
                {
                    if (binding.Converter != null)
                    {
                        binding.ConverterParameter = new ShibaConverterParameter
                        {
                            InnerConverter = binding.Converter,
                            InnerParameter = binding.ConverterParameter,
                            Function       = func
                        }
                    }
                    ;
                    else
                    {
                        binding.ConverterParameter = func;
                    }
                    binding.Converter = Singleton <SingleBindingFunctionConverter> .Instance;
                    return(binding);
                }

                return(new NativeBinding
                {
                    ConverterParameter =
                        Singleton <SingleBindingShibaFunctionExecutor> .Instance.Execute(func, item),
                    Converter = Singleton <RawDataConverter> .Instance
                });
            }

            throw new NotImplementedException();
        }
Esempio n. 16
0
        private object Visit(JValue item, IShibaContext context)
        {
            switch (item.Type)
            {
            case JTokenType.Integer:
                return(item.Value <int>());

            case JTokenType.Float:
                return(item.Value <float>());

            case JTokenType.String:
                return(item.Value <string>());

            case JTokenType.Boolean:
                return(item.Value <bool>());

            case JTokenType.Date:
                return(item.Value <DateTime>());

            case JTokenType.Raw:
                return(item.Value <string>());

            case JTokenType.Bytes:
                return(item.Value <byte[]>());

            case JTokenType.Guid:
                return(item.Value <Guid>());

            case JTokenType.Uri:
                return(item.Value <string>());

            case JTokenType.TimeSpan:
                return(item.Value <TimeSpan>());

            default:
                return(null);
            }
        }
Esempio n. 17
0
 public object ProvideValue(IShibaContext context, ShibaExtension value)
 {
     return(ProvideNativeBinding(context, value));
 }
Esempio n. 18
0
 private KeyValuePair <string, object> Visit(JProperty item, IShibaContext context)
 {
     return(new KeyValuePair <string, object>(item.Name, DynamicVisit(item.Value, context)));
 }
Esempio n. 19
0
 protected override ImageEx CreateNativeView(IShibaContext context)
 {
     return(base.CreateNativeView(context).Also(it => it.Stretch = Stretch.UniformToFill));
 }
Esempio n. 20
0
 private List <object> Visit(JArray obj, IShibaContext context)
 {
     return(obj.Select(it => DynamicVisit(it, context)).ToList());
 }
Esempio n. 21
0
 protected override ImageEx CreateNativeView(IShibaContext context)
 {
     return(base.CreateNativeView(context).Also(it => it.CornerRadius = new CornerRadius(999)));
 }
Esempio n. 22
0
 object IViewMapper.Map(ShibaView view, IShibaContext context)
 {
     return(Map(view, context));
 }
Esempio n. 23
0
 protected virtual TNativeView CreateNativeView(IShibaContext context)
 {
     return(new TNativeView());
 }
Esempio n. 24
0
 public object ProvideValue(IShibaContext context, ShibaExtension value)
 {
     return(Application.Current.Resources.ContainsKey(value.Value) ? Application.Current.Resources[value.Value] : null);
 }
Esempio n. 25
0
 private object Visit(object obj, IShibaContext context)
 {
     return(obj);
 }
Esempio n. 26
0
        private NativeView Visit(View view, IShibaContext context)
        {
            var attribute =
                ShibaApp.Instance.ViewMappings.LastOrDefault(it =>
                                                             view.ViewName == it.ViewName);

            if (attribute == null)
            {
                if (ShibaApp.Instance.Components.ContainsKey(view.ViewName))
                {
                    view.Properties.Add(new Property("componentName", view.ViewName));
                    return(ShibaHostMapper.Map(view, context) as ShibaHost);
                }

                return(null);
            }

            var renderer = Renderer.GetOrAdd(attribute.ViewName, type => CreateRenderer(attribute));

            if (context == null)
            {
                throw new ArgumentNullException($"{nameof(context)} can not be null");
            }

            var target = renderer.Map(view, context) as NativeView;

            if (view.Children.Any() && target is NativeViewGroup panel)
            {
                var commonprops = new List <(ShibaView view, NativeView native, List <Property> properties)>();
                view.Children.ForEach(it =>
                {
                    var child = Visit(it, context);
                    if (renderer is IAllowChildViewMapper viewGroupMapper)
                    {
                        viewGroupMapper.AddChild(panel, child);
                    }
                    else
                    {
                        panel.Children.Add(child);
                    }
                    var commonprop = it.Properties.Where(prop =>
                                                         ShibaApp.Instance.Configuration.CommonProperties.Any(cp => cp.Name == prop.Name))
                                     .ToList();
                    if (commonprop.Any())
                    {
                        commonprops.Add((it, child, commonprop));
                    }
                });

                commonprops.ForEach(it =>
                {
                    var(view1, native, properties) = it;
                    properties.ForEach(prop =>
                    {
                        ShibaApp.Instance.Configuration.CommonProperties
                        .Where(cp => cp.Name == prop.Name).ToList()
                        .ForEach(cp => cp.Handle(prop.Value, view1, native, target));
                    });
                });
            }

            return(target);
        }
Esempio n. 27
0
 public static NativeView Render(View view, IShibaContext context)
 {
     return(Singleton <ValueVisitor> .Instance.DynamicVisit(view, context) as NativeView);
 }