Introduce ElmSharp project
[platform/core/csapi/tizenfx.git] / src / ElmSharp / ElmSharp / List.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4
5 namespace ElmSharp
6 {
7     public enum ListMode
8     {
9         Compress = 0,
10         Scroll,
11         Limit,
12         Expand
13     }
14
15     public class ListItemEventArgs : EventArgs
16     {
17         public ListItem Item { get; set; }
18         internal static ListItemEventArgs CreateFromSmartEvent(IntPtr data, IntPtr obj, IntPtr info)
19         {
20             ListItem item = ItemObject.GetItemByHandle(info) as ListItem;
21             return new ListItemEventArgs() { Item = item };
22         }
23     }
24
25     public class List : Layout
26     {
27         HashSet<ListItem> _children = new HashSet<ListItem>();
28         Interop.SmartEvent<ListItemEventArgs> _selected;
29         Interop.SmartEvent<ListItemEventArgs> _unselected;
30         Interop.SmartEvent<ListItemEventArgs> _doubleClicked;
31         Interop.SmartEvent<ListItemEventArgs> _longpressed;
32         Interop.SmartEvent<ListItemEventArgs> _activated;
33
34         public List(EvasObject parent) : base(parent)
35         {
36             _selected = new Interop.SmartEvent<ListItemEventArgs>(this, Handle, "selected", ListItemEventArgs.CreateFromSmartEvent);
37             _unselected = new Interop.SmartEvent<ListItemEventArgs>(this, Handle, "unselected", ListItemEventArgs.CreateFromSmartEvent);
38             _doubleClicked = new Interop.SmartEvent<ListItemEventArgs>(this, Handle, "clicked,double", ListItemEventArgs.CreateFromSmartEvent);
39             _longpressed = new Interop.SmartEvent<ListItemEventArgs>(this, Handle, "longpressed", ListItemEventArgs.CreateFromSmartEvent);
40             _activated = new Interop.SmartEvent<ListItemEventArgs>(this, Handle, "activated", ListItemEventArgs.CreateFromSmartEvent);
41             _selected.On += (s, e) => { ItemSelected?.Invoke(this, e); };
42             _unselected.On += (s, e) => { ItemUnselected?.Invoke(this, e); };
43             _doubleClicked.On += (s, e) => { ItemDoubleClicked?.Invoke(this, e); };
44             _longpressed.On += (s, e) => { ItemLongPressed?.Invoke(this, e); };
45             _activated.On += (s, e) => { ItemActivated?.Invoke(this, e); };
46         }
47
48         public ListMode Mode
49         {
50             get
51             {
52                 return (ListMode)Interop.Elementary.elm_list_mode_get(Handle);
53             }
54             set
55             {
56                 Interop.Elementary.elm_list_mode_set(Handle, (Interop.Elementary.Elm_List_Mode)value);
57             }
58         }
59
60         public ListItem SelectedItem
61         {
62             get
63             {
64                 IntPtr item = Interop.Elementary.elm_list_selected_item_get(Handle);
65                 return ItemObject.GetItemByHandle(item) as ListItem;
66             }
67         }
68
69         public event EventHandler<ListItemEventArgs> ItemSelected;
70         public event EventHandler<ListItemEventArgs> ItemUnselected;
71         public event EventHandler<ListItemEventArgs> ItemDoubleClicked;
72         public event EventHandler<ListItemEventArgs> ItemLongPressed;
73         public event EventHandler<ListItemEventArgs> ItemActivated;
74
75         public void Update()
76         {
77             Interop.Elementary.elm_list_go(Handle);
78         }
79
80         public ListItem Append(string label)
81         {
82             return Append(label, null, null);
83         }
84
85         public ListItem Append(string label, EvasObject leftIcon, EvasObject rightIcon)
86         {
87             ListItem item = new ListItem(label, leftIcon, rightIcon);
88             item.Handle = Interop.Elementary.elm_list_item_append(Handle, label, leftIcon, rightIcon, null, (IntPtr)item.Id);
89             AddInternal(item);
90             return item;
91         }
92
93         public ListItem Prepend(string label)
94         {
95             return Prepend(label, null, null);
96         }
97
98         public ListItem Prepend(string label, EvasObject leftIcon, EvasObject rigthIcon)
99         {
100             ListItem item = new ListItem(label, leftIcon, rigthIcon);
101             item.Handle = Interop.Elementary.elm_list_item_prepend(Handle, label, leftIcon, rigthIcon, null, (IntPtr)item.Id);
102             AddInternal(item);
103             return item;
104         }
105
106         public void Clear()
107         {
108             Interop.Elementary.elm_list_clear(Handle);
109             foreach (var item in _children)
110             {
111                 item.Deleted -= Item_Deleted;
112             }
113             _children.Clear();
114         }
115
116         internal override IntPtr CreateHandle(EvasObject parent)
117         {
118             return Interop.Elementary.elm_list_add(parent);
119         }
120
121         void AddInternal(ListItem item)
122         {
123             _children.Add(item);
124             item.Deleted += Item_Deleted;
125         }
126
127         void Item_Deleted(object sender, EventArgs e)
128         {
129             _children.Remove((ListItem)sender);
130         }
131     }
132 }