1 // =================================
 2 // Copyright (c) 2022 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 using System;
 7 
 8 namespace System.Screen
 9 {
10     public abstract class Component
11     {
12         public nothrow Component() : container(null)nextSibling(null)prevSibling(null)
13         {
14         }
15         public virtual default ~Component();
16         public nothrow Container* GetContainer() const
17         {
18             return container;
19         }
20         public nothrow void SetContainer(Container* container_)
21         {
22             container = container_;
23         }
24         public nothrow Component* NextSibling() const
25         {
26             return nextSibling;
27         }
28         public nothrow void SetNextSibling(Component* nextSibling_)
29         {
30             nextSibling = nextSibling_;
31         }
32         public nothrow Component* PrevSibling() const
33         {
34             return prevSibling;
35         }
36         public nothrow void SetPrevSibling(Component* prevSibling_)
37         {
38             prevSibling = prevSibling_;
39         }
40         public nothrow void LinkBefore(Component* component)
41         {
42             if (prevSibling != null)
43             {
44                 prevSibling->nextSibling = component;
45             }
46             component->prevSibling = prevSibling;
47             component->nextSibling = this;
48             prevSibling = component;
49         }
50         public nothrow void LinkAfter(Component* component)
51         {
52             if (nextSibling != null)
53             {
54                 nextSibling->prevSibling = component;
55             }
56             component->prevSibling = this;
57             component->nextSibling = nextSibling;
58             nextSibling = component;
59         }
60         public void Unlink()
61         {
62             if (prevSibling != null)
63             {
64                 prevSibling->nextSibling = nextSibling;
65             }
66             if (nextSibling != null)
67             {
68                 nextSibling->prevSibling = prevSibling;
69             }
70         }
71         private Container* container;
72         private Component* nextSibling;
73         private Component* prevSibling;
74     }
75 }