/*
* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
namespace ElmSharp
{
///
/// The NaviframeEventArgs is a event args class for navi frame.
/// Inherits EventArgs
///
public class NaviframeEventArgs : EventArgs
{
///
/// Sets or gets the content object. The name of content part is "elm.swallow.content".
///
public EvasObject Content { get; set; }
}
///
/// Naviframe is a widget to stands for navigation frame. It's a views manager for applications.
/// Inherits Widget
///
public class Naviframe : Widget
{
SmartEvent _transitionFinished;
readonly List _itemStack = new List();
///
/// Creates and initializes a new instance of Naviframe class.
///
/// The parent is a given container which will be attached by Naviframe as a child. It's type.
public Naviframe(EvasObject parent) : base(parent)
{
_transitionFinished = new SmartEvent(this, this.RealHandle, "transition,finished");
_transitionFinished.On += (s, e) => AnimationFinished?.Invoke(this, EventArgs.Empty);
}
///
/// Popped will be triggered when NaviItem is removed.
///
///
/// It is always called when NaviItem was removed.
/// (even if removed by NaviItem.Delete())
/// This event will be invoked in progress of Pop/Delete operation.
/// After called Popped event, Pop/Delete method will be returned
///
public event EventHandler Popped;
///
/// AnimationFinished will be triggered when animation is finished.
///
public event EventHandler AnimationFinished;
///
/// Gets the list of navi item
///
public IReadOnlyList NavigationStack
{
get { return _itemStack; }
}
///
/// Sets or gets the the preserve content objects when items are popped.
///
public bool PreserveContentOnPop
{
get
{
return Interop.Elementary.elm_naviframe_content_preserve_on_pop_get(RealHandle);
}
set
{
Interop.Elementary.elm_naviframe_content_preserve_on_pop_set(RealHandle, value);
}
}
///
/// Sets or gets whether the default back button is enabled
///
public bool DefaultBackButtonEnabled
{
get
{
return Interop.Elementary.elm_naviframe_prev_btn_auto_pushed_get(RealHandle);
}
set
{
Interop.Elementary.elm_naviframe_prev_btn_auto_pushed_set(RealHandle, value);
}
}
///
/// Push a new item to the top of the naviframe stack and show it.
/// The title and style are null.
///
/// The main content object. The name of content part is "elm.swallow.content".
/// The created item or null upon failure.
public NaviItem Push(EvasObject content)
{
return Push(content, null);
}
///
/// Push a new item to the top of the naviframe stack and show it.
/// The style are null.
///
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
///
public NaviItem Push(EvasObject content, string title)
{
return Push(content, title, null);
}
///
/// Push a new item to the top of the naviframe stack and show it.
///
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
/// The current item style name. null would be default.
/// The created item or null upon failure.
public NaviItem Push(EvasObject content, string title, string style)
{
IntPtr item = Interop.Elementary.elm_naviframe_item_push(RealHandle, title, IntPtr.Zero, IntPtr.Zero, content.Handle, style);
NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
_itemStack.Add(naviItem);
naviItem.Popped += ItemPoppedHandler;
return naviItem;
}
///
/// Insert a new item into the naviframe before item.
/// The title is "" and the style is null.
///
/// The item which the new item is inserted before.
/// The main content object. The name of content part is "elm.swallow.content".
/// The created item or null upon failure.
public NaviItem InsertBefore(NaviItem before, EvasObject content)
{
return InsertBefore(before, content, "");
}
///
/// Insert a new item into the naviframe before item.
/// The style is null.
///
/// The item which the new item is inserted before.
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
/// The created item or null upon failure.
public NaviItem InsertBefore(NaviItem before, EvasObject content, string title)
{
return InsertBefore(before, content, title, null);
}
///
/// Insert a new item into the naviframe before item.
///
/// The item which the new item is inserted before.
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
/// The current item style name. null would be default.
/// The created item or null upon failure.
public NaviItem InsertBefore(NaviItem before, EvasObject content, string title, string style)
{
IntPtr item = Interop.Elementary.elm_naviframe_item_insert_before(RealHandle, before, title, IntPtr.Zero, IntPtr.Zero, content, null);
NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
int idx = _itemStack.IndexOf(before);
_itemStack.Insert(idx, naviItem);
naviItem.Popped += ItemPoppedHandler;
return naviItem;
}
///
/// Insert a new item into the naviframe after item.
/// The title is "" and the style is null.
///
/// The item which the new item is inserted after.
/// The main content object. The name of content part is "elm.swallow.content".
/// The created item or null upon failure.
public NaviItem InsertAfter(NaviItem after, EvasObject content)
{
return InsertAfter(after, content, "");
}
///
/// Insert a new item into the naviframe after item.
/// The style is null.
///
/// The item which the new item is inserted after.
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
/// The created item or null upon failure.
public NaviItem InsertAfter(NaviItem after, EvasObject content, string title)
{
return InsertAfter(after, content, title, null);
}
///
/// Insert a new item into the naviframe after item.
///
/// The item which the new item is inserted after.
/// The main content object. The name of content part is "elm.swallow.content".
/// The current item title. null would be default.
/// The current item style name. null would be default.
/// The created item or null upon failure.
public NaviItem InsertAfter(NaviItem after, EvasObject content, string title, string style)
{
IntPtr item = Interop.Elementary.elm_naviframe_item_insert_after(RealHandle, after, title, IntPtr.Zero, IntPtr.Zero, content, null);
NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
int idx = _itemStack.IndexOf(after);
_itemStack.Insert(idx + 1, naviItem);
naviItem.Popped += ItemPoppedHandler;
return naviItem;
}
///
/// Pop an item that is on top of the stack.
///
public void Pop()
{
Interop.Elementary.elm_naviframe_item_pop(RealHandle);
}
protected override IntPtr CreateHandle(EvasObject parent)
{
IntPtr handle = Interop.Elementary.elm_layout_add(parent);
Interop.Elementary.elm_layout_theme_set(handle, "layout", "elm_widget", "default");
RealHandle = Interop.Elementary.elm_naviframe_add(handle);
Interop.Elementary.elm_object_part_content_set(handle, "elm.swallow.content", RealHandle);
return handle;
}
void ItemPoppedHandler(object sender, EventArgs e)
{
NaviItem item = sender as NaviItem;
if (item == null)
return;
_itemStack.Remove(item);
Popped?.Invoke(this, new NaviframeEventArgs() { Content = item.Content });
}
}
}