6ad4e8c9cc0b905806abb7466f856c6740d39276
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / NamescopingVisitor.cs
1 using System.Collections.Generic;
2 using Tizen.NUI.Binding.Internals;
3
4 namespace Tizen.NUI.Xaml
5 {
6     internal class NamescopingVisitor : IXamlNodeVisitor
7     {
8         readonly Dictionary<INode, INameScope> scopes = new Dictionary<INode, INameScope>();
9
10         public NamescopingVisitor(HydrationContext context)
11         {
12             Values = context.Values;
13         }
14
15         Dictionary<INode, object> Values { get; set; }
16
17         public TreeVisitingMode VisitingMode => TreeVisitingMode.TopDown;
18         public bool StopOnDataTemplate => false;
19         public bool StopOnResourceDictionary => false;
20         public bool VisitNodeOnDataTemplate => true;
21         public bool SkipChildren(INode node, INode parentNode) => false;
22         public bool IsResourceDictionary(ElementNode node) => false;
23
24         public void Visit(ValueNode node, INode parentNode)
25         {
26             scopes[node] = scopes[parentNode];
27         }
28
29         public void Visit(MarkupNode node, INode parentNode)
30         {
31             scopes[node] = scopes[parentNode];
32         }
33
34         public void Visit(ElementNode node, INode parentNode)
35         {
36             var ns = parentNode == null || IsDataTemplate(node, parentNode) || IsStyle(parentNode) || IsVisualStateGroupList(node)
37                 ? new NameScope()
38                 : scopes[parentNode];
39             node.Namescope = ns;
40             scopes[node] = ns;
41         }
42
43         public void Visit(RootNode node, INode parentNode)
44         {
45             var ns = new NameScope();
46             node.Namescope = ns;
47             scopes[node] = ns;
48         }
49
50         public void Visit(ListNode node, INode parentNode)
51         {
52             scopes[node] = scopes[parentNode];
53         }
54
55         static bool IsDataTemplate(INode node, INode parentNode)
56         {
57             var parentElement = parentNode as IElementNode;
58             INode createContent;
59             if (parentElement != null && parentElement.Properties.TryGetValue(XmlName._CreateContent, out createContent) &&
60                 createContent == node)
61                 return true;
62             return false;
63         }
64
65         static bool IsStyle(INode parentNode)
66         {
67             var pnode = parentNode as ElementNode;
68             return pnode != null && pnode.XmlType.Name == "Style";
69         }
70
71         static bool IsVisualStateGroupList(ElementNode node)
72         {
73             return node != null && node.XmlType.Name == "VisualStateGroup" && node.Parent is IListNode;
74         }
75     }
76 }