Exemple #1
0
        /// <summary>
        /// Instantiates a <see cref="UIManagerModule"/>.
        /// </summary>
        /// <param name="reactContext">The React context.</param>
        /// <param name="viewManagers">The view managers.</param>
        /// <param name="uiImplementationProvider">The UI implementation provider.</param>
        /// <param name="layoutActionQueue">The layout action queue.</param>
        public UIManagerModule(
            ReactContext reactContext,
            IReadOnlyList <IViewManager> viewManagers,
            UIImplementationProvider uiImplementationProvider,
            IActionQueue layoutActionQueue)
            : base(reactContext, layoutActionQueue)
        {
            if (viewManagers == null)
            {
                throw new ArgumentNullException(nameof(viewManagers));
            }
            if (uiImplementationProvider == null)
            {
                throw new ArgumentNullException(nameof(uiImplementationProvider));
            }
            if (layoutActionQueue == null)
            {
                throw new ArgumentNullException(nameof(layoutActionQueue));
            }

            _eventDispatcher   = new EventDispatcher(reactContext);
            _uiImplementation  = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher);
            _moduleConstants   = CreateConstants(viewManagers);
            _layoutActionQueue = layoutActionQueue;
            reactContext.AddLifecycleEventListener(this);
        }
        /// <summary>
        /// Instantiates a <see cref="UIManagerModule"/>.
        /// </summary>
        /// <param name="reactContext">The React context.</param>
        /// <param name="viewManagers">The view managers.</param>
        /// <param name="uiImplementationProvider">The UI implementation provider.</param>
        /// <param name="window">The Framework Element.</param>
        public UIManagerModule(
            ReactContext reactContext,
            IReadOnlyList <IViewManager> viewManagers,
            UIImplementationProvider uiImplementationProvider,
            FrameworkElement window)
            : base(reactContext)
        {
            if (viewManagers == null)
            {
                throw new ArgumentNullException(nameof(viewManagers));
            }
            if (uiImplementationProvider == null)
            {
                throw new ArgumentNullException(nameof(uiImplementationProvider));
            }
            if (window == null)
            {
                throw new ArgumentNullException(nameof(window));
            }

            _window           = window;
            _eventDispatcher  = new EventDispatcher(reactContext);
            _uiImplementation = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher);
            _moduleConstants  = CreateConstants(viewManagers);
            reactContext.AddLifecycleEventListener(this);
        }
Exemple #3
0
        /// <summary>
        /// Instantiates a <see cref="UIManagerModule"/>.
        /// </summary>
        /// <param name="reactContext">The React context.</param>
        /// <param name="viewManagers">The view managers.</param>
        /// <param name="uiImplementationProvider">The UI implementation provider.</param>
        /// <param name="layoutActionQueue">The layout action queue.</param>
        /// <param name="options">Options for the <see cref="UIManagerModule"/>.</param>
        public UIManagerModule(
            ReactContext reactContext,
            IReadOnlyList <IViewManager> viewManagers,
            UIImplementationProvider uiImplementationProvider,
            IActionQueue layoutActionQueue,
            UIManagerModuleOptions options)
            : base(reactContext, layoutActionQueue)
        {
            if (viewManagers == null)
            {
                throw new ArgumentNullException(nameof(viewManagers));
            }
            if (uiImplementationProvider == null)
            {
                throw new ArgumentNullException(nameof(uiImplementationProvider));
            }
            if (layoutActionQueue == null)
            {
                throw new ArgumentNullException(nameof(layoutActionQueue));
            }

            _eventDispatcher  = new EventDispatcher(reactContext);
            _uiImplementation = uiImplementationProvider.Create(reactContext, viewManagers, _eventDispatcher);
            var lazyViewManagersEnabled = IsLazyViewManagersEnabled(options);

            _customDirectEvents = lazyViewManagersEnabled ? GetDirectEventTypeConstants() : new JObject();
            _moduleConstants    = CreateConstants(viewManagers, null, _customDirectEvents, IsLazyViewManagersEnabled(options));
            _layoutActionQueue  = layoutActionQueue;
            reactContext.AddLifecycleEventListener(this);
        }
        public async Task UIManagerModule_CustomEvents_Constants()
        {
            var context = new ReactContext();
            var viewManagers = new List<IViewManager>();
            var uiImplementation = new UIImplementation(context, viewManagers);

            var module = await DispatcherHelpers.CallOnDispatcherAsync(
                () => new UIManagerModule(context, viewManagers, uiImplementation));

            var constants = module.Constants;

            Assert.AreEqual("onSelect", constants.GetMap("customBubblingEventTypes").GetMap("topSelect").GetMap("phasedRegistrationNames").GetValue("bubbled"));
            Assert.AreEqual("onSelectCapture", constants.GetMap("customBubblingEventTypes").GetMap("topSelect").GetMap("phasedRegistrationNames").GetValue("captured"));
            Assert.AreEqual("onChange", constants.GetMap("customBubblingEventTypes").GetMap("topChange").GetMap("phasedRegistrationNames").GetValue("bubbled"));
            Assert.AreEqual("onChangeCapture", constants.GetMap("customBubblingEventTypes").GetMap("topChange").GetMap("phasedRegistrationNames").GetValue("captured"));
            Assert.AreEqual("onTouchStart", constants.GetMap("customBubblingEventTypes").GetMap("topTouchStart").GetMap("phasedRegistrationNames").GetValue("bubbled"));
            Assert.AreEqual("onTouchStartCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchStart").GetMap("phasedRegistrationNames").GetValue("captured"));
            Assert.AreEqual("onTouchMove", constants.GetMap("customBubblingEventTypes").GetMap("topTouchMove").GetMap("phasedRegistrationNames").GetValue("bubbled"));
            Assert.AreEqual("onTouchMoveCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchMove").GetMap("phasedRegistrationNames").GetValue("captured"));
            Assert.AreEqual("onTouchEnd", constants.GetMap("customBubblingEventTypes").GetMap("topTouchEnd").GetMap("phasedRegistrationNames").GetValue("bubbled"));
            Assert.AreEqual("onTouchEndCapture", constants.GetMap("customBubblingEventTypes").GetMap("topTouchEnd").GetMap("phasedRegistrationNames").GetValue("captured"));

            Assert.AreEqual("onSelectionChange", constants.GetMap("customDirectEventTypes").GetMap("topSelectionChange").GetValue("registrationName"));
            Assert.AreEqual("onLoadingStart", constants.GetMap("customDirectEventTypes").GetMap("topLoadingStart").GetValue("registrationName"));
            Assert.AreEqual("onLoadingFinish", constants.GetMap("customDirectEventTypes").GetMap("topLoadingFinish").GetValue("registrationName"));
            Assert.AreEqual("onLoadingError", constants.GetMap("customDirectEventTypes").GetMap("topLoadingError").GetValue("registrationName"));
            Assert.AreEqual("onLayout", constants.GetMap("customDirectEventTypes").GetMap("topLayout").GetValue("registrationName"));
        }
        public void UIManagerModule_ArgumentChecks()
        {
            var context = new ReactContext();
            var viewManagers = new List<IViewManager>();
            var uiImplementation = new UIImplementation(context, viewManagers);

            AssertEx.Throws<ArgumentNullException>(
                () => new UIManagerModule(context, null, uiImplementation),
                ex => Assert.AreEqual("viewManagers", ex.ParamName));

            AssertEx.Throws<ArgumentNullException>(
                () => new UIManagerModule(context, viewManagers, null),
                ex => Assert.AreEqual("uiImplementation", ex.ParamName));
        }
        /// <summary>
        /// Instantiates a <see cref="UIManagerModule"/>.
        /// </summary>
        /// <param name="reactContext">The React context.</param>
        /// <param name="viewManagers">The view managers.</param>
        /// <param name="uiImplementation">The UI implementation.</param>
        public UIManagerModule(
            ReactContext reactContext,
            IReadOnlyList<IViewManager> viewManagers,
            UIImplementation uiImplementation)
            : base(reactContext)
        {
            if (viewManagers == null)
                throw new ArgumentNullException(nameof(viewManagers));
            if (uiImplementation == null)
                throw new ArgumentNullException(nameof(uiImplementation));

            _eventDispatcher = new EventDispatcher(reactContext);
            _uiImplementation = uiImplementation;
            _moduleConstants = CreateConstants(viewManagers);
            reactContext.AddLifecycleEventListener(this);
        }
        public async Task UIManagerModule_Constants_ViewManagerOverrides()
        {
            var context = new ReactContext();
            var viewManagers = new List<IViewManager> { new TestViewManager() };
            var uiImplementation = new UIImplementation(context, viewManagers);

            var module = await DispatcherHelpers.CallOnDispatcherAsync(
                () => new UIManagerModule(context, viewManagers, uiImplementation));

            var constants = module.Constants;

            Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetValue("otherSelectionChange"));
            Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetMap("topSelectionChange").GetValue("registrationName"));
            Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetMap("topLoadingStart").GetValue("foo"));
            Assert.AreEqual(42, constants.GetMap("customDirectEventTypes").GetValue("topLoadingError"));
        }
Exemple #8
0
        /// <summary>
        /// Instantiates a <see cref="UIManagerModule"/>.
        /// </summary>
        /// <param name="reactContext">The React context.</param>
        /// <param name="viewManagers">The view managers.</param>
        /// <param name="uiImplementation">The UI implementation.</param>
        public UIManagerModule(
            ReactContext reactContext,
            IReadOnlyList <IViewManager> viewManagers,
            UIImplementation uiImplementation)
            : base(reactContext)
        {
            if (viewManagers == null)
            {
                throw new ArgumentNullException(nameof(viewManagers));
            }
            if (uiImplementation == null)
            {
                throw new ArgumentNullException(nameof(uiImplementation));
            }

            _eventDispatcher  = new EventDispatcher(reactContext);
            _uiImplementation = uiImplementation;
            _moduleConstants  = CreateConstants(viewManagers);
            reactContext.AddLifecycleEventListener(this);
        }
        public void UpdateView(UIImplementation uiImplementation)
        {
            if (ConnectedViewTag == -1)
            {
                throw new InvalidOperationException("Node has not been attached to a view.");
            }

            var propsMap = new JObject();
            foreach (var entry in _propMapping)
            {
                var node = _manager.GetNodeById(entry.Value);
                var styleNode = node as StyleAnimatedNode;
                var valueNode = default(ValueAnimatedNode);
                if (styleNode != null)
                {
                    styleNode.CollectViewUpdates(propsMap);
                }
                else if ((valueNode = node as ValueAnimatedNode) != null)
                {
                    propsMap.Add(entry.Key, valueNode.Value);
                }
                else
                {
                    throw new InvalidOperationException(
                        Invariant($"Unsupported type of node used in property node '{node.GetType()}'."));
                }
            }

            // TODO: Reuse propsMap and stylesDiffMap objects - note that in
            // subsequent animation steps for a given node most of the time
            // will be creating the same set of props (just with different
            // values). We can take advantage on that and optimize the way we
            // allocate property maps (we also know that updating view props
            // doesn't retain a reference to the styles object).
            uiImplementation.SynchronouslyUpdateViewOnDispatcherThread(
                ConnectedViewTag,
                new ReactStylesDiffMap(propsMap));
        }