/*
* Copyright(c) 2021 Samsung Electronics Co., Ltd.
*
* 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;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace Tizen.NUI.BaseComponents
{
///
/// View is the base class for all views.
///
/// 3
public partial class View
{
internal string styleName;
internal class ThemeData
{
[Flags]
private enum States : byte
{
None = 0,
ControlStatePropagation = 1 << 0,
ThemeChangeSensitive = 1 << 1,
ThemeApplied = 1 << 2, // It is true when the view has valid style name or the platform theme has a component style for this view type.
// That indicates the view can have different styles by theme.
// Hence if the current state has ThemeApplied and ThemeChangeSensitive, the view will change its style by theme changing.
ListeningThemeChangeEvent = 1 << 3,
};
private States states = ThemeManager.ApplicationThemeChangeSensitive ? States.ThemeChangeSensitive : States.None;
public ViewStyle viewStyle;
public ControlState controlStates = ControlState.Normal;
public ViewSelectorData selectorData;
public bool ControlStatePropagation
{
get => ((states & States.ControlStatePropagation) != 0);
set => SetOption(States.ControlStatePropagation, value);
}
public bool ThemeChangeSensitive
{
get => ((states & States.ThemeChangeSensitive) != 0);
set => SetOption(States.ThemeChangeSensitive, value);
}
public bool ThemeApplied
{
get => ((states & States.ThemeApplied) != 0);
set => SetOption(States.ThemeApplied, value);
}
public bool ListeningThemeChangeEvent
{
get => ((states & States.ListeningThemeChangeEvent) != 0);
set => SetOption(States.ListeningThemeChangeEvent, value);
}
private void SetOption(States option, bool value)
{
if (value) states |= option;
else states &= ~option;
}
}
///
/// The color mode of View.
/// This specifies whether the View uses its own color, or inherits its parent color.
/// The default is ColorMode.UseOwnMultiplyParentColor.
///
internal ColorMode ColorMode
{
set
{
SetColorMode(value);
}
get
{
return GetColorMode();
}
}
internal LayoutLength SuggestedMinimumWidth
{
get
{
float result = Interop.Actor.GetSuggestedMinimumWidth(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return new LayoutLength(result);
}
}
internal LayoutLength SuggestedMinimumHeight
{
get
{
float result = Interop.Actor.GetSuggestedMinimumHeight(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return new LayoutLength(result);
}
}
internal float WorldPositionX
{
get
{
float returnValue = 0.0f;
PropertyValue wordPositionX = GetProperty(View.Property.WorldPositionX);
wordPositionX?.Get(out returnValue);
wordPositionX?.Dispose();
return returnValue;
}
}
internal float WorldPositionY
{
get
{
float returnValue = 0.0f;
PropertyValue wordPositionY = GetProperty(View.Property.WorldPositionY);
wordPositionY?.Get(out returnValue);
wordPositionY?.Dispose();
return returnValue;
}
}
internal float WorldPositionZ
{
get
{
float returnValue = 0.0f;
PropertyValue wordPositionZ = GetProperty(View.Property.WorldPositionZ);
wordPositionZ?.Get(out returnValue);
wordPositionZ?.Dispose();
return returnValue;
}
}
internal bool FocusState
{
get
{
return IsKeyboardFocusable();
}
set
{
SetKeyboardFocusable(value);
}
}
internal void SetLayout(LayoutItem layout)
{
Window.Instance.LayoutController.CreateProcessCallback();
this.layout = layout;
this.layout?.AttachToOwner(this);
this.layout?.RequestLayout();
}
internal void AttachTransitionsToChildren(LayoutTransition transition)
{
// Iterate children, adding the transition unless a transition
// for the same condition and property has already been
// explicitly added.
foreach (View view in Children)
{
LayoutTransitionsHelper.AddTransitionForCondition(view.LayoutTransitions, transition.Condition, transition, false);
}
}
internal float ParentOriginX
{
get
{
float returnValue = 0.0f;
PropertyValue parentOriginX = GetProperty(View.Property.ParentOriginX);
parentOriginX?.Get(out returnValue);
parentOriginX?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.ParentOriginX, setValue);
setValue.Dispose();
NotifyPropertyChanged();
}
}
internal float ParentOriginY
{
get
{
float returnValue = 0.0f;
PropertyValue parentOriginY = GetProperty(View.Property.ParentOriginY);
parentOriginY?.Get(out returnValue);
parentOriginY?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.ParentOriginY, setValue);
setValue.Dispose();
NotifyPropertyChanged();
}
}
internal float ParentOriginZ
{
get
{
float returnValue = 0.0f;
PropertyValue parentOriginZ = GetProperty(View.Property.ParentOriginZ);
parentOriginZ?.Get(out returnValue);
parentOriginZ?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.ParentOriginZ, setValue);
setValue.Dispose();
NotifyPropertyChanged();
}
}
internal float PivotPointX
{
get
{
float returnValue = 0.0f;
PropertyValue anchorPointX = GetProperty(View.Property.AnchorPointX);
anchorPointX?.Get(out returnValue);
anchorPointX?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.AnchorPointX, setValue);
setValue.Dispose();
}
}
internal float PivotPointY
{
get
{
float returnValue = 0.0f;
PropertyValue anchorPointY = GetProperty(View.Property.AnchorPointY);
anchorPointY?.Get(out returnValue);
anchorPointY?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.AnchorPointY, setValue);
setValue.Dispose();
}
}
internal float PivotPointZ
{
get
{
float returnValue = 0.0f;
PropertyValue anchorPointZ = GetProperty(View.Property.AnchorPointZ);
anchorPointZ?.Get(out returnValue);
anchorPointZ?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.AnchorPointZ, setValue);
setValue.Dispose();
}
}
internal Matrix WorldMatrix
{
get
{
Matrix returnValue = new Matrix();
PropertyValue wordMatrix = GetProperty(View.Property.WorldMatrix);
wordMatrix?.Get(returnValue);
wordMatrix?.Dispose();
return returnValue;
}
}
///
/// Indicates that this View should listen Touch event to handle its ControlState.
///
private bool enableControlState = false;
private int LeftFocusableViewId
{
get
{
int returnValue = 0;
PropertyValue leftFocusableViewId = GetProperty(View.Property.LeftFocusableViewId);
leftFocusableViewId?.Get(out returnValue);
leftFocusableViewId?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.LeftFocusableViewId, setValue);
setValue.Dispose();
}
}
private int RightFocusableViewId
{
get
{
int returnValue = 0;
PropertyValue rightFocusableViewId = GetProperty(View.Property.RightFocusableViewId);
rightFocusableViewId?.Get(out returnValue);
rightFocusableViewId?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.RightFocusableViewId, setValue);
setValue.Dispose();
}
}
private int UpFocusableViewId
{
get
{
int returnValue = 0;
PropertyValue upFocusableViewId = GetProperty(View.Property.UpFocusableViewId);
upFocusableViewId?.Get(out returnValue);
upFocusableViewId?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.UpFocusableViewId, setValue);
setValue.Dispose();
}
}
private int DownFocusableViewId
{
get
{
int returnValue = 0;
PropertyValue downFocusableViewId = GetProperty(View.Property.DownFocusableViewId);
downFocusableViewId?.Get(out returnValue);
downFocusableViewId?.Dispose();
return returnValue;
}
set
{
PropertyValue setValue = new Tizen.NUI.PropertyValue(value);
SetProperty(View.Property.DownFocusableViewId, setValue);
setValue.Dispose();
}
}
internal void Raise()
{
var parentChildren = GetParent()?.Children;
if (parentChildren != null)
{
int currentIndex = parentChildren.IndexOf(this);
// If the view is not already the last item in the list.
if (currentIndex >= 0 && currentIndex < parentChildren.Count - 1)
{
View temp = parentChildren[currentIndex + 1];
parentChildren[currentIndex + 1] = this;
parentChildren[currentIndex] = temp;
Interop.NDalic.Raise(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
}
}
internal void Lower()
{
var parentChildren = GetParent()?.Children;
if (parentChildren != null)
{
int currentIndex = parentChildren.IndexOf(this);
// If the view is not already the first item in the list.
if (currentIndex > 0 && currentIndex < parentChildren.Count)
{
View temp = parentChildren[currentIndex - 1];
parentChildren[currentIndex - 1] = this;
parentChildren[currentIndex] = temp;
Interop.NDalic.Lower(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
}
}
///
/// Raises the view to above the target view.
///
/// The sibling order of views within the parent will be updated automatically.
/// Views on the level above the target view will still be shown above this view.
/// Raising this view above views with the same sibling order as each other will raise this view above them.
/// Once a raise or lower API is used that view will then have an exclusive sibling order independent of insertion.
///
/// Will be raised above this view.
internal void RaiseAbove(View target)
{
var parentChildren = GetParent()?.Children;
if (parentChildren != null)
{
int currentIndex = parentChildren.IndexOf(this);
int targetIndex = parentChildren.IndexOf(target);
if (currentIndex < 0 || targetIndex < 0 ||
currentIndex >= parentChildren.Count || targetIndex >= parentChildren.Count)
{
NUILog.Error("index should be bigger than 0 and less than children of layer count");
return;
}
// If the currentIndex is less than the target index and the target has the same parent.
if (currentIndex < targetIndex)
{
parentChildren.Remove(this);
parentChildren.Insert(targetIndex, this);
Interop.NDalic.RaiseAbove(SwigCPtr, View.getCPtr(target));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
}
}
///
/// Lowers the view to below the target view.
///
/// The sibling order of views within the parent will be updated automatically.
/// Lowering this view below views with the same sibling order as each other will lower this view above them.
/// Once a raise or lower API is used that view will then have an exclusive sibling order independent of insertion.
///
/// Will be lowered below this view.
internal void LowerBelow(View target)
{
var parentChildren = GetParent()?.Children;
if (parentChildren != null)
{
int currentIndex = parentChildren.IndexOf(this);
int targetIndex = parentChildren.IndexOf(target);
if (currentIndex < 0 || targetIndex < 0 ||
currentIndex >= parentChildren.Count || targetIndex >= parentChildren.Count)
{
NUILog.Error("index should be bigger than 0 and less than children of layer count");
return;
}
// If the currentIndex is not already the 0th index and the target has the same parent.
if ((currentIndex != 0) && (targetIndex != -1) &&
(currentIndex > targetIndex))
{
parentChildren.Remove(this);
parentChildren.Insert(targetIndex, this);
Interop.NDalic.LowerBelow(SwigCPtr, View.getCPtr(target));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
}
}
internal string GetName()
{
string ret = Interop.Actor.GetName(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetName(string name)
{
Interop.Actor.SetName(SwigCPtr, name);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal uint GetId()
{
uint ret = Interop.Actor.GetId(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal bool IsRoot()
{
bool ret = Interop.ActorInternal.IsRoot(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal bool OnWindow()
{
bool ret = Interop.Actor.OnStage(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal View FindChildById(uint id)
{
//to fix memory leak issue, match the handle count with native side.
IntPtr cPtr = Interop.Actor.FindChildById(SwigCPtr, id);
View ret = this.GetInstanceSafely(cPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal override View FindCurrentChildById(uint id)
{
return FindChildById(id);
}
internal void SetParentOrigin(Vector3 origin)
{
Interop.ActorInternal.SetParentOrigin(SwigCPtr, Vector3.getCPtr(origin));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector3 GetCurrentParentOrigin()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetCurrentParentOrigin(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetAnchorPoint(Vector3 anchorPoint)
{
Interop.Actor.SetAnchorPoint(SwigCPtr, Vector3.getCPtr(anchorPoint));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector3 GetCurrentAnchorPoint()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetCurrentAnchorPoint(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetSize(float width, float height)
{
Interop.ActorInternal.SetSize(SwigCPtr, width, height);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetSize(float width, float height, float depth)
{
Interop.ActorInternal.SetSize(SwigCPtr, width, height, depth);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetSize(Vector2 size)
{
Interop.ActorInternal.SetSizeVector2(SwigCPtr, Vector2.getCPtr(size));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetSize(Vector3 size)
{
Interop.ActorInternal.SetSizeVector3(SwigCPtr, Vector3.getCPtr(size));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector3 GetTargetSize()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetTargetSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Size2D GetCurrentSize()
{
Size ret = new Size(Interop.Actor.GetCurrentSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
Size2D size = new Size2D((int)ret.Width, (int)ret.Height);
ret.Dispose();
return size;
}
internal Size2D GetCurrentSizeFloat()
{
Size ret = new Size(Interop.Actor.GetCurrentSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector3 GetNaturalSize()
{
Vector3 ret = new Vector3(Interop.Actor.GetNaturalSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetPosition(float x, float y)
{
Interop.ActorInternal.SetPosition(SwigCPtr, x, y);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetPosition(float x, float y, float z)
{
Interop.ActorInternal.SetPosition(SwigCPtr, x, y, z);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetPosition(Vector3 position)
{
Interop.ActorInternal.SetPosition(SwigCPtr, Vector3.getCPtr(position));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetX(float x)
{
Interop.ActorInternal.SetX(SwigCPtr, x);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetY(float y)
{
Interop.ActorInternal.SetY(SwigCPtr, y);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetZ(float z)
{
Interop.ActorInternal.SetZ(SwigCPtr, z);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void TranslateBy(Vector3 distance)
{
Interop.ActorInternal.TranslateBy(SwigCPtr, Vector3.getCPtr(distance));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Position GetCurrentPosition()
{
Position ret = new Position(Interop.Actor.GetCurrentPosition(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector3 GetCurrentWorldPosition()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetCurrentWorldPosition(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetInheritPosition(bool inherit)
{
Interop.ActorInternal.SetInheritPosition(SwigCPtr, inherit);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsPositionInherited()
{
bool ret = Interop.ActorInternal.IsPositionInherited(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetOrientation(Degree angle, Vector3 axis)
{
Interop.ActorInternal.SetOrientationDegree(SwigCPtr, Degree.getCPtr(angle), Vector3.getCPtr(axis));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetOrientation(Radian angle, Vector3 axis)
{
Interop.ActorInternal.SetOrientationRadian(SwigCPtr, Radian.getCPtr(angle), Vector3.getCPtr(axis));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetOrientation(Rotation orientation)
{
Interop.ActorInternal.SetOrientationQuaternion(SwigCPtr, Rotation.getCPtr(orientation));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Rotation GetCurrentOrientation()
{
Rotation ret = new Rotation(Interop.ActorInternal.GetCurrentOrientation(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetInheritOrientation(bool inherit)
{
Interop.ActorInternal.SetInheritOrientation(SwigCPtr, inherit);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsOrientationInherited()
{
bool ret = Interop.ActorInternal.IsOrientationInherited(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Rotation GetCurrentWorldOrientation()
{
Rotation ret = new Rotation(Interop.ActorInternal.GetCurrentWorldOrientation(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetScale(float scale)
{
Interop.ActorInternal.SetScale(SwigCPtr, scale);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetScale(float scaleX, float scaleY, float scaleZ)
{
Interop.ActorInternal.SetScale(SwigCPtr, scaleX, scaleY, scaleZ);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void SetScale(Vector3 scale)
{
Interop.ActorInternal.SetScale(SwigCPtr, Vector3.getCPtr(scale));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector3 GetCurrentScale()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetCurrentScale(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector3 GetCurrentWorldScale()
{
Vector3 ret = new Vector3(Interop.ActorInternal.GetCurrentWorldScale(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetInheritScale(bool inherit)
{
Interop.ActorInternal.SetInheritScale(SwigCPtr, inherit);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsScaleInherited()
{
bool ret = Interop.ActorInternal.IsScaleInherited(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Matrix GetCurrentWorldMatrix()
{
Matrix ret = new Matrix(Interop.ActorInternal.GetCurrentWorldMatrix(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetVisible(bool visible)
{
Interop.Actor.SetVisible(SwigCPtr, visible);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsVisible()
{
bool ret = Interop.ActorInternal.IsVisible(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetOpacity(float opacity)
{
Interop.ActorInternal.SetOpacity(SwigCPtr, opacity);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal float GetCurrentOpacity()
{
float ret = Interop.ActorInternal.GetCurrentOpacity(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector4 GetCurrentColor()
{
Vector4 ret = new Vector4(Interop.ActorInternal.GetCurrentColor(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal ColorMode GetColorMode()
{
ColorMode ret = (ColorMode)Interop.ActorInternal.GetColorMode(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector4 GetCurrentWorldColor()
{
Vector4 ret = new Vector4(Interop.ActorInternal.GetCurrentWorldColor(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetDrawMode(DrawModeType drawMode)
{
Interop.ActorInternal.SetDrawMode(SwigCPtr, (int)drawMode);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal DrawModeType GetDrawMode()
{
DrawModeType ret = (DrawModeType)Interop.ActorInternal.GetDrawMode(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetKeyboardFocusable(bool focusable)
{
Interop.ActorInternal.SetKeyboardFocusable(SwigCPtr, focusable);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsKeyboardFocusable()
{
bool ret = Interop.ActorInternal.IsKeyboardFocusable(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetFocusableInTouch(bool enabled)
{
Interop.ActorInternal.SetFocusableInTouch(SwigCPtr, enabled);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal bool IsFocusableInTouch()
{
bool ret = Interop.ActorInternal.IsFocusableInTouch(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetResizePolicy(ResizePolicyType policy, DimensionType dimension)
{
Interop.Actor.SetResizePolicy(SwigCPtr, (int)policy, (int)dimension);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal ResizePolicyType GetResizePolicy(DimensionType dimension)
{
ResizePolicyType ret = (ResizePolicyType)Interop.Actor.GetResizePolicy(SwigCPtr, (int)dimension);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal Vector3 GetSizeModeFactor()
{
Vector3 ret = new Vector3(Interop.Actor.GetSizeModeFactor(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetMinimumSize(Vector2 size)
{
Interop.ActorInternal.SetMinimumSize(SwigCPtr, Vector2.getCPtr(size));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector2 GetMinimumSize()
{
Vector2 ret = new Vector2(Interop.ActorInternal.GetMinimumSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal void SetMaximumSize(Vector2 size)
{
Interop.ActorInternal.SetMaximumSize(SwigCPtr, Vector2.getCPtr(size));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal Vector2 GetMaximumSize()
{
Vector2 ret = new Vector2(Interop.ActorInternal.GetMaximumSize(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal int GetHierarchyDepth()
{
int ret = Interop.Actor.GetHierarchyDepth(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal uint GetRendererCount()
{
uint ret = Interop.Actor.GetRendererCount(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(View obj)
{
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.SwigCPtr;
}
internal bool IsTopLevelView()
{
if (GetParent() is Layer)
{
return true;
}
return false;
}
internal void SetKeyInputFocus()
{
Interop.ViewInternal.SetKeyInputFocus(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal void ClearKeyInputFocus()
{
Interop.ViewInternal.ClearKeyInputFocus(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}
internal PinchGestureDetector GetPinchGestureDetector()
{
PinchGestureDetector ret = new PinchGestureDetector(Interop.ViewInternal.GetPinchGestureDetector(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal PanGestureDetector GetPanGestureDetector()
{
PanGestureDetector ret = new PanGestureDetector(Interop.ViewInternal.GetPanGestureDetector(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal TapGestureDetector GetTapGestureDetector()
{
TapGestureDetector ret = new TapGestureDetector(Interop.ViewInternal.GetTapGestureDetector(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal LongPressGestureDetector GetLongPressGestureDetector()
{
LongPressGestureDetector ret = new LongPressGestureDetector(Interop.ViewInternal.GetLongPressGestureDetector(SwigCPtr), true);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
internal IntPtr GetPtrfromView()
{
return (IntPtr)SwigCPtr;
}
internal void RemoveChild(View child)
{
// Do actual child removal
Interop.Actor.Remove(SwigCPtr, View.getCPtr(child));
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
Children.Remove(child);
child.InternalParent = null;
RemoveChildBindableObject(child);
if (ChildRemoved != null)
{
ChildRemovedEventArgs e = new ChildRemovedEventArgs
{
Removed = child
};
ChildRemoved(this, e);
}
}
///
/// Removes the layout from this View.
///
internal void ResetLayout()
{
layout = null;
}
internal ResourceLoadingStatusType GetBackgroundResourceStatus()
{
return (ResourceLoadingStatusType)Interop.View.GetVisualResourceStatus(this.SwigCPtr, Property.BACKGROUND);
}
/// TODO open as a protected level
internal virtual void ApplyCornerRadius()
{
if (backgroundExtraData == null) return;
var cornerRadius = backgroundExtraData.CornerRadius == null ? new PropertyValue() : new PropertyValue(backgroundExtraData.CornerRadius);
// Apply to the background visual
PropertyMap backgroundMap = new PropertyMap();
PropertyValue background = Tizen.NUI.Object.GetProperty(SwigCPtr, View.Property.BACKGROUND);
if (background.Get(backgroundMap) && !backgroundMap.Empty())
{
backgroundMap[Visual.Property.CornerRadius] = cornerRadius;
backgroundMap[Visual.Property.CornerRadiusPolicy] = new PropertyValue((int)backgroundExtraData.CornerRadiusPolicy);
var temp = new PropertyValue(backgroundMap);
Tizen.NUI.Object.SetProperty(SwigCPtr, View.Property.BACKGROUND, temp);
temp.Dispose();
}
backgroundMap.Dispose();
background.Dispose();
// Apply to the shadow visual
PropertyMap shadowMap = new PropertyMap();
PropertyValue shadow = Tizen.NUI.Object.GetProperty(SwigCPtr, View.Property.SHADOW);
if (shadow.Get(shadowMap) && !shadowMap.Empty())
{
shadowMap[Visual.Property.CornerRadius] = cornerRadius;
shadowMap[Visual.Property.CornerRadiusPolicy] = new PropertyValue((int)backgroundExtraData.CornerRadiusPolicy);
var temp = new PropertyValue(shadowMap);
Tizen.NUI.Object.SetProperty(SwigCPtr, View.Property.SHADOW, temp);
temp.Dispose();
}
shadowMap.Dispose();
shadow.Dispose();
cornerRadius.Dispose();
}
/// TODO open as a protected level
internal virtual void ApplyBorderline()
{
if (backgroundExtraData == null) return;
var borderlineColor = backgroundExtraData.BorderlineColor == null ? new PropertyValue(Color.Black) : new PropertyValue(backgroundExtraData.BorderlineColor);
// Apply to the background visual
PropertyMap backgroundMap = new PropertyMap();
PropertyValue background = Tizen.NUI.Object.GetProperty(SwigCPtr, View.Property.BACKGROUND);
if (background.Get(backgroundMap) && !backgroundMap.Empty())
{
backgroundMap[Visual.Property.BorderlineWidth] = new PropertyValue(backgroundExtraData.BorderlineWidth);
backgroundMap[Visual.Property.BorderlineColor] = borderlineColor;
backgroundMap[Visual.Property.BorderlineOffset] = new PropertyValue(backgroundExtraData.BorderlineOffset);
var temp = new PropertyValue(backgroundMap);
Tizen.NUI.Object.SetProperty(SwigCPtr, View.Property.BACKGROUND, temp);
temp.Dispose();
}
backgroundMap.Dispose();
background.Dispose();
borderlineColor.Dispose();
}
///
/// Get selector value from the triggerable selector or related property.
///
internal Selector GetSelector(TriggerableSelector triggerableSelector, NUI.Binding.BindableProperty relatedProperty)
{
var selector = triggerableSelector?.Get();
if (selector != null)
{
return selector;
}
var value = (T)GetValue(relatedProperty);
return value == null ? null : new Selector(value);
}
internal void SetThemeApplied()
{
if (themeData == null) themeData = new ThemeData();
themeData.ThemeApplied = true;
if (ThemeChangeSensitive && !themeData.ListeningThemeChangeEvent)
{
themeData.ListeningThemeChangeEvent = true;
ThemeManager.ThemeChangedInternal.Add(OnThemeChanged);
}
}
///
/// you can override it to clean-up your own resources.
///
/// DisposeTypes
/// 3
protected override void Dispose(DisposeTypes type)
{
if (disposed)
{
return;
}
//_mergedStyle = null;
if (type == DisposeTypes.Explicit)
{
//Called by User
//Release your own managed resources here.
//You should release all of your own disposable objects here.
if (themeData != null)
{
themeData.selectorData?.Reset(this);
if (themeData.ListeningThemeChangeEvent)
{
ThemeManager.ThemeChangedInternal.Remove(OnThemeChanged);
}
}
if(widthConstraint != null)
{
widthConstraint.Remove();
widthConstraint.Dispose();
}
if(heightConstraint != null)
{
heightConstraint.Remove();
heightConstraint.Dispose();
}
Unparent();
}
//Release your own unmanaged resources here.
//You should not access any managed member here except static instance.
//because the execution order of Finalizes is non-deterministic.
// equivalent to "if (this != null)". more clear to understand.
if (this.HasBody())
{
DisConnectFromSignals();
foreach (View view in Children)
{
view.InternalParent = null;
}
}
base.Dispose(type);
}
/// This will not be public opened.
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
{
Interop.View.DeleteView(swigCPtr);
}
///
/// The touch event handler for ControlState.
/// Please change ControlState value by touch state if needed.
///
/// Thrown when touch is null.
[EditorBrowsable(EditorBrowsableState.Never)]
protected virtual bool HandleControlStateOnTouch(Touch touch)
{
if (touch == null)
{
throw new global::System.ArgumentNullException(nameof(touch));
}
switch (touch.GetState(0))
{
case PointStateType.Down:
ControlState += ControlState.Pressed;
break;
case PointStateType.Interrupted:
case PointStateType.Up:
if (ControlState.Contains(ControlState.Pressed))
{
ControlState -= ControlState.Pressed;
}
break;
default:
break;
}
return false;
}
private void DisConnectFromSignals()
{
// Save current CPtr.
global::System.Runtime.InteropServices.HandleRef currentCPtr = SwigCPtr;
// Use BaseHandle CPtr as current might have been deleted already in derived classes.
SwigCPtr = GetBaseHandleCPtrHandleRef;
if (onRelayoutEventCallback != null)
{
ViewSignal signal = this.OnRelayoutSignal();
signal?.Disconnect(onRelayoutEventCallback);
signal?.Dispose();
onRelayoutEventCallback = null;
}
if (offWindowEventCallback != null)
{
ViewSignal signal = this.OffWindowSignal();
signal?.Disconnect(offWindowEventCallback);
signal?.Dispose();
offWindowEventCallback = null;
}
if (onWindowEventCallback != null)
{
ViewSignal signal = this.OnWindowSignal();
signal?.Disconnect(onWindowEventCallback);
signal?.Dispose();
onWindowEventCallback = null;
}
if (wheelEventCallback != null)
{
WheelSignal signal = this.WheelEventSignal();
signal?.Disconnect(wheelEventCallback);
signal?.Dispose();
}
if (WindowWheelEventHandler != null)
{
NUIApplication.GetDefaultWindow().WheelEvent -= OnWindowWheelEvent;
}
if (hoverEventCallback != null)
{
HoverSignal signal = this.HoveredSignal();
signal?.Disconnect(hoverEventCallback);
signal?.Dispose();
}
if (interceptTouchDataCallback != null)
{
TouchDataSignal signal = this.InterceptTouchSignal();
signal?.Disconnect(interceptTouchDataCallback);
signal?.Dispose();
}
if (touchDataCallback != null)
{
TouchDataSignal signal = this.TouchSignal();
signal?.Disconnect(touchDataCallback);
signal?.Dispose();
}
if (ResourcesLoadedCallback != null)
{
ViewSignal signal = this.ResourcesLoadedSignal();
signal?.Disconnect(ResourcesLoadedCallback);
signal?.Dispose();
ResourcesLoadedCallback = null;
}
if (keyCallback != null)
{
ControlKeySignal signal = this.KeyEventSignal();
signal?.Disconnect(keyCallback);
signal?.Dispose();
}
if (keyInputFocusLostCallback != null)
{
KeyInputFocusSignal signal = this.KeyInputFocusLostSignal();
signal?.Disconnect(keyInputFocusLostCallback);
signal?.Dispose();
}
if (keyInputFocusGainedCallback != null)
{
KeyInputFocusSignal signal = this.KeyInputFocusGainedSignal();
signal?.Disconnect(keyInputFocusGainedCallback);
signal?.Dispose();
}
if (backgroundResourceLoadedCallback != null)
{
ViewSignal signal = this.ResourcesLoadedSignal();
signal?.Disconnect(backgroundResourceLoadedCallback);
signal?.Dispose();
backgroundResourceLoadedCallback = null;
}
if (onWindowSendEventCallback != null)
{
ViewSignal signal = this.OnWindowSignal();
signal?.Disconnect(onWindowSendEventCallback);
signal?.Dispose();
onWindowSendEventCallback = null;
}
// BaseHandle CPtr is used in Registry and there is danger of deletion if we keep using it here.
// Restore current CPtr.
SwigCPtr = currentCPtr;
}
///
/// Apply initial style to the view.
///
[EditorBrowsable(EditorBrowsableState.Never)]
protected virtual void InitializeStyle(ViewStyle style = null)
{
var initialStyle = ThemeManager.GetInitialStyleWithoutClone(GetType());
if (style == null)
{
ApplyStyle(initialStyle);
}
else
{
var refinedStyle = style;
if (style.IncludeDefaultStyle)
{
refinedStyle = initialStyle?.Merge(style);
}
ApplyStyle(refinedStyle);
}
// Listen theme change event if needs.
if (ThemeManager.PlatformThemeEnabled && initialStyle != null)
{
SetThemeApplied();
}
}
private View ConvertIdToView(uint id)
{
View view = GetParent()?.FindCurrentChildById(id);
//If we can't find the parent's children, find in the top layer.
if (!view)
{
Container parent = GetParent();
while ((parent is View) && (parent != null))
{
parent = parent.GetParent();
if (parent is Layer)
{
view = parent.FindCurrentChildById(id);
break;
}
}
}
return view;
}
private void OnScaleChanged(float x, float y, float z)
{
Scale = new Vector3(x, y, z);
}
private void OnBackgroundColorChanged(float r, float g, float b, float a)
{
BackgroundColor = new Color(r, g, b, a);
}
private void OnPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
{
Padding = new Extents(start, end, top, bottom);
}
private void OnMarginChanged(ushort start, ushort end, ushort top, ushort bottom)
{
Margin = new Extents(start, end, top, bottom);
}
private void OnColorChanged(float r, float g, float b, float a)
{
Color = new Color(r, g, b, a);
}
private void OnAnchorPointChanged(float x, float y, float z)
{
AnchorPoint = new Position(x, y, z);
}
private void OnCellIndexChanged(float x, float y)
{
CellIndex = new Vector2(x, y);
}
private void OnFlexMarginChanged(float x, float y, float z, float w)
{
FlexMargin = new Vector4(x, y, z, w);
}
private void OnPaddingEXChanged(ushort start, ushort end, ushort top, ushort bottom)
{
PaddingEX = new Extents(start, end, top, bottom);
}
private void OnSizeModeFactorChanged(float x, float y, float z)
{
SizeModeFactor = new Vector3(x, y, z);
}
private bool EmptyOnTouch(object target, TouchEventArgs args)
{
return false;
}
private ViewSelectorData EnsureSelectorData()
{
if (themeData == null) themeData = new ThemeData();
return themeData.selectorData ?? (themeData.selectorData = new ViewSelectorData());
}
}
}