[NUI]Add xaml support for nui and nui xaml test sample (#230)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / NamescopingVisitor.cs
1 using System.Collections.Generic;
2 using Tizen.NUI.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
23                 public void Visit(ValueNode node, INode parentNode)
24                 {
25                         scopes[node] = scopes[parentNode];
26                 }
27
28                 public void Visit(MarkupNode node, INode parentNode)
29                 {
30                         scopes[node] = scopes[parentNode];
31                 }
32
33                 public void Visit(ElementNode node, INode parentNode)
34                 {
35                         var ns = parentNode == null || IsDataTemplate(node, parentNode) || IsStyle(node, parentNode) || IsVisualStateGroupList(node)
36                                 ? new NameScope()
37                                 : scopes[parentNode];
38                         node.Namescope = ns;
39                         scopes[node] = ns;
40                 }
41
42                 public void Visit(RootNode node, INode parentNode)
43                 {
44                         var ns = new NameScope();
45                         node.Namescope = ns;
46                         scopes[node] = ns;
47                 }
48
49                 public void Visit(ListNode node, INode parentNode)
50                 {
51                         scopes[node] = scopes[parentNode];
52                 }
53
54                 static bool IsDataTemplate(INode node, INode parentNode)
55                 {
56                         var parentElement = parentNode as IElementNode;
57                         INode createContent;
58                         if (parentElement != null && parentElement.Properties.TryGetValue(XmlName._CreateContent, out createContent) &&
59                             createContent == node)
60                                 return true;
61                         return false;
62                 }
63
64                 static bool IsStyle(INode node, INode parentNode)
65                 {
66                         var pnode = parentNode as ElementNode;
67                         return pnode != null && pnode.XmlType.Name == "Style";
68                 }
69
70                 static bool IsVisualStateGroupList(ElementNode node)
71                 {
72                         return node != null  && node.XmlType.Name == "VisualStateGroup" && node.Parent is IListNode;
73                 }
74         }
75 }