private static bool findPropagationPathUsingTest( Control root, PropagationTest propagationTest, List <Control> path) { var outcome = propagationTest(root); switch (outcome) { case PropagationTestOutcome.Miss: return(false); case PropagationTestOutcome.PassThrough: if (!(root is IControlParent passThroughRootAsParent)) { return(false); } path.Add(root); if (tryFindPropagationPathForAnyChild(passThroughRootAsParent, propagationTest, path)) { return(true); } path.RemoveAt(path.Count - 1); return(false); case PropagationTestOutcome.Hit: path.Add(root); if (!(root is IControlParent hitRootAsParent)) { return(true); } tryFindPropagationPathForAnyChild(hitRootAsParent, propagationTest, path); return(true); default: throw new ArgumentOutOfRangeException(); } }
private static List <Control> findPropagationPathUsingTest(IControlParent root, PropagationTest propagationTest) { var path = new List <Control>(); tryFindPropagationPathForAnyChild(root, propagationTest, path); return(path); }
private static bool tryFindPropagationPathForAnyChild( IControlParent parent, PropagationTest propagationTest, List <Control> path) => parent.Children.Reverse() .Any(child => findPropagationPathUsingTest(child, propagationTest, path));
// Never returns the root as part of the path. public static EventPropagationPath FindPropagationPath(IControlParent root, PropagationTest propagationTest) => new EventPropagationPath(findPropagationPathUsingTest(root, propagationTest).AsReadOnly());