Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add observer #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Composite/Class/ILightNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();

}
}
4 changes: 4 additions & 0 deletions Composite/Class/LightElementNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,9 @@ public string OuterHTML(int level)
return $"<{LightName}{classAttr}{singleAttr}>";
}
}
public override string ToString()
{
return LightName;
}
}
}
4 changes: 4 additions & 0 deletions Composite/Class/LightTextNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,9 @@ public void ReplaceChild(ILightNode oldNode, ILightNode newNode)
{

}
public override string ToString()
{
return LightName;
}
}
}
18 changes: 18 additions & 0 deletions Composite/Observer/ChildObserver.cs
Original file line number Diff line number Diff line change
@@ -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.");
}
}
}
66 changes: 66 additions & 0 deletions Composite/Observer/HandlerContainer.cs
Original file line number Diff line number Diff line change
@@ -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<ILightNode, Dictionary<NodeEvents, List<IObserver>>> _listeners =
new Dictionary<ILightNode, Dictionary<NodeEvents, List<IObserver>>>();

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<NodeEvents, List<IObserver>>();
}
//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<IObserver>() {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);
}
}
}
}
13 changes: 13 additions & 0 deletions Composite/Observer/IObserver.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
18 changes: 18 additions & 0 deletions Composite/Observer/RandomObserver.cs
Original file line number Diff line number Diff line change
@@ -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");
}
}
}
14 changes: 14 additions & 0 deletions Composite/Program.cs
Original file line number Diff line number Diff line change
@@ -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);
Expand Down