Esempio n. 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DependencyObserver"/> class.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 /// <param name="methodFactory">The method factory.</param>
 /// <param name="notifier">The notifier.</param>
 public DependencyObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier)
 {
     this.messageHandler = messageHandler;
     this.methodFactory  = methodFactory;
     this.notifier       = notifier;
     singlePathObservers = new Dictionary <string, SinglePropertyPathObserver>();
 }
Esempio n. 2
0
        /// <summary>
        /// Adds a message handler at the specified location in the UI hierarchy.
        /// </summary>
        /// <param name="uiElement">The UI element.</param>
        /// <param name="handler">The message handler.</param>
        /// <param name="setContext">if set to <c>true</c> the handler will also be stored in the element's DataContext and ViewMetadata will be set.</param>
        public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
        {
            var node = FindOrAddNode(uiElement);

            node.RegisterHandler(handler);

            if (setContext)
            {
                var unwrappedValue = handler.Unwrap();

                var frameworkElement = uiElement as FrameworkElement;
                if (frameworkElement != null)
                {
                    frameworkElement.DataContext = unwrappedValue;
                }
#if !SILVERLIGHT
                else
                {
                    var frameworkContentElement = uiElement as FrameworkContentElement;
                    if (frameworkContentElement != null)
                    {
                        frameworkContentElement.DataContext = unwrappedValue;
                    }
                }
#endif
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DependencyObserver"/> class.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 /// <param name="methodFactory">The method factory.</param>
 /// <param name="notifier">The notifier.</param>
 public DependencyObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier)
 {
     _messageHandler = messageHandler;
     _methodFactory = methodFactory;
     _weakNotifier = new WeakReference<INotifyPropertyChanged>(notifier);
     _monitoringInfos = new Dictionary<string, MonitoringInfo>();
 }
Esempio n. 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DependencyObserver"/> class.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 /// <param name="methodFactory">The method factory.</param>
 /// <param name="notifier">The notifier.</param>
 public DependencyObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier)
 {
     _messageHandler  = messageHandler;
     _methodFactory   = methodFactory;
     _weakNotifier    = new WeakReference <INotifyPropertyChanged>(notifier);
     _monitoringInfos = new Dictionary <string, MonitoringInfo>();
 }
Esempio n. 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="EventMonitor"/> class.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="eventInfo">The event info.</param>
        internal EventMonitor(IRoutedMessageHandler messageHandler, EventInfo eventInfo)
        {
            this.messageHandler = messageHandler;
            triggersToNotify    = new List <IMessageTrigger>();

            EventHelper.WireEvent(messageHandler.Unwrap(), eventInfo, ChangedEventHandler);
        }
Esempio n. 6
0
		internal EventMonitor(IRoutedMessageHandler messageHandler, EventInfo eventInfo)
		{
			_messageHandler = messageHandler;
			_triggersToNotify = new List<IMessageTrigger>();

			EventHelper.WireEvent(messageHandler.Unwrap(), eventInfo, ChangedEventHandler);
		}
        //ref http://caliburn.codeplex.com/WorkItem/View.aspx?WorkItemId=6100
        //see also http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=212171
        public void backreferences_should_not_leak_the_observer()
        {
            var handlerRef = new WeakReference(handler);

            //this reference emulates a back pointer to a long-living model
            var parent = notifier.Model;


            ConfigureObserver(new[] {
                "Model.SomeModelProperty"
            });

            //emulates the collection of the cluster composed by Screen, View, MessageHandler and ancillary filters
            //(included Dependecies along with its internal PropertyPathMonitor)
            observer = null;
            handler  = null;
            GC.Collect();
            GC.WaitForFullGCComplete();
            GC.WaitForPendingFinalizers();


            handlerRef.IsAlive.ShouldBeFalse();


            //the first time a ppMonitor is notified AFTER the collection of its DependenyObserver,
            //it unregisters the unnecessary handler
            parent.NotifyOfPropertyChange("anyProperty");

            parent.SubscriptionCount.ShouldBe(0);
        }
		/// <summary>
		/// Initializes a new instance of the <see cref="DependencyObserver"/> class.
		/// </summary>
		/// <param name="messageHandler">The message handler.</param>
		/// <param name="methodFactory">The method factory.</param>
		/// <param name="notifier">The notifier.</param>
		public DependencyObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier)
		{
			_messageHandler = messageHandler;
			_methodFactory = methodFactory;
			_notifier = notifier;
			_singlePathObservers = new Dictionary<string, SinglePropertyPathObserver>();
		}
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType<AutoCheckAvailabilityHelper>();
            if(helper == null) return;

            helper.MakeAwareOf(trigger);
        }
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType<AutoCheckAvailabilityHelper>();
            if(helper != null) return;

            helper = new AutoCheckAvailabilityHelper(messageHandler);
            messageHandler.Metadata.Add(helper);
        }
        /// <summary>
        /// Adds a message handler at the specified location in the UI hierarchy.
        /// </summary>
        /// <param name="uiElement">The UI element.</param>
        /// <param name="handler">The message handler.</param>
        /// <param name="setContext">if set to <c>true</c> the handler will also be stored in the element's DataContext and ViewMetadata will be set.</param>
        public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
        {
            var node = FindOrAddNode(uiElement);
            node.RegisterHandler(handler);

            if(setContext)
                uiElement.SetDataContext(handler.Unwrap());
        }
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var helper = messageHandler.GetMetadata<AutoCheckAvailabilityHelper>();
            if(helper != null) return;

            helper = new AutoCheckAvailabilityHelper(messageHandler);
            messageHandler.AddMetadata(helper);
        }
            internal AutoCheckAvailabilityHelper(IRoutedMessageHandler messageHandler)
            {
                _messageHandler = messageHandler;
                _triggersToNotify = new List<IMessageTrigger>();
                _handlerReference = CommandManagerRequerySuggested;

                CommandManager.RequerySuggested += _handlerReference;
            }
Esempio n. 14
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.GetMetadata<DependencyObserver>();
            if (helper == null) return;

            if (trigger.Message.RelatesTo(_target))
                helper.MakeAwareOf(trigger, _dependencies);
        }
Esempio n. 15
0
            internal AutoCheckAvailabilityHelper(IRoutedMessageHandler messageHandler)
            {
                _messageHandler   = messageHandler;
                _triggersToNotify = new List <IMessageTrigger>();
                _handlerReference = CommandManagerRequerySuggested;

                CommandManager.RequerySuggested += _handlerReference;
            }
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType<DependencyObserver>();
            if (helper == null) return;

            if (trigger.Message.RelatesTo(target))
                helper.MakeAwareOf(trigger, dependencies);
        }
Esempio n. 17
0
		/// <summary>
		/// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
		/// </summary>
		/// <param name="messageHandler">The message handler.</param>
		public void MakeAwareOf(IRoutedMessageHandler messageHandler)
		{
			if (!AffectsTriggers) return;

			//deals with INPC classes
			TryHookDependencyObserver(messageHandler);
			//deals with XXXChanged events
			TryHookEventMonitor(messageHandler);
		}
Esempio n. 18
0
 protected override void given_the_context_of()
 {
     container  = Mock <IServiceLocator>();
     methodHost = new TheMethodHost();
     handler    = Mock <IRoutedMessageHandler>();
     handler.Stub(x => x.Unwrap()).Return(methodHost);
     trigger         = Stub <IMessageTrigger>();
     trigger.Message = Stub <IRoutedMessage>();
 }
 protected override void given_the_context_of()
 {
     container = Mock<IServiceLocator>();
     methodHost = new TheMethodHost();
     handler = Mock<IRoutedMessageHandler>();
     handler.Stub(x => x.Unwrap()).Return(methodHost);
     trigger = Stub<IMessageTrigger>();
     trigger.Message = Stub<IRoutedMessage>();
 }
Esempio n. 20
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.GetMetadata <AutoCheckAvailabilityHelper>();

            if (helper == null)
            {
                return;
            }

            helper.MakeAwareOf(trigger);
        }
		protected override void given_the_context_of()
		{
			_expectationsWasSet = false;

			var methodFactory = new DefaultMethodFactory();

			_handler = StrictMock<IRoutedMessageHandler>();
			_notifier = new TheNotifierClass();
			_observer = new DependencyObserver(_handler, methodFactory, _notifier);
			_trigger = Mock<IMessageTrigger>();
		}
Esempio n. 22
0
        /// <summary>
        /// Adds a message handler at the specified location in the UI hierarchy.
        /// </summary>
        /// <param name="uiElement">The UI element.</param>
        /// <param name="handler">The message handler.</param>
        /// <param name="setContext">if set to <c>true</c> the handler will also be stored in the element's DataContext and ViewMetadata will be set.</param>
        public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
        {
            var node = FindOrAddNode(uiElement);

            node.RegisterHandler(handler);

            if (setContext)
            {
                uiElement.SetDataContext(handler.Unwrap());
            }
        }
        protected override void given_the_context_of()
        {
            expectationsWasSet = false;

            var methodFactory = new DefaultMethodFactory();

            handler  = StrictMock <IRoutedMessageHandler>();
            notifier = new TheNotifierClass();
            observer = new DependencyObserver(handler, methodFactory, notifier);
            trigger  = Mock <IMessageTrigger>();
        }
Esempio n. 24
0
        /// <summary>
        /// Tries to hook the event.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="eventName">Name of the event.</param>
        /// <returns></returns>
        public static EventMonitor TryHook(IRoutedMessageHandler messageHandler, string eventName)
        {
            var target    = messageHandler.Unwrap();
            var eventInfo = target.GetType().GetEvent(eventName);

            if (eventInfo == null)
            {
                return(null);
            }
            return(new EventMonitor(messageHandler, eventInfo));
        }
Esempio n. 25
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;
            if (notifier == null) return;

            var helper = messageHandler.GetMetadata<DependencyObserver>();
            if (helper != null) return;

            helper = new DependencyObserver(messageHandler, _methodFactory, notifier);
            messageHandler.AddMetadata(helper);
        }
Esempio n. 26
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType <AutoCheckAvailabilityHelper>();

            if (helper != null)
            {
                return;
            }

            helper = new AutoCheckAvailabilityHelper(messageHandler);
            messageHandler.Metadata.Add(helper);
        }
Esempio n. 27
0
        protected override void given_the_context_of()
        {
            methodFactory = Mock<IMethodFactory>();
            info = typeof(MethodHost).GetMethod("Preview");
            attribute = new PreviewAttribute("Preview");
            container = Stub<IServiceLocator>();
            container.Stub(x => x.GetInstance<IMethodFactory>()).Return(methodFactory).Repeat.Any();

            routedMessageHandler = Mock<IRoutedMessageHandler>();
            var metadata = new List<object>();
            routedMessageHandler.Stub(x => x.Metadata).Return(metadata).Repeat.Any();
        }
Esempio n. 28
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var helper = messageHandler.GetMetadata <AutoCheckAvailabilityHelper>();

            if (helper != null)
            {
                return;
            }

            helper = new AutoCheckAvailabilityHelper(messageHandler);
            messageHandler.AddMetadata(helper);
        }
Esempio n. 29
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            if (!AffectsTriggers)
            {
                return;
            }

            //deals with INPC classes
            TryHookDependencyObserver(messageHandler);
            //deals with XXXChanged events
            TryHookEventMonitor(messageHandler);
        }
Esempio n. 30
0
        protected override void given_the_context_of()
        {
            methodFactory = Mock <IMethodFactory>();
            info          = typeof(MethodHost).GetMethod("Preview");
            attribute     = new PreviewAttribute("Preview");
            container     = Stub <IServiceLocator>();
            container.Stub(x => x.GetInstance(typeof(IMethodFactory), null)).Return(methodFactory).Repeat.Any();

            routedMessageHandler = Mock <IRoutedMessageHandler>();
            var metadata = new List <object>();

            routedMessageHandler.Stub(x => x.Metadata).Return(metadata).Repeat.Any();
        }
Esempio n. 31
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType <DependencyObserver>();

            if (helper == null)
            {
                return;
            }

            if (trigger.Message.RelatesTo(target))
            {
                helper.MakeAwareOf(trigger, dependencies);
            }
        }
Esempio n. 32
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            var helper = messageHandler.GetMetadata <ItemDependencyObserver>();

            if (helper == null)
            {
                return;
            }

            if (trigger.Message.RelatesTo(_target))
            {
                helper.MakeAwareOf(trigger, _dependencies);
            }
        }
Esempio n. 33
0
        private void TryHookEventMonitor(IRoutedMessageHandler messageHandler)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType <EventMonitor>();

            if (helper != null)
            {
                return;
            }

            helper = EventMonitor.TryHook(messageHandler, MethodName + "Changed");
            if (helper != null)
            {
                messageHandler.Metadata.Add(helper);
            }
        }
        //see http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=212171 for the rationale behind the finalizer removal
        public void backreferences_should_not_leak_the_observer_strict()
        {
            var handlerRef = new WeakReference(handler);
            var parent     = notifier.Model;

            ConfigureObserver(new[] {
                "Model.SomeModelProperty"
            });

            observer = null;
            handler  = null;
            GC.Collect();
            GC.WaitForFullGCComplete();
            GC.WaitForPendingFinalizers();

            handlerRef.IsAlive.ShouldBeFalse();
            parent.SubscriptionCount.ShouldBe(0);
        }
Esempio n. 35
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            if (!AffectsTriggers || !IsGetter)
            {
                return;
            }

            var helper = messageHandler.GetMetadata <DependencyObserver>();

            if (helper == null)
            {
                return;
            }

            if (trigger.Message.RelatesTo(Target))
            {
                helper.MakeAwareOf(trigger, new[] { MethodName });
            }
        }
Esempio n. 36
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;

            if (notifier == null)
            {
                return;
            }

            var helper = messageHandler.GetMetadata <ItemDependencyObserver>();

            if (helper != null)
            {
                return;
            }

            helper = new ItemDependencyObserver(messageHandler, _methodFactory, notifier);
            messageHandler.AddMetadata(helper);
        }
Esempio n. 37
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;

            if (notifier == null)
            {
                return;
            }

            var helper = messageHandler.Metadata.FirstOrDefaultOfType <DependencyObserver>();

            if (helper != null)
            {
                return;
            }

            helper = new DependencyObserver(messageHandler, methodFactory, notifier);
            messageHandler.Metadata.Add(helper);
        }
Esempio n. 38
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            if (!AffectsTriggers || !trigger.Message.RelatesTo(Member))
            {
                return;
            }

            var depObserver = messageHandler.Metadata.FirstOrDefaultOfType <DependencyObserver>();

            if (IsGetter && depObserver != null)
            {
                depObserver.MakeAwareOf(trigger, new[] { MethodName });
            }

            var evtMonitor = messageHandler.Metadata.FirstOrDefaultOfType <EventMonitor>();

            if (evtMonitor != null)
            {
                evtMonitor.MakeAwareOf(trigger);
            }
        }
Esempio n. 39
0
        /// <summary>
        /// Adds a message handler at the specified location in the UI hierarchy.
        /// </summary>
        /// <param name="uiElement">The UI element.</param>
        /// <param name="handler">The message handler.</param>
        /// <param name="setContext">if set to <c>true</c> the handler will also be stored in the element's DataContext and ViewMetadata will be set.</param>
        public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
        {
            var node = FindOrAddNode(uiElement);
            node.RegisterHandler(handler);

            if(setContext)
            {
                var unwrappedValue = handler.Unwrap();

                var frameworkElement = uiElement as FrameworkElement;
                if(frameworkElement != null)
                    frameworkElement.DataContext = unwrappedValue;
#if !SILVERLIGHT
                else
                {
                    var frameworkContentElement = uiElement as FrameworkContentElement;
                    if(frameworkContentElement != null)
                        frameworkContentElement.DataContext = unwrappedValue;
                }
#endif
            }
        }
Esempio n. 40
0
        private void TryHookDependencyObserver(IRoutedMessageHandler messageHandler)
        {
            if (!IsGetter)
            {
                return;
            }

            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;

            if (notifier == null)
            {
                return;
            }

            var helper = messageHandler.Metadata.FirstOrDefaultOfType <DependencyObserver>();

            if (helper != null)
            {
                return;
            }

            helper = new DependencyObserver(messageHandler, methodFactory, notifier);
            messageHandler.Metadata.Add(helper);
        }
Esempio n. 41
0
 /// <summary>
 /// Sets the message handler for this node.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 public void RegisterHandler(IRoutedMessageHandler messageHandler)
 {
     this.messageHandler = messageHandler;
     this.messageHandler.Initialize(this);
     Log.Info("Handler {0} registered.", messageHandler);
 }
Esempio n. 42
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            if (!AffectsTriggers)
                return;

            var helper = messageHandler.Metadata.FirstOrDefaultOfType<DependencyObserver>();
            if (helper == null) return;

            if (trigger.Message.RelatesTo(_target))

            {
                //helper.MakeAwareOf(trigger, new[] { _target.Name });
                var actionMessage = trigger.Message as ActionMessage;
                if (actionMessage == null) return;

                //var handler = helper.Host.FindActionHandler(actionMessage);
                bool isAvailable = Execute(actionMessage, trigger.Node,null);
                trigger.UpdateAvailabilty(isAvailable);
            }
        }
		//see http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=212171 for the rationale behind the finalizer removal
		public void backreferences_should_not_leak_the_observer_strict()
		{

			var handlerRef = new WeakReference(_handler);
			var parent = _notifier.Model;

			ConfigureObserver(new[] { "Model.SomeModelProperty" });

			_observer = null;
			_handler = null;
			GC.Collect();
			GC.WaitForFullGCComplete();
			GC.WaitForPendingFinalizers();

			Assert.That(handlerRef.IsAlive, Is.False);
			Assert.That(parent.SubscriptionCount, Is.EqualTo(0));

		}
 /// <summary>
 /// Initializes a new instance of the <see cref="SinglePropertyPathObserver"/> class.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 /// <param name="methodFactory">The method factory.</param>
 /// <param name="notifier">The notifier.</param>
 /// <param name="propertyPath">The property path.</param>
 public SinglePropertyPathObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier, string propertyPath)
 {
     this.messageHandler = messageHandler;
     monitor             = new PropertyPathMonitor(methodFactory, notifier, propertyPath, this);
 }
Esempio n. 45
0
 public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
 {
     throw new NotImplementedException();
 }
		//ref http://caliburn.codeplex.com/WorkItem/View.aspx?WorkItemId=6100
		//see also http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=212171
		public void backreferences_should_not_leak_the_observer()
		{

			var handlerRef = new WeakReference(_handler);

			//this reference emulates a back pointer to a long-living model
			var parent = _notifier.Model;


			ConfigureObserver(new[] { "Model.SomeModelProperty" });

			//emulates the collection of the cluster composed by Screen, View, MessageHandler and ancillary filters 
			//(included Dependecies along with its internal PropertyPathMonitor)
			_observer = null;
			_handler = null;
			GC.Collect();
			GC.WaitForFullGCComplete();
			GC.WaitForPendingFinalizers();


			Assert.That(handlerRef.IsAlive, Is.False, "message handler has not been released");


			//the first time a ppMonitor is notified AFTER the collection of its DependenyObserver,
			//it unregisters the unnecessary handler
			parent.NotifyOfPropertyChange("anyProperty");

			Assert.That(parent.SubscriptionCount, Is.EqualTo(0), "subscription to parent model has not been removed");

		}
Esempio n. 47
0
 /// <summary>
 /// Sets the message handler for this node.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 public void RegisterHandler(IRoutedMessageHandler messageHandler)
 {
     _messageHandler = messageHandler;
     _messageHandler.Initialize(this);
 }
			public ChangedEventMonitor(EventInfo @event, object sender, IRoutedMessageHandler messageHandler)
			{
				if (@event != null)
				{
					EventHelper.WireEvent(sender, @event, (o, e) =>
					{
						foreach (var trigger in _triggers)
							messageHandler.UpdateAvailability(trigger);
					});
				}
			}
Esempio n. 49
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            if (!AffectsTriggers || !IsGetter)
                return;

            var helper = messageHandler.GetMetadata<DependencyObserver>();
            if (helper == null) return;

            if (trigger.Message.RelatesTo(Target))
                helper.MakeAwareOf(trigger, new[] { MethodName });
        }
Esempio n. 50
0
        /// <summary>
        /// Makes the filter aware of the <see cref="IRoutedMessageHandler"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler)
        {
            if (!AffectsTriggers)
                return;

            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;
            if (notifier == null) return;

            var helper = messageHandler.Metadata.FirstOrDefaultOfType<DependencyObserver>();
            if (helper != null) return;

            helper = new DependencyObserver(messageHandler, _methodFactory, notifier);
            messageHandler.Metadata.Add(helper);
        }
        private void TryHookDependencyObserver(IRoutedMessageHandler messageHandler)
        {
            //if (!IsGetter()) return;

            var notifier = messageHandler.Unwrap() as INotifyPropertyChanged;
            if (notifier == null) return;

            var helper = messageHandler.Metadata.FirstOrDefaultOfType<DependencyObserver>();
            if (helper != null) return;

            helper = new DependencyObserver(messageHandler, _methodFactory, notifier);
            messageHandler.Metadata.Add(helper);
        }
        private void TryHookEventMonitor(IRoutedMessageHandler messageHandler,string methodName)
        {
            var helper = messageHandler.Metadata.FirstOrDefaultOfType<EventMonitor>();
            if (helper != null) return;

            helper = EventMonitor.TryHook(messageHandler, methodName + "Changed");
            if (helper != null)
                messageHandler.Metadata.Add(helper);
        }
        /// <summary>
        /// Makes the filter aware of the <see cref="IMessageTrigger"/>.
        /// </summary>
        /// <param name="messageHandler">The message handler.</param>
        /// <param name="trigger">The trigger.</param>
        public void MakeAwareOf(IRoutedMessageHandler messageHandler, IMessageTrigger trigger)
        {
            if (!AffectsTriggers || !trigger.Message.RelatesTo(Member))
                return;

            var depObserver = messageHandler.Metadata.FirstOrDefaultOfType<DependencyObserver>();
            if (IsGetter(_isInZoomMethod)  && depObserver != null)
                depObserver.MakeAwareOf(trigger, new[] { _isInZoomMethodName });
            if (IsGetter(_selectedItemsMethod) && depObserver != null)
                depObserver.MakeAwareOf(trigger, new[] { _selectedItemsMethodName });

            //var evtMonitor = messageHandler.Metadata.FirstOrDefaultOfType<EventMonitor>();
            //if (evtMonitor != null)
            //    evtMonitor.MakeAwareOf(trigger);
           
        }
Esempio n. 54
0
 public MonitoringInfo(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier, string propertyPath)
 {
     _messageHandler = messageHandler;
     new PropertyPathMonitor(methodFactory, notifier, propertyPath, OnPathChanged);
 }
Esempio n. 55
0
 /// <summary>
 /// Sets the message handler for this node.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 public void RegisterHandler(IRoutedMessageHandler messageHandler)
 {
     _messageHandler = messageHandler;
     _messageHandler.Initialize(this);
 }
Esempio n. 56
0
 public MonitoringInfo(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier, string propertyPath)
 {
     _messageHandler = messageHandler;
     new PropertyPathMonitor(methodFactory, notifier, propertyPath, OnPathChanged);
 }
Esempio n. 57
0
 public void AddHandler(DependencyObject uiElement, IRoutedMessageHandler handler, bool setContext)
 {
     throw new NotImplementedException();
 }
Esempio n. 58
0
 /// <summary>
 /// Sets the message handler for this node.
 /// </summary>
 /// <param name="messageHandler">The message handler.</param>
 public void RegisterHandler(IRoutedMessageHandler messageHandler)
 {
     _messageHandler = messageHandler;
     _messageHandler.Initialize(this);
     Log.Info("Handler {0} registered.", messageHandler);
 }
Esempio n. 59
0
		public SinglePropertyPathObserver(IRoutedMessageHandler messageHandler, IMethodFactory methodFactory, INotifyPropertyChanged notifier, string propertyPath)
		{
			_messageHandler = messageHandler;
			_monitor = new PropertyPathMonitor(methodFactory, notifier, propertyPath, this);
		}