#define DOT_NET_CORE
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
#if (DOT_NET_CORE)
using System.Reflection;
#endif
namespace Tizen.NUI
{
///
/// Helper class for calculating what property indexes should be assigned to C# View (view) classes.
///
internal class PropertyRangeManager
{
private Dictionary _propertyRange;
///
/// Initializes a new instance of the class.
///
public PropertyRangeManager()
{
_propertyRange = new Dictionary();
}
///
/// Only called if a View has scriptable properties
///
private PropertyRange RegisterView(string viewName, System.Type viewType)
{
PropertyRange range;
if (_propertyRange.TryGetValue(viewName, out range))
{
// already registered
return range;
}
// Find out the event and animatable start indexes for the type
range = new PropertyRange();
GetPropertyStartRange(viewType, ref range);
// add it to our dictionary
_propertyRange.Add(viewName, range);
return range;
}
///
/// Gets the index of the property.
/// Each property has to have unique index for this view type
///
/// The property index.
/// View name
/// View type
/// Type.
public int GetPropertyIndex(string viewName, System.Type viewType, ScriptableProperty.ScriptableType type)
{
PropertyRange range;
if (!_propertyRange.TryGetValue(viewName, out range))
{
// view not found, register it now
range = RegisterView(viewName, viewType);
}
int index = range.GetNextFreePropertyIndex(type);
// update the dictionary
_propertyRange[viewName] = range;
return index;
}
///
/// 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)
///
private void GetPropertyStartRange(System.Type viewType, ref PropertyRange range)
{
const int maxCountPerDerivation = 1000; // For child and animtable properties we use a gap of 1000 between each
// views property range in the heirachy
// custom views start there property index, at view_PROPERTY_END_INDEX
// we add 1000, just incase View class (our C# custom view base) starts using scriptable properties
int startEventPropertyIndex = (int)View.PropertyRange.CONTROL_PROPERTY_END_INDEX + maxCountPerDerivation;
// for animatable properties current range starts at ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX,
// we add 1000, just incase View class starts using animatable properties
int startAnimatablePropertyIndex = (int)Tizen.NUI.PropertyRanges.ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX + maxCountPerDerivation;
#if (DOT_NET_CORE)
while ( viewType.GetTypeInfo().BaseType.Name != "CustomView" ) // custom view is our C# view base class. we don't go any deeper.
#else
while (viewType.BaseType.Name != "CustomView") // custom view is our C# view base class. we don't go any deeper.
#endif
{
// for every base class increase property start index
startEventPropertyIndex += (int)Tizen.NUI.PropertyRanges.DEFAULT_PROPERTY_MAX_COUNT_PER_DERIVATION; // DALi uses 10,000
startAnimatablePropertyIndex += maxCountPerDerivation;
//Console.WriteLine ("getStartPropertyIndex = " + viewType.Name +"current index " + startEventPropertyIndex);
#if (DOT_NET_CORE)
viewType = viewType.GetTypeInfo().BaseType;
#else
viewType = viewType.BaseType;
#endif
}
range.startEventIndex = startEventPropertyIndex;
range.lastUsedEventIndex = startEventPropertyIndex;
range.startAnimationIndex = startAnimatablePropertyIndex;
range.lastUsedAnimationIndex = startAnimatablePropertyIndex;
}
public struct PropertyRange
{
public int GetNextFreePropertyIndex(ScriptableProperty.ScriptableType type)
{
if (type == ScriptableProperty.ScriptableType.Default)
{
lastUsedEventIndex++;
return lastUsedEventIndex;
}
else
{
lastUsedAnimationIndex++;
return lastUsedAnimationIndex;
}
}
public int startEventIndex; /// start of the property range
public int lastUsedEventIndex; /// last used of the property index
public int startAnimationIndex; /// start of the property range
public int lastUsedAnimationIndex; /// last used of the property index
};
}
}