120 lines
3.8 KiB
C#
120 lines
3.8 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.Activities.XamlIntegration
|
||
|
{
|
||
|
using System.Collections.Generic;
|
||
|
using System.Xaml;
|
||
|
|
||
|
class NamespaceTable : IXamlNamespaceResolver
|
||
|
{
|
||
|
List<NamespaceDeclaration> tempNamespaceList;
|
||
|
Stack<List<NamespaceDeclaration>> namespaceStack;
|
||
|
Dictionary<string, NamespaceDeclaration> namespacesCache;
|
||
|
|
||
|
public NamespaceTable()
|
||
|
{
|
||
|
this.tempNamespaceList = new List<NamespaceDeclaration>();
|
||
|
this.namespaceStack = new Stack<List<NamespaceDeclaration>>();
|
||
|
}
|
||
|
|
||
|
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<NamespaceDeclaration>();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ExitScope()
|
||
|
{
|
||
|
List<NamespaceDeclaration> namespaceList = this.namespaceStack.Pop();
|
||
|
if (namespaceList.Count != 0)
|
||
|
{
|
||
|
this.namespacesCache = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public IEnumerable<NamespaceDeclaration> GetNamespacePrefixes()
|
||
|
{
|
||
|
if (this.namespacesCache == null)
|
||
|
{
|
||
|
ConstructNamespaceCache();
|
||
|
}
|
||
|
|
||
|
return this.namespacesCache.Values;
|
||
|
}
|
||
|
|
||
|
void ConstructNamespaceCache()
|
||
|
{
|
||
|
Dictionary<string, NamespaceDeclaration> localNamespaces = new Dictionary<string, NamespaceDeclaration>();
|
||
|
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<NamespaceDeclaration> currentNamespaces in this.namespaceStack)
|
||
|
{
|
||
|
foreach (NamespaceDeclaration currentNamespace in currentNamespaces)
|
||
|
{
|
||
|
if (!localNamespaces.ContainsKey(currentNamespace.Prefix))
|
||
|
{
|
||
|
localNamespaces.Add(currentNamespace.Prefix, currentNamespace);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.namespacesCache = localNamespaces;
|
||
|
}
|
||
|
}
|
||
|
}
|