private static IEnumerable <DocumentNode> TraverseDocumentDescendants(DocumentNode node, ISearchPredicate continueTester, SceneViewModel viewModel) { if (node.ChildNodesCount != 0) { IEnumerator <DocumentNode> descendantEnumerator = node.DescendantNodes.GetEnumerator(); while (descendantEnumerator.MoveNext()) { DocumentNode current = descendantEnumerator.Current; yield return(current); if (continueTester != null && !continueTester.Test(viewModel.GetSceneNode(current))) { IDescendantEnumerator descendantEnumerator1 = descendantEnumerator as IDescendantEnumerator; if (descendantEnumerator1 != null) { descendantEnumerator1.SkipPastDescendants(current); } } } } }
protected static IEnumerable <SceneNode> Enumerate(SceneNode pivot, SearchAxis axis, ISearchPredicate continueTester) { SceneViewModel viewModel = pivot.ViewModel; switch (axis.axisType) { case SearchAxis.AxisType.DocumentAncestor: foreach (DocumentNode node in pivot.DocumentNode.AncestorNodes) { SceneNode sceneNode = viewModel.GetSceneNode(node); yield return(sceneNode); if (continueTester != null && !continueTester.Test(sceneNode)) { break; } } break; case SearchAxis.AxisType.DocumentParent: DocumentNode parentNode = (DocumentNode)pivot.DocumentNode.Parent; if (parentNode == null) { break; } yield return(viewModel.GetSceneNode(parentNode)); break; case SearchAxis.AxisType.DocumentChild: foreach (DocumentNode node in pivot.DocumentNode.ChildNodes) { SceneNode sceneNode = viewModel.GetSceneNode(node); yield return(sceneNode); } break; case SearchAxis.AxisType.DocumentDescendant: foreach (DocumentNode node in SearchAxis.TraverseDocumentDescendants(pivot.DocumentNode, continueTester, viewModel)) { yield return(viewModel.GetSceneNode(node)); } break; case SearchAxis.AxisType.DocumentSelfAndDescendant: yield return(pivot); foreach (DocumentNode node in SearchAxis.TraverseDocumentDescendants(pivot.DocumentNode, continueTester, viewModel)) { yield return(viewModel.GetSceneNode(node)); } break; case SearchAxis.AxisType.Self: yield return(pivot); break; case SearchAxis.AxisType.Root: yield return(viewModel.GetSceneNode(pivot.DocumentNode.DocumentRoot.RootNode)); break; case SearchAxis.AxisType.StoryboardContainer: SceneNode thisStoryboardContainer = (SceneNode)pivot.StoryboardContainer; if (thisStoryboardContainer == null) { break; } yield return(thisStoryboardContainer); break; case SearchAxis.AxisType.StoryboardAncestor: for (IStoryboardContainer cur = pivot.StoryboardContainer; cur != null; cur = cur.TargetElement.StoryboardContainer) { yield return((SceneNode)cur); if (continueTester != null && !continueTester.Test((SceneNode)cur)) { break; } } break; case SearchAxis.AxisType.ActiveStoryboard: if (pivot.ViewModel.ActiveStoryboardTimeline == null) { break; } yield return((SceneNode)pivot.ViewModel.ActiveStoryboardTimeline); break; case SearchAxis.AxisType.Animations: StoryboardTimelineSceneNode storyboard = pivot as StoryboardTimelineSceneNode; if (storyboard == null) { break; } foreach (TimelineSceneNode timelineSceneNode in (IEnumerable <TimelineSceneNode>)storyboard.Children) { yield return((SceneNode)timelineSceneNode); } break; case SearchAxis.AxisType.KeyFrames: KeyFrameAnimationSceneNode keyFrameAnimation = pivot as KeyFrameAnimationSceneNode; if (keyFrameAnimation == null) { break; } foreach (KeyFrameSceneNode keyFrameSceneNode in keyFrameAnimation.KeyFrames) { yield return((SceneNode)keyFrameSceneNode); } break; case SearchAxis.AxisType.SceneAncestor: for (SceneNode parent = pivot.Parent; parent != null; parent = parent.Parent) { yield return(parent); if (continueTester != null && !continueTester.Test(parent)) { break; } } break; case SearchAxis.AxisType.SceneParent: SceneNode node1 = pivot.Parent; if (node1 == null) { break; } yield return(node1); break; case SearchAxis.AxisType.SceneChild: DocumentCompositeNode docNode = pivot.DocumentNode as DocumentCompositeNode; if (docNode == null) { break; } if (docNode.SupportsChildren) { ISceneNodeCollection <SceneNode> children = pivot.GetChildren(); for (int i = 0; i < children.Count; ++i) { yield return(children[i]); } break; } foreach (IPropertyId propertyKey in (IEnumerable <IProperty>)docNode.Properties.Keys) { SceneNode subNode = pivot.GetLocalValueAsSceneNode(propertyKey); yield return(subNode); } break; case SearchAxis.AxisType.SceneDescendant: IEnumerator <SceneNode> descendantEnumerator = (IEnumerator <SceneNode>) new SearchAxis.SceneDescendantTraversalEnumerator(pivot, continueTester); while (descendantEnumerator.MoveNext()) { yield return(descendantEnumerator.Current); } break; case SearchAxis.AxisType.Property: IProperty resolvedProperty = pivot.ProjectContext.ResolveProperty(axis.Property); if (resolvedProperty == null) { break; } SceneNode node2 = pivot.GetLocalValueAsSceneNode((IPropertyId)resolvedProperty); if (node2 == null) { break; } yield return(node2); break; case SearchAxis.AxisType.CollectionChild: SceneNode node3 = pivot.GetChildren()[axis.ChildIndex]; if (node3 == null) { break; } yield return(node3); break; } }