//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.XamlIntegration { using System.Collections.Generic; using System.Xaml; class NamespaceTable : IXamlNamespaceResolver { List tempNamespaceList; Stack> namespaceStack; Dictionary namespacesCache; public NamespaceTable() { this.tempNamespaceList = new List(); this.namespaceStack = new Stack>(); } public string GetNamespace(string prefix) { NamespaceDeclaration result; if (this.namespacesCache == null) { ConstructNamespaceCache(); } if (this.namespacesCache.TryGetValue(prefix, out result)) { return result.Namespace; } else { return null; } } public void ManageNamespace(XamlReader reader) { switch (reader.NodeType) { case XamlNodeType.NamespaceDeclaration: AddNamespace(reader.Namespace); break; case XamlNodeType.StartObject: case XamlNodeType.StartMember: case XamlNodeType.GetObject: EnterScope(); break; case XamlNodeType.EndMember: case XamlNodeType.EndObject: ExitScope(); break; } } public void AddNamespace(NamespaceDeclaration xamlNamespace) { this.tempNamespaceList.Add(xamlNamespace); this.namespacesCache = null; } public void EnterScope() { if (this.tempNamespaceList != null) { this.namespaceStack.Push(this.tempNamespaceList); this.tempNamespaceList = new List(); } } public void ExitScope() { List namespaceList = this.namespaceStack.Pop(); if (namespaceList.Count != 0) { this.namespacesCache = null; } } public IEnumerable GetNamespacePrefixes() { if (this.namespacesCache == null) { ConstructNamespaceCache(); } return this.namespacesCache.Values; } void ConstructNamespaceCache() { Dictionary localNamespaces = new Dictionary(); if (this.tempNamespaceList != null && this.tempNamespaceList.Count > 0) { foreach (NamespaceDeclaration tempNamespace in tempNamespaceList) { if (!localNamespaces.ContainsKey(tempNamespace.Prefix)) { localNamespaces.Add(tempNamespace.Prefix, tempNamespace); } } } foreach (List currentNamespaces in this.namespaceStack) { foreach (NamespaceDeclaration currentNamespace in currentNamespaces) { if (!localNamespaces.ContainsKey(currentNamespace.Prefix)) { localNamespaces.Add(currentNamespace.Prefix, currentNamespace); } } } this.namespacesCache = localNamespaces; } } }