//////////////////////////////////////////////////////////////////////////////////////////////////// // NoesisGUI - http://www.noesisengine.com // Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved. //////////////////////////////////////////////////////////////////////////////////////////////////// namespace Noesis { //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata) { RegisterProperty(dp, name, metadata, nullptr, PropertyAccess_ReadWrite); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata, ValidateValueCallback validate) { RegisterProperty(dp, name, metadata, validate, PropertyAccess_ReadWrite); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata) { RegisterProperty(dp, name, metadata, nullptr, PropertyAccess_ReadOnly); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata, GetReadOnlyValueCallback getReadOnlyValue) { RegisterProperty(dp, name, metadata, nullptr, PropertyAccess_ReadOnly); ((DependencyProperty*)dp)->SetGetReadOnlyValueCallback(getReadOnlyValue); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterPropertyRO(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata, ValidateValueCallback validate) { RegisterProperty(dp, name, metadata, validate, PropertyAccess_ReadOnly); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::AddOwner(const DependencyProperty*& dp, const char* name, const DependencyProperty*& source, PropertyMetadata* metadata) { static_assert(!IsInterface>::Result, "Interface not supported in DPs"); const Type* type = TypeOf>(); NS_ASSERT(!StrIsNullOrEmpty(name)); NS_ASSERT(dp == 0 || dp->GetName() == Symbol(name)); NS_ASSERT(dp == 0 || type == dp->GetType()); if (source != 0) { NS_ASSERT(source->GetName() == Symbol(name)); NS_ASSERT(type == source->GetType()); dp = InsertProperty(source); } else { // Ensure insertion because the property could had been created in a previous call to // OverrideMetadata but not registered in the owner DependencyData if (dp != 0) { InsertProperty(dp); } else { Ptr prop = CreateProperty(name, Int2Type::Result>()); dp = InsertProperty(prop); } source = dp; } if (dp != 0 && metadata != 0) { NS_ASSERT(!metadata->HasDefaultValue() || metadata->GetValueManager()->CheckType(type)); const_cast(dp)->AddMetadata(mOwnerType, metadata); } } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::OverrideMetadata(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata) { static_assert(!IsInterface>::Result, "Interface not supported in DPs"); const Type* type = TypeOf>(); NS_CHECK(metadata != nullptr, "Can't override dependency property '%s.%s', metadata is null", mOwnerType->GetName(), name); if (dp != 0) { NS_ASSERT(!StrIsNullOrEmpty(name)); NS_ASSERT(dp->GetName() == Symbol(name)); NS_ASSERT(type == dp->GetType()); } else { Ptr prop = CreateProperty(name, Int2Type::Result>()); dp = InsertProperty(prop.GetPtr()); } if (dp != 0) { NS_ASSERT(!metadata->HasDefaultValue() || metadata->GetValueManager()->CheckType(type)); const_cast(dp)->AddMetadata(mOwnerType, metadata); } } //////////////////////////////////////////////////////////////////////////////////////////////////// template void DependencyData::RegisterProperty(const DependencyProperty*& dp, const char* name, PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access) { static_assert(!IsInterface>::Result, "Interface not supported in DPs"); const Type* type = TypeOf>(); CheckMetadata(name, metadata, type); if (dp != 0) { NS_ASSERT(type == dp->GetType()); RegisterExistingProperty(dp, name, metadata, validate, access); } else { Ptr prop = CreateProperty(name, metadata, validate, access, Int2Type::Result>()); dp = InsertProperty(prop); } } //////////////////////////////////////////////////////////////////////////////////////////////////// template Ptr DependencyData::CreateProperty(const char* name, PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access, IsNotBaseComponent) { return DependencyProperty::Create(name, mOwnerType, metadata, validate, access); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Ptr DependencyData::CreateProperty(const char* name, PropertyMetadata* metadata, ValidateValueCallback validate, PropertyAccess access, IsBaseComponent) { return DependencyProperty::Create>(name, TypeOf(), mOwnerType, metadata, validate, access); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Ptr DependencyData::CreateProperty(const char* name, IsNotBaseComponent) { return DependencyProperty::Create(name); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Ptr DependencyData::CreateProperty(const char* name, IsBaseComponent) { return DependencyProperty::Create>(name, TypeOf()); } }