Beispiel #1
0
 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);
 }
Beispiel #2
0
        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]);
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }