/* * Copyright(c) 2022 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.ComponentModel; using global::System.Diagnostics; using Tizen.NUI; namespace Tizen.NUI.BaseComponents { /// /// View is the base class for all views. /// /// 3 public partial class View { internal string styleName; internal virtual LayoutItem CreateDefaultLayout() { return new AbsoluteLayout(); } 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 { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.WorldPositionX); } } internal float WorldPositionY { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.WorldPositionY); } } internal float WorldPositionZ { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.WorldPositionZ); } } internal bool FocusState { get { return IsKeyboardFocusable(); } set { SetKeyboardFocusable(value); } } internal void SetLayout(LayoutItem layout) { LayoutCount++; 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 { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.ParentOriginX); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.WorldPositionX, value); NotifyPropertyChanged(); } } internal float ParentOriginY { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.ParentOriginY); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.ParentOriginY, value); NotifyPropertyChanged(); } } internal float ParentOriginZ { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.ParentOriginZ); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.ParentOriginZ, value); NotifyPropertyChanged(); } } internal float PivotPointX { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.AnchorPointX); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.AnchorPointX, value); } } internal float PivotPointY { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.AnchorPointY); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.AnchorPointY, value); } } internal float PivotPointZ { get { return Object.InternalGetPropertyFloat(SwigCPtr, View.Property.AnchorPointZ); } set { Object.InternalSetPropertyFloat(SwigCPtr, View.Property.AnchorPointZ, value); } } internal Matrix WorldMatrix { get { Matrix returnValue = new Matrix(); PropertyValue wordMatrix = GetProperty(View.Property.WorldMatrix); wordMatrix?.Get(returnValue); wordMatrix?.Dispose(); return returnValue; } } /// /// The number of layouts including view's layout and children's layouts. /// This can be used to set/unset Process callback to calculate Layout. /// internal int LayoutCount { get { return layoutCount; } set { if (layoutCount == value) return; if (value < 0) throw new global::System.ArgumentOutOfRangeException(nameof(LayoutCount), "LayoutCount(" + LayoutCount + ") should not be less than zero"); int diff = value - layoutCount; layoutCount = value; if (InternalParent != null) { var parentView = InternalParent as View; if (parentView != null) { parentView.LayoutCount += diff; } else { var parentLayer = InternalParent as Layer; if (parentLayer != null) { parentLayer.LayoutCount += diff; } } } } } /// /// Indicates that this View should listen Touch event to handle its ControlState. /// private bool enableControlState = false; private int LeftFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.LeftFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.LeftFocusableViewId, value); } } private int RightFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.RightFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.RightFocusableViewId, value); } } private int UpFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.UpFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.UpFocusableViewId, value); } } private int DownFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.DownFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.DownFocusableViewId, value); } } private int ClockwiseFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.ClockwiseFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.ClockwiseFocusableViewId, value); } } private int CounterClockwiseFocusableViewId { get { return Object.InternalGetPropertyInt(SwigCPtr, View.Property.CounterClockwiseFocusableViewId); } set { Object.InternalSetPropertyInt(SwigCPtr, View.Property.CounterClockwiseFocusableViewId, value); } } 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(Position origin) { Interop.ActorInternal.SetParentOrigin(SwigCPtr, Position.getCPtr(origin)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal Position GetCurrentParentOrigin() { if(internalCurrentParentOrigin == null) { internalCurrentParentOrigin = new Position(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, View.Property.ParentOrigin, internalCurrentParentOrigin.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentParentOrigin; } internal void SetAnchorPoint(Position anchorPoint) { Interop.Actor.SetAnchorPoint(SwigCPtr, Position.getCPtr(anchorPoint)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal Position GetCurrentAnchorPoint() { if(internalCurrentAnchorPoint == null) { internalCurrentAnchorPoint = new Position(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, View.Property.AnchorPoint, internalCurrentAnchorPoint.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentAnchorPoint; } 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() { if(internalTargetSize == null) { internalTargetSize = new Vector3(0, 0, 0); } Interop.ActorInternal.RetrieveTargetSize(SwigCPtr, internalTargetSize.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalTargetSize; } internal Size2D GetCurrentSize() { if(internalCurrentSize == null) { internalCurrentSize = new Size2D(0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector2ActualVector3(SwigCPtr, Property.SIZE, internalCurrentSize.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentSize; } internal Size2D GetCurrentSizeFloat() { Size ret = new Size(Interop.Actor.GetCurrentSize(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// GetNaturalSize() function behaviour can be changed for each subclass of View. /// So we make GetNaturalSize() function virtual, and make subclass can define it's owned logic /// internal virtual Vector3 GetNaturalSize() { Vector3 ret = new Vector3(Interop.Actor.GetNaturalSize(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } 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() { if(internalCurrentPosition == null) { internalCurrentPosition = new Position(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, Property.POSITION, internalCurrentPosition.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentPosition; } internal Vector3 GetCurrentWorldPosition() { if(internalCurrentWorldPosition == null) { internalCurrentWorldPosition = new Vector3(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, View.Property.WorldPosition, internalCurrentWorldPosition.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentWorldPosition; } internal Vector2 GetCurrentScreenPosition() { if(internalCurrentScreenPosition == null) { internalCurrentScreenPosition = new Vector2(0, 0); } Object.InternalRetrievingPropertyVector2(SwigCPtr, View.Property.ScreenPosition, internalCurrentScreenPosition.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentScreenPosition; } internal Vector4 GetCurrentScreenPositionSize() { Vector4 ret = new Vector4(Interop.Actor.CurrentScreenExtents(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw new InvalidOperationException("FATAL: get Exception", 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() { if(internalCurrentScale == null) { internalCurrentScale = new Vector3(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, View.Property.SCALE, internalCurrentScale.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentScale; } internal Vector3 GetCurrentWorldScale() { if(internalCurrentWorldScale == null) { internalCurrentWorldScale = new Vector3(0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector3(SwigCPtr, View.Property.WorldScale, internalCurrentWorldScale.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentWorldScale; } 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(); } /// /// Retrieve the View's current Visibility. /// /// /// The property is set in the main thread, so it is not updated in real time when the value is changed in the render thread. /// However, this method can get the current actual value updated in real time. /// 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() { if(internalCurrentColor == null) { internalCurrentColor = new Vector4(0, 0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector4(SwigCPtr, Interop.ActorProperty.ColorGet(), internalCurrentColor.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentColor; } internal ColorMode GetColorMode() { ColorMode ret = (ColorMode)Interop.ActorInternal.GetColorMode(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal Vector4 GetCurrentWorldColor() { if(internalCurrentWorldColor == null) { internalCurrentWorldColor = new Vector4(0, 0, 0, 0); } Interop.ActorInternal.RetrieveCurrentPropertyVector4(SwigCPtr, Property.WorldColor, internalCurrentWorldColor.SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) { throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } return internalCurrentWorldColor; } 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 SetKeyboardFocusableChildren(bool focusable) { Interop.ActorInternal.SetKeyboardFocusableChildren(SwigCPtr, focusable); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal bool AreChildrenKeyBoardFocusable() { bool ret = Interop.ActorInternal.AreChildrenKeyBoardFocusable(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() { if (internalSizeModeFactor == null) { internalSizeModeFactor = new Vector3(OnSizeModeFactorChanged, 0, 0, 0); } Object.InternalRetrievingPropertyVector3(SwigCPtr, View.Property.SizeModeFactor, internalSizeModeFactor.SwigCPtr); return internalSizeModeFactor; } internal void SetMinimumSize(Vector2 size) { Interop.ActorInternal.SetMinimumSize(SwigCPtr, Vector2.getCPtr(size)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal Vector2 GetMinimumSize() { if (internalMinimumSize == null) { internalMinimumSize = new Size2D(OnMinimumSizeChanged, 0, 0); } Object.InternalRetrievingPropertyVector2(SwigCPtr, View.Property.MinimumSize, internalMinimumSize.SwigCPtr); return internalMinimumSize; } internal void SetMaximumSize(Vector2 size) { Interop.ActorInternal.SetMaximumSize(SwigCPtr, Vector2.getCPtr(size)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal Vector2 GetMaximumSize() { if (internalMaximumSize == null) { internalMaximumSize = new Size2D(OnMaximumSizeChanged, 0, 0); } Object.InternalRetrievingPropertyVector2(SwigCPtr, View.Property.MaximumSize, internalMaximumSize.SwigCPtr); return internalMaximumSize; } 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; } /// /// Check whether Current view don't has BackgroundVisual or not. /// Some API (like Animation, Borderline) required non-empty backgrounds. /// internal bool IsBackgroundEmpty() { int visualType = (int)Visual.Type.Invalid; Interop.View.InternalRetrievingVisualPropertyInt(this.SwigCPtr, Property.BACKGROUND, Visual.Property.Type, out visualType); return visualType == (int)Visual.Type.Invalid; } 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) { // If the view had focus, it clears focus. if (child == FocusManager.Instance.GetCurrentFocusView()) { FocusManager.Instance.ClearFocus(); } // 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; LayoutCount -= child.LayoutCount; OnChildRemoved(child); if (ChildRemoved != null) { ChildRemovedEventArgs e = new ChildRemovedEventArgs { Removed = child }; ChildRemoved(this, e); } } /// /// Removes the layout from this View. /// internal void ResetLayout() { LayoutCount--; 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; // Update corner radius properties to background and shadow by ActionUpdateProperty if (backgroundExtraData.CornerRadius != null) { Interop.View.InternalUpdateVisualPropertyVector4(this.SwigCPtr, View.Property.BACKGROUND, Visual.Property.CornerRadius, Vector4.getCPtr(backgroundExtraData.CornerRadius)); Interop.View.InternalUpdateVisualPropertyVector4(this.SwigCPtr, View.Property.SHADOW, Visual.Property.CornerRadius, Vector4.getCPtr(backgroundExtraData.CornerRadius)); } Interop.View.InternalUpdateVisualPropertyInt(this.SwigCPtr, View.Property.BACKGROUND, Visual.Property.CornerRadiusPolicy, (int)backgroundExtraData.CornerRadiusPolicy); Interop.View.InternalUpdateVisualPropertyInt(this.SwigCPtr, View.Property.SHADOW, Visual.Property.CornerRadiusPolicy, (int)backgroundExtraData.CornerRadiusPolicy); } /// TODO open as a protected level internal virtual void ApplyBorderline() { if (backgroundExtraData == null) return; // ActionUpdateProperty works well only if BACKGROUND visual setup before. // If view don't have BACKGROUND visual, we set transparent background color in default. if (IsBackgroundEmpty()) { // BACKGROUND visual doesn't exist. SetBackgroundColor(Color.Transparent); // SetBackgroundColor function apply borderline internally. // So we can just return now. return; } // Update borderline properties to background by ActionUpdateProperty Interop.View.InternalUpdateVisualPropertyFloat(this.SwigCPtr, View.Property.BACKGROUND, Visual.Property.BorderlineWidth, backgroundExtraData.BorderlineWidth); Interop.View.InternalUpdateVisualPropertyVector4(this.SwigCPtr, View.Property.BACKGROUND, Visual.Property.BorderlineColor, Vector4.getCPtr(backgroundExtraData.BorderlineColor ?? Color.Black)); Interop.View.InternalUpdateVisualPropertyFloat(this.SwigCPtr, View.Property.BACKGROUND, Visual.Property.BorderlineOffset, backgroundExtraData.BorderlineOffset); } /// /// 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; } disposeDebugging(type); //_mergedStyle = null; internalMaximumSize?.Dispose(); internalMaximumSize = null; internalMinimumSize?.Dispose(); internalMinimumSize = null; internalMargin?.Dispose(); internalMargin = null; internalPadding?.Dispose(); internalPadding = null; internalSizeModeFactor?.Dispose(); internalSizeModeFactor = null; internalCellIndex?.Dispose(); internalCellIndex = null; internalBackgroundColor?.Dispose(); internalBackgroundColor = null; internalColor?.Dispose(); internalColor = null; internalPivotPoint?.Dispose(); internalPivotPoint = null; internalPosition?.Dispose(); internalPosition = null; internalPosition2D?.Dispose(); internalPosition2D = null; internalScale?.Dispose(); internalScale = null; internalSize?.Dispose(); internalSize = null; internalSize2D?.Dispose(); internalSize2D = null; panGestureDetector?.Dispose(); panGestureDetector = null; longGestureDetector?.Dispose(); longGestureDetector = null; pinchGestureDetector?.Dispose(); pinchGestureDetector = null; tapGestureDetector?.Dispose(); tapGestureDetector = null; rotationGestureDetector?.Dispose(); rotationGestureDetector = null; internalCurrentParentOrigin?.Dispose(); internalCurrentParentOrigin = null; internalCurrentAnchorPoint?.Dispose(); internalCurrentAnchorPoint = null; internalTargetSize?.Dispose(); internalTargetSize = null; internalCurrentSize?.Dispose(); internalCurrentSize = null; internalCurrentPosition?.Dispose(); internalCurrentPosition = null; internalCurrentWorldPosition?.Dispose(); internalCurrentWorldPosition = null; internalCurrentScale?.Dispose(); internalCurrentScale = null; internalCurrentWorldScale?.Dispose(); internalCurrentWorldScale = null; internalCurrentColor?.Dispose(); internalCurrentColor = null; internalCurrentWorldColor?.Dispose(); internalCurrentWorldColor = null; internalSizeModeFactor?.Dispose(); internalSizeModeFactor = null; internalCurrentScreenPosition?.Dispose(); internalCurrentScreenPosition = 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(); } } //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. DisConnectFromSignals(); foreach (View view in Children) { view.InternalParent = null; } LayoutCount = 0; NUILog.Debug($"[Dispose] View.Dispose({type}) END"); NUILog.Debug($"============================="); 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; } /// /// Internal callback of enabled property changes. /// Inherited view can override this method to implements enabled property changes. /// [EditorBrowsable(EditorBrowsableState.Never)] protected virtual void OnEnabled(bool enabled) { if (enabled) { if (State == View.States.Disabled) { State = View.States.Normal; } if (enableControlState) { ControlState -= ControlState.Disabled; } } else { State = View.States.Disabled; if (enableControlState) { ControlState += ControlState.Disabled; } } } private void DisConnectFromSignals() { if (HasBody() == false) { NUILog.Debug($"[Dispose] DisConnectFromSignals() No native body! No need to Disconnect Signals!"); return; } NUILog.Debug($"[Dispose] DisConnectFromSignals START"); NUILog.Debug($"[Dispose] View.DisConnectFromSignals() type:{GetType()} copyNativeHandle:{GetBaseHandleCPtrHandleRef.Handle.ToString("X8")}"); NUILog.Debug($"[Dispose] ID:{Interop.Actor.GetId(GetBaseHandleCPtrHandleRef)} Name:{Interop.Actor.GetName(GetBaseHandleCPtrHandleRef)}"); if (onRelayoutEventCallback != null) { NUILog.Debug($"[Dispose] onRelayoutEventCallback"); Interop.ActorSignal.OnRelayoutDisconnect(GetBaseHandleCPtrHandleRef, onRelayoutEventCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); onRelayoutEventCallback = null; } if (offWindowEventCallback != null) { NUILog.Debug($"[Dispose] offWindowEventCallback"); Interop.ActorSignal.OffSceneDisconnect(GetBaseHandleCPtrHandleRef, offWindowEventCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); offWindowEventCallback = null; } if (onWindowEventCallback != null) { NUILog.Debug($"[Dispose] onWindowEventCallback"); Interop.ActorSignal.OnSceneDisconnect(GetBaseHandleCPtrHandleRef, onWindowEventCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); onWindowEventCallback = null; } if (interceptWheelCallback != null) { NUILog.Debug($"[Dispose] interceptWheelCallback"); Interop.ActorSignal.InterceptWheelDisconnect(GetBaseHandleCPtrHandleRef, interceptWheelCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); interceptWheelCallback = null; } if (wheelEventCallback != null) { NUILog.Debug($"[Dispose] wheelEventCallback"); Interop.ActorSignal.WheelEventDisconnect(GetBaseHandleCPtrHandleRef, wheelEventCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); wheelEventCallback = null; } if (hoverEventCallback != null) { NUILog.Debug($"[Dispose] hoverEventCallback"); Interop.ActorSignal.HoveredDisconnect(GetBaseHandleCPtrHandleRef, hoverEventCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); hoverEventCallback = null; } if (hitTestResultDataCallback != null) { NUILog.Debug($"[Dispose] hitTestResultDataCallback"); Interop.ActorSignal.HitTestResultDisconnect(GetBaseHandleCPtrHandleRef, hitTestResultDataCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); hitTestResultDataCallback = null; } if (interceptTouchDataCallback != null) { NUILog.Debug($"[Dispose] interceptTouchDataCallback"); Interop.ActorSignal.InterceptTouchDisconnect(GetBaseHandleCPtrHandleRef, interceptTouchDataCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); interceptTouchDataCallback = null; } if (touchDataCallback != null) { NUILog.Debug($"[Dispose] touchDataCallback"); Interop.ActorSignal.TouchDisconnect(GetBaseHandleCPtrHandleRef, touchDataCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); touchDataCallback = null; } if (resourcesLoadedCallback != null) { NUILog.Debug($"[Dispose] ResourcesLoadedCallback"); Interop.ViewSignal.ResourceReadyDisconnect(GetBaseHandleCPtrHandleRef, resourcesLoadedCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); resourcesLoadedCallback = null; } if (keyCallback != null) { NUILog.Debug($"[Dispose] keyCallback"); Interop.ViewSignal.KeyEventDisconnect(GetBaseHandleCPtrHandleRef, keyCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); keyCallback = null; } if (keyInputFocusLostCallback != null) { NUILog.Debug($"[Dispose] keyInputFocusLostCallback"); Interop.ViewSignal.KeyInputFocusLostDisconnect(GetBaseHandleCPtrHandleRef, keyInputFocusLostCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); keyInputFocusLostCallback = null; keyInputFocusLostEventHandler = null; } if (keyInputFocusGainedCallback != null) { NUILog.Debug($"[Dispose] keyInputFocusGainedCallback"); Interop.ViewSignal.KeyInputFocusGainedDisconnect(GetBaseHandleCPtrHandleRef, keyInputFocusGainedCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); keyInputFocusGainedCallback = null; keyInputFocusGainedEventHandler = null; } if (backgroundResourceLoadedCallback != null) { NUILog.Debug($"[Dispose] backgroundResourceLoadedCallback"); Interop.ViewSignal.ResourceReadyDisconnect(GetBaseHandleCPtrHandleRef, backgroundResourceLoadedCallback.ToHandleRef(this)); NDalicPINVOKE.ThrowExceptionIfExistsDebug(); backgroundResourceLoadedCallback = null; } NDalicPINVOKE.ThrowExceptionIfExists(); NUILog.Debug($"[Dispose] DisConnectFromSignals END"); } /// /// Apply initial style to the view. /// [EditorBrowsable(EditorBrowsableState.Never)] protected virtual void InitializeStyle(ViewStyle style = null) { if (style == null && ThemeManager.InitialThemeDisabled) { // Fast return in most TV cases. return; } 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 (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 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; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool CheckResourceReady() { return true; } private ViewSelectorData EnsureSelectorData() { if (themeData == null) themeData = new ThemeData(); return themeData.selectorData ?? (themeData.selectorData = new ViewSelectorData()); } [Conditional("NUI_DISPOSE_DEBUG_ON")] private void disposeDebugging(DisposeTypes type) { DebugFileLogging.Instance.WriteLog($"View.Dispose({type}) START"); DebugFileLogging.Instance.WriteLog($"type:{GetType()} copyNativeHandle:{GetBaseHandleCPtrHandleRef.Handle.ToString("X8")}"); if (HasBody()) { DebugFileLogging.Instance.WriteLog($"ID:{Interop.Actor.GetId(GetBaseHandleCPtrHandleRef)} Name:{Interop.Actor.GetName(GetBaseHandleCPtrHandleRef)}"); } else { DebugFileLogging.Instance.WriteLog($"has no native body!"); } } } }