Merge "[Maps] Prevent crashes caused by releasing unmanaged resources"
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Layer.cs
1 /*
2  * Copyright(c) 2017 Samsung Electronics Co., Ltd.
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 Tizen.NUI.BaseComponents;
19 using System.ComponentModel;
20
21 namespace Tizen.NUI
22 {
23
24     /// <summary>
25     /// Layers provide a mechanism for overlaying groups of actors on top of each other.
26     /// </summary>
27     /// <since_tizen> 3 </since_tizen>
28     public class Layer : Container
29     {
30         private global::System.Runtime.InteropServices.HandleRef swigCPtr;
31
32         internal Layer(global::System.IntPtr cPtr, bool cMemoryOwn) : base(NDalicPINVOKE.Layer_SWIGUpcast(cPtr), cMemoryOwn)
33         {
34             swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
35         }
36
37         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Layer obj)
38         {
39             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
40         }
41
42         /// From the Container base class.
43
44         /// <summary>
45         /// Adds a child view to this layer.
46         /// </summary>
47         /// <seealso cref="Container.Add">
48         /// </seealso>
49         /// <since_tizen> 4 </since_tizen>
50         public override void Add(View child)
51         {
52             NDalicPINVOKE.Actor_Add(swigCPtr, View.getCPtr(child));
53             if (NDalicPINVOKE.SWIGPendingException.Pending)
54                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
55
56             Children.Add(child);
57         }
58
59         /// <summary>
60         /// Removes a child view from this layer. If the view was not a child of this layer, this is a no-op.
61         /// </summary>
62         /// <seealso cref="Container.Remove">
63         /// </seealso>
64         /// <since_tizen> 4 </since_tizen>
65         public override void Remove(View child)
66         {
67             NDalicPINVOKE.Actor_Remove(swigCPtr, View.getCPtr(child));
68             if (NDalicPINVOKE.SWIGPendingException.Pending)
69                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
70
71             Children.Remove(child);
72         }
73
74         /// <summary>
75         /// Retrieves a child view by the index.
76         /// </summary>
77         /// <pre>The view has been initialized.</pre>
78         /// <param name="index">The index of the child to retrieve.</param>
79         /// <returns>The view for the given index or empty handle if children not initialized.</returns>
80         /// <since_tizen> 4 </since_tizen>
81         public override View GetChildAt(uint index)
82         {
83             if (index < Children.Count)
84             {
85                 return Children[Convert.ToInt32(index)];
86             }
87             else
88             {
89                 return null;
90             }
91         }
92
93
94         /// <summary>
95         /// Get parent of the layer.
96         /// </summary>
97         /// <returns>The view's container</returns>
98         /// <since_tizen> 4 </since_tizen>
99         public override Container GetParent()
100         {
101             return null;
102         }
103
104         /// <summary>
105         /// Get the child count of the layer.
106         /// </summary>
107         /// <returns>The child count of the layer.</returns>
108         /// <since_tizen> 4 </since_tizen>
109         public override uint GetChildCount()
110         {
111             return Convert.ToUInt32(Children.Count);
112         }
113
114         /// <summary>
115         /// Dispose.
116         /// </summary>
117         /// <since_tizen> 3 </since_tizen>
118         protected override void Dispose(DisposeTypes type)
119         {
120             if(disposed)
121             {
122                 return;
123             }
124
125             if(type == DisposeTypes.Explicit)
126             {
127                 //Called by User
128                 //Release your own managed resources here.
129                 //You should release all of your own disposable objects here.
130             }
131
132             //Release your own unmanaged resources here.
133             //You should not access any managed member here except static instance.
134             //because the execution order of Finalizes is non-deterministic.
135
136             if (swigCPtr.Handle != global::System.IntPtr.Zero)
137             {
138                 if (swigCMemOwn)
139                 {
140                     swigCMemOwn = false;
141                     NDalicPINVOKE.delete_Layer(swigCPtr);
142                 }
143                 swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
144             }
145
146             base.Dispose(type);
147
148         }
149
150
151         internal class Property
152         {
153             internal static readonly int BEHAVIOR = NDalicPINVOKE.Layer_Property_BEHAVIOR_get();
154         }
155
156         /// <summary>
157         /// Creates a Layer object.
158         /// </summary>
159         /// <since_tizen> 3 </since_tizen>
160         public Layer() : this(NDalicPINVOKE.Layer_New(), true)
161         {
162             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
163             if(Window.Instance != null)
164             {
165                 this.SetAnchorPoint(Tizen.NUI.PivotPoint.TopLeft);
166                 this.SetResizePolicy(ResizePolicyType.FillToParent, DimensionType.AllDimensions);
167             }
168         }
169         internal void SetAnchorPoint(Vector3 anchorPoint)
170         {
171             NDalicPINVOKE.Actor_SetAnchorPoint(swigCPtr, Vector3.getCPtr(anchorPoint));
172             if (NDalicPINVOKE.SWIGPendingException.Pending)
173                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
174         }
175         internal void SetResizePolicy(ResizePolicyType policy, DimensionType dimension)
176         {
177             NDalicPINVOKE.Actor_SetResizePolicy(swigCPtr, (int)policy, (int)dimension);
178             if (NDalicPINVOKE.SWIGPendingException.Pending)
179                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
180         }
181
182
183         /// <summary>
184         /// Downcasts a handle to layer handle.
185         /// </summary>
186         /// <since_tizen> 3 </since_tizen>
187         /// Please do not use! this will be deprecated!
188         /// Instead please use as keyword.
189         [Obsolete("Please do not use! This will be deprecated! Please use as keyword instead!")]
190         [EditorBrowsable(EditorBrowsableState.Never)]
191         public static Layer DownCast(BaseHandle handle)
192         {
193             Layer ret =  Registry.GetManagedBaseHandleFromNativePtr(handle) as Layer;
194             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
195             return ret;
196         }
197
198         /// <summary>
199         /// Search through this layer's hierarchy for a view with the given unique ID.
200         /// </summary>
201         /// <pre>This layer (the parent) has been initialized.</pre>
202         /// <remarks>The actor itself is also considered in the search.</remarks>
203         /// <param name="id">The id of the child to find</param>
204         /// <returns> A handle to the view if found, or an empty handle if not. </returns>
205         /// <since_tizen> 3 </since_tizen>
206         public View FindChildById(uint id)
207         {
208             IntPtr cPtr = NDalicPINVOKE.Actor_FindChildById(swigCPtr, id);
209             View ret = Registry.GetManagedBaseHandleFromNativePtr(cPtr) as View;
210
211             if (NDalicPINVOKE.SWIGPendingException.Pending)
212                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
213             return ret;
214         }
215
216         /// <summary>
217         /// Queries the depth of the layer.<br />
218         /// 0 is the bottommost layer, higher number is on the top.<br />
219         /// </summary>
220         /// <since_tizen> 3 </since_tizen>
221         public uint Depth
222         {
223             get
224             {
225                 return GetDepth();
226             }
227         }
228
229         internal uint GetDepth()
230         {
231             var parentChildren = Window.Instance.LayersChildren;
232             if(parentChildren != null)
233             {
234                 int idx = parentChildren.IndexOf(this);
235                 if (idx >= 0)
236                 {
237                     return Convert.ToUInt32(idx); ;
238                 }
239             }
240             return 0u;
241         }
242
243         /// <summary>
244         /// Increments the depth of the layer.
245         /// </summary>
246         /// <since_tizen> 3 </since_tizen>
247         public void Raise()
248         {
249             var parentChildren = Window.Instance.LayersChildren;
250             if (parentChildren != null)
251             {
252                 int currentIdx = parentChildren.IndexOf(this);
253
254                 if (currentIdx != parentChildren.Count - 1)
255                 {
256                     RaiseAbove(parentChildren[currentIdx + 1]);
257
258                     Layer temp = parentChildren[currentIdx + 1];
259                     parentChildren[currentIdx + 1] = this;
260                     parentChildren[currentIdx] = temp;
261                 }
262             }
263         }
264
265         /// <summary>
266         /// Decrements the depth of the layer.
267         /// </summary>
268         /// <since_tizen> 3 </since_tizen>
269         public void Lower()
270         {
271             var parentChildren = Window.Instance.LayersChildren;
272             if (parentChildren != null)
273             {
274                 int currentIdx = parentChildren.IndexOf(this);
275
276                 if (currentIdx > 0)
277                 {
278                     LowerBelow(parentChildren[currentIdx - 1]);
279
280                     Layer temp = parentChildren[currentIdx - 1];
281                     parentChildren[currentIdx - 1] = this;
282                     parentChildren[currentIdx] = temp;
283
284                 }
285             }
286         }
287
288         internal void RaiseAbove(Layer target)
289         {
290             NDalicPINVOKE.Layer_RaiseAbove(swigCPtr, Layer.getCPtr(target));
291             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
292         }
293
294         internal void LowerBelow(Layer target)
295         {
296             NDalicPINVOKE.Layer_LowerBelow(swigCPtr, Layer.getCPtr(target));
297             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
298         }
299
300         /// <summary>
301         /// Raises the layer to the top.
302         /// </summary>
303         /// <since_tizen> 3 </since_tizen>
304         public void RaiseToTop()
305         {
306             var parentChildren = Window.Instance.LayersChildren;
307
308             if (parentChildren != null)
309             {
310                 parentChildren.Remove(this);
311                 parentChildren.Add(this);
312             }
313             NDalicPINVOKE.Layer_RaiseToTop(swigCPtr);
314             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
315         }
316
317         /// <summary>
318         /// Lowers the layer to the bottom.
319         /// </summary>
320         /// <since_tizen> 3 </since_tizen>
321         public void LowerToBottom()
322         {
323             var parentChildren = Window.Instance.LayersChildren;
324
325             if (parentChildren != null)
326             {
327                 parentChildren.Remove(this);
328                 parentChildren.Insert(0, this);
329             }
330
331             NDalicPINVOKE.Layer_LowerToBottom(swigCPtr);
332             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
333         }
334
335         /// <summary>
336         /// Moves the layer directly above the given layer.<br />
337         /// After the call, this layer's depth will be immediately above target.<br />
338         /// </summary>
339         /// <param name="target">The layer to get on top of.</param>
340         /// <since_tizen> 3 </since_tizen>
341         public void MoveAbove(Layer target)
342         {
343             NDalicPINVOKE.Layer_MoveAbove(swigCPtr, Layer.getCPtr(target));
344             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
345         }
346
347         /// <summary>
348         /// Moves the layer directly below the given layer.<br />
349         /// After the call, this layer's depth will be immediately below target.<br />
350         /// </summary>
351         /// <param name="target">The layer to get below of.</param>
352         /// <since_tizen> 3 </since_tizen>
353         public void MoveBelow(Layer target)
354         {
355             NDalicPINVOKE.Layer_MoveBelow(swigCPtr, Layer.getCPtr(target));
356             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
357         }
358
359         private void SetBehavior(LayerBehavior behavior)
360         {
361             NDalicPINVOKE.Layer_SetBehavior(swigCPtr, (int)behavior);
362             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
363         }
364
365         private LayerBehavior GetBehavior()
366         {
367             Layer.LayerBehavior ret = (Layer.LayerBehavior)NDalicPINVOKE.Layer_GetBehavior(swigCPtr);
368             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
369             return ret;
370         }
371
372         internal void SetSortFunction(SWIGTYPE_p_f_r_q_const__Dali__Vector3__float function)
373         {
374             NDalicPINVOKE.Layer_SetSortFunction(swigCPtr, SWIGTYPE_p_f_r_q_const__Dali__Vector3__float.getCPtr(function));
375             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
376         }
377
378         internal void SetTouchConsumed(bool consume)
379         {
380             NDalicPINVOKE.Layer_SetTouchConsumed(swigCPtr, consume);
381             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
382         }
383
384         internal bool IsTouchConsumed()
385         {
386             bool ret = NDalicPINVOKE.Layer_IsTouchConsumed(swigCPtr);
387             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
388             return ret;
389         }
390
391         internal void SetHoverConsumed(bool consume)
392         {
393             NDalicPINVOKE.Layer_SetHoverConsumed(swigCPtr, consume);
394             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
395         }
396
397         internal bool IsHoverConsumed()
398         {
399             bool ret = NDalicPINVOKE.Layer_IsHoverConsumed(swigCPtr);
400             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
401             return ret;
402         }
403
404         /// <summary>
405         /// Enumeration for the behavior of the layer.
406         /// </summary>
407         /// <since_tizen> 3 </since_tizen>
408         public enum LayerBehavior
409         {
410             /// <summary>
411             /// UI control rendering mode.
412             /// </summary>
413             /// <since_tizen> 3 </since_tizen>
414             Layer2D,
415             /// <summary>
416             /// UI control rendering mode (default mode).
417             /// This mode is designed for UI controls that can overlap. In this
418             /// mode renderer order will be respective to the tree hierarchy of
419             /// Actors.<br />
420             /// The rendering order is depth first, so for the following actor tree,
421             /// A will be drawn first, then B, D, E, then C, F.  This ensures that
422             /// overlapping actors are drawn as expected (whereas, with breadth first
423             /// traversal, the actors would interleave).<br />
424             /// </summary>
425             /// <since_tizen> 3 </since_tizen>
426             LayerUI = Layer2D,
427             /// <summary>
428             /// Layer will use depth test.
429             /// This mode is designed for a 3 dimensional scene where actors in front
430             /// of other actors will obscure them, i.e. the actors are sorted by the
431             /// distance from the camera.<br />
432             /// When using this mode, a depth test will be used. A depth clear will
433             /// happen for each layer, which means actors in a layer "above" other
434             /// layers will be rendered in front of actors in those layers regardless
435             /// of their Z positions (see Layer::Raise() and Layer::Lower()).<br />
436             /// Opaque renderers are drawn first and write to the depth buffer.  Then
437             /// transparent renderers are drawn with depth test enabled but depth
438             /// write switched off.  Transparent renderers are drawn based on their
439             /// distance from the camera.  A renderer's DEPTH_INDEX property is used to
440             /// offset the distance to the camera when ordering transparent renderers.
441             /// This is useful if you want to define the draw order of two or more
442             /// transparent renderers that are equal distance from the camera.  Unlike
443             /// LAYER_UI, parent-child relationship does not affect rendering order at
444             /// all.
445             /// </summary>
446             /// <since_tizen> 3 </since_tizen>
447             Layer3D
448         }
449
450         internal enum TreeDepthMultiplier
451         {
452             TREE_DEPTH_MULTIPLIER = 10000
453         }
454
455         /// <summary>
456         /// Layer behavior, type String (Layer.LayerBehavior).
457         /// </summary>
458         /// <since_tizen> 3 </since_tizen>
459         public Layer.LayerBehavior Behavior
460         {
461             get
462             {
463                 return GetBehavior();
464             }
465             set
466             {
467                 SetBehavior(value);
468             }
469         }
470
471         /// <summary>
472         /// Internal only property to enable or disable clipping, type boolean.
473         /// By default, this is false, i.e., the viewport of the layer is the entire window.
474         /// </summary>
475         internal bool ClippingEnabled
476         {
477             get
478             {
479                 bool ret = NDalicPINVOKE.Layer_IsClipping(swigCPtr);
480                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
481                 return ret;
482             }
483             set
484             {
485                 NDalicPINVOKE.Layer_SetClipping(swigCPtr, value);
486                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
487             }
488         }
489
490         /// <summary>
491         /// Sets the viewport (in window coordinates), type rectangle.
492         /// The contents of the layer will not be visible outside this box, when ViewportEnabled is true.
493         /// </summary>
494         /// <since_tizen> 4 </since_tizen>
495         public Rectangle Viewport
496         {
497             get
498             {
499                 if( ClippingEnabled )
500                 {
501                   Rectangle ret = new Rectangle(NDalicPINVOKE.Layer_GetClippingBox(swigCPtr), true);
502                   if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
503                   return ret;
504                 }
505                 else
506                 {
507                   // Clipping not enabled so return the window size
508                   Size2D windowSize = Window.Instance.Size;
509                   Rectangle ret = new Rectangle(0, 0, windowSize.Width, windowSize.Height);
510                   return ret;
511                 }
512             }
513             set
514             {
515                 NDalicPINVOKE.Layer_SetClippingBox__SWIG_1(swigCPtr, Rectangle.getCPtr(value));
516                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
517                 ClippingEnabled = true;
518             }
519         }
520
521         /// <summary>
522         /// Retrieves and sets the layer's opacity.<br />
523         /// </summary>
524         /// <since_tizen> 3 </since_tizen>
525         public float Opacity
526         {
527             get
528             {
529                 float temp = 0.0f;
530                 GetProperty(View.Property.OPACITY).Get(out temp);
531                 return temp;
532             }
533             set
534             {
535                 SetProperty(View.Property.OPACITY, new Tizen.NUI.PropertyValue(value));
536             }
537         }
538
539         /// <summary>
540         /// Retrieves and sets the layer's visibility.
541         /// </summary>
542         /// <since_tizen> 3 </since_tizen>
543         public bool Visibility
544         {
545             get
546             {
547                 bool temp = false;
548                 GetProperty(View.Property.VISIBLE).Get(out temp);
549                 return temp;
550             }
551             set
552             {
553                 SetProperty(View.Property.VISIBLE, new Tizen.NUI.PropertyValue(value));
554             }
555         }
556
557         /// <summary>
558         /// Get the number of children held by the layer.
559         /// </summary>
560         /// <since_tizen> 3 </since_tizen>
561         public new uint ChildCount
562         {
563             get
564             {
565                 return Convert.ToUInt32(Children.Count);
566             }
567         }
568
569         /// <summary>
570         /// Gets or sets the layer's name.
571         /// </summary>
572         /// <since_tizen> 3 </since_tizen>
573         public string Name
574         {
575             get
576             {
577                 return GetName();
578             }
579             set
580             {
581                 SetName(value);
582             }
583         }
584
585         internal string GetName()
586         {
587             string ret = NDalicPINVOKE.Actor_GetName(swigCPtr);
588             if (NDalicPINVOKE.SWIGPendingException.Pending)
589                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
590             return ret;
591         }
592
593         internal void SetName(string name)
594         {
595             NDalicPINVOKE.Actor_SetName(swigCPtr, name);
596             if (NDalicPINVOKE.SWIGPendingException.Pending)
597                 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
598         }
599
600     }
601 }