4 using System.Reflection;
7 using System.Runtime.InteropServices;
8 using System.Collections.Generic;
13 /// Helper class for calculating what property indexes should be assigned to C# View (view) classes.
15 internal class PropertyRangeManager
17 private Dictionary<String, PropertyRange > _propertyRange;
20 /// Initializes a new instance of the <see cref="Tizen.NUI.PropertyRangeManager"/> class.
22 public PropertyRangeManager()
24 _propertyRange = new Dictionary<String, PropertyRange>();
28 /// Only called if a View has scriptable properties
30 private PropertyRange RegisterView(string viewName, System.Type viewType)
34 if (_propertyRange.TryGetValue(viewName, out range))
40 // Find out the event and animatable start indexes for the type
41 range = new PropertyRange();
43 GetPropertyStartRange(viewType, ref range);
45 // add it to our dictionary
46 _propertyRange.Add(viewName, range);
53 /// Gets the index of the property.
54 /// Each property has to have unique index for this view type
56 /// <returns>The property index.</returns>
57 /// <param name="viewName">View name</param>
58 /// <param name="viewType">View type</param>
59 /// <param name="type">Type.</param>
60 public int GetPropertyIndex(string viewName, System.Type viewType, ScriptableProperty.ScriptableType type)
65 if (!_propertyRange.TryGetValue(viewName, out range))
67 // view not found, register it now
68 range = RegisterView(viewName, viewType);
71 int index = range.GetNextFreePropertyIndex(type);
73 // update the dictionary
74 _propertyRange[viewName] = range;
81 /// 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)
83 private void GetPropertyStartRange(System.Type viewType, ref PropertyRange range)
85 const int maxCountPerDerivation = 1000; // For child and animtable properties we use a gap of 1000 between each
86 // views property range in the heirachy
88 // custom views start there property index, at view_PROPERTY_END_INDEX
89 // we add 1000, just incase View class (our C# custom view base) starts using scriptable properties
90 int startEventPropertyIndex = (int)View.PropertyRange.CONTROL_PROPERTY_END_INDEX + maxCountPerDerivation;
92 // for animatable properties current range starts at ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX,
93 // we add 1000, just incase View class starts using animatable properties
94 int startAnimatablePropertyIndex = (int)Tizen.NUI.PropertyRanges.ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX + maxCountPerDerivation;
97 while ( viewType.GetTypeInfo().BaseType.Name != "CustomView" ) // custom view is our C# view base class. we don't go any deeper.
99 while (viewType.BaseType.Name != "CustomView") // custom view is our C# view base class. we don't go any deeper.
102 // for every base class increase property start index
103 startEventPropertyIndex += (int)Tizen.NUI.PropertyRanges.DEFAULT_PROPERTY_MAX_COUNT_PER_DERIVATION; // DALi uses 10,000
104 startAnimatablePropertyIndex += maxCountPerDerivation;
106 //Tizen.Log.Debug("NUI", "getStartPropertyIndex = " + viewType.Name +"current index " + startEventPropertyIndex);
108 viewType = viewType.GetTypeInfo().BaseType;
110 viewType = viewType.BaseType;
114 range.startEventIndex = startEventPropertyIndex;
115 range.lastUsedEventIndex = startEventPropertyIndex;
117 range.startAnimationIndex = startAnimatablePropertyIndex;
118 range.lastUsedAnimationIndex = startAnimatablePropertyIndex;
123 public struct PropertyRange
126 public int GetNextFreePropertyIndex(ScriptableProperty.ScriptableType type)
128 if (type == ScriptableProperty.ScriptableType.Default)
130 lastUsedEventIndex++;
131 return lastUsedEventIndex;
135 lastUsedAnimationIndex++;
136 return lastUsedAnimationIndex;
141 public int startEventIndex; /// start of the property range
142 public int lastUsedEventIndex; /// last used of the property index
144 public int startAnimationIndex; /// start of the property range
145 public int lastUsedAnimationIndex; /// last used of the property index