2 using System.Runtime.InteropServices;
3 using System.Collections.Generic;
4 using System.Reflection;
9 /// Helper class for calculating what property indexes should be assigned to C# View (view) classes.
11 internal class PropertyRangeManager
13 private Dictionary<String, PropertyRange > _propertyRange;
16 /// Initializes a new instance of the <see cref="Tizen.NUI.PropertyRangeManager"/> class.
18 public PropertyRangeManager ()
20 _propertyRange = new Dictionary<String, PropertyRange > ();
24 /// Only called if a View has scriptable properties
26 private PropertyRange RegisterView( string viewName, System.Type viewType )
30 if ( _propertyRange.TryGetValue (viewName, out range) )
36 // Find out the event and animatable start indexes for the type
37 range = new PropertyRange();
39 GetPropertyStartRange( viewType, ref range);
41 // add it to our dictionary
42 _propertyRange.Add( viewName, range );
49 /// Gets the index of the property.
50 /// Each property has to have unique index for this view type
52 /// <returns>The property index.</returns>
53 /// <param name="viewName">View name</param>
54 /// <param name="viewType">View type</param>
55 /// <param name="type">Type.</param>
56 public int GetPropertyIndex( string viewName, System.Type viewType, ScriptableProperty.ScriptableType type )
61 if (! _propertyRange.TryGetValue (viewName, out range) )
63 // view not found, register it now
64 range = RegisterView( viewName, viewType);
67 int index = range.GetNextFreePropertyIndex ( type );
69 // update the dictionary
70 _propertyRange[viewName]=range;
77 /// We calculate the start property indices, based on the type and it's class heirachy, e.g. DateView (70,000)- > Spin (60,000) -> View (50,000)
79 private void GetPropertyStartRange( System.Type viewType, ref PropertyRange range )
81 const int maxCountPerDerivation = 1000; // For child and animtable properties we use a gap of 1000 between each
82 // views property range in the heirachy
84 // custom views start there property index, at view_PROPERTY_END_INDEX
85 // we add 1000, just incase View class (our C# custom view base) starts using scriptable properties
86 int startEventPropertyIndex = (int)View.PropertyRange.CONTROL_PROPERTY_END_INDEX+maxCountPerDerivation;
88 // for animatable properties current range starts at ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX,
89 // we add 1000, just incase View class starts using animatable properties
90 int startAnimatablePropertyIndex = (int)Tizen.NUI.PropertyRanges.ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX +maxCountPerDerivation;
92 while ( viewType.GetTypeInfo().BaseType.Name != "CustomView" ) // custom view is our C# view base class. we don't go any deeper.
94 // for every base class increase property start index
95 startEventPropertyIndex += (int)Tizen.NUI.PropertyRanges.DEFAULT_PROPERTY_MAX_COUNT_PER_DERIVATION; // DALi uses 10,000
96 startAnimatablePropertyIndex += maxCountPerDerivation;
98 //Console.WriteLine ("getStartPropertyIndex = " + viewType.Name +"current index " + startEventPropertyIndex);
99 viewType = viewType.GetTypeInfo().BaseType;
102 range.startEventIndex = startEventPropertyIndex;
103 range.lastUsedEventIndex = startEventPropertyIndex;
105 range.startAnimationIndex = startAnimatablePropertyIndex;
106 range.lastUsedAnimationIndex = startAnimatablePropertyIndex;
111 public struct PropertyRange
114 public int GetNextFreePropertyIndex( ScriptableProperty.ScriptableType type)
116 if ( type == ScriptableProperty.ScriptableType.Default )
118 lastUsedEventIndex++;
119 return lastUsedEventIndex;
123 lastUsedAnimationIndex++;
124 return lastUsedAnimationIndex ;
129 public int startEventIndex; /// start of the property range
130 public int lastUsedEventIndex; /// last used of the property index
132 public int startAnimationIndex; /// start of the property range
133 public int lastUsedAnimationIndex; /// last used of the property index