public static DocumentCompositeNode FindResource(DocumentNode key, DocumentCompositeNode resourcesCollection, int numberOfChildrenToSearch) { if (resourcesCollection != null && resourcesCollection.SupportsChildren) { IList <DocumentNode> children = resourcesCollection.Children; if (numberOfChildrenToSearch < 0) { numberOfChildrenToSearch = children.Count; } for (int i = 0; i < numberOfChildrenToSearch; i++) { DocumentCompositeNode item = children[i] as DocumentCompositeNode; if (item != null) { DocumentNode resourceEntryKey = ResourceNodeHelper.GetResourceEntryKey(item); if (resourceEntryKey == null) { DocumentCompositeNode documentCompositeNode = item.Properties[KnownProperties.DictionaryEntryValueProperty] as DocumentCompositeNode; if (documentCompositeNode != null) { resourceEntryKey = ResourceSite.GetImplicitKey(documentCompositeNode); } } if (resourceEntryKey != null && resourceEntryKey.Equals(key)) { return(item); } } } } return(null); }
private DocumentNode EvaluateResourceAtSpecificSite(ResourceSite resourceSite, DocumentNode keyNode, ICollection <DocumentCompositeNode> resourcesHostNodePath, ICollection <IDocumentRoot> relatedRoots, int lastResourceToSearch, ICollection <string> warnings) { DocumentCompositeNode documentCompositeNode = resourceSite.FindResource(this.documentRootResolver, keyNode, resourcesHostNodePath, relatedRoots, lastResourceToSearch, warnings); if (documentCompositeNode == null) { return(null); } return(documentCompositeNode.Properties[KnownProperties.DictionaryEntryValueProperty]); }
private DocumentNode EvaluateResourceAtSpecificNode(DocumentNode node, DocumentNode keyNode, ICollection <DocumentCompositeNode> resourcesHostNodePath, ICollection <IDocumentRoot> relatedRoots, ICollection <string> warnings) { ISupportsResources resourcesCollection = ResourceNodeHelper.GetResourcesCollection(node); if (resourcesCollection == null) { return(null); } ResourceSite resourceSite = new ResourceSite(node.Context, resourcesCollection); return(this.EvaluateResourceAtSpecificSite(resourceSite, keyNode, resourcesHostNodePath, relatedRoots, -1, warnings)); }
public bool RemoveResource(string key) { bool flag = false; if (this.resourcesHost.Resources != null) { DocumentCompositeNode documentCompositeNode = ResourceSite.FindResource(this.documentContext.CreateNode(key), this.resourcesHost.Resources, -1); if (documentCompositeNode != null) { flag = this.resourcesHost.Resources.Children.Remove(documentCompositeNode); } } return(flag); }
public string GetUniqueResourceKey(string prefix) { string str; string i = prefix; if (this.FindResource(null, i, null, null) != null) { int num = (ResourceSite.ParseKeyString(prefix, out str, out num) ? num + 1 : 1); for (i = string.Concat(str, num.ToString()); this.FindResource(null, i, null, null) != null; i = string.Concat(str, num.ToString(CultureInfo.InvariantCulture))) { num++; } } return(i); }
private DocumentCompositeNode FindResourceInRelatedDocument(IDocumentRootResolver documentRootResolver, DocumentNode keyNode, ICollection <DocumentCompositeNode> resourcesHostNodePath, ICollection <IDocumentRoot> relatedRoots, ResourceSite.ResourceDictionaryLink container, DocumentNode rootNode) { IDocumentRoot documentRoot = rootNode.DocumentRoot; for (ResourceSite.ResourceDictionaryLink i = container; i != null; i = i.Container) { if (i.DocumentRoot == documentRoot) { return(null); } } ResourceSite resourceSite = new ResourceSite(rootNode); DocumentCompositeNode documentCompositeNode = resourceSite.FindResource(documentRootResolver, keyNode, resourcesHostNodePath, relatedRoots, new ResourceSite.ResourceDictionaryLink(container, documentRoot), -1, null); if (documentCompositeNode != null && relatedRoots != null) { relatedRoots.Add(documentRoot); } return(documentCompositeNode); }
private DocumentCompositeNode FindResource(IDocumentRootResolver documentRootResolver, DocumentNode keyNode, ICollection <DocumentCompositeNode> resourcesHostNodePath, ICollection <IDocumentRoot> relatedRoots, ResourceSite.ResourceDictionaryLink container, int numberOfChildrenToSearch, ICollection <string> warnings) { if (resourcesHostNodePath != null) { resourcesHostNodePath.Add(this.resourcesHost.HostNode); } DocumentCompositeNode resources = this.resourcesHost.Resources; if (resources == null) { return(null); } DocumentCompositeNode documentCompositeNode = ResourceSite.FindResource(keyNode, resources, numberOfChildrenToSearch); if (documentCompositeNode != null) { return(documentCompositeNode); } if (documentRootResolver == null) { return(null); } if (resources.TypeResolver.ResolveProperty(KnownProperties.ResourceDictionaryMergedDictionariesProperty) != null) { DocumentCompositeNode item = resources.Properties[KnownProperties.ResourceDictionaryMergedDictionariesProperty] as DocumentCompositeNode; if (item != null) { for (int i = item.Children.Count - 1; i >= 0; i--) { DocumentCompositeNode item1 = item.Children[i] as DocumentCompositeNode; if (item1 != null) { DocumentNode resolvedDocumentRootForSourceUri = this.GetResolvedDocumentRootForSourceUri(documentRootResolver, item1, warnings); if (resolvedDocumentRootForSourceUri == null || !PlatformTypes.ResourceDictionary.IsAssignableFrom(resolvedDocumentRootForSourceUri.Type)) { documentCompositeNode = ResourceSite.FindResource(keyNode, item1, -1); if (documentCompositeNode != null) { return(documentCompositeNode); } } else { documentCompositeNode = this.FindResourceInRelatedDocument(documentRootResolver, keyNode, resourcesHostNodePath, relatedRoots, container, resolvedDocumentRootForSourceUri); if (documentCompositeNode != null) { return(documentCompositeNode); } } } } } } if (resources.TypeResolver.ResolveProperty(KnownProperties.ResourceDictionarySourceProperty) != null) { DocumentNode documentNode = this.GetResolvedDocumentRootForSourceUri(documentRootResolver, resources, warnings); if (documentNode != null && PlatformTypes.ResourceDictionary.IsAssignableFrom(documentNode.Type)) { return(this.FindResourceInRelatedDocument(documentRootResolver, keyNode, resourcesHostNodePath, relatedRoots, container, documentNode)); } } return(null); }
public DocumentNode EvaluateResourceAndCollectionPath(DocumentNodePath nodePath, ResourceReferenceType referenceType, DocumentNode keyNode, ICollection <DocumentCompositeNode> resourcesHostNodePath, ICollection <IDocumentRoot> relatedRoots, ICollection <string> warnings, out bool invalidForwardReference) { Uri uri; DocumentNode documentNode; IDocumentRoot applicationRoot; IDocumentRoot documentRoot = nodePath.RootNode.DocumentRoot; if (this.documentRootResolver != null) { applicationRoot = this.documentRootResolver.ApplicationRoot; } else { applicationRoot = null; } IDocumentRoot documentRoot1 = applicationRoot; bool flag = (documentRoot1 == null ? false : documentRoot1.RootNode != null); IDocumentRoot documentRoot2 = null; invalidForwardReference = false; if (referenceType != ResourceReferenceType.Static) { DocumentNode node = nodePath.Node; while (node != null) { if (flag && node.DocumentRoot != null && node == node.DocumentRoot.RootNode && PlatformTypes.ResourceDictionary.IsAssignableFrom(node.Type)) { string documentUrl = node.Context.DocumentUrl; DocumentCompositeNode rootNode = documentRoot1.RootNode as DocumentCompositeNode; if (rootNode != null && Uri.TryCreate(documentUrl, UriKind.Absolute, out uri) && ResourceNodeHelper.FindReferencedDictionaries(rootNode).Contains <Uri>(uri)) { documentRoot2 = node.DocumentRoot; break; } } DocumentNode documentNode1 = this.EvaluateResourceAtSpecificNode(node, keyNode, resourcesHostNodePath, relatedRoots, warnings); if (documentNode1 != null) { return(documentNode1); } node = node.Parent; if (node == null || nodePath == null) { continue; } DocumentNode containerNode = nodePath.ContainerNode; DocumentNode styleForSetter = ExpressionEvaluator.GetStyleForSetter(node); if (styleForSetter == null || styleForSetter != containerNode) { styleForSetter = ExpressionEvaluator.GetStyleForResourceEntry(node); if (styleForSetter == null) { if (node != containerNode) { continue; } nodePath = null; } else { if (styleForSetter == containerNode) { nodePath = null; } node = styleForSetter.Parent; } } else { nodePath = nodePath.GetContainerOwnerPath(); if (nodePath == null) { continue; } node = nodePath.Node; } } } else { DocumentNode documentNode2 = null; for (DocumentNode i = nodePath.Node; i != null; i = i.Parent) { ISupportsResources resourcesCollection = ResourceNodeHelper.GetResourcesCollection(i); if (resourcesCollection != null) { ResourceSite resourceSite = new ResourceSite(i.Context, resourcesCollection); DocumentNode documentNode3 = null; if (ResourceNodeHelper.IsResourceDictionary(resourcesCollection)) { int siteChildIndex = -1; if (documentNode2 != null) { siteChildIndex = documentNode2.SiteChildIndex; } documentNode3 = this.EvaluateResourceAtSpecificSite(resourceSite, keyNode, resourcesHostNodePath, relatedRoots, siteChildIndex, warnings); } else if (ResourceNodeHelper.IsResourceContainer(resourcesCollection, documentNode2)) { documentNode3 = this.EvaluateResourceAtSpecificSite(resourceSite, keyNode, resourcesHostNodePath, relatedRoots, -1, warnings); } if (documentNode3 != null) { if (keyNode != null && keyNode.Parent != null && keyNode.Parent.Parent == i) { ITextRange nodeSpan = DocumentNodeHelper.GetNodeSpan(keyNode.Parent); ITextRange textRange = DocumentNodeHelper.GetNodeSpan(documentNode3); if (!TextRange.IsNull(textRange) && !TextRange.IsNull(nodeSpan) && nodeSpan.Offset < textRange.Offset) { documentNode3 = null; invalidForwardReference = true; } } if (documentNode3 != null) { return(documentNode3); } } } documentNode2 = i; } } if (flag) { DocumentNode documentNode4 = this.EvaluateResourceAtSpecificNode(documentRoot1.RootNode, keyNode, resourcesHostNodePath, relatedRoots, warnings); if (documentNode4 != null) { if (relatedRoots != null && documentNode4.DocumentRoot != documentRoot2) { relatedRoots.Add(documentRoot1); } return(documentNode4); } } if (documentRoot != null) { using (IEnumerator <IDocumentRoot> enumerator = documentRoot.DesignTimeResources.GetEnumerator()) { while (enumerator.MoveNext()) { IDocumentRoot current = enumerator.Current; DocumentNode documentNode5 = this.EvaluateResourceAtSpecificNode(current.RootNode, keyNode, resourcesHostNodePath, relatedRoots, warnings); if (documentNode5 == null) { continue; } if (relatedRoots != null && documentNode5.DocumentRoot != documentRoot2) { relatedRoots.Add(current); } documentNode = documentNode5; return(documentNode); } return(null); } return(documentNode); } return(null); }