Merge changes I0645dc99,I9115d8e9 into tizen
[platform/core/csapi/tizenfx.git] / src / ElmSharp / ElmSharp / List.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using System.Collections.Generic;
19
20 namespace ElmSharp
21 {
22     public enum ListMode
23     {
24         Compress = 0,
25         Scroll,
26         Limit,
27         Expand
28     }
29
30     public class ListItemEventArgs : EventArgs
31     {
32         public ListItem Item { get; set; }
33         internal static ListItemEventArgs CreateFromSmartEvent(IntPtr data, IntPtr obj, IntPtr info)
34         {
35             ListItem item = ItemObject.GetItemByHandle(info) as ListItem;
36             return new ListItemEventArgs() { Item = item };
37         }
38     }
39
40     public class List : Layout
41     {
42         HashSet<ListItem> _children = new HashSet<ListItem>();
43         SmartEvent<ListItemEventArgs> _selected;
44         SmartEvent<ListItemEventArgs> _unselected;
45         SmartEvent<ListItemEventArgs> _doubleClicked;
46         SmartEvent<ListItemEventArgs> _longpressed;
47         SmartEvent<ListItemEventArgs> _activated;
48
49         public List(EvasObject parent) : base(parent)
50         {
51             _selected = new SmartEvent<ListItemEventArgs>(this, this.RealHandle, "selected", ListItemEventArgs.CreateFromSmartEvent);
52             _unselected = new SmartEvent<ListItemEventArgs>(this, this.RealHandle, "unselected", ListItemEventArgs.CreateFromSmartEvent);
53             _doubleClicked = new SmartEvent<ListItemEventArgs>(this, this.RealHandle, "clicked,double", ListItemEventArgs.CreateFromSmartEvent);
54             _longpressed = new SmartEvent<ListItemEventArgs>(this, this.RealHandle, "longpressed", ListItemEventArgs.CreateFromSmartEvent);
55             _activated = new SmartEvent<ListItemEventArgs>(this, this.RealHandle, "activated", ListItemEventArgs.CreateFromSmartEvent);
56             _selected.On += (s, e) => { ItemSelected?.Invoke(this, e); };
57             _unselected.On += (s, e) => { ItemUnselected?.Invoke(this, e); };
58             _doubleClicked.On += (s, e) => { ItemDoubleClicked?.Invoke(this, e); };
59             _longpressed.On += (s, e) => { ItemLongPressed?.Invoke(this, e); };
60             _activated.On += (s, e) => { ItemActivated?.Invoke(this, e); };
61         }
62
63         public ListMode Mode
64         {
65             get
66             {
67                 return (ListMode)Interop.Elementary.elm_list_mode_get(RealHandle);
68             }
69             set
70             {
71                 Interop.Elementary.elm_list_mode_set(RealHandle, (Interop.Elementary.Elm_List_Mode)value);
72             }
73         }
74
75         public ListItem SelectedItem
76         {
77             get
78             {
79                 IntPtr item = Interop.Elementary.elm_list_selected_item_get(RealHandle);
80                 return ItemObject.GetItemByHandle(item) as ListItem;
81             }
82         }
83
84         public event EventHandler<ListItemEventArgs> ItemSelected;
85         public event EventHandler<ListItemEventArgs> ItemUnselected;
86         public event EventHandler<ListItemEventArgs> ItemDoubleClicked;
87         public event EventHandler<ListItemEventArgs> ItemLongPressed;
88         public event EventHandler<ListItemEventArgs> ItemActivated;
89
90         public void Update()
91         {
92             Interop.Elementary.elm_list_go(RealHandle);
93         }
94
95         public ListItem Append(string label)
96         {
97             return Append(label, null, null);
98         }
99
100         public ListItem Append(string label, EvasObject leftIcon, EvasObject rightIcon)
101         {
102             ListItem item = new ListItem(label, leftIcon, rightIcon);
103             item.Handle = Interop.Elementary.elm_list_item_append(RealHandle, label, leftIcon, rightIcon, null, (IntPtr)item.Id);
104             AddInternal(item);
105             return item;
106         }
107
108         public ListItem Prepend(string label)
109         {
110             return Prepend(label, null, null);
111         }
112
113         public ListItem Prepend(string label, EvasObject leftIcon, EvasObject rigthIcon)
114         {
115             ListItem item = new ListItem(label, leftIcon, rigthIcon);
116             item.Handle = Interop.Elementary.elm_list_item_prepend(RealHandle, label, leftIcon, rigthIcon, null, (IntPtr)item.Id);
117             AddInternal(item);
118             return item;
119         }
120
121         public void Clear()
122         {
123             Interop.Elementary.elm_list_clear(RealHandle);
124             foreach (var item in _children)
125             {
126                 item.Deleted -= Item_Deleted;
127             }
128             _children.Clear();
129         }
130
131         protected override IntPtr CreateHandle(EvasObject parent)
132         {
133             IntPtr handle = Interop.Elementary.elm_layout_add(parent.Handle);
134             Interop.Elementary.elm_layout_theme_set(handle, "layout", "elm_widget", "default");
135
136             RealHandle = Interop.Elementary.elm_list_add(handle);
137             Interop.Elementary.elm_object_part_content_set(handle, "elm.swallow.content", RealHandle);
138
139             return handle;
140         }
141
142         void AddInternal(ListItem item)
143         {
144             _children.Add(item);
145             item.Deleted += Item_Deleted;
146         }
147
148         void Item_Deleted(object sender, EventArgs e)
149         {
150             _children.Remove((ListItem)sender);
151         }
152     }
153 }