public static DocumentNodePath ResolveValue(DocumentNodePath source, IList <IProperty> propertyPath, SceneNode referenceSource, int numberOfStepsToResolve, bool evaluateExpressions, bool visualTriggerOnly, BaseTriggerNode trigger, DocumentNodeResolver.ShouldUseTrigger shouldUseTrigger, out int stepsResolved) { if (source.Node is DocumentPrimitiveNode) { stepsResolved = 0; return(source); } List <DocumentNode> list1 = (List <DocumentNode>)null; List <IProperty> list2 = (List <IProperty>)null; List <DocumentNode> list3 = (List <DocumentNode>)null; DocumentNode childNode = source.Node; int index; for (index = 0; index < numberOfStepsToResolve; ++index) { IProperty property1 = propertyPath[index]; DocumentCompositeNode documentCompositeNode1 = childNode as DocumentCompositeNode; if (documentCompositeNode1 != null) { DocumentNode documentNode1 = childNode; IProperty property2 = property1; IndexedClrPropertyReferenceStep propertyReferenceStep = property1 as IndexedClrPropertyReferenceStep; DocumentNode documentNode2; if (propertyReferenceStep != null) { if (documentCompositeNode1.SupportsChildren && propertyReferenceStep.Index >= 0 && propertyReferenceStep.Index < documentCompositeNode1.Children.Count) { documentNode2 = documentCompositeNode1.Children[propertyReferenceStep.Index]; } else { break; } } else if (property1.TargetType != (Type)null && property1.TargetType.IsAssignableFrom(childNode.TargetType)) { if (trigger != null && (shouldUseTrigger == null || shouldUseTrigger(trigger, (IPropertyId)property1))) { documentNode2 = trigger.GetDocumentNodeValue(documentCompositeNode1, (IPropertyId)property1, visualTriggerOnly); if (documentNode2 != null) { documentNode1 = (DocumentNode)documentNode2.Parent; property2 = documentNode2.SitePropertyKey; } } else { documentNode2 = documentCompositeNode1.Properties[(IPropertyId)property1]; } } else { DocumentNodeReference documentNodeReference = (DocumentNodeReference)DocumentNodeResolver.CreateCompositeOrCollectionNodePropertyReference(referenceSource, documentCompositeNode1, (IPropertyId)property1, trigger, shouldUseTrigger, visualTriggerOnly); documentNode2 = documentNodeReference != null ? documentNodeReference.Node : (DocumentNode)null; if (documentNode2 != null) { documentNode1 = (DocumentNode)documentNode2.Parent; property2 = documentNode2.SitePropertyKey; } } bool flag = false; if (documentNode2 != null && documentNode2.Type.IsExpression && evaluateExpressions) { DocumentNodePath context = DocumentNodeResolver.RecreatePath(source, (IList <DocumentNode>)list1, (IList <DocumentNode>)list3, (IList <IProperty>)list2, documentNode2); DocumentNode documentNode3 = new ExpressionEvaluator((IDocumentRootResolver)documentNode2.Context).EvaluateExpression(context, documentNode2); if (documentNode3 != null && documentNode3 != documentNode2) { flag = true; documentNode2 = documentNode3; } } if (documentNode2 != null) { DocumentCompositeNode documentCompositeNode2 = documentNode2 as DocumentCompositeNode; if ((flag || PlatformTypes.Style.IsAssignableFrom((ITypeId)property1.PropertyType) || PlatformTypes.FrameworkTemplate.IsAssignableFrom((ITypeId)property1.PropertyType)) && documentCompositeNode2 != null) { if (list1 == null) { list1 = new List <DocumentNode>(); list2 = new List <IProperty>(); list3 = new List <DocumentNode>(); } list1.Add(documentNode2); list3.Add(documentNode1); list2.Add(property2); } childNode = documentNode2; } else { break; } } else { break; } } stepsResolved = index; if (stepsResolved == 0) { return(source); } return(DocumentNodeResolver.RecreatePath(source, (IList <DocumentNode>)list1, (IList <DocumentNode>)list3, (IList <IProperty>)list2, childNode)); }
public static DocumentPropertyNodeReferenceBase CreateCompositeOrCollectionNodePropertyReference(SceneNode referenceSource, DocumentCompositeNode parent, IPropertyId propertyKey, BaseTriggerNode trigger, DocumentNodeResolver.ShouldUseTrigger shouldUseTrigger, bool visualTriggerOnly) { IndexedClrPropertyReferenceStep referenceStep = propertyKey as IndexedClrPropertyReferenceStep; return(referenceStep == null ? (trigger == null || shouldUseTrigger == null || !shouldUseTrigger(trigger, propertyKey) ? (referenceSource == null ? (DocumentPropertyNodeReferenceBase) new DocumentPropertyNodeReference(parent, propertyKey) : referenceSource.CreateLocalDocumentPropertyNodeReference(parent, propertyKey)) : (DocumentPropertyNodeReferenceBase) new TriggerSetterNodeReference(trigger, parent, propertyKey, visualTriggerOnly)) : (!parent.SupportsChildren || referenceStep.Index < 0 || referenceStep.Index >= parent.Children.Count ? (DocumentPropertyNodeReferenceBase)null : (DocumentPropertyNodeReferenceBase) new DocumentIndexedPropertyNodeReference(parent, referenceStep))); }