f24f61e65241950eb321cbd856e6ccd00551eda8
[platform/core/csapi/elm-sharp.git] / ElmSharp / ElmSharp / Naviframe.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 class NaviframeEventArgs : EventArgs
23     {
24         public EvasObject Content { get; set; }
25     }
26     public class Naviframe : Widget
27     {
28         Interop.SmartEvent _transitionFinished;
29         readonly List<NaviItem> _itemStack = new List<NaviItem>();
30         public Naviframe(EvasObject parent) : base(parent)
31         {
32             _transitionFinished = new Interop.SmartEvent(this, Handle, "transition,finished");
33             _transitionFinished.On += (s, e) => AnimationFinished?.Invoke(this, EventArgs.Empty);
34         }
35
36         /// <summary>
37         /// 
38         /// </summary>
39         /// <remarks>
40         /// It is always called when NaviItem was removed.
41         /// (even if removed by NaviItem.Delete())
42         /// This event will be invoked in progress of Pop/Delete operation. 
43         /// After called Popped event, Pop/Delete method will be returned
44         /// </remarks>
45         public event EventHandler<NaviframeEventArgs> Popped;
46         public event EventHandler AnimationFinished;
47         public IReadOnlyList<NaviItem> NavigationStack
48         {
49             get { return _itemStack; }
50         }
51
52         public bool PreserveContentOnPop
53         {
54             get
55             {
56                 return Interop.Elementary.elm_naviframe_content_preserve_on_pop_get(Handle);
57             }
58             set
59             {
60                 Interop.Elementary.elm_naviframe_content_preserve_on_pop_set(Handle, value);
61             }
62         }
63
64         public bool DefaultBackButtonEnabled
65         {
66             get
67             {
68                 return Interop.Elementary.elm_naviframe_prev_btn_auto_pushed_get(Handle);
69             }
70             set
71             {
72                 Interop.Elementary.elm_naviframe_prev_btn_auto_pushed_set(Handle, value);
73             }
74         }
75
76         public NaviItem Push(EvasObject content)
77         {
78             return Push(content, null);
79         }
80         public NaviItem Push(EvasObject content, string title)
81         {
82             IntPtr item = Interop.Elementary.elm_naviframe_item_push(Handle, title, IntPtr.Zero, IntPtr.Zero, content.Handle, null);
83             NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
84             _itemStack.Add(naviItem);
85             naviItem.Popped += ItemPoppedHandler;
86             return naviItem;
87         }
88
89         public NaviItem InsertBefore(NaviItem before, EvasObject content)
90         {
91             return InsertBefore(before, content, "");
92         }
93         public NaviItem InsertBefore(NaviItem before, EvasObject content, string title)
94         {
95             IntPtr item = Interop.Elementary.elm_naviframe_item_insert_before(Handle, before, title, IntPtr.Zero, IntPtr.Zero, content, null);
96             NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
97             int idx = _itemStack.IndexOf(before);
98             _itemStack.Insert(idx, naviItem);
99             naviItem.Popped += ItemPoppedHandler;
100             return naviItem;
101         }
102
103         public NaviItem InsertAfter(NaviItem after, EvasObject content)
104         {
105             return InsertAfter(after, content, "");
106         }
107         public NaviItem InsertAfter(NaviItem after, EvasObject content, string title)
108         {
109             IntPtr item = Interop.Elementary.elm_naviframe_item_insert_after(Handle, after, title, IntPtr.Zero, IntPtr.Zero, content, null);
110             NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
111             int idx = _itemStack.IndexOf(after);
112             _itemStack.Insert(idx + 1, naviItem);
113             naviItem.Popped += ItemPoppedHandler;
114             return naviItem;
115         }
116
117         public void Pop()
118         {
119             Interop.Elementary.elm_naviframe_item_pop(Handle);
120         }
121
122         protected override IntPtr CreateHandle(EvasObject parent)
123         {
124             return Interop.Elementary.elm_naviframe_add(parent.Handle);
125         }
126
127         void ItemPoppedHandler(object sender, EventArgs e)
128         {
129             NaviItem item = sender as NaviItem;
130             if (item == null)
131                 return;
132             _itemStack.Remove(item);
133             Popped?.Invoke(this, new NaviframeEventArgs() { Content = item.Content });
134         }
135     }
136 }