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; }
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); }