diff --git a/Composite/Class/ILightNode.cs b/Composite/Class/ILightNode.cs index 16366f4..3c4f03b 100644 --- a/Composite/Class/ILightNode.cs +++ b/Composite/Class/ILightNode.cs @@ -9,11 +9,13 @@ namespace Composite.Class public interface ILightNode { public string InnerHTML(int level = 0); - public string OuterHTML(int level =0); + public string OuterHTML(int level = 0); public void AppendChild(ILightNode node); public void ReplaceChild(ILightNode oldNode, ILightNode newNode); public void RemoveChild(ILightNode node); public void InsertBefore(ILightNode node, ILightNode refNode); public ILightNode Clone(); + public string ToString(); + } } diff --git a/Composite/Class/LightElementNode.cs b/Composite/Class/LightElementNode.cs index 1a11f58..5dd2275 100644 --- a/Composite/Class/LightElementNode.cs +++ b/Composite/Class/LightElementNode.cs @@ -104,5 +104,9 @@ public string OuterHTML(int level) return $"<{LightName}{classAttr}{singleAttr}>"; } } + public override string ToString() + { + return LightName; + } } } diff --git a/Composite/Class/LightTextNode.cs b/Composite/Class/LightTextNode.cs index 0389d8a..4cd5e52 100644 --- a/Composite/Class/LightTextNode.cs +++ b/Composite/Class/LightTextNode.cs @@ -50,5 +50,9 @@ public void ReplaceChild(ILightNode oldNode, ILightNode newNode) { } + public override string ToString() + { + return LightName; + } } } diff --git a/Composite/Observer/ChildObserver.cs b/Composite/Observer/ChildObserver.cs new file mode 100644 index 0000000..870c37a --- /dev/null +++ b/Composite/Observer/ChildObserver.cs @@ -0,0 +1,18 @@ +using Composite.Class; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Composite.Observer +{ + public class ChildObserver : IObserver + { + public void Notify(object sender) + { + sender = (ILightNode)sender; + Console.WriteLine($"Child nodes of {sender} would be displayed here."); + } + } +} diff --git a/Composite/Observer/HandlerContainer.cs b/Composite/Observer/HandlerContainer.cs new file mode 100644 index 0000000..ea78ccb --- /dev/null +++ b/Composite/Observer/HandlerContainer.cs @@ -0,0 +1,66 @@ +using Composite.Class; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Composite.Observer +{ + public enum NodeEvents + { + mouseIn, + mouseOut, + click + } + public class HandlerContainer + { + //maybe it would be better to add callback functions instead of adding observers to dictionary + private Dictionary>> _listeners = + new Dictionary>>(); + + public void AddEventHandler(ILightNode sender, NodeEvents nodeEvent, IObserver handler) + { + addNode(sender); + addHandler(sender, nodeEvent, handler); + } + //check if node is in list + private void addNode(ILightNode node) + { + if(!_listeners.ContainsKey(node)) + _listeners[node] = new Dictionary>(); + } + //add handler + private void addHandler(ILightNode node,NodeEvents nodeEvent, IObserver handler) + { + //check if node has event otherwise create it and add handler + if (!_listeners[node].ContainsKey(nodeEvent)) + { + _listeners[node][nodeEvent] = new List() {handler}; + } + else + { + if (_listeners[node][nodeEvent].IndexOf(handler) == -1) + { + _listeners[node][nodeEvent].Add(handler); + } + } + + } + + public void NotifyHandlers(ILightNode node, NodeEvents nodeEvent) + { + //idk how to make it readable + var observers = _listeners.ContainsKey(node)? + _listeners[node].ContainsKey(nodeEvent)? _listeners[node][nodeEvent] : null + : null; + if (observers == null) + return; + foreach(var obj in observers) + { + obj.Notify(node); + } + } + } +} diff --git a/Composite/Observer/IObserver.cs b/Composite/Observer/IObserver.cs new file mode 100644 index 0000000..671cfbe --- /dev/null +++ b/Composite/Observer/IObserver.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Composite.Observer +{ + public interface IObserver + { + public void Notify(object sender); + } +} diff --git a/Composite/Observer/RandomObserver.cs b/Composite/Observer/RandomObserver.cs new file mode 100644 index 0000000..c90522c --- /dev/null +++ b/Composite/Observer/RandomObserver.cs @@ -0,0 +1,18 @@ +using Composite.Class; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Composite.Observer +{ + public class RandomObserver : IObserver + { + public void Notify(object sender) + { + sender = sender as ILightNode; + Console.WriteLine($"Random {sender} handler"); + } + } +} diff --git a/Composite/Program.cs b/Composite/Program.cs index 22cbd64..ed235d3 100644 --- a/Composite/Program.cs +++ b/Composite/Program.cs @@ -1,6 +1,20 @@ using Composite.Class; +using Composite.Observer; + +var container = new HandlerContainer(); ILightNode parent = new LightElementNode("div", "block", false); + +container.AddEventHandler(parent, NodeEvents.click, new ChildObserver()); +container.AddEventHandler(parent, NodeEvents.mouseIn, new RandomObserver()); + +container.NotifyHandlers(parent, NodeEvents.click); +container.NotifyHandlers(parent, NodeEvents.mouseIn); + +Console.ReadLine(); + +return; + ILightNode table = new LightElementNode("table", "block", false); ILightNode tr = new LightElementNode("tr", "inline", false); ILightNode td = new LightElementNode("td", "inline", false);