internal void RaiseEvent(FunctionalEventArgs eventArgs, Predicate<IFunctionalTreeElement> predicate = null)
        {
            if (eventArgs == null)
                throw new ArgumentNullException("eventArgs", "eventArgs is null.");
            if (eventArgs.FunctionalEvent == null)
                throw new ArgumentNullException("eventArgs", "eventArgs is null.");

            if (!FunctionalEventsInternal.ContainsKey(eventArgs.FunctionalEvent.OwnerType))
                return;

            FunctionalEvent functionalEvent = eventArgs.FunctionalEvent;
            FunctionalElementRoute route = null;
            switch (functionalEvent.FunctionalStretegy)
            {
                case FunctionalStrategy.Bubble:
                    route = BuildBubbleEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Tunnel:
                    route = BuildTunnelEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Spread:
                    route = BuildSpreadEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Children:
                    route = BuildChildrenEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Descendents:
                    route = BuildDescendentsEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Siblings:
                    route = BuildSiblingsEventRoute(eventArgs.Source, eventArgs);
                    break;
                case FunctionalStrategy.Parent:
                    route = BuildParentEventRoute(eventArgs.Source, eventArgs);
                    break;
            }

            FunctionalEventTracingArgs tracingEventArgs = new FunctionalEventTracingArgs(route);
            foreach (IFunctionalTreeElement element in route)
            {
                tracingEventArgs.UpdateCurrentIndex(route.IndexOf(element));
                RaiseEventOnElement(element, eventArgs, tracingEventArgs, predicate);
                if (tracingEventArgs.Abort)
                    break;
            }
        }
        private FunctionalElementRoute BuildTunnelEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = BuildBubbleEventRoute(element, eventArgs);
            route.Reverse();

            return route;
        }
        private FunctionalElementRoute BuildSpreadEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = new FunctionalElementRoute();

            IFunctionalTreeElement treeRoot = FunctionalTreeHelper.GetFunctionalTree(element).Root;
            route.Add(treeRoot);
            route.AddRange(GetDescendents(treeRoot));

            return route;
        }
        private FunctionalElementRoute BuildSiblingsEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = new FunctionalElementRoute();

            IFunctionalTreeElement parent = FunctionalTreeHelper.GetFunctionalParent(element);
            if (parent == null)
                return route;

            route.AddRange(FunctionalTreeHelper.GetFunctionalChildren(parent).Where(cur => cur != element));
            return route;
        }
        private FunctionalElementRoute BuildParentEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = new FunctionalElementRoute();
            route.Add(FunctionalTreeHelper.GetFunctionalParent(element));

            return route;
        }
        private FunctionalElementRoute BuildDescendentsEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = new FunctionalElementRoute();
            route.AddRange(GetDescendents(element));

            return route;
        }
 private FunctionalElementRoute BuildChildrenEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
 {
     FunctionalElementRoute route = new FunctionalElementRoute();
     route.AddRange(FunctionalTreeHelper.GetFunctionalChildren(element));
     return route;
 }
 public static void RaiseFunctionalEventPair(this IFunctionalTreeElement source, 
     FunctionalEvent tunnelEvent, 
     FunctionalEvent bubbleEvent, 
     FunctionalEventArgs e)
 {
     RaiseFunctionalEventPair(source, tunnelEvent, bubbleEvent, e, null);
 }
        /// <summary>
        /// The event will be raised only on objects of type T.
        /// </summary>
        internal void RaiseEventPair(FunctionalEvent tunnelEvent, FunctionalEvent bubbleEvent, FunctionalEventArgs eventArgs, Predicate<IFunctionalTreeElement> predicate = null)
        {
            if (tunnelEvent == null)
                throw new ArgumentNullException("tunnelEvent", "tunnelEvent is null.");
            if (bubbleEvent == null)
                throw new ArgumentNullException("bubbleEvent", "bubbleEvent is null.");
            if (eventArgs == null)
                throw new ArgumentNullException("eventArgs", "eventArgs is null.");

            if (tunnelEvent.FunctionalStretegy != FunctionalStrategy.Tunnel)
                throw new ArgumentNullException("tunnelEvent", "tunnelEvent is not tunnel.");
            if (bubbleEvent.FunctionalStretegy != FunctionalStrategy.Bubble)
                throw new ArgumentNullException("bubbleEvent", "bubbleEvent is bubble.");

            if (!FunctionalEventsInternal.ContainsKey(eventArgs.FunctionalEvent.OwnerType))
                return;

            eventArgs.FunctionalEvent = tunnelEvent;
            RaiseEvent(eventArgs, predicate);

            eventArgs.FunctionalEvent = bubbleEvent;
            RaiseEvent(eventArgs, predicate);
        }
 private void EventTestHandler(IFunctionalTreeElement sender, FunctionalEventArgs e)
 {
     MainWindow.Reporter.WriteLine(string.Format("[Event] Event: {0}  Sender: {1}  Source: {2}", e.FunctionalEvent.Name, ((TestingElement)sender).Name, ((TestingElement)e.Source).Name));
 }
 private void TestHandler(IFunctionalTreeElement sender, FunctionalEventArgs e)
 {
     string senderString = (sender is Foo ? ((Foo)sender).Header : "Root");
     string sourceString = (e.Source is Foo ? ((Foo)e.Source).Header : "Root");
     Debug.WriteLine(String.Format("{0} | Id: {1} | sender: {2} | e.Source: {3}", Header, Id, senderString, sourceString));
 }
 private void TestHandler(IFunctionalTreeElement sender, FunctionalEventArgs e)
 {
     Debug.WriteLine(String.Format("{0} | Id: {1} | NoFoo", Header, Id));
 }
        public static void RaiseFunctionalEvent(this IFunctionalTreeElement source, FunctionalEventArgs e, Predicate<IFunctionalTreeElement> predicate)
        {
            if (e == null || source == null)
                return;

            e.Source = source;
            FunctionalEventManager.Instance.RaiseEvent(e, predicate);
        }
 public static void RaiseFunctionalEvent(this IFunctionalTreeElement source, FunctionalEventArgs e)
 {
     RaiseFunctionalEvent(source, e, null);
 }
        public static void RaiseFunctionalEventPair(this IFunctionalTreeElement source, 
            FunctionalEvent tunnelEvent, 
            FunctionalEvent bubbleEvent, 
            FunctionalEventArgs e,
            Predicate<IFunctionalTreeElement> predicate)
        {
            if (source == null || tunnelEvent == null || bubbleEvent == null || e == null)
                return;

            e.Source = source;
            FunctionalEventManager.Instance.RaiseEventPair(tunnelEvent, bubbleEvent, e, predicate);
        }
        private void RaiseEventOnElement(IFunctionalTreeElement element, 
            FunctionalEventArgs eventArgs, 
            FunctionalEventTracingArgs tracingEventArgs, 
            Predicate<IFunctionalTreeElement> predicate = null)
        {
            if (element == null || eventArgs == null || (predicate != null && !predicate(element)))
                return;

            List<FunctionalEventHandlerContainer> eventHandlerList = GetHandlerList(eventArgs.FunctionalEvent, element);
            if (eventHandlerList != null && eventHandlerList.Count() > 0)
            {
                foreach (FunctionalEventHandlerContainer handlerContainer in eventHandlerList)
                {
                    if (!eventArgs.Handled || handlerContainer.HandledEventsToo)
                    {
                        eventArgs.FunctionalEvent.EventTracer.RaiseEventRaising(eventArgs.FunctionalEvent, tracingEventArgs);
                        if (tracingEventArgs.Abort)
                            return;

                        foreach (Delegate handler in handlerContainer.Handler.GetInvocationList())
                            handler.Method.Invoke(element, new object[] { element, eventArgs });

                        eventArgs.FunctionalEvent.EventTracer.RaiseEventRaised(eventArgs.FunctionalEvent, tracingEventArgs);
                        if (tracingEventArgs.Abort)
                            return;
                    }
                }
            }
        }
        private FunctionalElementRoute BuildBubbleEventRoute(IFunctionalTreeElement element, FunctionalEventArgs eventArgs)
        {
            FunctionalElementRoute route = new FunctionalElementRoute();

            IFunctionalTreeElement curElement = element;
            while (curElement != null)
            {
                route.Add(curElement);
                curElement = FunctionalTreeHelper.GetFunctionalParent(curElement);
            }

            return route;
        }
Esempio n. 18
0
 private void OnDockingContentClosedInternal(IFunctionalTreeElement sender, FunctionalEventArgs e)
 {
     Debug.Assert(e.Source is DockingBase, "Source is not an DockingBase.");
     if (e.Source is DockingBase)
         OnDockingDescendentClosed((DockingBase)e.Source);
 }