diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index 022ba6d2..cdb26612 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -430,8 +430,8 @@ GuiApplicationMain GuiApplication app; application=&app; - GetPluginManager()->Load(); GetGlobalTypeManager()->Load(); + GetPluginManager()->Load(); theme::SetCurrentTheme(theme.Obj()); GuiMain(); theme::SetCurrentTheme(0); @@ -1000,6 +1000,11 @@ GuiInstanceRootObject } } + bool GuiInstanceRootObject::AddControlHostComponent(GuiControlHost* controlHost) + { + return AddComponent(new GuiObjectComponent(controlHost)); + } + bool GuiInstanceRootObject::RemoveComponent(GuiComponent* component) { vint index = components.IndexOf(component); @@ -5707,6 +5712,11 @@ GuiComboBoxBase::CommandExecutor GuiComboBoxBase ***********************************************************************/ + bool GuiComboBoxBase::IsAltAvailable() + { + return false; + } + IGuiMenuService::Direction GuiComboBoxBase::GetSubMenuDirection() { return IGuiMenuService::Horizontal; @@ -31990,6 +32000,15 @@ GuiToolstripButton return dynamic_cast(GetSubMenu()); } + GuiToolstripMenu* GuiToolstripButton::EnsureToolstripSubMenu() + { + if (!GetSubMenu()) + { + CreateToolstripSubMenu(); + } + return dynamic_cast(GetSubMenu()); + } + void GuiToolstripButton::CreateToolstripSubMenu(GuiToolstripMenu::IStyleController* subMenuStyleController) { if(!subMenu) @@ -34085,9 +34104,12 @@ GuiStackComposition { GuiBoundsComposition::OnChildInserted(child); GuiStackItemComposition* item = dynamic_cast(child); - if (item && !stackItems.Contains(item)) + if (item) { - stackItems.Add(item); + if (!stackItems.Contains(item)) + { + stackItems.Add(item); + } UpdateStackItemBounds(); } } @@ -37214,9 +37236,10 @@ GuiGraphicsHost vint count = actions.Count(); for (vint i = 0; i < count; i++) { + WString key = actions.Keys()[i]; const auto& values = actions.GetByIndex(i); vint numberLength = 0; - if (values.Count() == 1) + if (values.Count() == 1 && key.Length() > 0) { numberLength = 0; } @@ -42768,10 +42791,6 @@ GlobalStringKey GlobalStringKey GlobalStringKey::_Format; GlobalStringKey GlobalStringKey::_Eval; GlobalStringKey GlobalStringKey::_Uri; - GlobalStringKey GlobalStringKey::_Workflow_Assembly_Cache; - GlobalStringKey GlobalStringKey::_Workflow_Global_Context; - GlobalStringKey GlobalStringKey::_Shared_Workflow_Assembly_Cache; - GlobalStringKey GlobalStringKey::_Shared_Workflow_Global_Context; GlobalStringKey GlobalStringKey::_ControlTemplate; GlobalStringKey GlobalStringKey::_ItemTemplate; @@ -42789,10 +42808,6 @@ GlobalStringKey GlobalStringKey::_Format = GlobalStringKey::Get(L"format"); GlobalStringKey::_Eval = GlobalStringKey::Get(L"eval"); GlobalStringKey::_Uri = GlobalStringKey::Get(L"uri"); - GlobalStringKey::_Workflow_Assembly_Cache = GlobalStringKey::Get(L"WORKFLOW-ASSEMBLY-CACHE"); - GlobalStringKey::_Workflow_Global_Context = GlobalStringKey::Get(L"WORKFLOW-GLOBAL-CONTEXT"); - GlobalStringKey::_Shared_Workflow_Assembly_Cache = GlobalStringKey::Get(L"SHARED-WORKFLOW-ASSEMBLY-CACHE"); - GlobalStringKey::_Shared_Workflow_Global_Context = GlobalStringKey::Get(L"SHARED-WORKFLOW-GLOBAL-CONTEXT"); GlobalStringKey::_ControlTemplate = GlobalStringKey::Get(L"ControlTemplate"); GlobalStringKey::_ItemTemplate = GlobalStringKey::Get(L"ItemTemplate"); } @@ -42900,14 +42915,26 @@ GuiResourceNodeBase return name; } - const WString& GuiResourceNodeBase::GetPath() + WString GuiResourceNodeBase::GetResourcePath() { - return path; + auto resourcePath = name; + auto current = parent; + while (current && current->GetParent()) + { + resourcePath = parent->GetName() + L"/" + resourcePath; + current = current->GetParent(); + } + return resourcePath; } - void GuiResourceNodeBase::SetPath(const WString& value) + const WString& GuiResourceNodeBase::GetFileContentPath() { - path = value; + return fileContentPath; + } + + void GuiResourceNodeBase::SetFileContentPath(const WString& value) + { + fileContentPath = value; } GuiResourceFolder* GuiResourceNodeBase::GetParent() @@ -42999,8 +43026,8 @@ GuiResourceFolder { if(contentAtt->value.value==L"Link") { - folder->SetPath(XmlGetValue(element)); - WString filePath = containingFolder + folder->GetPath(); + folder->SetFileContentPath(XmlGetValue(element)); + WString filePath = containingFolder + folder->GetFileContentPath(); WString text; if(LoadTextFile(filePath, text)) { @@ -43083,7 +43110,7 @@ GuiResourceFolder } else { - item->SetPath(relativeFilePath); + item->SetFileContentPath(relativeFilePath); resource = directLoad->ResolveResource(filePath, errors); } @@ -43132,59 +43159,62 @@ GuiResourceFolder } } - void GuiResourceFolder::SaveResourceFolderToXml(Ptr xmlParent, bool serializePrecompiledResource) + void GuiResourceFolder::SaveResourceFolderToXml(Ptr xmlParent) { FOREACH(Ptr, item, items.Values()) { - auto attName = MakePtr(); - attName->name.value = L"name"; - attName->value.value = item->GetName(); - - if (serializePrecompiledResource || item->GetPath() == L"") + auto resolver = GetResourceResolverManager()->GetTypeResolver(item->GetTypeName()); + if (resolver->XmlSerializable()) { - auto resolver = GetResourceResolverManager()->GetTypeResolver(item->GetTypeName()); - Ptr xmlElement; + auto attName = MakePtr(); + attName->name.value = L"name"; + attName->value.value = item->GetName(); - if (auto directLoad = resolver->DirectLoadXml()) + if (item->GetFileContentPath() == L"") { - xmlElement = directLoad->Serialize(item->GetContent(), serializePrecompiledResource); - } - else if (auto indirectLoad = resolver->IndirectLoad()) - { - if (auto preloadResolver = GetResourceResolverManager()->GetTypeResolver(indirectLoad->GetPreloadType())) + Ptr xmlElement; + + if (auto directLoad = resolver->DirectLoadXml()) { - if (auto directLoad = preloadResolver->DirectLoadXml()) + xmlElement = directLoad->Serialize(item->GetContent()); + } + else if (auto indirectLoad = resolver->IndirectLoad()) + { + if (auto preloadResolver = GetResourceResolverManager()->GetTypeResolver(indirectLoad->GetPreloadType())) { - if (auto resource = indirectLoad->Serialize(item->GetContent(), serializePrecompiledResource)) + if (auto directLoad = preloadResolver->DirectLoadXml()) { - xmlElement = directLoad->Serialize(resource, serializePrecompiledResource); - xmlElement->name.value = resolver->GetType(); + if (auto resource = indirectLoad->Serialize(item->GetContent())) + { + xmlElement = directLoad->Serialize(resource); + xmlElement->name.value = resolver->GetType(); + } } } } - } - if (xmlElement) + if (xmlElement) + { + xmlElement->attributes.Add(attName); + xmlParent->subNodes.Add(xmlElement); + } + } + else { - xmlElement->attributes.Add(attName); + auto xmlElement = MakePtr(); + xmlElement->name.value = item->GetTypeName(); xmlParent->subNodes.Add(xmlElement); + + auto attContent = MakePtr(); + attContent->name.value = L"content"; + attContent->value.value = L"File"; + xmlElement->attributes.Add(attContent); + + auto xmlText = MakePtr(); + xmlText->content.value = item->GetFileContentPath(); + xmlElement->subNodes.Add(xmlText); } } - else - { - auto xmlElement = MakePtr(); - xmlElement->name.value = item->GetTypeName(); - xmlParent->subNodes.Add(xmlElement); - - auto attContent = MakePtr(); - attContent->name.value = L"content"; - attContent->value.value = L"File"; - xmlElement->attributes.Add(attContent); - - auto xmlText = MakePtr(); - xmlText->content.value = item->GetPath(); - xmlElement->subNodes.Add(xmlText); - } } FOREACH(Ptr, folder, folders.Values()) @@ -43199,9 +43229,9 @@ GuiResourceFolder xmlParent->subNodes.Add(xmlFolder); - if (serializePrecompiledResource || folder->GetPath() == L"") + if (folder->GetFileContentPath() == L"") { - folder->SaveResourceFolderToXml(xmlFolder, serializePrecompiledResource); + folder->SaveResourceFolderToXml(xmlFolder); } else { @@ -43211,7 +43241,7 @@ GuiResourceFolder xmlFolder->attributes.Add(attContent); auto xmlText = MakePtr(); - xmlText->content.value = folder->GetPath(); + xmlText->content.value = folder->GetFileContentPath(); xmlFolder->subNodes.Add(xmlText); } } @@ -43338,23 +43368,26 @@ GuiResourceFolder FOREACH(Ptr, item, items.Values()) { - vint typeName = typeNames.IndexOf(item->GetTypeName()); - WString name = item->GetName(); - auto resolver = GetResourceResolverManager()->GetTypeResolver(item->GetTypeName()); - if (auto directLoad = resolver->DirectLoadStream()) + if (resolver->StreamSerializable()) { - itemTuples.Add(ItemTuple(typeName, name, directLoad, item->GetContent())); - } - else if (auto indirectLoad = resolver->IndirectLoad()) - { - if (auto preloadResolver = GetResourceResolverManager()->GetTypeResolver(indirectLoad->GetPreloadType())) + vint typeName = typeNames.IndexOf(item->GetTypeName()); + WString name = item->GetName(); + + if (auto directLoad = resolver->DirectLoadStream()) { - if (auto directLoad = preloadResolver->DirectLoadStream()) + itemTuples.Add(ItemTuple(typeName, name, directLoad, item->GetContent())); + } + else if (auto indirectLoad = resolver->IndirectLoad()) + { + if (auto preloadResolver = GetResourceResolverManager()->GetTypeResolver(indirectLoad->GetPreloadType())) { - if (auto resource = indirectLoad->Serialize(item->GetContent(), true)) + if (auto directLoad = preloadResolver->DirectLoadStream()) { - itemTuples.Add(ItemTuple(typeName, name, directLoad, resource)); + if (auto resource = indirectLoad->Serialize(item->GetContent())) + { + itemTuples.Add(ItemTuple(typeName, name, directLoad, resource)); + } } } } @@ -43384,20 +43417,37 @@ GuiResourceFolder } } - void GuiResourceFolder::PrecompileResourceFolder(Ptr resolver, GuiResource* rootResource, vint passIndex, collections::List& errors) + void GuiResourceFolder::PrecompileResourceFolder(GuiResourcePrecompileContext& context, collections::List& errors) { FOREACH(Ptr, item, items.Values()) { auto typeResolver = GetResourceResolverManager()->GetTypeResolver(item->GetTypeName()); if (auto precompile = typeResolver->Precompile()) { - precompile->Precompile(item->GetContent(), rootResource, passIndex, resolver, errors); + precompile->Precompile(item, context, errors); } } FOREACH(Ptr, folder, folders.Values()) { - folder->PrecompileResourceFolder(resolver, rootResource, passIndex, errors); + folder->PrecompileResourceFolder(context, errors); + } + } + + void GuiResourceFolder::InitializeResourceFolder(GuiResourcePrecompileContext& context) + { + FOREACH(Ptr, item, items.Values()) + { + auto typeResolver = GetResourceResolverManager()->GetTypeResolver(item->GetTypeName()); + if (auto initialize = typeResolver->Initialize()) + { + initialize->Initialize(item, context); + } + } + + FOREACH(Ptr, folder, folders.Values()) + { + folder->InitializeResourceFolder(context); } } @@ -43526,130 +43576,34 @@ GuiResourceFolder return 0; } -/*********************************************************************** -GuiResource -***********************************************************************/ - - void IGuiResourceCache::LoadFromXml(Ptr xml, collections::Dictionary>& caches) + bool GuiResourceFolder::CreateValueByPath(const WString& path, const WString& typeName, Ptr value) { - FOREACH(Ptr, element, XmlGetElements(xml, L"Cache")) + const wchar_t* buffer = path.Buffer(); + const wchar_t* index = wcschr(buffer, L'\\'); + if (!index) index = wcschr(buffer, '/'); + + if(index) { - auto attName = XmlGetAttribute(element, L"Name"); - auto attType = XmlGetAttribute(element, L"Type"); - if (attName && attType) + WString name = path.Sub(0, index - buffer); + Ptr folder = GetFolder(name); + if (!folder) { - auto resolver = GetResourceResolverManager()->GetCacheResolver(GlobalStringKey::Get(attType->value.value)); - - MemoryStream stream; - HexToBinary(stream, XmlGetValue(element)); - stream.SeekFromBegin(0); - - auto cache = resolver->Deserialize(stream); - caches.Add(GlobalStringKey::Get(attName->value.value), cache); + folder = new GuiResourceFolder; + AddFolder(name, folder); } + vint start = index - buffer + 1; + return folder->CreateValueByPath(path.Sub(start, path.Length() - start), typeName, value); } - } - - void IGuiResourceCache::SaveToXml(Ptr xml, collections::Dictionary>& caches) - { - for (vint i = 0; i < caches.Count(); i++) + else { - auto key = caches.Keys()[i]; - auto value = caches.Values()[i]; - auto resolver = GetResourceResolverManager()->GetCacheResolver(value->GetCacheTypeName()); - - MemoryStream stream; - resolver->Serialize(value, stream); - stream.SeekFromBegin(0); - auto hex = BinaryToHex(stream); - - auto xmlCache = MakePtr(); - xmlCache->name.value = L"Cache"; - xml->subNodes.Add(xmlCache); - - auto attName = MakePtr(); - attName->name.value = L"Name"; - attName->value.value = key.ToString(); - xmlCache->attributes.Add(attName); - - auto attType = MakePtr(); - attType->name.value = L"Type"; - attType->value.value = value->GetCacheTypeName().ToString(); - xmlCache->attributes.Add(attType); - - auto xmlContent = MakePtr(); - xmlContent->content.value = hex; - xmlCache->subNodes.Add(xmlContent); - } - } - - void IGuiResourceCache::LoadFromBinary(stream::internal::Reader& reader, collections::Dictionary>& caches, collections::List& sortedKeys) - { - vint count = 0; - reader << count; - - for (vint i = 0; i < count; i++) - { - GlobalStringKey key, name; - if (&sortedKeys) + if(GetItem(path)) { - vint keyIndex = -1; - vint nameIndex = -1; - reader << keyIndex << nameIndex; - auto key = sortedKeys[keyIndex]; - auto name = sortedKeys[nameIndex]; - } - else - { - WString keyString, nameString; - reader << keyString << nameString; - key = GlobalStringKey::Get(keyString); - name = GlobalStringKey::Get(nameString); + return false; } - stream::MemoryStream stream; - reader << (stream::IStream&)stream; - - if (auto resolver = GetResourceResolverManager()->GetCacheResolver(name)) - { - if (auto cache = resolver->Deserialize(stream)) - { - caches.Add(key, cache); - } - } - } - } - - void IGuiResourceCache::SaveToBinary(stream::internal::Writer& writer, collections::Dictionary>& caches, collections::SortedList& sortedKeys) - { - vint count = caches.Count(); - writer << count; - for (vint i = 0; i < count; i++) - { - auto cache = caches.Values()[i]; - auto key = caches.Keys()[i]; - auto name = cache->GetCacheTypeName(); - if (&sortedKeys) - { - auto keyIndex = sortedKeys.IndexOf(key); - vint nameIndex = sortedKeys.IndexOf(name); - CHECK_ERROR(keyIndex != -1 && nameIndex != -1, L"IGuiResourceCache::SaveToBinary(stream::internal::Writer&, collections::Dictionary>&)#Internal Error."); - writer << keyIndex << nameIndex; - } - else - { - WString keyString = key.ToString(); - WString nameString = name.ToString(); - writer << keyString << nameString; - } - - stream::MemoryStream stream; - - if (auto resolver = GetResourceResolverManager()->GetCacheResolver(name)) - { - resolver->Serialize(cache, stream); - } - writer << (stream::IStream&)stream; + auto item = new GuiResourceItem; + item->SetContent(typeName, value); + return AddItem(path, item); } } @@ -43701,10 +43655,6 @@ GuiResource Ptr resource = new GuiResource; resource->workingDirectory = workingDirectory; DelayLoadingList delayLoadings; - if (auto xmlCaches = XmlGetElement(xml->rootElement, L"ref.Caches")) - { - IGuiResourceCache::LoadFromXml(xmlCaches, resource->precompiledCaches); - } resource->LoadResourceFolderFromXml(delayLoadings, resource->workingDirectory, xml->rootElement, errors); ProcessDelayLoading(resource, delayLoadings, errors); @@ -43733,18 +43683,11 @@ GuiResource return 0; } - Ptr GuiResource::SaveToXml(bool serializePrecompiledResource) + Ptr GuiResource::SaveToXml() { auto xmlRoot = MakePtr(); xmlRoot->name.value = L"Resource"; - if (serializePrecompiledResource && precompiledCaches.Count() > 0) - { - auto xmlCaches = MakePtr(); - xmlCaches->name.value = L"ref.Caches"; - xmlRoot->subNodes.Add(xmlCaches); - IGuiResourceCache::SaveToXml(xmlCaches, precompiledCaches); - } - SaveResourceFolderToXml(xmlRoot, serializePrecompiledResource); + SaveResourceFolderToXml(xmlRoot); auto doc = MakePtr(); doc->rootElement = xmlRoot; @@ -43758,7 +43701,6 @@ GuiResource List typeNames; reader << typeNames; - IGuiResourceCache::LoadFromBinary(reader, resource->precompiledCaches); DelayLoadingList delayLoadings; resource->LoadResourceFolderFromBinary(delayLoadings, reader, typeNames, errors); @@ -43774,17 +43716,53 @@ GuiResource List typeNames; CollectTypeNames(typeNames); writer << typeNames; - IGuiResourceCache::SaveToBinary(writer, precompiledCaches); SaveResourceFolderToBinary(writer, typeNames); } void GuiResource::Precompile(collections::List& errors) { + if (GetFolder(L"Precompiled")) + { + errors.Add(L"A precompiled resource cannot be compiled again."); + return; + } + + GuiResourcePrecompileContext context; + context.rootResource = this; + context.resolver = new GuiResourcePathResolver(this, workingDirectory); + context.targetFolder = new GuiResourceFolder; + vint maxPass = GetResourceResolverManager()->GetMaxPrecompilePassIndex(); - Ptr resolver = new GuiResourcePathResolver(this, workingDirectory); for (vint i = 0; i <= maxPass; i++) { - PrecompileResourceFolder(resolver, this, i, errors); + context.passIndex = i; + PrecompileResourceFolder(context, errors); + } + if (errors.Count() == 0) + { + AddFolder(L"Precompiled", context.targetFolder); + } + } + + void GuiResource::Initialize() + { + auto precompiledFolder = GetFolder(L"Precompiled"); + if (!precompiledFolder) + { + CHECK_FAIL(L"GuiResource::Initialize()#Cannot initialize a non-precompiled resource."); + return; + } + + GuiResourcePrecompileContext context; + context.rootResource = this; + context.resolver = new GuiResourcePathResolver(this, workingDirectory); + context.targetFolder = precompiledFolder; + + vint maxPass = GetResourceResolverManager()->GetMaxInitializePassIndex(); + for (vint i = 0; i <= maxPass; i++) + { + context.passIndex = i; + InitializeResourceFolder(context); } } @@ -43962,11 +43940,9 @@ IGuiResourceResolverManager { typedef Dictionary> PathFactoryMap; typedef Dictionary> TypeResolverMap; - typedef Dictionary> CacheResolverMap; protected: PathFactoryMap pathFactories; TypeResolverMap typeResolvers; - CacheResolverMap cacheResolvers; public: GuiResourceResolverManager() @@ -44041,17 +44017,21 @@ IGuiResourceResolverManager return maxPass; } - IGuiResourceCacheResolver* GetCacheResolver(GlobalStringKey cacheTypeName)override + vint GetMaxInitializePassIndex() { - vint index = cacheResolvers.Keys().IndexOf(cacheTypeName); - return index == -1 ? 0 : cacheResolvers.Values()[index].Obj(); - } - - bool SetCacheResolver(Ptr cacheResolver)override - { - if (cacheResolvers.Keys().Contains(cacheResolver->GetCacheTypeName())) return false; - cacheResolvers.Add(cacheResolver->GetCacheTypeName(), cacheResolver); - return true; + vint maxPass = -1; + FOREACH(Ptr, resolver, typeResolvers.Values()) + { + if (auto initialize = resolver->Initialize()) + { + vint pass = initialize->GetMaxPassIndex(); + if (maxPass < pass) + { + maxPass = pass; + } + } + } + return maxPass; } }; GUI_REGISTER_PLUGIN(GuiResourceResolverManager) @@ -44074,7 +44054,7 @@ namespace vl using namespace stream; /*********************************************************************** -Image Type Resolver +Image Type Resolver (Image) ***********************************************************************/ class GuiResourceImageTypeResolver @@ -44089,6 +44069,16 @@ Image Type Resolver return L"Image"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return true; + } + IGuiResourceTypeResolver_DirectLoadXml* DirectLoadXml()override { return this; @@ -44099,7 +44089,7 @@ Image Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { if (auto obj = resource.Cast()) { @@ -44177,7 +44167,7 @@ Image Type Resolver }; /*********************************************************************** -Text Type Resolver +Text Type Resolver (Text) ***********************************************************************/ class GuiResourceTextTypeResolver @@ -44192,6 +44182,16 @@ Text Type Resolver return L"Text"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return true; + } + IGuiResourceTypeResolver_DirectLoadXml* DirectLoadXml()override { return this; @@ -44202,7 +44202,7 @@ Text Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { if (auto obj = resource.Cast()) { @@ -44255,7 +44255,7 @@ Text Type Resolver }; /*********************************************************************** -Xml Type Resolver +Xml Type Resolver (Xml) ***********************************************************************/ class GuiResourceXmlTypeResolver @@ -44270,6 +44270,16 @@ Xml Type Resolver return L"Xml"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return true; + } + IGuiResourceTypeResolver_DirectLoadXml* DirectLoadXml()override { return this; @@ -44280,7 +44290,7 @@ Xml Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { if (auto obj = resource.Cast()) { @@ -44351,7 +44361,7 @@ Xml Type Resolver }; /*********************************************************************** -Doc Type Resolver +Doc Type Resolver (Doc) ***********************************************************************/ class GuiResourceDocTypeResolver @@ -44365,6 +44375,16 @@ Doc Type Resolver return L"Doc"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return true; + } + WString GetPreloadType()override { return L"Xml"; @@ -44380,7 +44400,7 @@ Doc Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { if (auto obj = resource.Cast()) { diff --git a/Import/GacUI.h b/Import/GacUI.h index 70e1e5c6..f661e8fb 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -3249,10 +3249,6 @@ Global String Key static GlobalStringKey _Format; static GlobalStringKey _Eval; static GlobalStringKey _Uri; - static GlobalStringKey _Workflow_Assembly_Cache; - static GlobalStringKey _Workflow_Global_Context; - static GlobalStringKey _Shared_Workflow_Assembly_Cache; - static GlobalStringKey _Shared_Workflow_Global_Context; static GlobalStringKey _ControlTemplate; static GlobalStringKey _ItemTemplate; @@ -3341,7 +3337,7 @@ Resource Structure protected: GuiResourceFolder* parent; WString name; - WString path; + WString fileContentPath; public: GuiResourceNodeBase(); @@ -3353,16 +3349,20 @@ Resource Structure /// Get the name of this resource node. /// The name of this resource node . const WString& GetName(); - /// Get the path of this resource node. When saving the resource, if the path is not empty, the path will be serialized instead of the content. - /// The path of this resource node . - const WString& GetPath(); - /// Set the path of this resource node. - /// The path of this resource node . - void SetPath(const WString& value); + /// Get the resource path of this resource node. When saving the resource, if the path is not empty, the path will be serialized instead of the content. + /// The resource path of this resource node . + WString GetResourcePath(); + /// Get the file content path of this resource node. When saving the resource, if the path is not empty, the path will be serialized instead of the content. + /// The file content path of this resource node . + const WString& GetFileContentPath(); + /// Set the file content path of this resource node. + /// The file content path of this resource node . + void SetFileContentPath(const WString& value); }; class DocumentModel; class GuiResourcePathResolver; + struct GuiResourcePrecompileContext; /// Resource item. class GuiResourceItem : public GuiResourceNodeBase, public Description @@ -3425,11 +3425,12 @@ Resource Structure FolderMap folders; void LoadResourceFolderFromXml(DelayLoadingList& delayLoadings, const WString& containingFolder, Ptr folderXml, collections::List& errors); - void SaveResourceFolderToXml(Ptr xmlParent, bool serializePrecompiledResource); + void SaveResourceFolderToXml(Ptr xmlParent); void CollectTypeNames(collections::List& typeNames); void LoadResourceFolderFromBinary(DelayLoadingList& delayLoadings, stream::internal::Reader& reader, collections::List& typeNames, collections::List& errors); void SaveResourceFolderToBinary(stream::internal::Writer& writer, collections::List& typeNames); - void PrecompileResourceFolder(Ptr resolver, GuiResource* rootResource, vint passIndex, collections::List& errors); + void PrecompileResourceFolder(GuiResourcePrecompileContext& context, collections::List& errors); + void InitializeResourceFolder(GuiResourcePrecompileContext& context); public: /// Create a resource folder. GuiResourceFolder(); @@ -3481,29 +3482,12 @@ Resource Structure /// The resource folder. /// The path. Ptr GetFolderByPath(const WString& path); - }; - -/*********************************************************************** -Resource Cache -***********************************************************************/ - - class IGuiResourceCache : public IDescriptable, public Description - { - public: - virtual GlobalStringKey GetCacheTypeName() = 0; - - static void LoadFromXml(Ptr xml, collections::Dictionary>& caches); - static void SaveToXml(Ptr xml, collections::Dictionary>& caches); - static void LoadFromBinary(stream::internal::Reader& reader, collections::Dictionary>& caches, collections::List& sortedKeys = *(collections::List*)nullptr); - static void SaveToBinary(stream::internal::Writer& writer, collections::Dictionary>& caches, collections::SortedList& sortedKeys = *(collections::SortedList*)nullptr); - }; - - class IGuiResourceCacheResolver : public IDescriptable, public Description - { - public: - virtual GlobalStringKey GetCacheTypeName() = 0; - virtual bool Serialize(Ptr cache, stream::IStream& stream) = 0; - virtual Ptr Deserialize(stream::IStream& stream) = 0; + /// Create a contained resource object using a path like "Packages\Application\Name". + /// Returns true if this operation succeeded. + /// The path. + /// The type name of this contained object. + /// The contained object. + bool CreateValueByPath(const WString& path, const WString& typeName, Ptr value); }; /*********************************************************************** @@ -3513,14 +3497,11 @@ Resource /// Resource. A resource is a root resource folder that does not have a name. class GuiResource : public GuiResourceFolder, public Description { - typedef collections::Dictionary> CacheMap; protected: WString workingDirectory; static void ProcessDelayLoading(Ptr resource, DelayLoadingList& delayLoadings, collections::List& errors); public: - CacheMap precompiledCaches; - /// Create a resource. GuiResource(); ~GuiResource(); @@ -3544,8 +3525,7 @@ Resource /// Save the resource to xml. /// The xml. - /// Set to true to serialize all resources (including image, compiled script, etc) in the xml. - Ptr SaveToXml(bool serializePrecompiledResource); + Ptr SaveToXml(); /// Load a precompiled resource from a stream. /// The loaded resource. @@ -3560,6 +3540,9 @@ Resource /// Precompile this resource to improve performance. /// All collected errors during precompiling a resource. void Precompile(collections::List& errors); + + /// Initialize a precompiled resource. + void Initialize(); /// Get a contained document model using a path like "Packages\Application\Name". If the path does not exists or the type does not match, an exception will be thrown. /// The containd resource object. @@ -3636,6 +3619,7 @@ Resource Type Resolver ***********************************************************************/ class IGuiResourceTypeResolver_Precompile; + class IGuiResourceTypeResolver_Initialize; class IGuiResourceTypeResolver_DirectLoadXml; class IGuiResourceTypeResolver_DirectLoadStream; class IGuiResourceTypeResolver_IndirectLoad; @@ -3647,10 +3631,19 @@ Resource Type Resolver /// Get the type of the resource that load by this resolver. /// The type. virtual WString GetType() = 0; + /// Test is this resource able to serialize in an XML resource or not. + /// Returns true if this resource is able to serialize in an XML resource. + virtual bool XmlSerializable() = 0; + /// Test is this resource able to serialize in a precompiled binary resource or not. + /// Returns true if this resource is able to serialize in a precompiled binary resource. + virtual bool StreamSerializable() = 0; /// Get the precompiler for the type resolver. /// Returns null if the type resolve does not support precompiling. virtual IGuiResourceTypeResolver_Precompile* Precompile(){ return 0; } + /// Get the initializer for the type resolver. + /// Returns null if the type resolve does not support initializing. + virtual IGuiResourceTypeResolver_Initialize* Initialize(){ return 0; } /// Get the object for convert the resource between xml and object. /// Returns null if the type resolver does not have this ability. virtual IGuiResourceTypeResolver_DirectLoadXml* DirectLoadXml(){ return 0; } @@ -3662,12 +3655,26 @@ Resource Type Resolver virtual IGuiResourceTypeResolver_IndirectLoad* IndirectLoad(){ return 0; } }; + /// Provide a context for resource precompiling + struct GuiResourcePrecompileContext + { + /// The folder to contain compiled objects. + Ptr targetFolder; + /// The root resource object. + GuiResource* rootResource; + /// Indicate the pass index of this precompiling pass. + vint passIndex; + /// The path resolver. This is only for delay load resource. + Ptr resolver; + }; + /// /// Represents a precompiler for resources of a specified type. /// Current resources that needs precompiling: /// Pass 0: Script (collect workflow scripts) - /// Pass 1: Script (compile collected workflow scripts) - /// Pass 2: Instance + /// Pass 1: Script (compile view model scripts) + /// Pass 2: Script (compile shared scripts) + /// Pass 3: Instance /// class IGuiResourceTypeResolver_Precompile : public virtual IDescriptable, public Description { @@ -3676,11 +3683,30 @@ Resource Type Resolver /// Returns the maximum pass index. The precompiler doesn't not need to response to every pass. virtual vint GetMaxPassIndex() = 0; /// Precompile the resource item. - /// The resource. - /// Indicate the pass index of this precompiling pass. - /// The path resolver. This is only for delay load resource. + /// The resource to precompile. + /// The context for precompiling. /// All collected errors during loading a resource. - virtual void Precompile(Ptr resource, GuiResource* rootResource, vint passIndex, Ptr resolver, collections::List& errors) = 0; + virtual void Precompile(Ptr resource, GuiResourcePrecompileContext& context, collections::List& errors) = 0; + }; + + /// + /// Represents a precompiler for resources of a specified type. + /// Current resources that needs precompiling: + /// Pass 0: Script (initialize view model scripts) + /// Pass 1: Script (initialize shared scripts) + /// Pass 3: Script (initialize instance scripts) + /// + class IGuiResourceTypeResolver_Initialize : public virtual IDescriptable, public Description + { + public: + /// Get the maximum pass index that the initializer needs. + /// Returns the maximum pass index. The initializer doesn't not need to response to every pass. + virtual vint GetMaxPassIndex() = 0; + /// Initialize the resource item. + /// The resource to initializer. + /// The context for initializing. + /// All collected errors during loading a resource. + virtual void Initialize(Ptr resource, GuiResourcePrecompileContext& context) = 0; }; /// Represents a symbol type for loading a resource without a preload type. @@ -3690,8 +3716,7 @@ Resource Type Resolver /// Serialize a resource to an xml element. This function is called if this type resolver does not have a preload type. /// The serialized xml element. /// The resource. - /// Set to true to serialize the precompiled version of the resource. - virtual Ptr Serialize(Ptr resource, bool serializePrecompiledResource) = 0; + virtual Ptr Serialize(Ptr resource) = 0; /// Load a resource for a type inside an xml element. /// The resource. @@ -3736,8 +3761,7 @@ Resource Type Resolver /// Serialize a resource to a resource in preload type. /// The serialized resource. /// The resource. - /// Set to true to serialize the precompiled version of the resource. - virtual Ptr Serialize(Ptr resource, bool serializePrecompiledResource) = 0; + virtual Ptr Serialize(Ptr resource) = 0; /// Load a resource for a type from a resource loaded by the preload type resolver. /// The resource. @@ -3774,14 +3798,9 @@ Resource Resolver Manager /// Get the maximum precompiling pass index. /// The maximum precompiling pass index. virtual vint GetMaxPrecompilePassIndex() = 0; - /// Get the for a cache type. - /// The resolver. - /// The cache type. - virtual IGuiResourceCacheResolver* GetCacheResolver(GlobalStringKey cacheTypeName) = 0; - /// Set the for a cache type. - /// Returns true if this operation succeeded. - /// The resolver. - virtual bool SetCacheResolver(Ptr cacheResolver) = 0; + /// Get the maximum initializing pass index. + /// The maximum initializing pass index. + virtual vint GetMaxInitializePassIndex() = 0; }; extern IGuiResourceResolverManager* GetResourceResolverManager(); @@ -8150,6 +8169,11 @@ Basic Construction /// Returns true if this operation succeeded. /// The component to add. bool AddComponent(GuiComponent* component); + + /// Add a control host as a component. When this control host is disposing, all attached components will be deleted. + /// Returns true if this operation succeeded. + /// The controlHost to add. + bool AddControlHostComponent(GuiControlHost* controlHost); /// Remove a component. /// Returns true if this operation succeeded. /// The component to remove. @@ -13045,7 +13069,8 @@ ComboBox Base Ptr commandExecutor; IStyleController* styleController; - + + bool IsAltAvailable()override; IGuiMenuService::Direction GetSubMenuDirection()override; virtual void SelectItem(); void OnBoundsChanged(compositions::GuiGraphicsComposition* sender, compositions::GuiEventArgs& arguments); @@ -17149,6 +17174,10 @@ Toolstrip Component /// Get the toolstrip sub menu. If the sub menu is not created, it returns null. /// The toolstrip sub menu. GuiToolstripMenu* GetToolstripSubMenu(); + + /// Get the toolstrip sub menu. If the sub menu is not created, it returns null. + /// The toolstrip sub menu. + GuiToolstripMenu* EnsureToolstripSubMenu(); /// Create the toolstrip sub menu if necessary. The created toolstrip sub menu is owned by this menu button. /// The style controller for the toolstrip sub menu. If this argument is null, it will call for a style controller. void CreateToolstripSubMenu(GuiToolstripMenu::IStyleController* subMenuStyleController=0); @@ -21280,55 +21309,6 @@ Interfaces: #define VCZH_PRESENTATION_GACWORKFLOWREFERENCES -#endif - -/*********************************************************************** -GACUI.H -***********************************************************************/ -/*********************************************************************** -Vczh Library++ 3.0 -Developer: Zihan Chen(vczh) -GacUI Header Files and Common Namespaces - -Global Objects: - vl::reflection::description:: GetGlobalTypeManager - vl::presentation:: GetParserManager - vl::presentation:: GetResourceResolverManager - vl::presentation:: GetCurrentController - vl::presentation:: GetInstanceLoaderManager - vl::presentation::elements:: GetGuiGraphicsResourceManager - vl::presentation::controls:: GetApplication - vl::presentation::controls:: GetPluginManager - vl::presentation::theme:: GetCurrentTheme - - vl::presentation::windows:: GetDirect2DFactory - vl::presentation::windows:: GetDirectWriteFactory - vl::presentation::elements_windows_gdi:: GetWindowsGDIResourceManager - vl::presentation::elements_windows_gdi:: GetWindowsGDIObjectProvider - vl::presentation::elements_windows_d2d:: GetWindowsDirect2DResourceManager - vl::presentation::elements_windows_d2d:: GetWindowsDirect2DObjectProvider -***********************************************************************/ - -#ifndef VCZH_PRESENTATION_GACUI -#define VCZH_PRESENTATION_GACUI - - -#if !defined(__APPLE__) && !defined(__APPLE_CC__) && !defined(GAC_HEADER_USE_NAMESPACE) - -using namespace vl; -using namespace vl::presentation; -using namespace vl::presentation::elements; -using namespace vl::presentation::compositions; -using namespace vl::presentation::controls; -using namespace vl::presentation::theme; -using namespace vl::presentation::templates; - -#endif - -extern int SetupWindowsGDIRenderer(); -extern int SetupWindowsDirect2DRenderer(); -extern int SetupOSXCoreGraphicsRenderer(); - #endif /*********************************************************************** @@ -22476,3 +22456,52 @@ Parser Manager } #endif + +/*********************************************************************** +GACUI.H +***********************************************************************/ +/*********************************************************************** +Vczh Library++ 3.0 +Developer: Zihan Chen(vczh) +GacUI Header Files and Common Namespaces + +Global Objects: + vl::reflection::description:: GetGlobalTypeManager + vl::presentation:: GetParserManager + vl::presentation:: GetResourceResolverManager + vl::presentation:: GetCurrentController + vl::presentation:: GetInstanceLoaderManager + vl::presentation::elements:: GetGuiGraphicsResourceManager + vl::presentation::controls:: GetApplication + vl::presentation::controls:: GetPluginManager + vl::presentation::theme:: GetCurrentTheme + + vl::presentation::windows:: GetDirect2DFactory + vl::presentation::windows:: GetDirectWriteFactory + vl::presentation::elements_windows_gdi:: GetWindowsGDIResourceManager + vl::presentation::elements_windows_gdi:: GetWindowsGDIObjectProvider + vl::presentation::elements_windows_d2d:: GetWindowsDirect2DResourceManager + vl::presentation::elements_windows_d2d:: GetWindowsDirect2DObjectProvider +***********************************************************************/ + +#ifndef VCZH_PRESENTATION_GACUI +#define VCZH_PRESENTATION_GACUI + + +#if !defined(__APPLE__) && !defined(__APPLE_CC__) && !defined(GAC_HEADER_USE_NAMESPACE) + +using namespace vl; +using namespace vl::presentation; +using namespace vl::presentation::elements; +using namespace vl::presentation::compositions; +using namespace vl::presentation::controls; +using namespace vl::presentation::theme; +using namespace vl::presentation::templates; + +#endif + +extern int SetupWindowsGDIRenderer(); +extern int SetupWindowsDirect2DRenderer(); +extern int SetupOSXCoreGraphicsRenderer(); + +#endif diff --git a/Import/GacUIReflection.cpp b/Import/GacUIReflection.cpp index bfcc93c1..a4220c45 100644 --- a/Import/GacUIReflection.cpp +++ b/Import/GacUIReflection.cpp @@ -122,23 +122,13 @@ namespace vl using namespace regex; using namespace reflection::description; using namespace stream; + using namespace workflow; + using namespace workflow::analyzer; /*********************************************************************** GuiInstancePropertyInfo ***********************************************************************/ - GuiInstancePropertyInfo::GuiInstancePropertyInfo() - :support(NotSupport) - , tryParent(false) - , required(false) - , scope(Property) - { - } - - GuiInstancePropertyInfo::~GuiInstancePropertyInfo() - { - } - Ptr GuiInstancePropertyInfo::Unsupported() { return new GuiInstancePropertyInfo; @@ -189,68 +179,11 @@ GuiInstancePropertyInfo return info; } -/*********************************************************************** -GuiInstanceEventInfo -***********************************************************************/ - - GuiInstanceEventInfo::GuiInstanceEventInfo() - :support(NotSupport) - , argumentType(0) - { - } - - GuiInstanceEventInfo::~GuiInstanceEventInfo() - { - } - - Ptr GuiInstanceEventInfo::Unsupported() - { - return new GuiInstanceEventInfo; - } - - Ptr GuiInstanceEventInfo::Assign(description::ITypeDescriptor* typeDescriptor) - { - Ptr info = new GuiInstanceEventInfo; - info->support = SupportAssign; - info->argumentType = typeDescriptor; - return info; - } - /*********************************************************************** IGuiInstanceLoader ***********************************************************************/ - bool IGuiInstanceLoader::IsDeserializable(const TypeInfo& typeInfo) - { - return false; - } - - description::Value IGuiInstanceLoader::Deserialize(const TypeInfo& typeInfo, const WString& text) - { - return Value(); - } - - bool IGuiInstanceLoader::IsCreatable(const TypeInfo& typeInfo) - { - return false; - } - - description::Value IGuiInstanceLoader::CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments) - { - return Value(); - } - - bool IGuiInstanceLoader::IsInitializable(const TypeInfo& typeInfo) - { - return false; - } - - Ptr IGuiInstanceLoader::InitializeInstance(const TypeInfo& typeInfo, description::Value instance) - { - return 0; - } - - void IGuiInstanceLoader::GetPropertyNames(const TypeInfo& typeInfo, List& propertyNames) + void IGuiInstanceLoader::GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) { } @@ -258,33 +191,33 @@ IGuiInstanceLoader { } + void IGuiInstanceLoader::GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames) + { + } + Ptr IGuiInstanceLoader::GetPropertyType(const PropertyInfo& propertyInfo) { - return 0; + return nullptr; } - bool IGuiInstanceLoader::GetPropertyValue(PropertyValue& propertyValue) + bool IGuiInstanceLoader::CanCreate(const TypeInfo& typeInfo) { return false; } - bool IGuiInstanceLoader::SetPropertyValue(PropertyValue& propertyValue) + Ptr IGuiInstanceLoader::CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors) { - return false; + CHECK_FAIL(L"IGuiInstanceLoader::CreateInstance(const TypeInfo&, GlobalStringKey, ArgumentMap&)#This function is not implemented."); } - void IGuiInstanceLoader::GetEventNames(const TypeInfo& typeInfo, collections::List& eventNames) + Ptr IGuiInstanceLoader::AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors) { + CHECK_FAIL(L"IGuiInstanceLoader::AssignParameters(const TypeInfo&, GlobalStringKey, ArgumentMap&)#This function is not implemented."); } - Ptr IGuiInstanceLoader::GetEventType(const PropertyInfo& eventInfo) + Ptr IGuiInstanceLoader::GetParameter(const PropertyInfo& propertyInfo, GlobalStringKey variableName, collections::List& errors) { - return 0; - } - - bool IGuiInstanceLoader::SetEventValue(PropertyValue& propertyValue) - { - return false; + CHECK_FAIL(L"IGuiInstanceLoader::GetParameter(const PropertyInfo&, GlobalStringKey)#This function is not implemented."); } /*********************************************************************** @@ -341,10 +274,8 @@ GuiDefaultInstanceLoader protected: typedef Tuple FieldKey; typedef Tuple, IPropertyInfo*> PropertyType; - typedef Tuple, IEventInfo*> EventType; Dictionary propertyTypes; - Dictionary eventTypes; public: static IMethodInfo* GetDefaultConstructor(ITypeDescriptor* typeDescriptor) @@ -371,54 +302,6 @@ GuiDefaultInstanceLoader //*********************************************************************************** - bool IsDeserializable(const TypeInfo& typeInfo)override - { - return typeInfo.typeDescriptor->GetValueSerializer() != 0; - } - - description::Value Deserialize(const TypeInfo& typeInfo, const WString& text)override - { - if (IValueSerializer* serializer = typeInfo.typeDescriptor->GetValueSerializer()) - { - Value loadedValue; - if (serializer->Parse(text, loadedValue)) - { - return loadedValue; - } - } - return Value(); - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetDefaultConstructor(typeInfo.typeDescriptor) != 0; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (IMethodInfo* method = GetDefaultConstructor(typeInfo.typeDescriptor)) - { - return method->Invoke(Value(), (Value_xs())); - } - else - { - env->scope->errors.Add(L"Failed to create \"" + typeInfo.typeName.ToString() + L"\" because no there is no default constructor."); - return Value(); - } - } - - bool IsInitializable(const TypeInfo& typeInfo)override - { - return false; - } - - Ptr InitializeInstance(const TypeInfo& typeInfo, description::Value instance)override - { - return 0; - } - - //*********************************************************************************** - void ProcessGenericType(ITypeInfo* propType, ITypeInfo*& genericType, ITypeInfo*& elementType, bool& readableList, bool& writableList, bool& collectionType) { genericType = 0; @@ -652,321 +535,154 @@ GuiDefaultInstanceLoader return GetPropertyTypeCached(propertyInfo).f0; } - bool GetPropertyValue(PropertyValue& propertyValue)override + //*********************************************************************************** + + bool CanCreate(const TypeInfo& typeInfo)override { - if (IPropertyInfo* prop = GetPropertyTypeCached(propertyValue).f1) - { - if (prop->IsReadable()) - { - propertyValue.propertyValue = prop->GetValue(propertyValue.instanceValue); - return true; - } - } - return false; + return GetDefaultConstructor(typeInfo.typeDescriptor) != 0; } - bool SetPropertyValue(PropertyValue& propertyValue)override + Ptr CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors) { - PropertyType propertyType = GetPropertyTypeCached(propertyValue); - if (propertyType.f1) + auto create = MakePtr(); + create->type = GetTypeFromTypeInfo(GetDefaultConstructor(typeInfo.typeDescriptor)->GetReturn()); + + auto refValue = MakePtr(); + refValue->name.value = variableName.ToString(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refValue; + assign->second = create; + + auto stat = MakePtr(); + stat->expression = assign; + return stat; + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors) + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) { - switch (propertyType.f0->support) + PropertyType propertyType = GetPropertyTypeCached(PropertyInfo(typeInfo, prop)); + if (propertyType.f1) { - case GuiInstancePropertyInfo::SupportCollection: + switch (propertyType.f0->support) { - Value value = propertyType.f1->GetValue(propertyValue.instanceValue); - if (auto list = dynamic_cast(value.GetRawPtr())) + case GuiInstancePropertyInfo::SupportCollection: { - list->Add(propertyValue.propertyValue); - return true; + const auto& values = arguments.GetByIndex(index); + if (values.Count() > 0) + { + { + auto refValue = MakePtr(); + refValue->name.value = variableName.ToString(); + + auto refProp = MakePtr(); + refProp->parent = refValue; + refProp->name.value = prop.ToString(); + + auto varDesc = MakePtr(); + varDesc->name.value = L""; + varDesc->expression = refProp; + + auto stat = MakePtr(); + stat->variable = varDesc; + block->statements.Add(stat); + } + + for (vint i = 0; i < values.Count(); i++) + { + auto refCollection = MakePtr(); + refCollection->name.value = L""; + + auto refAdd = MakePtr(); + refAdd->parent = refCollection; + refAdd->name.value = L"Add"; + + auto call = MakePtr(); + call->function = refAdd; + call->arguments.Add(values[i].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } } - } - break; - case GuiInstancePropertyInfo::SupportAssign: - case GuiInstancePropertyInfo::SupportArray: - propertyValue.instanceValue.SetProperty(propertyValue.propertyName.ToString(), propertyValue.propertyValue); - propertyType.f1->SetValue(propertyValue.instanceValue, propertyValue.propertyValue); - return true; - default:; - } - } - return false; - } + break; + case GuiInstancePropertyInfo::SupportAssign: + case GuiInstancePropertyInfo::SupportArray: + { + auto refValue = MakePtr(); + refValue->name.value = variableName.ToString(); - //*********************************************************************************** + auto refProp = MakePtr(); + refProp->parent = refValue; + refProp->name.value = prop.ToString(); - void CollectEventNames(const TypeInfo& typeInfo, ITypeDescriptor* typeDescriptor, collections::List& eventNames) - { - vint eventCount = typeDescriptor->GetEventCount(); - for (vint i = 0; i < eventCount; i++) - { - GlobalStringKey eventName = GlobalStringKey::Get(typeDescriptor->GetEvent(i)->GetName()); - if (!eventNames.Contains(eventName)) - { - auto info = GetEventType(PropertyInfo(typeInfo, eventName)); - if (info && info->support != GuiInstanceEventInfo::NotSupport) - { - eventNames.Add(eventName); + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refProp; + assign->second = arguments.GetByIndex(index)[0].expression; + + auto stat = MakePtr(); + stat->expression = assign; + block->statements.Add(stat); + } + break; + default:; } } } - vint parentCount = typeDescriptor->GetBaseTypeDescriptorCount(); - for (vint i = 0; i < parentCount; i++) + if (block->statements.Count() > 0) { - CollectEventNames(typeInfo, typeDescriptor->GetBaseTypeDescriptor(i), eventNames); + return block; } + return nullptr; } - //*********************************************************************************** - - void GetEventNames(const TypeInfo& typeInfo, collections::List& eventNames)override + Ptr GetParameter(const PropertyInfo& propertyInfo, GlobalStringKey variableName, collections::List& errors) { - CollectEventNames(typeInfo, typeInfo.typeDescriptor, eventNames); - } + auto refValue = MakePtr(); + refValue->name.value = variableName.ToString(); - EventType GetEventTypeCached(const PropertyInfo& eventInfo) - { - FieldKey key(eventInfo.typeInfo.typeDescriptor, eventInfo.propertyName); - vint index = eventTypes.Keys().IndexOf(key); - if (index == -1) - { - if (IEventInfo* ev = eventInfo.typeInfo.typeDescriptor->GetEventByName(eventInfo.propertyName.ToString(), true)) - { -#ifndef VCZH_DEBUG_NO_REFLECTION - ITypeInfo *handlerType = 0, - *genericType = 0, - *functionType = 0, - *returnType = 0, - *senderType = 0, - *argumentType = 0; + auto refProp = MakePtr(); + refProp->parent = refValue; + refProp->name.value = propertyInfo.propertyName.ToString(); - handlerType = ev->GetHandlerType(); - if (handlerType->GetDecorator() != ITypeInfo::SharedPtr) goto UNSUPPORTED; - - genericType = handlerType->GetElementType(); - if (genericType->GetDecorator() != ITypeInfo::Generic) goto UNSUPPORTED; - - functionType = genericType->GetElementType(); - if (functionType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (functionType->GetTypeDescriptor() != description::GetTypeDescriptor()) goto UNSUPPORTED; - - if (genericType->GetGenericArgumentCount() != 3) goto UNSUPPORTED; - returnType = genericType->GetGenericArgument(0); - senderType = genericType->GetGenericArgument(1); - argumentType = genericType->GetGenericArgument(2); - - if (returnType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (returnType->GetTypeDescriptor() != description::GetTypeDescriptor()) goto UNSUPPORTED; - - if (senderType->GetDecorator() != ITypeInfo::RawPtr) goto UNSUPPORTED; - senderType = senderType->GetElementType(); - if (senderType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (senderType->GetTypeDescriptor() != description::GetTypeDescriptor()) goto UNSUPPORTED; - - if (argumentType->GetDecorator() != ITypeInfo::RawPtr) goto UNSUPPORTED; - argumentType = argumentType->GetElementType(); - if (argumentType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (!argumentType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) goto UNSUPPORTED; - - { - auto result = GuiInstanceEventInfo::Assign(argumentType->GetTypeDescriptor()); - EventType value(result, ev); - eventTypes.Add(key, value); - return value; - } - UNSUPPORTED: - { - auto result = GuiInstanceEventInfo::Unsupported(); - EventType value(result, ev); - eventTypes.Add(key, value); - return value; - } -#endif - } - - EventType value(0, 0); - eventTypes.Add(key, value); - return value; - } - else - { - return eventTypes.Values()[index]; - } - } - - Ptr GetEventType(const PropertyInfo& eventInfo)override - { - return GetEventTypeCached(eventInfo).f0; - } - - bool SetEventValue(PropertyValue& propertyValue)override - { - EventType eventType = GetEventTypeCached(propertyValue); - if (eventType.f0 && eventType.f0->support == GuiInstanceEventInfo::SupportAssign) - { - Ptr proxy=UnboxValue>(propertyValue.propertyValue, Description::GetAssociatedTypeDescriptor(), L"function"); - eventType.f1->Attach(propertyValue.instanceValue, proxy); - return true; - } - return false; + return refProp; } }; /*********************************************************************** -GuiResourceInstanceLoader +FindInstanceLoadingSource ***********************************************************************/ - class GuiResourceInstanceLoader : public Object, public IGuiInstanceLoader + InstanceLoadingSource FindInstanceLoadingSource( + Ptr context, + GuiConstructorRepr* ctor + ) { - protected: - Ptr resource; - Ptr context; - GlobalStringKey contextClassName; - - void InitializeContext(Ptr resolver, List& errors) + vint index=context->namespaces.Keys().IndexOf(ctor->typeNamespace); + if(index!=-1) { - context->ApplyStyles(resolver, errors); - } - public: - GuiResourceInstanceLoader(Ptr _resource, Ptr _context) - :resource(_resource) - , context(_context) - { - if (context->className) + Ptr namespaceInfo=context->namespaces.Values()[index]; + FOREACH(Ptr, ns, namespaceInfo->namespaces) { - contextClassName = GlobalStringKey::Get(context->className.Value()); - } - } - - GlobalStringKey GetTypeName()override - { - return contextClassName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == contextClassName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == contextClassName) - { - if (auto typeDescriptor = GetGlobalTypeManager()->GetTypeDescriptor(typeInfo.typeName.ToString())) + auto fullName = GlobalStringKey::Get(ns->prefix + ctor->typeName.ToString() + ns->postfix); + IGuiInstanceLoader* loader = GetInstanceLoaderManager()->GetLoader(fullName); + if(loader) { - InitializeContext(env->resolver, env->scope->errors); - SortedList argumentNames; - { - List names; - GetConstructorParameters(typeInfo, names); - CopyFrom(argumentNames, names); - } - auto group = typeDescriptor->GetConstructorGroup(); - for (vint i = 0; i < group->GetMethodCount(); i++) - { - auto method = group->GetMethod(i); - List parameterNames; - for (vint j = 0; j < method->GetParameterCount(); j++) - { - parameterNames.Add(GlobalStringKey::Get(method->GetParameter(j)->GetName())); - } - - auto f = [](GlobalStringKey a, GlobalStringKey b){return GlobalStringKey::Compare(a, b); }; - if (CompareEnumerable(argumentNames, From(parameterNames).OrderBy(f)) == 0) - { - Array arguments(constructorArguments.Count()); - for (vint j = 0; j < arguments.Count(); j++) - { - arguments[j] = constructorArguments[parameterNames[j]][0]; - } - Value result = method->Invoke(Value(), arguments); - - if (auto partialClass = dynamic_cast(result.GetRawPtr())) - { - if (auto partialScope = partialClass->GetScope()) - { - CopyFrom(env->scope->errors, partialScope->errors, true); - } - } - return result; - } - } - } - - Ptr resolver = new GuiResourcePathResolver(resource, resource->GetWorkingDirectory()); - auto scope = LoadInstanceFromContext(context, resolver); - - if (scope) - { - CopyFrom(env->scope->errors, scope->errors, true); - return scope->rootInstance; - } - } - return Value(); - } - - bool IsInitializable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == contextClassName; - } - - Ptr InitializeInstance(const TypeInfo& typeInfo, description::Value instance)override - { - if (typeInfo.typeName == contextClassName) - { - Ptr resolver = new GuiResourcePathResolver(resource, resource->GetWorkingDirectory()); - List errors; - InitializeContext(resolver, errors); - - auto scope = InitializeInstanceFromContext(context, resolver, instance); - if (scope) - { - for (vint i = 0; i < errors.Count(); i++) - { - scope->errors.Insert(i, errors[i]); - } - } - return scope; - } - return 0; - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames) - { - if (typeInfo.typeName == contextClassName) - { - FOREACH(Ptr, parameter, context->parameters) - { - if (description::GetTypeDescriptor(parameter->className.ToString())) - { - propertyNames.Add(parameter->name); - } + return InstanceLoadingSource(loader, fullName); } } } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo) - { - if (propertyInfo.typeInfo.typeName == contextClassName) - { - FOREACH(Ptr, parameter, context->parameters) - { - if (parameter->name == propertyInfo.propertyName) - { - if (auto td = description::GetTypeDescriptor(parameter->className.ToString())) - { - auto info = GuiInstancePropertyInfo::Assign(td); - info->required = true; - info->scope = GuiInstancePropertyInfo::ViewModel; - return info; - } - } - } - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - }; + return InstanceLoadingSource(); + } /*********************************************************************** GuiInstanceLoaderManager @@ -984,7 +700,6 @@ GuiInstanceLoaderManager protected: typedef Dictionary> BinderMap; typedef Dictionary> EventBinderMap; - typedef Dictionary> BindingContextFactoryMap; struct VirtualTypeInfo { @@ -1001,15 +716,17 @@ GuiInstanceLoaderManager { } }; - typedef Dictionary> VirtualTypeInfoMap; - typedef Dictionary> ResourceMap; + typedef Dictionary> VirtualTypeInfoMap; + typedef Dictionary> ResourceMap; + typedef Pair, Ptr> ResourceItemPair; + typedef Dictionary ResourceItemMap; Ptr rootLoader; BinderMap binders; EventBinderMap eventBinders; - BindingContextFactoryMap bindingContextFactories; VirtualTypeInfoMap typeInfos; ResourceMap resources; + ResourceItemMap instanceCtors; bool IsTypeExists(GlobalStringKey name) { @@ -1090,25 +807,24 @@ GuiInstanceLoaderManager } } - void GetClassesInResource(Ptr folder, Dictionary>& classes) + void GetClassesInResource(Ptr resource, Ptr folder) { FOREACH(Ptr, item, folder->GetItems()) { - if (auto context = item->GetContent().Cast()) + if (auto compiled = item->GetContent().Cast()) { - if (context->className) + if (compiled->type == GuiInstanceCompiledWorkflow::InstanceCtor) { - auto contextClassName = GlobalStringKey::Get(context->className.Value()); - if (!classes.Keys().Contains(contextClassName)) + if (!instanceCtors.Keys().Contains(compiled->classFullName)) { - classes.Add(contextClassName, context); + instanceCtors.Add(compiled->classFullName, ResourceItemPair(resource, item)); } } } } FOREACH(Ptr, subFolder, folder->GetFolders()) { - GetClassesInResource(subFolder, classes); + GetClassesInResource(resource, subFolder); } } public: @@ -1133,19 +849,6 @@ GuiInstanceLoaderManager instanceLoaderManager = 0; } - bool AddInstanceBindingContextFactory(Ptr factory)override - { - if (bindingContextFactories.Keys().Contains(factory->GetContextName())) return false; - bindingContextFactories.Add(factory->GetContextName(), factory); - return true; - } - - IGuiInstanceBindingContextFactory* GetInstanceBindingContextFactory(GlobalStringKey contextName)override - { - vint index = bindingContextFactories.Keys().IndexOf(contextName); - return index == -1 ? 0 : bindingContextFactories.Values()[index].Obj(); - } - bool AddInstanceBinder(Ptr binder)override { if (binders.Keys().Contains(binder->GetBindingName())) return false; @@ -1278,47 +981,10 @@ GuiInstanceLoaderManager { vint index = resources.Keys().IndexOf(name); if (index != -1) return false; - - Ptr resolver = new GuiResourcePathResolver(resource, resource->GetWorkingDirectory()); - Dictionary> classes; - Dictionary parentTypes; - GetClassesInResource(resource, classes); - - FOREACH(Ptr, context, classes.Values()) - { - auto contextClassName = GlobalStringKey::Get(context->className.Value()); - if (typeInfos.Keys().Contains(contextClassName)) - { - return false; - } - - Ptr env = new GuiInstanceEnvironment(context, resolver); - auto loadingSource = FindInstanceLoadingSource(env->context, context->instance.Obj()); - if (loadingSource.loader) - { - parentTypes.Add(contextClassName, loadingSource.typeName); - } - } - FOREACH(GlobalStringKey, className, classes.Keys()) - { - auto context = classes[className]; - vint index = parentTypes.Keys().IndexOf(className); - if (index == -1) continue; - auto parentType = parentTypes.Values()[index]; - - Ptr loader = new GuiResourceInstanceLoader(resource, context); - if (GetGlobalTypeManager()->GetTypeDescriptor(context->className.Value())) - { - SetLoader(loader); - } - else - { - CreateVirtualType(parentType, loader); - } - } - + resource->Initialize(); resources.Add(name, resource); + GetClassesInResource(resource, resource); return true; } @@ -1327,1854 +993,23 @@ GuiInstanceLoaderManager vint index = resources.Keys().IndexOf(name); return index == -1 ? nullptr : resources.Values()[index]; } + + Ptr RunInstanceConstructor(const WString& classFullName, description::Value instance)override + { + vint index = instanceCtors.Keys().IndexOf(classFullName); + if (index == -1) return nullptr; + + auto pair = instanceCtors.Values()[index]; + auto context = Workflow_RunPrecompiledScript(pair.key, pair.value, instance); + auto result = MakePtr(); + result->context = context; + return result; + } }; GUI_REGISTER_PLUGIN(GuiInstanceLoaderManager) } } -/*********************************************************************** -GUIINSTANCELOADER_LOADINSTANCE.CPP -***********************************************************************/ - -namespace vl -{ - namespace presentation - { - using namespace collections; - using namespace reflection::description; - -/*********************************************************************** -Helper Functions Declarations -***********************************************************************/ - - struct FillInstanceBindingSetter - { - IGuiInstanceBinder* binder; - IGuiInstanceLoader* loader; - GuiAttSetterRepr* bindingTarget; - IGuiInstanceLoader::PropertyValue propertyValue; - - FillInstanceBindingSetter() - :binder(0) - , loader(0) - , bindingTarget(0) - { - } - }; - - struct FillInstanceEventSetter - { - IGuiInstanceEventBinder* binder; - IGuiInstanceLoader* loader; - GuiAttSetterRepr* bindingTarget; - Ptr eventInfo; - IGuiInstanceLoader::PropertyValue propertyValue; - WString handlerName; - - FillInstanceEventSetter() - :binder(0) - , loader(0) - , bindingTarget(0) - { - } - }; - - bool LoadInstancePropertyValue( - Ptr env, - GuiAttSetterRepr* attSetter, - GlobalStringKey binding, - IGuiInstanceLoader::PropertyValue propertyValue, - List>& input, - IGuiInstanceLoader* propertyLoader, - bool constructorArgument, - List>& output, - List& bindingSetters, - List& eventSetters - ); - - void FillInstance( - description::Value createdInstance, - Ptr env, - GuiAttSetterRepr* attSetter, - IGuiInstanceLoader* loader, - bool skipDefaultProperty, - GlobalStringKey typeName, - List& bindingSetters, - List& eventSetters - ); - - description::Value CreateInstance( - Ptr env, - GuiConstructorRepr* ctor, - description::ITypeDescriptor* expectedType, - GlobalStringKey& typeName, - List& bindingSetters, - List& eventSetters, - bool isRootInstance - ); - - void ExecuteParameters( - Ptr env - ); - - bool PrepareBindingContext( - Ptr env, - collections::List& contextNames, - const WString& dependerType, - const GlobalStringKey& dependerName - ); - - void ExecuteBindingSetters( - Ptr env, - List& bindingSetters - ); - - void ExecuteEventSetters( - description::Value createdInstance, - Ptr env, - List& eventSetters - ); - - void InitializeInstanceFromConstructor( - Ptr env, - GuiConstructorRepr* ctor, - IGuiInstanceLoader* instanceLoader, - GlobalStringKey typeName, - description::Value instance, - bool deserialized, - List& bindingSetters, - List& eventSetters - ); - - namespace visitors - { - -/*********************************************************************** -LoadValueVisitor -***********************************************************************/ - - class LoadValueVisitor : public Object, public GuiValueRepr::IVisitor - { - public: - Ptr env; - List& acceptableTypes; - List& bindingSetters; - List& eventSetters; - bool result; - Value loadedValue; - - LoadValueVisitor(Ptr _env, List& _acceptableTypes, List& _bindingSetters, List& _eventSetters) - :env(_env) - , acceptableTypes(_acceptableTypes) - , bindingSetters(_bindingSetters) - , eventSetters(_eventSetters) - , result(false) - { - } - - void Visit(GuiTextRepr* repr)override - { - FOREACH(ITypeDescriptor*, typeDescriptor, acceptableTypes) - { - if (IValueSerializer* serializer = typeDescriptor->GetValueSerializer()) - { - if (serializer->Parse(repr->text, loadedValue)) - { - result = true; - return; - } - } - } - - FOREACH(ITypeDescriptor*, typeDescriptor, acceptableTypes) - { - env->scope->errors.Add( - L"Failed to deserialize object of type \"" + - typeDescriptor->GetTypeName() + - L"\" from string \"" + - repr->text + - L"\"."); - } - } - - void Visit(GuiAttSetterRepr* repr)override - { - } - - void Visit(GuiConstructorRepr* repr)override - { - vint errorCount = env->scope->errors.Count(); - FOREACH(ITypeDescriptor*, typeDescriptor, acceptableTypes) - { - GlobalStringKey _typeName; - loadedValue = CreateInstance(env, repr, typeDescriptor, _typeName, bindingSetters, eventSetters, false); - if (!loadedValue.IsNull()) - { - for (vint i = env->scope->errors.Count() - 1; i >= errorCount; i--) - { - if (wcsstr(env->scope->errors[i].Buffer(), L"because the expected type is")) - { - env->scope->errors.RemoveAt(i); - } - } - result = true; - return; - } - } - } - - static bool LoadValue(Ptr valueRepr, Ptr env, List& acceptableTypes, List& bindingSetters, List& eventSetters, Value& loadedValue) - { - LoadValueVisitor visitor(env, acceptableTypes, bindingSetters, eventSetters); - valueRepr->Accept(&visitor); - if (visitor.result) - { - loadedValue = visitor.loadedValue; - } - return visitor.result; - } - }; - - } - using namespace visitors; - -/*********************************************************************** -FindInstanceLoadingSource -***********************************************************************/ - - InstanceLoadingSource FindInstanceLoadingSource( - Ptr context, - GuiConstructorRepr* ctor - ) - { - vint index=context->namespaces.Keys().IndexOf(ctor->typeNamespace); - if(index!=-1) - { - Ptr namespaceInfo=context->namespaces.Values()[index]; - FOREACH(Ptr, ns, namespaceInfo->namespaces) - { - auto fullName = GlobalStringKey::Get(ns->prefix + ctor->typeName.ToString() + ns->postfix); - IGuiInstanceLoader* loader = GetInstanceLoaderManager()->GetLoader(fullName); - if(loader) - { - return InstanceLoadingSource(loader, fullName); - } - } - } - return InstanceLoadingSource(); - } - -/*********************************************************************** -LoadInstancePropertyValue -***********************************************************************/ - - bool LoadInstancePropertyValue( - Ptr env, - GuiAttSetterRepr* attSetter, - GlobalStringKey binding, - IGuiInstanceLoader::PropertyValue propertyValue, - List>& input, - IGuiInstanceLoader* propertyLoader, - bool constructorArgument, - List>& output, - List& bindingSetters, - List& eventSetters - ) - { - GlobalStringKey instanceType; - if (propertyValue.instanceValue.IsNull()) - { - instanceType = propertyLoader->GetTypeName(); - } - else - { - instanceType = GlobalStringKey::Get(propertyValue.instanceValue.GetTypeDescriptor()->GetTypeName()); - } - - vint loadedValueCount = 0; - // try to look for a loader to handle this property - while (propertyLoader && loadedValueCount < input.Count()) - { - if (auto propertyInfo = propertyLoader->GetPropertyType(propertyValue)) - { - if (constructorArgument) - { - if (propertyInfo->scope == GuiInstancePropertyInfo::Property) - { - return false; - } - } - else - { - if (propertyInfo->scope == GuiInstancePropertyInfo::Constructor) - { - return false; - } - } - if (propertyInfo->support == GuiInstancePropertyInfo::NotSupport) - { - env->scope->errors.Add( - L"Property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - propertyValue.instanceValue.GetTypeDescriptor()->GetTypeName() + - L"\" is not supported."); - return false; - } - - switch (propertyInfo->support) - { - case GuiInstancePropertyInfo::SupportSet: - if (input.Count() != 1) - { - env->scope->errors.Add( - L"Collection property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" can only be assigned with a single value."); - return false; - } - if (constructorArgument) return false; - if (binding != GlobalStringKey::_Set) - { - env->scope->errors.Add( - L"Collection property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" can only be retrived using binding \"set\"."); - return false; - } - { - // set binding: get the property value and apply another property list on it - if(Ptr propertyAttSetter=input[0].Cast()) - { - if(propertyLoader->GetPropertyValue(propertyValue) && propertyValue.propertyValue.GetRawPtr()) - { - input[0] = 0; - loadedValueCount++; - - ITypeDescriptor* propertyTypeDescriptor=propertyValue.propertyValue.GetRawPtr()->GetTypeDescriptor(); - auto propertyTypeKey = GlobalStringKey::Get(propertyTypeDescriptor->GetTypeName()); - IGuiInstanceLoader* propertyInstanceLoader=GetInstanceLoaderManager()->GetLoader(propertyTypeKey); - if(propertyInstanceLoader) - { - FillInstance(propertyValue.propertyValue, env, propertyAttSetter.Obj(), propertyInstanceLoader, false, propertyTypeKey, bindingSetters, eventSetters); - } - } - } - } - break; - case GuiInstancePropertyInfo::SupportCollection: - if (binding != GlobalStringKey::Empty) - { - env->scope->errors.Add( - L"Collection property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be assigned using binding."); - return false; - } - { - FOREACH_INDEXER(Ptr, valueRepr, index, input) - { - if (valueRepr) - { - // default binding: set the value directly - vint errorCount = env->scope->errors.Count(); - if (LoadValueVisitor::LoadValue(valueRepr, env, propertyInfo->acceptableTypes, bindingSetters, eventSetters, propertyValue.propertyValue)) - { - input[index] = 0; - loadedValueCount++; - output.Add(Pair(propertyValue.propertyValue, propertyLoader)); - } - else if (propertyInfo->tryParent) - { - env->scope->errors.RemoveRange(errorCount, env->scope->errors.Count() - errorCount); - } - } - } - } - break; - case GuiInstancePropertyInfo::SupportAssign: - if (input.Count() != 1) - { - env->scope->errors.Add( - L"Assignable property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be assigned using multiple values."); - return false; - } - if (binding == GlobalStringKey::_Set) - { - env->scope->errors.Add( - L"Assignable property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be retrived using binding \"set\"."); - return false; - } - { - FOREACH_INDEXER(Ptr, valueRepr, index, input) - { - if (valueRepr) - { - bool canRemoveLoadedValue = false; - if (binding == GlobalStringKey::Empty) - { - // default binding: set the value directly - if (LoadValueVisitor::LoadValue(valueRepr, env, propertyInfo->acceptableTypes, bindingSetters, eventSetters, propertyValue.propertyValue)) - { - canRemoveLoadedValue = true; - output.Add(Pair(propertyValue.propertyValue, propertyLoader)); - } - } - else if (IGuiInstanceBinder* binder=GetInstanceLoaderManager()->GetInstanceBinder(binding)) - { - List contextNames; - binder->GetRequiredContexts(contextNames); - bool success = PrepareBindingContext(env, contextNames, L"property binding", binder->GetBindingName()); - - if (success) - { - // other binding: provide the property value to the specified binder - List binderExpectedTypes; - binder->GetExpectedValueTypes(binderExpectedTypes); - if (LoadValueVisitor::LoadValue(valueRepr, env, binderExpectedTypes, bindingSetters, eventSetters, propertyValue.propertyValue)) - { - canRemoveLoadedValue = true; - if (constructorArgument) - { - auto translatedValue = binder->GetValue(env, propertyValue.propertyValue); - if (translatedValue.IsNull()) - { - env->scope->errors.Add( - L"Assignable property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be assigned using binding \"" + - binding.ToString() + - L"\" because the value translation failed."); - } - else - { - output.Add(Pair(translatedValue, propertyLoader)); - } - } - else if (propertyInfo->scope == GuiInstancePropertyInfo::Property) - { - FillInstanceBindingSetter bindingSetter; - bindingSetter.binder = binder; - bindingSetter.loader = propertyLoader; - bindingSetter.bindingTarget = attSetter; - bindingSetter.propertyValue = propertyValue; - bindingSetters.Add(bindingSetter); - } - } - } - } - else - { - env->scope->errors.Add( - L"Assignable property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be assigned using binding \"" + - binding.ToString() + - L"\" because the appropriate IGuiInstanceBinder for this binding cannot be found."); - } - - if (canRemoveLoadedValue) - { - input[index] = 0; - loadedValueCount++; - } - } - } - } - break; - case GuiInstancePropertyInfo::SupportArray: - if (binding != GlobalStringKey::Empty) - { - env->scope->errors.Add( - L"Array property \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - instanceType.ToString() + - L"\" cannot be assigned using binding."); - return false; - } - { - auto list = IValueList::Create(); - FOREACH_INDEXER(Ptr, valueRepr, index, input) - { - // default binding: add the value to the list - if (LoadValueVisitor::LoadValue(valueRepr, env, propertyInfo->acceptableTypes, bindingSetters, eventSetters, propertyValue.propertyValue)) - { - input[index] = 0; - loadedValueCount++; - list->Add(propertyValue.propertyValue); - } - } - - // set the whole list to the property - output.Add(Pair(Value::From(list), propertyLoader)); - } - break; - default:; - } - - if (!propertyInfo->tryParent) - { - break; - } - } - if (constructorArgument) - { - break; - } - else - { - propertyLoader = GetInstanceLoaderManager()->GetParentLoader(propertyLoader); - } - } - - return true; - } - -/*********************************************************************** -FillInstance -***********************************************************************/ - - void FillInstance( - description::Value createdInstance, - Ptr env, - GuiAttSetterRepr* attSetter, - IGuiInstanceLoader* loader, - bool skipDefaultProperty, - GlobalStringKey typeName, - List& bindingSetters, - List& eventSetters - ) - { - IGuiInstanceLoader::TypeInfo typeInfo(typeName, createdInstance.GetTypeDescriptor()); - // reverse loop to set the default property (name == L"") after all other properties - for (vint i = attSetter->setters.Count() - 1; i >= 0; i--) - { - GlobalStringKey propertyName = attSetter->setters.Keys()[i]; - if (propertyName == GlobalStringKey::Empty && skipDefaultProperty) - { - continue; - } - - auto propertyValue=attSetter->setters.Values()[i]; - IGuiInstanceLoader* propertyLoader=loader; - IGuiInstanceLoader::PropertyValue cachedPropertyValue( - typeInfo, - propertyName, - createdInstance - ); - List> input; - List> output; - - // extract all loaded property values - CopyFrom(input, propertyValue->values); - LoadInstancePropertyValue(env, attSetter, propertyValue->binding, cachedPropertyValue, input, propertyLoader, false, output, bindingSetters, eventSetters); - - // if there is no binding, set all values into the specified property - if (propertyValue->binding == GlobalStringKey::Empty) - { - for (vint i = 0; i < output.Count(); i++) - { - auto value = output[i].key; - auto valueLoader = output[i].value; - cachedPropertyValue.propertyValue = value; - if (!valueLoader->SetPropertyValue(cachedPropertyValue)) - { - value.DeleteRawPtr(); - } - } - } - } - - // attach events - FOREACH_INDEXER(GlobalStringKey, eventName, index, attSetter->eventHandlers.Keys()) - { - auto handler = attSetter->eventHandlers.Values()[index]; - - IGuiInstanceLoader::PropertyInfo propertyInfo( - typeInfo, - eventName - ); - - // get the loader to attach the event - Ptr eventInfo; - IGuiInstanceLoader* eventLoader = loader; - { - while (eventLoader) - { - if ((eventInfo = eventLoader->GetEventType(propertyInfo))) - { - if (eventInfo->support == GuiInstanceEventInfo::NotSupport) - { - eventInfo = 0; - } - break; - } - eventLoader = GetInstanceLoaderManager()->GetParentLoader(eventLoader); - } - } - - IGuiInstanceEventBinder* binder = 0; - if (handler->binding != GlobalStringKey::Empty) - { - binder = GetInstanceLoaderManager()->GetInstanceEventBinder(handler->binding); - if (!binder) - { - env->scope->errors.Add( - L"Failed to attach event \"" + - eventName.ToString() + - L"\" of type \"" + - typeName.ToString() + - L"\" with the handler \"" + - handler->value + - L"\" using event binding \"" + - handler->binding.ToString() + - L"\" because the appropriate IGuiInstanceEventBinder for this binding cannot be found."); - continue; - } - } - - if (eventInfo) - { - FillInstanceEventSetter eventSetter; - eventSetter.binder = binder; - eventSetter.loader = eventLoader; - eventSetter.bindingTarget = attSetter; - eventSetter.eventInfo = eventInfo; - eventSetter.propertyValue.typeInfo = propertyInfo.typeInfo; - eventSetter.propertyValue.propertyName = propertyInfo.propertyName; - eventSetter.propertyValue.instanceValue = createdInstance; - eventSetter.handlerName = handler->value; - eventSetters.Add(eventSetter); - } - else - { - env->scope->errors.Add( - L"Failed to attach event \"" + - eventName.ToString() + - L"\" of type \"" + - typeName.ToString() + - L"\" with the handler \"" + - handler->value + - L"\" using event binding \"" + - handler->binding.ToString() + - L"\" because no IGuiInstanceLoader supports this event."); - } - } - } - -/*********************************************************************** -CreateInstance -***********************************************************************/ - - description::Value CreateInstance( - Ptr env, - GuiConstructorRepr* ctor, - description::ITypeDescriptor* expectedType, - GlobalStringKey& typeName, - List& bindingSetters, - List& eventSetters, - bool isRootInstance - ) - { - // search for a correct loader - InstanceLoadingSource source=FindInstanceLoadingSource(env->context, ctor); - Value instance; - IGuiInstanceLoader* instanceLoader = 0; - bool deserialized = false; - - if(source.loader) - { - // found the correct loader, prepare a TypeInfo - IGuiInstanceLoader* loader=source.loader; - instanceLoader = source.loader; - typeName = source.typeName; - ITypeDescriptor* typeDescriptor = GetInstanceLoaderManager()->GetTypeDescriptorForType(source.typeName); - - // see if the constructor contains only a single text value - Ptr singleTextValue; - { - vint index = ctor->setters.Keys().IndexOf(GlobalStringKey::Empty); - if (index != -1) - { - auto setterValue = ctor->setters.Values()[index]; - if (setterValue->values.Count() == 1) - { - singleTextValue = setterValue->values[0].Cast(); - } - } - else - { - singleTextValue = new GuiTextRepr; - singleTextValue->text = L""; - } - } - - // if the target type is not the expected type, fail - if (!expectedType || expectedType==GetTypeDescriptor() || typeDescriptor->CanConvertTo(expectedType)) - { - // traverse the loader and all ancestors to load the type - IGuiInstanceLoader::TypeInfo typeInfo(typeName, typeDescriptor); - bool foundLoader = false; - while(!foundLoader && loader && instance.IsNull()) - { - if (singleTextValue && loader->IsDeserializable(typeInfo)) - { - foundLoader = true; - // if the loader support deserialization and this is a single text value constructor - // then choose deserialization - instance = loader->Deserialize(typeInfo, singleTextValue->text); - if (!instance.IsNull()) - { - deserialized = true; - } - else - { - env->scope->errors.Add( - L"Failed to deserialize object of type \"" + - source.typeName.ToString() + - L"\" from string \"" + - singleTextValue->text + - L"\"."); - } - } - else if (loader->IsCreatable(typeInfo)) - { - foundLoader = true; - // find all constructor parameters - List constructorParameters; - List requiredParameters; - loader->GetConstructorParameters(typeInfo, constructorParameters); - - // see if all parameters exists - Group constructorArguments; - FOREACH(GlobalStringKey, propertyName, constructorParameters) - { - IGuiInstanceLoader::PropertyInfo propertyInfo(typeInfo, propertyName); - auto info = loader->GetPropertyType(propertyInfo); - vint index = ctor->setters.Keys().IndexOf(propertyName); - - if (info->scope != GuiInstancePropertyInfo::Property) - { - if (info->required) - { - if (index == -1) - { - // if a required parameter doesn't exist, fail - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\" because the required constructor parameter \"" + - propertyName.ToString() + - L"\" is missing."); - goto SKIP_CREATE_INSTANCE; - } - requiredParameters.Add(propertyName); - } - - if (index != -1) - { - auto setterValue = ctor->setters.Values()[index]; - if (setterValue->binding != GlobalStringKey::Empty) - { - if (IGuiInstanceBinder* binder = GetInstanceLoaderManager()->GetInstanceBinder(setterValue->binding)) - { - if (!binder->ApplicableToConstructorArgument()) - { - // if the constructor argument uses binding, fail - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\" because the required constructor parameter \"" + - propertyName.ToString() + - L"\" is not allowed to use binding \"" + - setterValue->binding.ToString() + - L"\" which does not applicable to constructor parameters."); - goto SKIP_CREATE_INSTANCE; - } - } - else - { - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\" because the required constructor parameter \"" + - propertyName.ToString() + - L"\" is not allowed to use binding \"" + - setterValue->binding.ToString() + - L"\" because the appropriate IGuiInstanceBinder for this binding cannot be found."); - goto SKIP_CREATE_INSTANCE; - } - } - - // load the parameter - List> input; - List> output; - IGuiInstanceLoader::PropertyValue propertyValue(typeInfo, propertyName, Value()); - - CopyFrom(input, setterValue->values); - LoadInstancePropertyValue(env, ctor, setterValue->binding, propertyValue, input, loader, true, output, bindingSetters, eventSetters); - - for (vint i = 0; i < output.Count(); i++) - { - constructorArguments.Add(propertyName, output[i].key); - } - } - } - } - - // check if all required parameters exist - FOREACH(GlobalStringKey, propertyName, requiredParameters) - { - if (!constructorArguments.Contains(propertyName)) - { - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\" because the required constructor parameter \"" + - propertyName.ToString() + - L"\" is missing."); - goto SKIP_CREATE_INSTANCE; - } - } - - // create the instance - instance = loader->CreateInstance(env, typeInfo, constructorArguments); - SKIP_CREATE_INSTANCE: - // delete all arguments if the constructing fails - if (instance.IsNull()) - { - for (vint i = 0; i < constructorArguments.Count(); i++) - { - FOREACH(Value, value, constructorArguments.GetByIndex(i)) - { - value.DeleteRawPtr(); - } - } - } - } - loader = GetInstanceLoaderManager()->GetParentLoader(loader); - } - - if (instance.IsNull()) - { - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\"."); - } - } - else - { - env->scope->errors.Add( - L"Failed to create object of type \"" + - source.typeName.ToString() + - L"\" because the expected type is \"" + - expectedType->GetTypeName() + - L"\"."); - } - } - else if(source.context) - { - // found another instance in the resource - if (Ptr scope = LoadInstanceFromContext(source.context, env->resolver, expectedType)) - { - typeName = scope->typeName; - instance = scope->rootInstance; - instanceLoader = GetInstanceLoaderManager()->GetLoader(typeName); - } - else - { - auto contextCtor = source.context->instance; - env->scope->errors.Add( - L"Failed to find type \"" + - (contextCtor->typeNamespace == GlobalStringKey::Empty - ? contextCtor->typeName.ToString() - : contextCtor->typeNamespace.ToString() + L":" + contextCtor->typeName.ToString() - ) + - L"\"."); - } - } - else - { - env->scope->errors.Add( - L"Failed to find type \"" + - (ctor->typeNamespace == GlobalStringKey::Empty - ? ctor->typeName.ToString() - : ctor->typeNamespace.ToString() + L":" + ctor->typeName.ToString() - ) + - L"\"."); - } - - if(instance.GetRawPtr() && instanceLoader) - { - if (isRootInstance) - { - env->scope->rootInstance = instance; - ExecuteParameters(env); - } - InitializeInstanceFromConstructor(env, ctor, instanceLoader, typeName, instance, deserialized, bindingSetters, eventSetters); - } - return instance; - } - -/*********************************************************************** -ExecuteBindingSetters -***********************************************************************/ - - void ExecuteParameters(Ptr env) - { - auto td = env->scope->rootInstance.GetTypeDescriptor(); - FOREACH(Ptr, parameter, env->context->parameters) - { - auto info = td->GetPropertyByName(parameter->name.ToString(), true); - if (!info) - { - env->scope->errors.Add(L"Cannot find parameter \"" + parameter->name.ToString() + L"\" in properties of \"" + td->GetTypeName() + L"\"."); - continue; - } - - auto parameterTd = GetTypeDescriptor(parameter->className.ToString()); - if (!parameterTd) - { - env->scope->errors.Add(L"Cannot find type \"" + parameter->className.ToString() + L"\" of parameter \"" + parameter->name.ToString() + L"\"."); - } - - auto value = info->GetValue(env->scope->rootInstance); - if (parameterTd && (!value.GetTypeDescriptor() || !value.GetTypeDescriptor()->CanConvertTo(parameterTd))) - { - env->scope->errors.Add(L"Value of parameter \"" + parameter->name.ToString() + L"\" is not \"" + parameterTd->GetTypeName() + L"\" which is required."); - } - - if (env->scope->referenceValues.Keys().Contains(parameter->name)) - { - env->scope->errors.Add(L"Parameter \"" + parameter->name.ToString() + L"\" conflict with an existing named object."); - } - else - { - env->scope->referenceValues.Add(parameter->name, value); - } - } - } - -/*********************************************************************** -ExecuteBindingSetters -***********************************************************************/ - - bool PrepareBindingContext( - Ptr env, - collections::List& contextNames, - const WString& dependerType, - const GlobalStringKey& dependerName - ) - { - bool success = true; - FOREACH(GlobalStringKey, contextName, contextNames) - { - if (!env->scope->bindingContexts.Keys().Contains(contextName)) - { - auto factory = GetInstanceLoaderManager()->GetInstanceBindingContextFactory(contextName); - if (factory) - { - env->scope->bindingContexts.Add(contextName, factory->CreateContext()); - } - else - { - env->scope->errors.Add( - L"Failed to create binding context \"" + - contextName.ToString() + - L"\" which is required by " + - dependerType + - L" \"" + - dependerName.ToString() + - L"\"."); - success = false; - } - } - } - return success; - } - - void ExecuteBindingSetters( - Ptr env, - List& bindingSetters - ) - { - // set all binding attributes - FOREACH(FillInstanceBindingSetter, bindingSetter, bindingSetters) - { - List contextNames; - bindingSetter.binder->GetRequiredContexts(contextNames); - bool success = PrepareBindingContext(env, contextNames, L"property binding", bindingSetter.binder->GetBindingName()); - - if (bindingSetter.binder->RequireInstanceName()) - { - if (bindingSetter.bindingTarget->instanceName == GlobalStringKey::Empty) - { - auto name = GlobalStringKey::Get(L"" + itow(env->scope->referenceValues.Count())); - bindingSetter.bindingTarget->instanceName = name; - } - - auto name = bindingSetter.bindingTarget->instanceName; - auto value = bindingSetter.propertyValue.instanceValue; - if (!env->scope->referenceValues.Keys().Contains(bindingSetter.bindingTarget->instanceName)) - { - env->scope->referenceValues.Add(name, value); - } - } - - if (!success || !bindingSetter.binder->SetPropertyValue(env, bindingSetter.loader, bindingSetter.bindingTarget->instanceName, bindingSetter.propertyValue)) - { - auto value = bindingSetter.propertyValue.propertyValue; - env->scope->errors.Add( - L"Failed to set property \"" + - bindingSetter.propertyValue.propertyName.ToString() + - L"\" of \"" + - bindingSetter.propertyValue.instanceValue.GetTypeDescriptor()->GetTypeName() + - L"\" using binding \"" + - bindingSetter.binder->GetBindingName().ToString() + - L"\" and value \"" + - ( - value.GetValueType() == Value::Null ? WString(L"null") : - value.GetValueType() == Value::Text ? value.GetText() : - (L"<" + value.GetTypeDescriptor()->GetTypeName() + L">") - ) + - L"\"."); - bindingSetter.propertyValue.propertyValue.DeleteRawPtr(); - } - } - - // initialize all binding context - FOREACH(Ptr, context, env->scope->bindingContexts.Values()) - { - context->Initialize(env); - } - } - -/*********************************************************************** -ExecuteBindingSetters -***********************************************************************/ - - void ExecuteEventSetters( - description::Value createdInstance, - Ptr env, - List& eventSetters - ) - { -#ifndef VCZH_DEBUG_NO_REFLECTION - // set all event attributes - FOREACH(FillInstanceEventSetter, eventSetter, eventSetters) - { - if (eventSetter.binder) - { - List contextNames; - eventSetter.binder->GetRequiredContexts(contextNames); - auto propertyValue = eventSetter.propertyValue; - propertyValue.propertyValue = BoxValue(eventSetter.handlerName); - bool success = PrepareBindingContext(env, contextNames, L"event binding", eventSetter.binder->GetBindingName()); - - if (eventSetter.binder->RequireInstanceName()) - { - if (eventSetter.bindingTarget->instanceName == GlobalStringKey::Empty) - { - auto name = GlobalStringKey::Get(L"" + itow(env->scope->referenceValues.Count())); - eventSetter.bindingTarget->instanceName = name; - } - - auto name = eventSetter.bindingTarget->instanceName; - auto value = eventSetter.propertyValue.instanceValue; - if (!env->scope->referenceValues.Keys().Contains(eventSetter.bindingTarget->instanceName)) - { - env->scope->referenceValues.Add(name, value); - } - } - - if (!success || !eventSetter.binder->AttachEvent(env, eventSetter.loader, eventSetter.bindingTarget->instanceName, propertyValue)) - { - env->scope->errors.Add( - L"Failed to attach event \"" + - propertyValue.propertyName.ToString() + - L"\" of type \"" + - propertyValue.instanceValue.GetTypeDescriptor()->GetTypeName() + - L"\" with the handler \"" + - propertyValue.propertyValue.GetText() + - L"\" using event binding \"" + - eventSetter.binder->GetBindingName().ToString() + - L"\"."); - } - } - else if (auto group = createdInstance.GetTypeDescriptor()->GetMethodGroupByName(eventSetter.handlerName, true)) - { - // find a correct method - vint count = group->GetMethodCount(); - IMethodInfo* selectedMethod = 0; - for (vint i = 0; i < count; i++) - { - auto method = group->GetMethod(i); - if (method->GetParameterCount() != 2) goto UNSUPPORTED; - - { - auto returnType = method->GetReturn(); - auto senderType = method->GetParameter(0)->GetType(); - auto argumentType = method->GetParameter(1)->GetType(); - - if (returnType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (returnType->GetTypeDescriptor() != description::GetTypeDescriptor()) goto UNSUPPORTED; - - if (senderType->GetDecorator() != ITypeInfo::RawPtr) goto UNSUPPORTED; - senderType = senderType->GetElementType(); - if (senderType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (senderType->GetTypeDescriptor() != description::GetTypeDescriptor()) goto UNSUPPORTED; - - if (argumentType->GetDecorator() != ITypeInfo::RawPtr) goto UNSUPPORTED; - argumentType = argumentType->GetElementType(); - if (argumentType->GetDecorator() != ITypeInfo::TypeDescriptor) goto UNSUPPORTED; - if (argumentType->GetTypeDescriptor() != eventSetter.eventInfo->argumentType) goto UNSUPPORTED; - - selectedMethod = method; - break; - } - - UNSUPPORTED: - continue; - } - - if (selectedMethod) - { - Value proxy = selectedMethod->CreateFunctionProxy(createdInstance); - if (!proxy.IsNull()) - { - auto propertyValue = eventSetter.propertyValue; - propertyValue.propertyValue = proxy; - eventSetter.loader->SetEventValue(propertyValue); - } - } - else - { - env->scope->errors.Add( - L"Event handler \"" + - eventSetter.handlerName + - L"\" exists but the type does not match the event \"" + - eventSetter.propertyValue.propertyName.ToString() + - L"\" of \"" + - env->context->instance->typeName.ToString() + - L"\"."); - } - } - else - { - env->scope->errors.Add( - L"Failed to find event handler \"" + - eventSetter.handlerName + - L"\" when setting event \"" + - eventSetter.propertyValue.propertyName.ToString() + - L"\" of \"" + - env->context->instance->typeName.ToString() + - L"\"."); - } - } -#endif - } - -/*********************************************************************** -LoadInstance -***********************************************************************/ - - Ptr LoadInstanceFromContext( - Ptr context, - Ptr resolver, - description::ITypeDescriptor* expectedType - ) - { - Ptr env = new GuiInstanceEnvironment(context, resolver); - List bindingSetters; - List eventSetters; - Value instance = CreateInstance(env, context->instance.Obj(), expectedType, env->scope->typeName, bindingSetters, eventSetters, true); - - if (!instance.IsNull()) - { - ExecuteBindingSetters(env, bindingSetters); - ExecuteEventSetters(instance, env, eventSetters); - return env->scope; - } - return 0; - } - - Ptr LoadInstance( - Ptr resource, - const WString& instancePath, - description::ITypeDescriptor* expectedType - ) - { - Ptr context=resource->GetValueByPath(instancePath).Cast(); - if (context) - { - Ptr resolver = new GuiResourcePathResolver(resource, resource->GetWorkingDirectory()); - return LoadInstanceFromContext(context, resolver, expectedType); - } - return 0; - } - -/*********************************************************************** -InitializeInstance -***********************************************************************/ - - void InitializeInstanceFromConstructor( - Ptr env, - GuiConstructorRepr* ctor, - IGuiInstanceLoader* instanceLoader, - GlobalStringKey typeName, - description::Value instance, - bool deserialized, - List& bindingSetters, - List& eventSetters - ) - { - // fill all attributes - FillInstance(instance, env, ctor, instanceLoader, deserialized, typeName, bindingSetters, eventSetters); - - if (ctor->instanceName != GlobalStringKey::Empty) - { - if (env->scope->referenceValues.Keys().Contains(ctor->instanceName)) - { - env->scope->errors.Add(L"Parameter \"" + ctor->instanceName.ToString() + L"\" conflict with an existing named object."); - } - else - { - env->scope->referenceValues.Add(ctor->instanceName, instance); - } - } - } - - Ptr InitializeInstanceFromContext( - Ptr context, - Ptr resolver, - description::Value instance - ) - { - List bindingSetters; - List eventSetters; - - // search for a correct loader - GuiConstructorRepr* ctor = context->instance.Obj(); - Ptr env = new GuiInstanceEnvironment(context, resolver); - InstanceLoadingSource source = FindInstanceLoadingSource(env->context, ctor); - - // initialize the instance - if(source.loader) - { - env->scope->rootInstance = instance; - ExecuteParameters(env); - InitializeInstanceFromConstructor(env, ctor, source.loader, source.typeName, instance, false, bindingSetters, eventSetters); - ExecuteBindingSetters(env, bindingSetters); - ExecuteEventSetters(instance, env, eventSetters); - return env->scope; - } - return 0; - } - - Ptr InitializeInstance( - Ptr resource, - const WString& instancePath, - description::Value instance - ) - { - if (instance.GetRawPtr()) - { - Ptr context=resource->GetValueByPath(instancePath).Cast(); - if (context) - { - Ptr resolver = new GuiResourcePathResolver(resource, resource->GetWorkingDirectory()); - return InitializeInstanceFromContext(context, resolver, instance); - } - } - return 0; - } - } -} - -/*********************************************************************** -GUIINSTANCELOADER_LOG.CPP -***********************************************************************/ - -namespace vl -{ - namespace presentation - { - using namespace collections; - using namespace reflection::description; - -/*********************************************************************** -LogInstanceLoaderManager_GetParentTypes -***********************************************************************/ - - void LogInstanceLoaderManager_GetParentTypes(const WString& typeName, List& parentTypes) - { - if (ITypeDescriptor* type = GetGlobalTypeManager()->GetTypeDescriptor(typeName)) - { - vint parentCount = type->GetBaseTypeDescriptorCount(); - for (vint j = 0; j < parentCount; j++) - { - ITypeDescriptor* parent = type->GetBaseTypeDescriptor(j); - parentTypes.Add(parent->GetTypeName()); - } - } - else - { - parentTypes.Add(GetInstanceLoaderManager()->GetParentTypeForVirtualType(GlobalStringKey::Get(typeName)).ToString()); - } - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintParentTypes -***********************************************************************/ - - void LogInstanceLoaderManager_PrintParentTypes(stream::TextWriter& writer, const WString& typeName) - { - List parentTypes; - LogInstanceLoaderManager_GetParentTypes(typeName, parentTypes); - FOREACH_INDEXER(WString, parentType, index, parentTypes) - { - writer.WriteLine(L" " + WString(index == 0 ? L": " : L", ") + parentType); - } - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintFieldName -***********************************************************************/ - - void LogInstanceLoaderManager_PrintFieldName(stream::TextWriter& writer, const WString& name) - { - writer.WriteString(L" " + name); - for (vint i = name.Length(); i < 24; i++) - { - writer.WriteChar(L' '); - } - writer.WriteString(L" : "); - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintProperties -***********************************************************************/ - - void LogInstanceLoaderManager_PrintProperties(stream::TextWriter& writer, const WString& typeName) - { - List loaders; - { - IGuiInstanceLoader* loader = GetInstanceLoaderManager()->GetLoader(GlobalStringKey::Get(typeName)); - while (loader) - { - loaders.Add(loader); - loader = GetInstanceLoaderManager()->GetParentLoader(loader); - } - } - - IGuiInstanceLoader::TypeInfo typeInfo(GlobalStringKey::Get(typeName), GetInstanceLoaderManager()->GetTypeDescriptorForType(GlobalStringKey::Get(typeName))); - Dictionary propertyLoaders; - FOREACH(IGuiInstanceLoader*, loader, loaders) - { - List propertyNames; - loader->GetPropertyNames(typeInfo, propertyNames); - - FOREACH(GlobalStringKey, propertyName, propertyNames) - { - if (!propertyLoaders.Keys().Contains(propertyName)) - { - propertyLoaders.Add(propertyName, loader); - } - } - } - - FOREACH_INDEXER(GlobalStringKey, propertyName, index, propertyLoaders.Keys()) - { - SortedList acceptableTypes; - Ptr firstInfo; - IGuiInstanceLoader* loader = propertyLoaders.Values()[index]; - IGuiInstanceLoader::PropertyInfo propertyInfo(typeInfo, propertyName); - - while (loader) - { - if (auto info = loader->GetPropertyType(propertyInfo)) - { - if (firstInfo) - { - if (info->support != firstInfo->support) - { - break; - } - } - else - { - firstInfo = info; - } - - if (info->support!=GuiInstancePropertyInfo::NotSupport) - { - FOREACH(ITypeDescriptor*, type, info->acceptableTypes) - { - if (!acceptableTypes.Contains(type->GetTypeName())) - { - acceptableTypes.Add(type->GetTypeName()); - } - } - - if (!info->tryParent) - { - break; - } - } - else - { - break; - } - } - - vint index = loaders.IndexOf(loader); - loader = index == loaders.Count() - 1 ? 0 : loaders[index + 1]; - } - - if (firstInfo->support == GuiInstancePropertyInfo::NotSupport) - { - continue; - } - - LogInstanceLoaderManager_PrintFieldName(writer, (propertyName == GlobalStringKey::Empty? L"" : propertyName.ToString())); - switch (firstInfo->scope) - { - case GuiInstancePropertyInfo::ViewModel: - writer.WriteString(L"#"); - break; - case GuiInstancePropertyInfo::Constructor: - writer.WriteString(firstInfo->required ? L"+" : L"*"); - break; - case GuiInstancePropertyInfo::Property: - writer.WriteString(L" "); - break; - } - switch (firstInfo->support) - { - case GuiInstancePropertyInfo::SupportAssign: - writer.WriteString(L"[assign] "); - break; - case GuiInstancePropertyInfo::SupportCollection: - writer.WriteString(L"[collection] "); - break; - case GuiInstancePropertyInfo::SupportArray: - writer.WriteString(L"[array] "); - break; - case GuiInstancePropertyInfo::SupportSet: - writer.WriteString(L"[set] "); - break; - default:; - } - - switch (acceptableTypes.Count()) - { - case 0: - writer.WriteLine(L""); - break; - case 1: - writer.WriteLine(acceptableTypes[0]); - break; - default: - writer.WriteLine(L"{"); - FOREACH(WString, typeName, acceptableTypes) - { - writer.WriteLine(L" " + typeName + L","); - } - writer.WriteLine(L" }"); - } - } - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintProperties -***********************************************************************/ - - void LogInstanceLoaderManager_PrintEvents(stream::TextWriter& writer, const WString& typeName) - { - List loaders; - { - IGuiInstanceLoader* loader = GetInstanceLoaderManager()->GetLoader(GlobalStringKey::Get(typeName)); - while (loader) - { - loaders.Add(loader); - loader = GetInstanceLoaderManager()->GetParentLoader(loader); - } - } - - IGuiInstanceLoader::TypeInfo typeInfo(GlobalStringKey::Get(typeName), GetInstanceLoaderManager()->GetTypeDescriptorForType(GlobalStringKey::Get(typeName))); - Dictionary eventLoaders; - FOREACH(IGuiInstanceLoader*, loader, loaders) - { - List eventNames; - loader->GetEventNames(typeInfo, eventNames); - - FOREACH(GlobalStringKey, eventName, eventNames) - { - if (!eventLoaders.Keys().Contains(eventName)) - { - eventLoaders.Add(eventName, loader); - } - } - } - - FOREACH_INDEXER(GlobalStringKey, eventName, index, eventLoaders.Keys()) - { - IGuiInstanceLoader* loader = eventLoaders.Values()[index]; - IGuiInstanceLoader::PropertyInfo propertyInfo(typeInfo, eventName); - auto info = loader->GetEventType(propertyInfo); - if (info->support == GuiInstanceEventInfo::NotSupport) - { - continue; - } - - LogInstanceLoaderManager_PrintFieldName(writer, eventName.ToString()); - writer.WriteString(L" [event] "); - writer.WriteLine(info->argumentType->GetTypeName()); - } - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintSerializableType -***********************************************************************/ - - void LogInstanceLoaderManager_PrintSerializableType(stream::TextWriter& writer, const WString& typeName) - { - if (ITypeDescriptor* type = GetGlobalTypeManager()->GetTypeDescriptor(typeName)) - { - if (IValueSerializer* serializer = type->GetValueSerializer()) - { - if (serializer->HasCandidate()) - { - if (serializer->CanMergeCandidate()) - { - writer.WriteLine(L" enum " + typeName + L" = {" + serializer->GetDefaultText() + L"}"); - } - else - { - writer.WriteLine(L" flags " + typeName + L" = {" + serializer->GetDefaultText() + L"}"); - } - - writer.WriteLine(L" {"); - vint count = serializer->GetCandidateCount(); - for (vint i = 0; i < count; i++) - { - writer.WriteLine(L" " + serializer->GetCandidate(i) + L","); - } - writer.WriteLine(L" }"); - return; - } - else if (type->GetPropertyCount() > 0) - { - writer.WriteLine(L" struct "+ typeName + + L" = {" + serializer->GetDefaultText() + L"}"); - writer.WriteLine(L" {"); - vint count = type->GetPropertyCount(); - for (vint i = 0; i < count; i++) - { - IPropertyInfo* prop = type->GetProperty(i); - LogInstanceLoaderManager_PrintFieldName(writer, prop->GetName()); - writer.WriteLine(prop->GetReturn()->GetTypeFriendlyName() + L";"); - } - writer.WriteLine(L" }"); - return; - } - else - { - writer.WriteLine(L" data "+ typeName + + L" = {" + serializer->GetDefaultText() + L"}"); - return; - } - } - } - writer.WriteLine(L" serializable " + typeName); - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintConstructableType -***********************************************************************/ - - void LogInstanceLoaderManager_PrintConstructableType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" class " + typeName); - LogInstanceLoaderManager_PrintParentTypes(writer, typeName); - writer.WriteLine(L" {"); - LogInstanceLoaderManager_PrintProperties(writer, typeName); - LogInstanceLoaderManager_PrintEvents(writer, typeName); - writer.WriteLine(L" }"); - } - -/*********************************************************************** -LogInstanceLoaderManager_PrintUnconstructableParentType -***********************************************************************/ - - void LogInstanceLoaderManager_PrintUnconstructableParentType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" abstract class " + typeName); - LogInstanceLoaderManager_PrintParentTypes(writer, typeName); - writer.WriteLine(L" {"); - writer.WriteLine(L" }"); - } - -/*********************************************************************** -LogInstanceLoaderManager_Others -***********************************************************************/ - - void LogInstanceLoaderManager_PrintVirtualizedType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" abstract class " + typeName); - } - - void LogInstanceLoaderManager_PrintUnconstructableType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" abstract class " + typeName); - } - - void LogInstanceLoaderManager_PrintInterfaceType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" interface " + typeName); - } - - void LogInstanceLoaderManager_PrintInterfaceConstructableType(stream::TextWriter& writer, const WString& typeName) - { - writer.WriteLine(L" interface " + typeName); - } - -/*********************************************************************** -LogInstanceLoaderManager -***********************************************************************/ - - void LogInstanceLoaderManager(stream::TextWriter& writer) - { - SortedList allTypes, virtualizedTypes; - Group typeParents, typeChildren; - - // collect types - { - vint typeCount = GetGlobalTypeManager()->GetTypeDescriptorCount(); - for (vint i = 0; i < typeCount; i++) - { - ITypeDescriptor* type = GetGlobalTypeManager()->GetTypeDescriptor(i); - allTypes.Add(type->GetTypeName()); - - vint parentCount = type->GetBaseTypeDescriptorCount(); - for (vint j = 0; j < parentCount; j++) - { - ITypeDescriptor* parent = type->GetBaseTypeDescriptor(j); - typeParents.Add(type->GetTypeName(), parent->GetTypeName()); - typeChildren.Add(parent->GetTypeName(), type->GetTypeName()); - } - } - - List virtualTypes; - GetInstanceLoaderManager()->GetVirtualTypes(virtualTypes); - FOREACH(GlobalStringKey, typeName, virtualTypes) - { - GlobalStringKey parentType = GetInstanceLoaderManager()->GetParentTypeForVirtualType(typeName); - if (description::GetTypeDescriptor(parentType.ToString()) && !virtualizedTypes.Contains(parentType.ToString())) - { - virtualizedTypes.Add(parentType.ToString()); - } - allTypes.Add(typeName.ToString()); - typeParents.Add(typeName.ToString(), parentType.ToString()); - typeChildren.Add(parentType.ToString(), typeName.ToString()); - } - } - - // sort types - List sortedTypes; - { - FOREACH(WString, typeName, allTypes) - { - if (!typeParents.Contains(typeName)) - { - sortedTypes.Add(typeName); - } - } - - for (vint i = 0; i < sortedTypes.Count(); i++) - { - WString selectedType = sortedTypes[i]; - vint index = typeChildren.Keys().IndexOf(selectedType); - if (index != -1) - { - FOREACH(WString, childType, typeChildren.GetByIndex(index)) - { - typeParents.Remove(childType, selectedType); - if (!typeParents.Contains(childType)) - { - sortedTypes.Add(childType); - } - } - typeChildren.Remove(selectedType); - } - } - } - - // categorize types - List serializableTypes; - List constructableTypes; - List unconstructableParentTypes; - List unconstructableTypes; - List interfaceTypes; - List interfaceConstructableTypes; - { - FOREACH(WString, typeName, sortedTypes) - { - auto typeKey = GlobalStringKey::Get(typeName); - auto typeDescriptor = GetInstanceLoaderManager()->GetTypeDescriptorForType(typeKey); - IGuiInstanceLoader::TypeInfo typeInfo(typeKey, typeDescriptor); - - auto loader = GetInstanceLoaderManager()->GetLoader(typeKey); - while (loader) - { - if (loader->IsDeserializable(typeInfo)) - { - serializableTypes.Add(typeName); - break; - } - else if (loader->IsCreatable(typeInfo)) - { - constructableTypes.Add(typeName); - break; - } - else - { - loader = GetInstanceLoaderManager()->GetParentLoader(loader); - } - } - if (!loader && !virtualizedTypes.Contains(typeName)) - { - bool acceptProxy = false; - if (typeDescriptor->GetTypeName() == typeName && IsInterfaceType(typeDescriptor, acceptProxy)) - { - if (acceptProxy) - { - interfaceConstructableTypes.Add(typeName); - } - else - { - interfaceTypes.Add(typeName); - } - } - else - { - unconstructableTypes.Add(typeName); - } - } - } - - List parentTypes; - FOREACH(WString, typeName, constructableTypes) - { - parentTypes.Add(typeName); - } - for (vint i = 0; i < parentTypes.Count(); i++) - { - LogInstanceLoaderManager_GetParentTypes(parentTypes[i], parentTypes); - } - - for (vint i = unconstructableTypes.Count() - 1; i >= 0; i--) - { - WString selectedType = unconstructableTypes[i]; - if (parentTypes.Contains(selectedType)) - { - unconstructableTypes.RemoveAt(i); - unconstructableParentTypes.Insert(0, selectedType); - } - } - } - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Serializable Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, serializableTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintSerializableType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Constructable Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, constructableTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintConstructableType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Unconstructable Parent Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, unconstructableParentTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintUnconstructableParentType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Unconstructable Virtualized Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, virtualizedTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintVirtualizedType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Unconstructable Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, unconstructableTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintUnconstructableType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Interface Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, interfaceTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintInterfaceType(writer, typeName); - } - writer.WriteLine(L""); - - writer.WriteLine(L"/***********************************************************************"); - writer.WriteLine(L"Interface Constructable Types"); - writer.WriteLine(L"***********************************************************************/"); - FOREACH(WString, typeName, interfaceConstructableTypes) - { - writer.WriteLine(L""); - LogInstanceLoaderManager_PrintInterfaceConstructableType(writer, typeName); - } - writer.WriteLine(L""); - } - } -} - /*********************************************************************** GUIINSTANCELOADER_PREDEFINEDINSTANCEBINDERS.CPP ***********************************************************************/ @@ -3191,49 +1026,10 @@ namespace vl using namespace controls; /*********************************************************************** -GuiTextInstanceBinderBase +GuiResourceInstanceBinder (uri) ***********************************************************************/ - class GuiTextInstanceBinderBase : public Object, public IGuiInstanceBinder - { - protected: - ITypeDescriptor* stringTypeDescriptor; - public: - GuiTextInstanceBinderBase() - :stringTypeDescriptor(description::GetTypeDescriptor()) - { - } - - bool ApplicableToConstructorArgument()override - { - return false; - } - - bool RequireInstanceName()override - { - return false; - } - - void GetRequiredContexts(collections::List& contextNames)override - { - } - - void GetExpectedValueTypes(collections::List& expectedTypes)override - { - expectedTypes.Add(stringTypeDescriptor); - } - - description::Value GetValue(Ptr env, const description::Value& propertyValue)override - { - return Value(); - } - }; - -/*********************************************************************** -GuiResourceInstanceBinder -***********************************************************************/ - - class GuiResourceInstanceBinder : public GuiTextInstanceBinderBase + class GuiResourceInstanceBinder : public Object, public IGuiInstanceBinder { public: GlobalStringKey GetBindingName()override @@ -3241,54 +1037,31 @@ GuiResourceInstanceBinder return GlobalStringKey::_Uri; } - bool SetPropertyValue(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue)override + bool ApplicableToConstructorArgument()override { - if (propertyValue.propertyValue.GetValueType() == Value::Text) - { - WString protocol, path; - if (IsResourceUrl(propertyValue.propertyValue.GetText(), protocol, path)) - { - if(Ptr resource=env->resolver->ResolveResource(protocol, path)) - { - Value value; - if(Ptr text=resource.Cast()) - { - value=Value::From(text->GetText(), stringTypeDescriptor); - } - else if(Ptr obj=resource.Cast()) - { - if (auto image = obj.Cast()) - { - auto td = propertyValue.typeInfo.typeDescriptor; - if (auto prop = td->GetPropertyByName(propertyValue.propertyName.ToString(), true)) - { - if (prop->GetReturn() && prop->GetReturn()->GetTypeDescriptor()->GetTypeName() == L"presentation::INativeImage") - { - obj = image->GetImage(); - } - } - } - value = Value::From(obj); - } - - if(!value.IsNull()) - { - IGuiInstanceLoader::PropertyValue newValue = propertyValue; - newValue.propertyValue = value; - return loader->SetPropertyValue(newValue); - } - } - } - } return false; } + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors)override + { + WString protocol, path; + if (!IsResourceUrl(code, protocol, path)) + { + errors.Add(L"Precompile: \"" + code + L"\" is not a valid resource uri."); + return 0; + } + else + { + return Workflow_InstallUriProperty(variableName, propertyInfo, protocol, path); + } + } }; /*********************************************************************** -GuiReferenceInstanceBinder +GuiReferenceInstanceBinder (ref) ***********************************************************************/ - class GuiReferenceInstanceBinder : public GuiTextInstanceBinderBase + class GuiReferenceInstanceBinder : public Object, public IGuiInstanceBinder { public: GlobalStringKey GetBindingName()override @@ -3296,167 +1069,24 @@ GuiReferenceInstanceBinder return GlobalStringKey::_Ref; } - bool SetPropertyValue(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue)override + bool ApplicableToConstructorArgument()override { - if (propertyValue.propertyValue.GetValueType() == Value::Text) - { - GlobalStringKey name = GlobalStringKey::Get(propertyValue.propertyValue.GetText()); - vint index = env->scope->referenceValues.Keys().IndexOf(name); - if (index != -1) - { - IGuiInstanceLoader::PropertyValue newValue = propertyValue; - newValue.propertyValue = env->scope->referenceValues.Values()[index]; - if (!newValue.propertyValue.IsNull()) - { - return loader->SetPropertyValue(newValue); - } - } - } return false; } - }; - -/*********************************************************************** -GuiWorkflowGlobalContext -***********************************************************************/ - - class GuiWorkflowGlobalContext : public Object, public IGuiInstanceBindingContext - { - public: - List dataBindings; - Ptr globalContext; - - GuiWorkflowGlobalContext() + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors)override { - } - - GlobalStringKey GetContextName()override - { - return GuiWorkflowCache::CacheContextName; - } - - void Initialize(Ptr env)override - { - Ptr assembly; - vint cacheIndex = env->context->precompiledCaches.Keys().IndexOf(GetContextName()); - if (cacheIndex != -1) - { - assembly = env->context->precompiledCaches.Values()[cacheIndex].Cast()->assembly; - } - else - { - types::VariableTypeMap types; - ITypeDescriptor* thisType = env->scope->rootInstance.GetTypeDescriptor(); - Workflow_GetVariableTypes(env, types); - assembly = Workflow_CompileDataBinding(env->context, types, thisType, env->scope->errors, dataBindings); - env->context->precompiledCaches.Add(GetContextName(), new GuiWorkflowCache(assembly)); - } - - if (assembly) - { - globalContext = new WfRuntimeGlobalContext(assembly); - - try - { - LoadFunction(globalContext, L"")(); - } - catch (const TypeDescriptorException& ex) - { - env->scope->errors.Add(L"Workflow Script Exception: " + ex.Message()); - } - - Workflow_SetVariablesForReferenceValues(globalContext, env); - { - vint index = assembly->variableNames.IndexOf(L""); - globalContext->globalVariables->variables[index] = env->scope->rootInstance; - } - - try - { - LoadFunction(globalContext, L"")(); - } - catch (const TypeDescriptorException& ex) - { - env->scope->errors.Add(L"Workflow Script Exception: " + ex.Message()); - } - } + auto expression = MakePtr(); + expression->name.value = code; + return Workflow_InstallEvalProperty(variableName, propertyInfo, expression); } }; /*********************************************************************** -GuiScriptInstanceBinder +GuiEvalInstanceBinder (eval) ***********************************************************************/ - class GuiScriptInstanceBinder : public GuiTextInstanceBinderBase - { - public: - virtual WString TranslateExpression(const WString& input) = 0; - - bool RequireInstanceName()override - { - return true; - } - - void GetRequiredContexts(collections::List& contextNames)override - { - contextNames.Add(GuiWorkflowCache::CacheContextName); - } - - bool SetPropertyValue(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue)override - { - auto context = env->scope->bindingContexts[GuiWorkflowCache::CacheContextName].Cast(); - WorkflowDataBinding dataBinding; - dataBinding.variableName = instanceName; - - if (env->context->precompiledCaches.Keys().Contains(GuiWorkflowCache::CacheContextName)) - { - goto SUCCESS; - } - if (propertyValue.propertyValue.GetValueType() == Value::Text) - { - WString expressionCode = TranslateExpression(propertyValue.propertyValue.GetText()); - Ptr expression; - types::VariableTypeMap types; - Workflow_GetVariableTypes(env, types); - if (Workflow_ValidateExpression(env->context, types, env->scope->errors, propertyValue, expressionCode, expression)) - { - auto expr = expression; - if (auto bind = expr.Cast()) - { - bind->expandedExpression = 0; - expr = bind->expression; - } - if (auto format = expr.Cast()) - { - format->expandedExpression = 0; - } - - auto td = propertyValue.typeInfo.typeDescriptor; - auto propertyInfo = td->GetPropertyByName(propertyValue.propertyName.ToString(), true); - dataBinding.propertyInfo = propertyInfo; - dataBinding.bindExpression = expression; - goto SUCCESS; - } - else - { - goto FAILED; - } - } - - FAILED: - context->dataBindings.Add(dataBinding); - return false; - SUCCESS: - context->dataBindings.Add(dataBinding); - return true; - } - }; - -/*********************************************************************** -GuiEvalInstanceBinder -***********************************************************************/ - - class GuiEvalInstanceBinder : public GuiScriptInstanceBinder + class GuiEvalInstanceBinder : public Object, public IGuiInstanceBinder { public: GlobalStringKey GetBindingName()override @@ -3468,72 +1098,73 @@ GuiEvalInstanceBinder { return true; } - - description::Value GetValue(Ptr env, const description::Value& propertyValue)override + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors)override { - if (propertyValue.GetValueType() == Value::Text) + if (auto expression = Workflow_ParseExpression(code, errors)) { - Ptr assembly; - WString expressionCode = TranslateExpression(propertyValue.GetText()); - GlobalStringKey cacheKey = GlobalStringKey::Get(L"" + expressionCode); - vint cacheIndex = env->context->precompiledCaches.Keys().IndexOf(cacheKey); - if (cacheIndex != -1) - { - assembly = env->context->precompiledCaches.Values()[cacheIndex].Cast()->assembly; - } - else - { - types::VariableTypeMap types; - Workflow_GetVariableTypes(env, types); - assembly = Workflow_CompileExpression(env->context, types, env->scope->errors, expressionCode); - env->context->precompiledCaches.Add(cacheKey, new GuiWorkflowCache(assembly)); - } - - if (assembly) - { - auto globalContext = MakePtr(assembly); - - try - { - LoadFunction(globalContext, L"")(); - } - catch (const TypeDescriptorException& ex) - { - env->scope->errors.Add(L"Workflow Script Exception: " + ex.Message()); - } - - Workflow_SetVariablesForReferenceValues(globalContext, env); - vint variableIndex = assembly->variableNames.IndexOf(L""); - auto variable = globalContext->globalVariables->variables[variableIndex]; - auto proxy = UnboxValue>(variable); - - Value translated; - try - { - translated = proxy->Invoke(IValueList::Create()); - } - catch (const TypeDescriptorException& ex) - { - env->scope->errors.Add(L"Workflow Script Exception: " + ex.Message()); - } - - // the global context contains a closure variable which captured the context - // clear all variables to break the circle references - globalContext->globalVariables = 0; - return translated; - } + return Workflow_InstallEvalProperty(variableName, propertyInfo, expression); } - return Value(); - } - - WString TranslateExpression(const WString& input)override - { - return input; + return 0; } }; /*********************************************************************** -GuiEvalInstanceEventBinder +GuiBindInstanceBinder (bind) +***********************************************************************/ + + class GuiBindInstanceBinder : public Object, public IGuiInstanceBinder + { + public: + GlobalStringKey GetBindingName()override + { + return GlobalStringKey::_Bind; + } + + bool ApplicableToConstructorArgument()override + { + return false; + } + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors)override + { + if (auto expression = Workflow_ParseExpression(L"bind(" + code + L")", errors)) + { + return Workflow_InstallBindProperty(variableName, propertyInfo, expression); + } + return 0; + } + }; + +/*********************************************************************** +GuiFormatInstanceBinder (format) +***********************************************************************/ + + class GuiFormatInstanceBinder : public Object, public IGuiInstanceBinder + { + public: + GlobalStringKey GetBindingName()override + { + return GlobalStringKey::_Format; + } + + bool ApplicableToConstructorArgument()override + { + return false; + } + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors)override + { + if (auto expression = Workflow_ParseExpression(L"bind($\"" + code + L"\")", errors)) + { + return Workflow_InstallBindProperty(variableName, propertyInfo, expression); + } + return 0; + } + }; + +/*********************************************************************** +GuiEvalInstanceEventBinder (eval) ***********************************************************************/ class GuiEvalInstanceEventBinder : public Object, public IGuiInstanceEventBinder @@ -3543,95 +1174,14 @@ GuiEvalInstanceEventBinder { return GlobalStringKey::_Eval; } - - bool RequireInstanceName()override + + Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IEventInfo* eventInfo, const WString& code, collections::List& errors) { - return true; - } - - void GetRequiredContexts(collections::List& contextNames)override - { - } - - bool AttachEvent(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue) - { - auto handler = propertyValue.propertyValue; - if (handler.GetValueType() == Value::Text) + if (auto statement = Workflow_ParseStatement(code, errors)) { - Ptr assembly; - WString statementCode = handler.GetText(); - GlobalStringKey cacheKey = GlobalStringKey::Get(L"<" + instanceName.ToString() + L"><" + propertyValue.propertyName.ToString() + L">" + statementCode); - vint cacheIndex = env->context->precompiledCaches.Keys().IndexOf(cacheKey); - if (cacheIndex != -1) - { - assembly = env->context->precompiledCaches.Values()[cacheIndex].Cast()->assembly; - } - else - { - types::VariableTypeMap types; - Workflow_GetVariableTypes(env, types); - assembly = Workflow_CompileEventHandler(env->context, types, env->scope->errors, propertyValue, statementCode); - env->context->precompiledCaches.Add(cacheKey, new GuiWorkflowCache(assembly)); - } - - if (assembly) - { - auto globalContext = MakePtr(assembly); - - try - { - LoadFunction(globalContext, L"")(); - } - catch (const TypeDescriptorException& ex) - { - env->scope->errors.Add(L"Workflow Script Exception: " + ex.Message()); - } - - Workflow_SetVariablesForReferenceValues(globalContext, env); - auto eventHandler = LoadFunction(globalContext, L""); - handler = BoxValue(eventHandler); - - propertyValue.propertyValue = handler; - return loader->SetEventValue(propertyValue); - } + return Workflow_InstallEvalEvent(variableName, eventInfo, statement); } - return false; - } - }; - -/*********************************************************************** -GuiBindInstanceBinder -***********************************************************************/ - - class GuiBindInstanceBinder : public GuiScriptInstanceBinder - { - public: - GlobalStringKey GetBindingName()override - { - return GlobalStringKey::_Bind; - } - - WString TranslateExpression(const WString& input)override - { - return L"bind(" + input + L")"; - } - }; - -/*********************************************************************** -GuiFormatInstanceBinder -***********************************************************************/ - - class GuiFormatInstanceBinder : public GuiScriptInstanceBinder - { - public: - GlobalStringKey GetBindingName()override - { - return GlobalStringKey::_Format; - } - - WString TranslateExpression(const WString& input)override - { - return L"bind($\"" + input + L"\")"; + return 0; } }; @@ -3666,8 +1216,6 @@ GuiPredefinedInstanceBindersPlugin { IGuiInstanceLoaderManager* manager=GetInstanceLoaderManager(); - manager->AddInstanceBindingContextFactory(new GuiInstanceBindingContextFactory(GuiWorkflowCache::CacheContextName)); - manager->AddInstanceBinder(new GuiResourceInstanceBinder); manager->AddInstanceBinder(new GuiReferenceInstanceBinder); manager->AddInstanceBinder(new GuiEvalInstanceBinder); @@ -3685,2249 +1233,6 @@ GuiPredefinedInstanceBindersPlugin } } -/*********************************************************************** -GUIINSTANCELOADER_PREDEFINEDINSTANCELOADERS.CPP -***********************************************************************/ - -namespace vl -{ - namespace presentation - { - using namespace collections; - using namespace reflection::description; - using namespace controls; - using namespace compositions; - using namespace theme; - using namespace helper_types; - -#ifndef VCZH_DEBUG_NO_REFLECTION - -/*********************************************************************** -GuiVrtualTypeInstanceLoader -***********************************************************************/ - - class GuiTemplateControlInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - Func defaultConstructor; - Func)> templateConstructor; - public: - GuiTemplateControlInstanceLoader(const WString& _typeName, const Func& _defaultConstructor, const Func)>& _templateConstructor) - :typeName(GlobalStringKey::Get(_typeName)) - , defaultConstructor(_defaultConstructor) - , templateConstructor(_templateConstructor) - { - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeName == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(typeName==typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return defaultConstructor(); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return templateConstructor(factory); - } - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return 0; - } - }; - -/*********************************************************************** -GuiControlInstanceLoader -***********************************************************************/ - - class GuiControlInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiControlInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - auto info = GuiInstancePropertyInfo::Collection(); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - if (propertyInfo.typeInfo.typeDescriptor->CanConvertTo(description::GetTypeDescriptor())) - { - info->acceptableTypes.Add(description::GetTypeDescriptor()); - } - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto component = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->AddComponent(component); - return true; - } - else if (auto controlHost = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->AddComponent(new GuiObjectComponent(controlHost)); - return true; - } - } - } - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->AddChild(control); - return true; - } - else if (auto composition = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetContainerComposition()->AddChild(composition); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiTabInstanceLoader -***********************************************************************/ - - class GuiTabInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiTabInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(g::NewTab()); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiTab(new GuiTabTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto tabPage = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->CreatePage(tabPage); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiTabPageInstanceLoader -***********************************************************************/ - - class GuiTabPageInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiTabPageInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - auto info = GuiInstancePropertyInfo::Collection(); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetContainerComposition()->AddChild(control->GetBoundsComposition()); - return true; - } - else if (auto composition = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetContainerComposition()->AddChild(composition); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiToolstripMenuInstanceLoader -***********************************************************************/ - - class GuiToolstripMenuInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiToolstripMenuInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(g::NewMenu(0)); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiToolstripMenu(new GuiMenuTemplate_StyleProvider(factory), 0)); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetToolstripItems().Add(control); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiToolstripMenuBarInstanceLoader -***********************************************************************/ - - class GuiToolstripMenuBarInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiToolstripMenuBarInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(new GuiToolstripMenuBar(GetCurrentTheme()->CreateMenuBarStyle())); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiToolstripMenuBar(new GuiControlTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetToolstripItems().Add(control); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiToolstripToolBarInstanceLoader -***********************************************************************/ - - class GuiToolstripToolBarInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiToolstripToolBarInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(new GuiToolstripToolBar(GetCurrentTheme()->CreateToolBarStyle())); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiToolstripToolBar(new GuiControlTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetToolstripItems().Add(control); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiToolstripButtonInstanceLoader -***********************************************************************/ - - class GuiToolstripButtonInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _SubMenu; - - public: - GuiToolstripButtonInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _SubMenu = GlobalStringKey::Get(L"SubMenu"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(g::NewToolBarButton()); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiToolstripButton(new GuiToolstripButtonTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_SubMenu); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _SubMenu) - { - return GuiInstancePropertyInfo::Set(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool GetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _SubMenu) - { - if (!container->GetToolstripSubMenu()) - { - container->CreateToolstripSubMenu(); - } - propertyValue.propertyValue = Value::From(container->GetToolstripSubMenu()); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiSelectableListControlInstanceLoader -***********************************************************************/ - - class GuiSelectableListControlInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiSelectableListControlInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ItemTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::_ItemTemplate) - { - auto factory = CreateTemplateFactory(propertyValue.propertyValue.GetText()); - auto styleProvider = new GuiListItemTemplate_ItemStyleProvider(factory); - container->SetStyleProvider(styleProvider); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiVirtualTreeViewInstanceLoader -***********************************************************************/ - - class GuiVirtualTreeViewInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiVirtualTreeViewInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ItemTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::_ItemTemplate) - { - auto factory = CreateTemplateFactory(propertyValue.propertyValue.GetText()); - auto styleProvider = new GuiTreeItemTemplate_ItemStyleProvider(factory); - container->SetNodeStyleProvider(styleProvider); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiListViewInstanceLoader -***********************************************************************/ - - class GuiListViewInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - bool bindable; - GlobalStringKey typeName; - GlobalStringKey _View, _IconSize, _ItemSource; - - public: - GuiListViewInstanceLoader(bool _bindable) - :bindable(_bindable) - { - if (bindable) - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - else - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - _View = GlobalStringKey::Get(L"View"); - _IconSize = GlobalStringKey::Get(L"IconSize"); - _ItemSource = GlobalStringKey::Get(L"ItemSource"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - Ptr itemSource; - ListViewViewType viewType = ListViewViewType::Detail; - GuiListViewBase::IStyleProvider* styleProvider = 0; - Size iconSize; - { - vint indexItemSource = constructorArguments.Keys().IndexOf(_ItemSource); - if (indexItemSource != -1) - { - itemSource = UnboxValue>(constructorArguments.GetByIndex(indexItemSource)[0]); - } - else if (bindable) - { - return Value(); - } - - vint indexView = constructorArguments.Keys().IndexOf(_View); - if (indexView != -1) - { - viewType = UnboxValue(constructorArguments.GetByIndex(indexView)[0]); - } - - vint indexIconSize = constructorArguments.Keys().IndexOf(_IconSize); - if (indexIconSize != -1) - { - iconSize = UnboxValue(constructorArguments.GetByIndex(indexIconSize)[0]); - } - - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - styleProvider = GetCurrentTheme()->CreateListViewStyle(); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - styleProvider = new GuiListViewTemplate_StyleProvider(factory); - } - } - - GuiVirtualListView* listView = 0; - if (bindable) - { - listView = new GuiBindableListView(styleProvider, itemSource); - } - else - { - listView = new GuiListView(styleProvider); - } - switch (viewType) - { -#define VIEW_TYPE_CASE(NAME)\ - case ListViewViewType::NAME:\ - if (iconSize == Size())\ - {\ - listView->ChangeItemStyle(new list::ListView##NAME##ContentProvider);\ - }\ - else\ - {\ - listView->ChangeItemStyle(new list::ListView##NAME##ContentProvider(iconSize, false));\ - }\ - break;\ - - VIEW_TYPE_CASE(BigIcon) - VIEW_TYPE_CASE(SmallIcon) - VIEW_TYPE_CASE(List) - VIEW_TYPE_CASE(Tile) - VIEW_TYPE_CASE(Information) - VIEW_TYPE_CASE(Detail) - -#undef VIEW_TYPE_CASE - } - - return Value::From(listView); - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - propertyNames.Add(_View); - propertyNames.Add(_IconSize); - if (bindable) - { - propertyNames.Add(_ItemSource); - } - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _View) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _IconSize) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _ItemSource) - { - if (bindable) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; - return info; - } - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiTreeViewInstanceLoader -***********************************************************************/ - - class GuiTreeViewInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - bool bindable; - GlobalStringKey typeName; - GlobalStringKey _IconSize, _ItemSource, _Nodes; - - public: - GuiTreeViewInstanceLoader(bool _bindable) - :bindable(_bindable) - { - if (bindable) - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - else - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - _IconSize = GlobalStringKey::Get(L"IconSize"); - _ItemSource = GlobalStringKey::Get(L"ItemSource"); - _Nodes = GlobalStringKey::Get(L"Nodes"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexItemSource = constructorArguments.Keys().IndexOf(_ItemSource); - GuiVirtualTreeView::IStyleProvider* styleProvider = 0; - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - styleProvider = GetCurrentTheme()->CreateTreeViewStyle(); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - styleProvider = new GuiTreeViewTemplate_StyleProvider(factory); - } - } - - GuiVirtualTreeView* treeView = 0; - if (bindable) - { - if (indexItemSource == -1) - { - return Value(); - } - - auto itemSource = constructorArguments.GetByIndex(indexItemSource)[0]; - treeView = new GuiBindableTreeView(styleProvider, itemSource); - } - else - { - treeView = new GuiTreeView(styleProvider); - } - - vint indexIconSize = constructorArguments.Keys().IndexOf(_IconSize); - if (indexIconSize != -1) - { - auto iconSize = UnboxValue(constructorArguments.GetByIndex(indexIconSize)[0]); - treeView->SetNodeStyleProvider(new tree::TreeViewNodeItemStyleProvider(iconSize, false)); - } - - return Value::From(treeView); - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (!bindable) - { - propertyNames.Add(_Nodes); - } - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - propertyNames.Add(_IconSize); - if (bindable) - { - propertyNames.Add(_ItemSource); - } - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _Nodes) - { - if (!bindable) - { - return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); - } - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _ItemSource) - { - if (bindable) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; - return info; - } - } - else if (propertyInfo.propertyName == _IconSize) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _Nodes) - { - auto item = UnboxValue>(propertyValue.propertyValue); - container->Nodes()->Children().Add(item); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiComboBoxInstanceLoader -***********************************************************************/ - - class GuiComboBoxInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _ListControl; - - public: - GuiComboBoxInstanceLoader() - :typeName(GlobalStringKey::Get(L"presentation::controls::GuiComboBox")) - { - _ListControl = GlobalStringKey::Get(L"ListControl"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexListControl = constructorArguments.Keys().IndexOf(_ListControl); - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexListControl != -1) - { - Ptr factory; - if (indexControlTemplate != -1) - { - factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - } - - GuiComboBoxBase::IStyleController* styleController = 0; - if (factory) - { - styleController = new GuiComboBoxTemplate_StyleProvider(factory); - } - else - { - styleController = GetCurrentTheme()->CreateComboBoxStyle(); - } - - auto listControl = UnboxValue(constructorArguments.GetByIndex(indexListControl)[0]); - auto comboBox = new GuiComboBoxListControl(styleController, listControl); - return Value::From(comboBox); - } - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(_ListControl); - } - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - propertyNames.Add(_ListControl); - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _ListControl) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; - return info; - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiBindableTextListInstanceLoader -***********************************************************************/ - - class GuiBindableTextListInstanceLoader : public Object, public IGuiInstanceLoader - { - typedef Func ItemStyleProviderFactory; - protected: - GlobalStringKey typeName; - ItemStyleProviderFactory itemStyleProviderFactory; - GlobalStringKey _ItemSource; - - public: - GuiBindableTextListInstanceLoader(const WString& type, const ItemStyleProviderFactory& factory) - :typeName(GlobalStringKey::Get(L"presentation::controls::GuiBindable" + type + L"TextList")) - , itemStyleProviderFactory(factory) - { - _ItemSource = GlobalStringKey::Get(L"ItemSource"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexItemSource = constructorArguments.Keys().IndexOf(_ItemSource); - if (indexItemSource != -1) - { - GuiTextListTemplate_StyleProvider* styleProvider = 0; - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate != -1) - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - styleProvider = new GuiTextListTemplate_StyleProvider(factory); - } - } - - auto itemSource = UnboxValue>(constructorArguments.GetByIndex(indexItemSource)[0]); - GuiBindableTextList* control = 0; - if (styleProvider) - { - control = new GuiBindableTextList(styleProvider, styleProvider->CreateArgument(), itemSource); - } - else - { - control = new GuiBindableTextList(GetCurrentTheme()->CreateTextListStyle(), itemStyleProviderFactory(), itemSource); - } - return Value::From(control); - } - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - propertyNames.Add(_ItemSource); - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - if (propertyInfo.propertyName == _ItemSource) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiBindableDataColumnInstanceLoader -***********************************************************************/ - - class GuiBindableDataColumnInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _VisualizerTemplates; - GlobalStringKey _EditorTemplate; - - public: - GuiBindableDataColumnInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _VisualizerTemplates = GlobalStringKey::Get(L"VisualizerTemplates"); - _EditorTemplate = GlobalStringKey::Get(L"EditorTemplate"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_VisualizerTemplates); - propertyNames.Add(_EditorTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _VisualizerTemplates) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == _EditorTemplate) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _VisualizerTemplates) - { - List types; - SplitBySemicolon(propertyValue.propertyValue.GetText(), types); - Ptr factory; - FOREACH(WString, type, types) - { - auto templateFactory = CreateTemplateFactory(type); - if (factory) - { - factory = new GuiBindableDataVisualizer::DecoratedFactory(templateFactory, container, factory); - } - else - { - factory = new GuiBindableDataVisualizer::Factory(templateFactory, container); - } - } - - container->SetVisualizerFactory(factory); - return true; - } - else if (propertyValue.propertyName == _EditorTemplate) - { - auto templateFactory = CreateTemplateFactory(propertyValue.propertyValue.GetText()); - auto factory = new GuiBindableDataEditor::Factory(templateFactory, container); - container->SetEditorFactory(factory); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiBindableDataGridInstanceLoader -***********************************************************************/ - - class GuiBindableDataGridInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _ItemSource; - GlobalStringKey _ViewModelContext; - GlobalStringKey _Columns; - - public: - GuiBindableDataGridInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _ItemSource = GlobalStringKey::Get(L"ItemSource"); - _ViewModelContext = GlobalStringKey::Get(L"ViewModelContext"); - _Columns = GlobalStringKey::Get(L"Columns"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexItemSource = constructorArguments.Keys().IndexOf(_ItemSource); - if (indexItemSource == -1) - { - return Value(); - } - - GuiBindableDataGrid::IStyleProvider* styleProvider = 0; - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - styleProvider = GetCurrentTheme()->CreateListViewStyle(); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - styleProvider = new GuiListViewTemplate_StyleProvider(factory); - } - - auto itemSource = UnboxValue>(constructorArguments.GetByIndex(indexItemSource)[0]); - - Value viewModelContext; - vint indexViewModelContext = constructorArguments.Keys().IndexOf(_ViewModelContext); - if (indexViewModelContext != -1) - { - viewModelContext = constructorArguments.GetByIndex(indexViewModelContext)[0]; - } - - auto dataGrid = new GuiBindableDataGrid(styleProvider, itemSource, viewModelContext); - return Value::From(dataGrid); - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_Columns); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - propertyNames.Add(_ItemSource); - propertyNames.Add(_ViewModelContext); - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _Columns) - { - return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - else if (propertyInfo.propertyName == _ItemSource) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; - return info; - } - else if (propertyInfo.propertyName == _ViewModelContext) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _Columns) - { - auto column = UnboxValue>(propertyValue.propertyValue); - container->AddBindableColumn(column); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiDocumentItemInstanceLoader -***********************************************************************/ - - class GuiDocumentItemInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _Name; - - public: - GuiDocumentItemInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _Name = GlobalStringKey::Get(L"Name"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeName == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexName = constructorArguments.Keys().IndexOf(_Name); - if (indexName == -1) - { - return Value(); - } - - auto name = UnboxValue(constructorArguments.GetByIndex(indexName)[0]); - auto item = MakePtr(name); - return Value::From(item); - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(_Name); - } - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - auto info = GuiInstancePropertyInfo::Collection(); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - return info; - } - else if (propertyInfo.propertyName == _Name) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetContainer()->AddChild(control->GetBoundsComposition()); - return true; - } - else if (auto composition = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->GetContainer()->AddChild(composition); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiDocumentCommonInterfaceInstanceLoader -***********************************************************************/ - - class GuiDocumentCommonInterfaceInstanceLoader : public Object, public IGuiInstanceLoader - { - public: - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto item = propertyValue.propertyValue.GetSharedPtr().Cast()) - { - container->AddDocumentItem(item); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiDocumentViewerInstanceLoader -***********************************************************************/ - - class GuiDocumentViewerInstanceLoader : public GuiDocumentCommonInterfaceInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiDocumentViewerInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(g::NewDocumentViewer()); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiDocumentViewer(new GuiDocumentViewerTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return GuiDocumentCommonInterfaceInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiDocumentLabelInstanceLoader -***********************************************************************/ - - class GuiDocumentLabelInstanceLoader : public GuiDocumentCommonInterfaceInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiDocumentLabelInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return GetTypeName() == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if(GetTypeName() == typeInfo.typeName) - { - vint indexControlTemplate = constructorArguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); - if (indexControlTemplate == -1) - { - return Value::From(g::NewDocumentLabel()); - } - else - { - auto factory = CreateTemplateFactory(constructorArguments.GetByIndex(indexControlTemplate)[0].GetText()); - return Value::From(new GuiDocumentLabel(new GuiDocumentLabelTemplate_StyleProvider(factory))); - } - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::_ControlTemplate); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::_ControlTemplate) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return GuiDocumentCommonInterfaceInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiAxisInstanceLoader -***********************************************************************/ - - class GuiAxisInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _AxisDirection; - - public: - GuiAxisInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _AxisDirection = GlobalStringKey::Get(L"AxisDirection"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeName == typeInfo.typeName; - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - vint indexAxisDirection = constructorArguments.Keys().IndexOf(_AxisDirection); - if (indexAxisDirection == -1) - { - return Value(); - } - - auto axisDirection = UnboxValue(constructorArguments.GetByIndex(indexAxisDirection)[0]); - auto axis = new GuiAxis(axisDirection); - return Value::From(axis); - } - return Value(); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(_AxisDirection); - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _AxisDirection) - { - auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - }; - -/*********************************************************************** -GuiCompositionInstanceLoader -***********************************************************************/ - - class GuiCompositionInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - - public: - GuiCompositionInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - auto info = GuiInstancePropertyInfo::Collection(); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - info->acceptableTypes.Add(description::GetTypeDescriptor()); - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == GlobalStringKey::Empty) - { - if (auto control = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->AddChild(control->GetBoundsComposition()); - return true; - } - else if(auto composition = dynamic_cast(propertyValue.propertyValue.GetRawPtr())) - { - container->AddChild(composition); - return true; - } - else if (Ptr element = propertyValue.propertyValue.GetSharedPtr().Cast()) - { - container->SetOwnedElement(element); - return true; - } - } - } - return false; - } - }; - -/*********************************************************************** -GuiTableCompositionInstanceLoader -***********************************************************************/ - - class GuiTableCompositionInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _Rows, _Columns; - - public: - GuiTableCompositionInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _Rows = GlobalStringKey::Get(L"Rows"); - _Columns = GlobalStringKey::Get(L"Columns"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_Rows); - propertyNames.Add(_Columns); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _Rows || propertyInfo.propertyName == _Columns) - { - return GuiInstancePropertyInfo::Array(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _Rows) - { - List options; - CopyFrom(options, GetLazyList(UnboxValue>(propertyValue.propertyValue))); - container->SetRowsAndColumns(options.Count(), container->GetColumns()); - FOREACH_INDEXER(GuiCellOption, option, index, options) - { - container->SetRowOption(index, option); - } - return true; - } - else if (propertyValue.propertyName == _Columns) - { - List options; - CopyFrom(options, GetLazyList(UnboxValue>(propertyValue.propertyValue))); - container->SetRowsAndColumns(container->GetRows(), options.Count()); - FOREACH_INDEXER(GuiCellOption, option, index, options) - { - container->SetColumnOption(index, option); - } - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiCellCompositionInstanceLoader -***********************************************************************/ - - class GuiCellCompositionInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _Site; - - public: - GuiCellCompositionInstanceLoader() - { - typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); - _Site = GlobalStringKey::Get(L"Site"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_Site); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _Site) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _Site) - { - SiteValue site = UnboxValue(propertyValue.propertyValue); - container->SetSite(site.row, site.column, site.rowSpan, site.columnSpan); - return true; - } - } - return false; - } - }; - -/*********************************************************************** -GuiTreeNodeInstanceLoader -***********************************************************************/ - - class GuiTreeNodeInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _Text, _Image, _Tag; - - public: - GuiTreeNodeInstanceLoader() - :typeName(GlobalStringKey::Get(L"presentation::controls::tree::TreeNode")) - { - _Text = GlobalStringKey::Get(L"Text"); - _Image = GlobalStringKey::Get(L"Image"); - _Tag = GlobalStringKey::Get(L"Tag"); - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - - bool IsCreatable(const TypeInfo& typeInfo)override - { - return typeInfo.typeName == GetTypeName(); - } - - description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override - { - if (typeInfo.typeName == GetTypeName()) - { - Ptr item = new tree::TreeViewItem; - Ptr node = new tree::MemoryNodeProvider(item); - return Value::From(node); - } - return Value(); - } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(_Text); - propertyNames.Add(_Image); - propertyNames.Add(_Tag); - propertyNames.Add(GlobalStringKey::Empty); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == _Text) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == _Image) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == _Tag) - { - return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); - } - else if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - if (auto container = dynamic_cast(propertyValue.instanceValue.GetRawPtr())) - { - if (propertyValue.propertyName == _Text) - { - if (auto item = container->GetData().Cast()) - { - item->text = UnboxValue(propertyValue.propertyValue); - container->NotifyDataModified(); - return true; - } - } - else if (propertyValue.propertyName == _Image) - { - if (auto item = container->GetData().Cast()) - { - item->image = UnboxValue>(propertyValue.propertyValue); - container->NotifyDataModified(); - return true; - } - } - else if (propertyValue.propertyName == _Tag) - { - if (auto item = container->GetData().Cast()) - { - item->tag = propertyValue.propertyValue; - return true; - } - } - else if (propertyValue.propertyName == GlobalStringKey::Empty) - { - auto item = UnboxValue>(propertyValue.propertyValue); - container->Children().Add(item); - return true; - } - } - return false; - } - }; - -#endif - -/*********************************************************************** -GuiPredefinedInstanceLoadersPlugin -***********************************************************************/ - - void InitializeTrackerProgressBar(GuiScroll* control) - { - control->SetPageSize(0); - } - - class GuiPredefinedInstanceLoadersPlugin : public Object, public IGuiPlugin - { - public: - void Load()override - { - } - - void AfterLoad()override - { -#ifndef VCZH_DEBUG_NO_REFLECTION - IGuiInstanceLoaderManager* manager=GetInstanceLoaderManager(); - -#define ADD_VIRTUAL_TYPE_LOADER(TYPENAME, LOADER)\ - manager->CreateVirtualType(\ - GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()),\ - new LOADER\ - ) - -#define ADD_TEMPLATE_CONTROL(TYPENAME, CONSTRUCTOR, TEMPLATE)\ - manager->SetLoader(\ - new GuiTemplateControlInstanceLoader(\ - L"presentation::controls::" L ## #TYPENAME,\ - [](){return Value::From(CONSTRUCTOR());},\ - [](Ptr factory){return Value::From(new TYPENAME(new TEMPLATE##_StyleProvider(factory))); }\ - )\ - ) - -#define ADD_TEMPLATE_CONTROL_2(TYPENAME, CONSTRUCTOR, TEMPLATE)\ - manager->SetLoader(\ - new GuiTemplateControlInstanceLoader(\ - L"presentation::controls::" L ## #TYPENAME,\ - [](){return Value::From(CONSTRUCTOR());},\ - [](Ptr factory)\ - {\ - auto style = new TEMPLATE##_StyleProvider(factory);\ - auto argument = style->CreateArgument();\ - return Value::From(new TYPENAME(style, argument));\ - }\ - )\ - ) - -#define ADD_VIRTUAL_CONTROL(VIRTUALTYPENAME, TYPENAME, CONSTRUCTOR, TEMPLATE)\ - manager->CreateVirtualType(\ - GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()),\ - new GuiTemplateControlInstanceLoader(\ - L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ - [](){return Value::From(CONSTRUCTOR());},\ - [](Ptr factory){return Value::From(new TYPENAME(new TEMPLATE##_StyleProvider(factory))); }\ - )\ - ) - -#define ADD_VIRTUAL_CONTROL_2(VIRTUALTYPENAME, TYPENAME, CONSTRUCTOR, TEMPLATE)\ - manager->CreateVirtualType(\ - GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()),\ - new GuiTemplateControlInstanceLoader(\ - L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ - [](){return Value::From(CONSTRUCTOR());},\ - [](Ptr factory)\ - {\ - auto style = new TEMPLATE##_StyleProvider(factory);\ - auto argument = style->CreateArgument();\ - return Value::From(new TYPENAME(style, argument));\ - }\ - )\ - ) - -#define ADD_VIRTUAL_CONTROL_F(VIRTUALTYPENAME, TYPENAME, CONSTRUCTOR, TEMPLATE, FUNCTION)\ - manager->CreateVirtualType(\ - GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()),\ - new GuiTemplateControlInstanceLoader(\ - L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ - [](){return Value::From(CONSTRUCTOR());},\ - [](Ptr factory)\ - {\ - auto control = new TYPENAME(new TEMPLATE##_StyleProvider(factory));\ - FUNCTION(control);\ - return Value::From(control);\ - }\ - )\ - ) - - manager->SetLoader(new GuiControlInstanceLoader); - manager->SetLoader(new GuiTabInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiTabPageInstanceLoader); - manager->SetLoader(new GuiToolstripMenuInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiToolstripMenuBarInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiToolstripToolBarInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiToolstripButtonInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiSelectableListControlInstanceLoader); // ItemTemplate - manager->SetLoader(new GuiVirtualTreeViewInstanceLoader); // ItemTemplate - manager->SetLoader(new GuiListViewInstanceLoader(false)); // ControlTemplate - manager->SetLoader(new GuiTreeViewInstanceLoader(false)); // ControlTemplate - manager->SetLoader(new GuiBindableTextListInstanceLoader(L"", [](){return GetCurrentTheme()->CreateTextListItemStyle(); })); // ControlTemplate, ItemSource - manager->SetLoader(new GuiListViewInstanceLoader(true)); // ControlTemplate, ItemSource - manager->SetLoader(new GuiTreeViewInstanceLoader(true)); // ControlTemplate, ItemSource - manager->SetLoader(new GuiBindableDataColumnInstanceLoader); // VisualizerTemplates, EditorTemplate - manager->SetLoader(new GuiBindableDataGridInstanceLoader); // ControlTemplate, ItemSource - - manager->SetLoader(new GuiDocumentItemInstanceLoader); - manager->SetLoader(new GuiDocumentViewerInstanceLoader); // ControlTemplate - manager->SetLoader(new GuiDocumentLabelInstanceLoader); // ControlTemplate - - manager->SetLoader(new GuiAxisInstanceLoader); - manager->SetLoader(new GuiCompositionInstanceLoader); - manager->SetLoader(new GuiTableCompositionInstanceLoader); - manager->SetLoader(new GuiCellCompositionInstanceLoader); - - ADD_VIRTUAL_TYPE_LOADER(GuiComboBoxListControl, GuiComboBoxInstanceLoader); // ControlTemplate - ADD_VIRTUAL_TYPE_LOADER(tree::MemoryNodeProvider, GuiTreeNodeInstanceLoader); - - ADD_TEMPLATE_CONTROL ( GuiCustomControl, g::NewCustomControl, GuiControlTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiLabel, g::NewLabel, GuiLabelTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiButton, g::NewButton, GuiButtonTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiScrollContainer, g::NewScrollContainer, GuiScrollViewTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiWindow, g::NewWindow, GuiWindowTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL_2 ( GuiTextList, g::NewTextList, GuiTextListTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiMultilineTextBox, g::NewMultilineTextBox, GuiMultilineTextBoxTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiSinglelineTextBox, g::NewTextBox, GuiSinglelineTextBoxTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiDatePicker, g::NewDatePicker, GuiDatePickerTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL_2 ( GuiDateComboBox, g::NewDateComboBox, GuiDateComboBoxTemplate); // ControlTemplate - ADD_TEMPLATE_CONTROL ( GuiStringGrid, g::NewStringGrid, GuiListViewTemplate); // ControlTemplate - // ControlTemplate - ADD_VIRTUAL_CONTROL (GroupBox, GuiControl, g::NewGroupBox, GuiControlTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (MenuSplitter, GuiControl, g::NewMenuSplitter, GuiControlTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (MenuBarButton, GuiToolstripButton, g::NewMenuBarButton, GuiToolstripButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (MenuItemButton, GuiToolstripButton, g::NewMenuItemButton, GuiToolstripButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (ToolstripDropdownButton, GuiToolstripButton, g::NewToolBarDropdownButton, GuiToolstripButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (ToolstripSplitButton, GuiToolstripButton, g::NewToolBarSplitButton, GuiToolstripButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (ToolstripSplitter, GuiControl, g::NewToolBarSplitter, GuiControlTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (CheckBox, GuiSelectableButton, g::NewCheckBox, GuiSelectableButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (RadioButton, GuiSelectableButton, g::NewRadioButton, GuiSelectableButtonTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (HScroll, GuiScroll, g::NewHScroll, GuiScrollTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL (VScroll, GuiScroll, g::NewVScroll, GuiScrollTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL_F (HTracker, GuiScroll, g::NewHTracker, GuiScrollTemplate, InitializeTrackerProgressBar); // ControlTemplate - ADD_VIRTUAL_CONTROL_F (VTracker, GuiScroll, g::NewVTracker, GuiScrollTemplate, InitializeTrackerProgressBar); // ControlTemplate - ADD_VIRTUAL_CONTROL_F (ProgressBar, GuiScroll, g::NewProgressBar, GuiScrollTemplate, InitializeTrackerProgressBar); // ControlTemplate - ADD_VIRTUAL_CONTROL_2 (CheckTextList, GuiTextList, g::NewCheckTextList, GuiTextListTemplate); // ControlTemplate - ADD_VIRTUAL_CONTROL_2 (RadioTextList, GuiTextList, g::NewRadioTextList, GuiTextListTemplate); // ControlTemplate - - auto bindableTextListName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); // ControlTemplate, ItemSource - manager->CreateVirtualType(bindableTextListName, new GuiBindableTextListInstanceLoader(L"Check", [](){return GetCurrentTheme()->CreateCheckTextListItemStyle(); })); - manager->CreateVirtualType(bindableTextListName, new GuiBindableTextListInstanceLoader(L"Radio", [](){return GetCurrentTheme()->CreateRadioTextListItemStyle(); })); - -#undef ADD_VIRTUAL_TYPE -#undef ADD_VIRTUAL_TYPE_LOADER -#endif - } - - void Unload()override - { - } - }; - GUI_REGISTER_PLUGIN(GuiPredefinedInstanceLoadersPlugin) - } -} - /*********************************************************************** GUIINSTANCELOADER_PREDEFINEDTYPERESOLVERS.CPP ***********************************************************************/ @@ -5942,18 +1247,20 @@ namespace vl using namespace workflow::runtime; using namespace reflection::description; using namespace collections; + using namespace stream; + + using namespace controls; #define ERROR_CODE_PREFIX L"================================================================" /*********************************************************************** -Instance Type Resolver +Instance Type Resolver (Instance) ***********************************************************************/ class GuiResourceInstanceTypeResolver : public Object , public IGuiResourceTypeResolver , private IGuiResourceTypeResolver_Precompile - , private IGuiResourceTypeResolver_DirectLoadStream , private IGuiResourceTypeResolver_IndirectLoad { public: @@ -5962,6 +1269,16 @@ Instance Type Resolver return L"Instance"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return false; + } + WString GetPreloadType()override { return L"Xml"; @@ -5974,17 +1291,24 @@ Instance Type Resolver vint GetMaxPassIndex()override { - return 2; + return 3; } - void Precompile(Ptr resource, GuiResource* rootResource, vint passIndex, Ptr resolver, collections::List& errors)override + void Precompile(Ptr resource, GuiResourcePrecompileContext& context, collections::List& errors)override { - if (passIndex == 2) + if (context.passIndex == 3) { - if (auto obj = resource.Cast()) + if (auto obj = resource->GetContent().Cast()) { - obj->ApplyStyles(resolver, errors); - Workflow_PrecompileInstanceContext(obj, errors); + obj->ApplyStyles(context.resolver, errors); + if (auto assembly = Workflow_PrecompileInstanceContext(obj, errors)) + { + auto compiled = MakePtr(); + compiled->type = GuiInstanceCompiledWorkflow::InstanceCtor; + compiled->classFullName = obj->className; + compiled->assembly = assembly; + context.targetFolder->CreateValueByPath(L"Workflow/InstanceCtor/" + resource->GetResourcePath(), L"Workflow", compiled); + } } } } @@ -5994,32 +1318,16 @@ Instance Type Resolver return this; } - IGuiResourceTypeResolver_DirectLoadStream* DirectLoadStream()override - { - return this; - } - IGuiResourceTypeResolver_IndirectLoad* IndirectLoad()override { return this; } - void SerializePrecompiled(Ptr resource, stream::IStream& stream)override - { - auto obj = resource.Cast(); - obj->SavePrecompiledBinary(stream); - } - - Ptr ResolveResourcePrecompiled(stream::IStream& stream, collections::List& errors)override - { - return GuiInstanceContext::LoadPrecompiledBinary(stream, errors); - } - - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { if (auto obj = resource.Cast()) { - return obj->SaveToXml(serializePrecompiledResource); + return obj->SaveToXml(); } return 0; } @@ -6037,7 +1345,7 @@ Instance Type Resolver }; /*********************************************************************** -Instance Style Type Resolver +Instance Style Type Resolver (InstanceStyle) ***********************************************************************/ class GuiResourceInstanceStyleResolver @@ -6051,6 +1359,16 @@ Instance Style Type Resolver return L"InstanceStyle"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return false; + } + WString GetPreloadType()override { return L"Xml"; @@ -6066,14 +1384,11 @@ Instance Style Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { - if (!serializePrecompiledResource) + if (auto obj = resource.Cast()) { - if (auto obj = resource.Cast()) - { - return obj->SaveToXml(); - } + return obj->SaveToXml(); } return 0; } @@ -6091,75 +1406,9 @@ Instance Style Type Resolver }; /*********************************************************************** -Shared Script Type Resolver +Shared Script Type Resolver (Script) ***********************************************************************/ - class GuiSharedWorkflowCache : public Object, public IGuiResourceCache - { - public: - static const GlobalStringKey& CacheTypeName; - static const GlobalStringKey& CacheContextName; - - List moduleCodes; - Ptr assembly; - Ptr globalContext; - - GuiSharedWorkflowCache() - { - } - - GuiSharedWorkflowCache(Ptr _assembly) - :assembly(_assembly) - { - Initialize(); - } - - GlobalStringKey GetCacheTypeName()override - { - return CacheTypeName; - } - - void Initialize() - { - if (!globalContext) - { - globalContext = new WfRuntimeGlobalContext(assembly); - LoadFunction(globalContext, L"")(); - } - } - }; - - const GlobalStringKey& GuiSharedWorkflowCache::CacheTypeName = GlobalStringKey::_Shared_Workflow_Assembly_Cache; - const GlobalStringKey& GuiSharedWorkflowCache::CacheContextName = GlobalStringKey::_Shared_Workflow_Global_Context; - - class GuiSharedWorkflowCacheResolver : public Object, public IGuiResourceCacheResolver - { - public: - GlobalStringKey GetCacheTypeName()override - { - return GuiSharedWorkflowCache::CacheTypeName; - } - - bool Serialize(Ptr cache, stream::IStream& stream)override - { - if (auto obj = cache.Cast()) - { - obj->assembly->Serialize(stream); - return true; - } - else - { - return false; - } - } - - Ptr Deserialize(stream::IStream& stream)override - { - auto assembly = new WfAssembly(stream); - return new GuiSharedWorkflowCache(assembly); - } - }; - class GuiResourceSharedScriptTypeResolver : public Object , public IGuiResourceTypeResolver @@ -6172,6 +1421,16 @@ Shared Script Type Resolver return L"Script"; } + bool XmlSerializable()override + { + return true; + } + + bool StreamSerializable()override + { + return false; + } + WString GetPreloadType()override { return L"Xml"; @@ -6184,67 +1443,86 @@ Shared Script Type Resolver vint GetMaxPassIndex()override { - return 1; + return 2; } - void Precompile(Ptr resource, GuiResource* rootResource, vint passIndex, Ptr resolver, collections::List& errors)override + void Precompile(Ptr resource, GuiResourcePrecompileContext& context, collections::List& errors)override { - if (passIndex == 0) + Ptr compiled; + switch (context.passIndex) { - if (auto obj = resource.Cast()) + case 0: { - if (obj->language == L"Workflow") + if (auto obj = resource->GetContent().Cast()) { - Ptr cache; - auto key = GuiSharedWorkflowCache::CacheContextName; - auto index = rootResource->precompiledCaches.Keys().IndexOf(key); - - if (index == -1) + WString path; + GuiInstanceCompiledWorkflow::AssemblyType type = GuiInstanceCompiledWorkflow::Shared; + if (obj->language == L"Workflow-ViewModel") { - cache = new GuiSharedWorkflowCache; - rootResource->precompiledCaches.Add(key, cache); + path = L"Workflow/ViewModel"; + type = GuiInstanceCompiledWorkflow::ViewModel; } - else + else if (obj->language == L"Workflow") { - cache = rootResource->precompiledCaches.Values()[index].Cast(); + path = L"Workflow/Shared"; } - cache->moduleCodes.Add(obj->code); - } - } - } - else if (passIndex == 1) - { - Ptr cache; - auto key = GuiSharedWorkflowCache::CacheContextName; - auto index = rootResource->precompiledCaches.Keys().IndexOf(key); - - if (index != -1) - { - auto cache = rootResource->precompiledCaches.Values()[index].Cast(); - if (cache->moduleCodes.Count() > 0) - { - auto table = GetParserManager()->GetParsingTable(L"WORKFLOW"); - List> scriptErrors; - cache->assembly = Compile(table, cache->moduleCodes, scriptErrors); - cache->moduleCodes.Clear(); - - if (scriptErrors.Count() > 0) + + if (path != L"") { - errors.Add(ERROR_CODE_PREFIX L"Failed to parse the shared workflow script"); - FOREACH(Ptr, error, scriptErrors) + compiled = context.targetFolder->GetValueByPath(path).Cast(); + if (!compiled) { - errors.Add( - L"Row: " + itow(error->codeRange.start.row + 1) + - L", Column: " + itow(error->codeRange.start.column + 1) + - L", Message: " + error->errorMessage); + compiled = new GuiInstanceCompiledWorkflow; + compiled->type = type; + context.targetFolder->CreateValueByPath(path, L"Workflow", compiled); } } - else + + if (compiled) { - cache->Initialize(); + compiled->codes.Add(obj->code); } } } + return; + case 1: + { + WString path = L"Workflow/ViewModel"; + compiled = context.targetFolder->GetValueByPath(path).Cast(); + } + break; + case 2: + { + WString path = L"Workflow/Shared"; + compiled = context.targetFolder->GetValueByPath(path).Cast(); + } + break; + default: + return; + } + + if (compiled) + { + auto table = GetParserManager()->GetParsingTable(L"WORKFLOW"); + List> scriptErrors; + compiled->assembly = Compile(table, compiled->codes, scriptErrors); + compiled->codes.Clear(); + + if (scriptErrors.Count() > 0) + { + errors.Add(ERROR_CODE_PREFIX L"Failed to parse the shared workflow script"); + FOREACH(Ptr, error, scriptErrors) + { + errors.Add( + L"Row: " + itow(error->codeRange.start.row + 1) + + L", Column: " + itow(error->codeRange.start.column + 1) + + L", Message: " + error->errorMessage); + } + } + else + { + compiled->Initialize(true); + } } } @@ -6258,14 +1536,11 @@ Shared Script Type Resolver return this; } - Ptr Serialize(Ptr resource, bool serializePrecompiledResource)override + Ptr Serialize(Ptr resource)override { - if (!serializePrecompiledResource) + if (auto obj = resource.Cast()) { - if (auto obj = resource.Cast()) - { - return obj->SaveToXml(); - } + return obj->SaveToXml(); } return 0; } @@ -6282,6 +1557,105 @@ Shared Script Type Resolver } }; +/*********************************************************************** +Compiled Workflow Type Resolver (Script) +***********************************************************************/ + + class GuiResourceCompiledWorkflowTypeResolver + : public Object + , public IGuiResourceTypeResolver + , private IGuiResourceTypeResolver_Initialize + , private IGuiResourceTypeResolver_DirectLoadStream + { + public: + WString GetType()override + { + return L"Workflow"; + } + + bool XmlSerializable()override + { + return false; + } + + bool StreamSerializable()override + { + return true; + } + + vint GetMaxPassIndex()override + { + return 2; + } + + void Initialize(Ptr resource, GuiResourcePrecompileContext& context)override + { + if (auto compiled = resource->GetContent().Cast()) + { + switch (context.passIndex) + { + case 0: + if (compiled->type == GuiInstanceCompiledWorkflow::ViewModel) + { + compiled->Initialize(false); + } + break; + case 1: + if (compiled->type == GuiInstanceCompiledWorkflow::Shared) + { + compiled->Initialize(true); + } + break; + case 2: + if (compiled->type == GuiInstanceCompiledWorkflow::InstanceCtor && compiled->type != GuiInstanceCompiledWorkflow::InstanceClass) + { + compiled->Initialize(false); + } + break; + } + } + } + + IGuiResourceTypeResolver_Initialize* Initialize()override + { + return this; + } + + IGuiResourceTypeResolver_DirectLoadStream* DirectLoadStream()override + { + return this; + } + + void SerializePrecompiled(Ptr resource, stream::IStream& stream)override + { + if (auto obj = resource.Cast()) + { + internal::Writer writer(stream); + + vint type = (vint)obj->type; + writer << type << obj->classFullName; + + MemoryStream memoryStream; + obj->assembly->Serialize(memoryStream); + writer << (IStream&)memoryStream; + } + } + + Ptr ResolveResourcePrecompiled(stream::IStream& stream, collections::List& errors)override + { + internal::Reader reader(stream); + auto obj = MakePtr(); + + vint type; + auto memoryStream = MakePtr();; + reader << type << obj->classFullName << (IStream&)*memoryStream.Obj(); + + obj->type = (GuiInstanceCompiledWorkflow::AssemblyType)type; + obj->binaryToLoad = memoryStream; + return obj; + } + }; + /*********************************************************************** Shared Script Type Resolver ***********************************************************************/ @@ -6303,7 +1677,7 @@ Shared Script Type Resolver manager->SetTypeResolver(new GuiResourceInstanceTypeResolver); manager->SetTypeResolver(new GuiResourceInstanceStyleResolver); manager->SetTypeResolver(new GuiResourceSharedScriptTypeResolver); - manager->SetCacheResolver(new GuiSharedWorkflowCacheResolver); + manager->SetTypeResolver(new GuiResourceCompiledWorkflowTypeResolver); } void Unload()override @@ -6314,1085 +1688,6 @@ Shared Script Type Resolver } } -/*********************************************************************** -GUIINSTANCELOADER_WORKFLOWCOMPILER.CPP -***********************************************************************/ - -namespace vl -{ - namespace presentation - { - using namespace workflow; - using namespace workflow::analyzer; - using namespace workflow::runtime; - using namespace reflection::description; - using namespace collections; - -#define ERROR_CODE_PREFIX L"================================================================" - -/*********************************************************************** -Module -***********************************************************************/ - - Ptr Workflow_CreateEmptyModule(Ptr context) - { - auto module = MakePtr(); - vint index = context->namespaces.Keys().IndexOf(GlobalStringKey()); - if (index != -1) - { - auto nss = context->namespaces.Values()[index]; - FOREACH(Ptr, ns, nss->namespaces) - { - auto path = MakePtr(); - module->paths.Add(path); - - auto pathCode = ns->prefix + L"*" + ns->postfix; - auto reading = pathCode.Buffer(); - while (reading) - { - auto delimiter = wcsstr(reading, L"::"); - auto begin = reading; - auto end = delimiter ? delimiter : begin + wcslen(reading); - - auto wildcard = wcschr(reading, L'*'); - if (wildcard >= end) - { - wildcard = nullptr; - } - - auto item = MakePtr(); - path->items.Add(item); - if (wildcard) - { - if (begin < wildcard) - { - auto fragment = MakePtr(); - item->fragments.Add(fragment); - fragment->name.value = WString(begin, vint(wildcard - begin)); - } - { - auto fragment = MakePtr(); - item->fragments.Add(fragment); - } - if (wildcard + 1 < end) - { - auto fragment = MakePtr(); - item->fragments.Add(fragment); - fragment->name.value = WString(wildcard + 1, vint(end - wildcard - 1)); - } - } - else if (begin < end) - { - auto fragment = MakePtr(); - item->fragments.Add(fragment); - fragment->name.value = WString(begin, vint(end - begin)); - } - - if (delimiter) - { - reading = delimiter + 2; - } - else - { - reading = nullptr; - } - } - } - } - return module; - } - -/*********************************************************************** -Variable -***********************************************************************/ - - void Workflow_CreatePointerVariable(Ptr module, GlobalStringKey name, description::ITypeDescriptor* type) - { - auto var = MakePtr(); - var->name.value = name.ToString(); - { - Ptr elementType = new TypeInfoImpl(ITypeInfo::TypeDescriptor); - elementType->SetTypeDescriptor(type); - - Ptr pointerType = new TypeInfoImpl(ITypeInfo::RawPtr); - pointerType->SetElementType(elementType); - - var->type = GetTypeFromTypeInfo(pointerType.Obj()); - } - - auto literal = MakePtr(); - literal->value = WfLiteralValue::Null; - var->expression = literal; - - module->declarations.Add(var); - } - - void Workflow_GetVariableTypes(Ptr env, types::VariableTypeMap& types) - { - FOREACH_INDEXER(GlobalStringKey, name, index, env->scope->referenceValues.Keys()) - { - auto value = env->scope->referenceValues.Values()[index]; - if (value.GetTypeDescriptor()) - { - types.Add(name, value.GetTypeDescriptor()); - } - else - { - types.Add(name, GetTypeDescriptor()); - } - } - } - - void Workflow_CreateVariablesForReferenceValues(Ptr module, types::VariableTypeMap& types) - { - for (vint i = 0; i < types.Count(); i++) - { - auto key = types.Keys()[i]; - auto value = types.Values()[i]; - Workflow_CreatePointerVariable(module, key, value); - } - } - - void Workflow_SetVariablesForReferenceValues(Ptr context, Ptr env) - { - FOREACH_INDEXER(GlobalStringKey, name, index, env->scope->referenceValues.Keys()) - { - vint variableIndex = context->assembly->variableNames.IndexOf(name.ToString()); - if (variableIndex != -1) - { - context->globalVariables->variables[variableIndex] = env->scope->referenceValues.Values()[index]; - } - } - } - -/*********************************************************************** -Workflow_ValidateExpression -***********************************************************************/ - - bool Workflow_ValidateExpression(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, IGuiInstanceLoader::PropertyInfo& bindingTarget, const WString& expressionCode, Ptr& expression) - { - auto parser = GetParserManager()->GetParser(L"WORKFLOW-EXPRESSION"); - expression = parser->TypedParse(expressionCode, errors); - if (!expression) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to parse the workflow expression."); - return false; - } - - bool failed = false; - auto td = bindingTarget.typeInfo.typeDescriptor; - auto propertyInfo = td->GetPropertyByName(bindingTarget.propertyName.ToString(), true); - if (!propertyInfo) - { - errors.Add(ERROR_CODE_PREFIX L"Property \"" + bindingTarget.propertyName.ToString() + L"\" does not exist in type \"" + td->GetTypeName() + L"\"."); - failed = true; - } - else if (!propertyInfo->IsReadable() || !propertyInfo->IsWritable()) - { - errors.Add(ERROR_CODE_PREFIX L"Property \"" + bindingTarget.propertyName.ToString() + L"\" of type \"" + td->GetTypeName() + L"\" should be both readable and writable."); - failed = true; - } - - auto module = Workflow_CreateEmptyModule(context); - Workflow_CreateVariablesForReferenceValues(module, types); - { - auto func = MakePtr(); - func->anonymity = WfFunctionAnonymity::Named; - func->name.value = L""; - func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); - - auto stat = MakePtr(); - stat->expression = expression; - func->statement = stat; - - module->declarations.Add(func); - } - - Workflow_GetSharedManager()->Clear(true, true); - Workflow_GetSharedManager()->AddModule(module); - Workflow_GetSharedManager()->Rebuild(true); - if (Workflow_GetSharedManager()->errors.Count() > 0) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to analyze the workflow expression \"" + expressionCode + L"\"."); - FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) - { - errors.Add(error->errorMessage); - } - failed = true; - } - else if (propertyInfo) - { - auto bind = expression.Cast(); - auto result = Workflow_GetSharedManager()->expressionResolvings[(bind ? bind->expression : expression).Obj()]; - if (result.type) - { - ITypeInfo* propertyType = propertyInfo->GetReturn(); - if (propertyInfo->GetSetter() && propertyInfo->GetSetter()->GetParameterCount() == 1) - { - propertyType = propertyInfo->GetSetter()->GetParameter(0)->GetType(); - } - if (!CanConvertToType(result.type.Obj(), propertyType, false)) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to analyze the workflow expression \"" + expressionCode + L"\"."); - errors.Add( - WfErrors::ExpressionCannotImplicitlyConvertToType(expression.Obj(), result.type.Obj(), propertyType) - ->errorMessage); - failed = true; - } - } - } - - return !failed; - } - -/*********************************************************************** -Workflow_CompileExpression -***********************************************************************/ - - Ptr Workflow_CompileExpression(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, const WString& expressionCode) - { - auto parser = GetParserManager()->GetParser(L"WORKFLOW-EXPRESSION"); - auto expression = parser->TypedParse(expressionCode, errors); - if (!expression) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to parse the workflow expression \"" + expressionCode + L"\"."); - return 0; - } - - auto module = Workflow_CreateEmptyModule(context); - Workflow_CreateVariablesForReferenceValues(module, types); - { - auto lambda = MakePtr(); - lambda->body = expression; - - auto var = MakePtr(); - var->name.value = L""; - var->expression = lambda; - - module->declarations.Add(var); - } - - Workflow_GetSharedManager()->Clear(true, true); - Workflow_GetSharedManager()->AddModule(module); - Workflow_GetSharedManager()->Rebuild(true); - if (Workflow_GetSharedManager()->errors.Count() > 0) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to analyze the workflow expression \"" + expressionCode + L"\"."); - FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) - { - errors.Add(error->errorMessage); - } - return 0; - } - - return GenerateAssembly(Workflow_GetSharedManager()); - } - -/*********************************************************************** -Workflow_CompileEventHandler -***********************************************************************/ - - Ptr Workflow_CompileEventHandler(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, IGuiInstanceLoader::PropertyInfo& bindingTarget, const WString& statementCode) - { - auto parser = GetParserManager()->GetParser(L"WORKFLOW-STATEMENT"); - auto statement = parser->TypedParse(statementCode, errors); - if (!statement) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to parse the workflow statement."); - return 0; - } - - auto module = Workflow_CreateEmptyModule(context); - Workflow_CreateVariablesForReferenceValues(module, types); - { - auto func = MakePtr(); - func->anonymity = WfFunctionAnonymity::Named; - func->name.value = L""; - func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); - - auto td = bindingTarget.typeInfo.typeDescriptor; - auto eventInfo = td->GetEventByName(bindingTarget.propertyName.ToString(), true); - if (eventInfo) - { - vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1; - bool standardName = false; - if (count == 2) - { - auto senderType = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(1)->GetTypeDescriptor(); - auto argumentType = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(2)->GetTypeDescriptor(); - if (senderType == GetTypeDescriptor()) - { - auto expectedType = GetTypeDescriptor(); - List types; - types.Add(argumentType); - for (vint i = 0; i < types.Count(); i++) - { - auto type = types[i]; - if (type == expectedType) - { - standardName = true; - break; - } - vint baseCount = type->GetBaseTypeDescriptorCount(); - for (vint j = 0; j < baseCount; j++) - { - auto baseType = type->GetBaseTypeDescriptor(j); - if (!types.Contains(baseType)) - { - types.Add(baseType); - } - } - } - } - } - - if (standardName) - { - { - auto arg = MakePtr(); - arg->name.value = L"sender"; - arg->type = GetTypeFromTypeInfo(eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(1)); - func->arguments.Add(arg); - } - { - auto arg = MakePtr(); - arg->name.value = L"arguments"; - arg->type = GetTypeFromTypeInfo(eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(2)); - func->arguments.Add(arg); - } - } - else - { - auto type = TypeInfoRetriver::CreateTypeInfo(); - for (vint i = 0; i < count; i++) - { - auto arg = MakePtr(); - arg->name.value = L"" + itow(i + 1); - arg->type = GetTypeFromTypeInfo(type.Obj()); - func->arguments.Add(arg); - } - } - } - - auto block = MakePtr(); - block->statements.Add(statement); - func->statement = block; - - module->declarations.Add(func); - } - - Workflow_GetSharedManager()->Clear(true, true); - Workflow_GetSharedManager()->AddModule(module); - Workflow_GetSharedManager()->Rebuild(true); - if (Workflow_GetSharedManager()->errors.Count() > 0) - { - errors.Add(ERROR_CODE_PREFIX L"Failed to analyze the workflow statement \"" + statementCode + L"\"."); - FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) - { - errors.Add(error->errorMessage); - } - return 0; - } - - return GenerateAssembly(Workflow_GetSharedManager()); - } - -/*********************************************************************** -Workflow_CompileDataBinding -***********************************************************************/ - - WString Workflow_ModuleToString(Ptr module) - { - stream::MemoryStream stream; - { - stream::StreamWriter writer(stream); - WfPrint(module, L"", writer); - } - stream.SeekFromBegin(0); - stream::StreamReader reader(stream); - return reader.ReadToEnd(); - } - - Ptr Workflow_CompileDataBinding(Ptr context, types::VariableTypeMap& types, description::ITypeDescriptor* thisType, types::ErrorList& errors, collections::List& dataBindings) - { - auto module = Workflow_CreateEmptyModule(context); - Workflow_CreateVariablesForReferenceValues(module, types); - Workflow_CreatePointerVariable(module, GlobalStringKey::Get(L""), thisType); - - auto func = MakePtr(); - func->anonymity = WfFunctionAnonymity::Named; - func->name.value = L""; - func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); - - auto block = MakePtr(); - func->statement = block; - module->declarations.Add(func); - - - FOREACH(WorkflowDataBinding, dataBinding, dataBindings) - { - if (dataBinding.bindExpression.Cast()) - { - auto subBlock = MakePtr(); - block->statements.Add(subBlock); - { - auto refThis = MakePtr(); - refThis->name.value = L""; - - auto member = MakePtr(); - member->parent = refThis; - member->name.value = L"AddSubscription"; - - auto call = MakePtr(); - call->function = member; - call->arguments.Add(dataBinding.bindExpression); - - auto var = MakePtr(); - var->name.value = L""; - var->expression = call; - - auto stat = MakePtr(); - stat->variable = var; - subBlock->statements.Add(stat); - } - { - auto callback = MakePtr(); - callback->anonymity = WfFunctionAnonymity::Anonymous; - callback->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj());; - { - auto arg = MakePtr(); - arg->name.value = L""; - arg->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); - callback->arguments.Add(arg); - } - auto callbackBlock = MakePtr(); - callback->statement = callbackBlock; - { - auto refSubscribee = MakePtr(); - refSubscribee->name.value = dataBinding.variableName.ToString(); - - auto member = MakePtr(); - member->parent = refSubscribee; - member->name.value = dataBinding.propertyInfo->GetName(); - - auto var = MakePtr(); - var->name.value = L""; - var->expression = member; - - auto stat = MakePtr(); - stat->variable = var; - callbackBlock->statements.Add(stat); - } - { - ITypeInfo* propertyType = dataBinding.propertyInfo->GetReturn(); - if (dataBinding.propertyInfo->GetSetter() && dataBinding.propertyInfo->GetSetter()->GetParameterCount() == 1) - { - propertyType = dataBinding.propertyInfo->GetSetter()->GetParameter(0)->GetType(); - } - - auto refValue = MakePtr(); - refValue->name.value = L""; - - auto cast = MakePtr(); - cast->strategy = WfTypeCastingStrategy::Strong; - cast->expression = refValue; - cast->type = GetTypeFromTypeInfo(propertyType); - - auto var = MakePtr(); - var->name.value = L""; - var->expression = cast; - - auto stat = MakePtr(); - stat->variable = var; - callbackBlock->statements.Add(stat); - } - { - auto refOld = MakePtr(); - refOld->name.value = L""; - - auto refNew = MakePtr(); - refNew->name.value = L""; - - auto compare = MakePtr(); - compare->op = WfBinaryOperator::EQ; - compare->first = refOld; - compare->second = refNew; - - auto ifStat = MakePtr(); - ifStat->expression = compare; - callbackBlock->statements.Add(ifStat); - - auto ifBlock = MakePtr(); - ifStat->trueBranch = ifBlock; - - auto returnStat = MakePtr(); - ifBlock->statements.Add(returnStat); - } - { - auto refSubscribee = MakePtr(); - refSubscribee->name.value = dataBinding.variableName.ToString(); - - auto member = MakePtr(); - member->parent = refSubscribee; - member->name.value = dataBinding.propertyInfo->GetName(); - - auto refNew = MakePtr(); - refNew->name.value = L""; - - auto assign = MakePtr(); - assign->op = WfBinaryOperator::Assign; - assign->first = member; - assign->second = refNew; - - auto stat = MakePtr(); - stat->expression = assign; - callbackBlock->statements.Add(stat); - } - - auto funcExpr = MakePtr(); - funcExpr->function = callback; - - auto refThis = MakePtr(); - refThis->name.value = L""; - - auto member = MakePtr(); - member->parent = refThis; - member->name.value = L"Subscribe"; - - auto call = MakePtr(); - call->function = member; - call->arguments.Add(funcExpr); - - auto stat = MakePtr(); - stat->expression = call; - subBlock->statements.Add(stat); - } - { - auto refThis = MakePtr(); - refThis->name.value = L""; - - auto member = MakePtr(); - member->parent = refThis; - member->name.value = L"Update"; - - auto call = MakePtr(); - call->function = member; - - auto stat = MakePtr(); - stat->expression = call; - subBlock->statements.Add(stat); - } - } - else if (dataBinding.bindExpression) - { - auto refSubscribee = MakePtr(); - refSubscribee->name.value = dataBinding.variableName.ToString(); - - auto member = MakePtr(); - member->parent = refSubscribee; - member->name.value = dataBinding.propertyInfo->GetName(); - - auto assign = MakePtr(); - assign->op = WfBinaryOperator::Assign; - assign->first = member; - assign->second = dataBinding.bindExpression; - - auto stat = MakePtr(); - stat->expression = assign; - block->statements.Add(stat); - } - } - - Workflow_GetSharedManager()->Clear(true, true); - Workflow_GetSharedManager()->AddModule(module); - Workflow_GetSharedManager()->Rebuild(true); - WString moduleCode = Workflow_ModuleToString(module); - - if (Workflow_GetSharedManager()->errors.Count() > 0) - { - errors.Add(ERROR_CODE_PREFIX L"Unexpected errors are encountered when initializing data binding."); - FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) - { - errors.Add(error->errorMessage); - } - errors.Add(ERROR_CODE_PREFIX L"Print code for reference:"); - errors.Add(moduleCode); - return 0; - } - return GenerateAssembly(Workflow_GetSharedManager()); - } - -/*********************************************************************** -Workflow_GetSharedManager -***********************************************************************/ - - class WorkflowReferenceNamesVisitor : public Object, public GuiValueRepr::IVisitor - { - public: - Ptr context; - types::VariableTypeInfoMap& typeInfos; - types::ErrorList& errors; - - IGuiInstanceLoader::TypeInfo bindingTargetTypeInfo; - vint generatedNameCount; - ITypeDescriptor* rootTypeDescriptor; - - WorkflowReferenceNamesVisitor(Ptr _context, types::VariableTypeInfoMap& _typeInfos, types::ErrorList& _errors) - :context(_context) - , typeInfos(_typeInfos) - , errors(_errors) - , generatedNameCount(0) - , rootTypeDescriptor(0) - { - } - - void Visit(GuiTextRepr* repr)override - { - } - - void Visit(GuiAttSetterRepr* repr)override - { - auto reprTypeInfo = bindingTargetTypeInfo; - auto loader = GetInstanceLoaderManager()->GetLoader(reprTypeInfo.typeName); - - if (repr->instanceName != GlobalStringKey::Empty && reprTypeInfo.typeDescriptor) - { - if (typeInfos.Keys().Contains(repr->instanceName)) - { - errors.Add(L"Precompile: Parameter \"" + repr->instanceName.ToString() + L"\" conflict with an existing named object."); - } - else - { - typeInfos.Add(repr->instanceName, reprTypeInfo); - } - } - - FOREACH_INDEXER(Ptr, setter, index, repr->setters.Values()) - { - IGuiInstanceLoader::TypeInfo propertyTypeInfo; - - if (setter->binding != GlobalStringKey::Empty && setter->binding != GlobalStringKey::_Set) - { - auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding); - if (!binder) - { - errors.Add(L"The appropriate IGuiInstanceBinder of binding \"" + setter->binding.ToString() + L"\" cannot be found."); - } - else if (binder->RequireInstanceName() && repr->instanceName == GlobalStringKey::Empty && reprTypeInfo.typeDescriptor) - { - auto name = GlobalStringKey::Get(L"" + itow(generatedNameCount++)); - repr->instanceName = name; - typeInfos.Add(name, reprTypeInfo); - } - } - - if (setter->binding == GlobalStringKey::_Set) - { - IGuiInstanceLoader::PropertyInfo info; - info.typeInfo = reprTypeInfo; - info.propertyName = repr->setters.Keys()[index]; - auto currentLoader = loader; - - while (currentLoader) - { - auto typeInfo = currentLoader->GetPropertyType(info); - if (typeInfo && typeInfo->support != GuiInstancePropertyInfo::NotSupport) - { - propertyTypeInfo.typeDescriptor = typeInfo->acceptableTypes[0]; - propertyTypeInfo.typeName = GlobalStringKey::Get(typeInfo->acceptableTypes[0]->GetTypeName()); - break; - } - currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); - } - } - - FOREACH(Ptr, value, setter->values) - { - bindingTargetTypeInfo = propertyTypeInfo; - value->Accept(this); - } - } - - FOREACH(Ptr, handler, repr->eventHandlers.Values()) - { - if (handler->binding != GlobalStringKey::Empty) - { - auto binder = GetInstanceLoaderManager()->GetInstanceEventBinder(handler->binding); - if (!binder) - { - errors.Add(L"The appropriate IGuiInstanceEventBinder of binding \"" + handler->binding.ToString() + L"\" cannot be found."); - } - else if (binder->RequireInstanceName() && repr->instanceName == GlobalStringKey::Empty && reprTypeInfo.typeDescriptor) - { - auto name = GlobalStringKey::Get(L"" + itow(generatedNameCount++)); - repr->instanceName = name; - typeInfos.Add(name, reprTypeInfo); - } - } - } - } - - void Visit(GuiConstructorRepr* repr)override - { - bool found = false; - if (repr == context->instance.Obj() && context->className) - { - auto fullName = GlobalStringKey::Get(context->className.Value()); - auto td = GetInstanceLoaderManager()->GetTypeDescriptorForType(fullName); - if (td) - { - found = true; - bindingTargetTypeInfo.typeName = fullName; - bindingTargetTypeInfo.typeDescriptor = td; - } - } - - if (!found) - { - auto source = FindInstanceLoadingSource(context, repr); - bindingTargetTypeInfo.typeName = source.typeName; - bindingTargetTypeInfo.typeDescriptor = GetInstanceLoaderManager()->GetTypeDescriptorForType(source.typeName); - } - - if (!bindingTargetTypeInfo.typeDescriptor) - { - errors.Add( - L"Precompile: Failed to find type \"" + - (repr->typeNamespace == GlobalStringKey::Empty - ? repr->typeName.ToString() - : repr->typeNamespace.ToString() + L":" + repr->typeName.ToString() - ) + - L"\"."); - } - - if (context->instance.Obj() == repr) - { - rootTypeDescriptor = bindingTargetTypeInfo.typeDescriptor; - } - Visit((GuiAttSetterRepr*)repr); - } - }; - - class WorkflowCompileVisitor : public Object, public GuiValueRepr::IVisitor - { - public: - Ptr context; - types::VariableTypeInfoMap& typeInfos; - types::ErrorList& errors; - - types::VariableTypeMap types; - List dataBindings; - - WorkflowCompileVisitor(Ptr _context, types::VariableTypeInfoMap& _typeInfos, types::ErrorList& _errors) - :context(_context) - , typeInfos(_typeInfos) - , errors(_errors) - { - for (vint i = 0; i < typeInfos.Count(); i++) - { - auto key = typeInfos.Keys()[i]; - auto value = typeInfos.Values()[i]; - types.Add(key, value.typeDescriptor); - } - } - - void Visit(GuiTextRepr* repr)override - { - } - - void Visit(GuiAttSetterRepr* repr)override - { - IGuiInstanceLoader::TypeInfo reprTypeInfo; - if (repr->instanceName != GlobalStringKey::Empty) - { - reprTypeInfo = typeInfos[repr->instanceName]; - } - - FOREACH_INDEXER(Ptr, setter, index, repr->setters.Values()) - { - if (reprTypeInfo.typeDescriptor) - { - GlobalStringKey propertyName = repr->setters.Keys()[index]; - Ptr propertyInfo; - IGuiInstanceLoader::PropertyInfo info; - info.typeInfo = reprTypeInfo; - info.propertyName = propertyName; - - { - auto currentLoader = GetInstanceLoaderManager()->GetLoader(info.typeInfo.typeName); - - while (currentLoader && !propertyInfo) - { - propertyInfo = currentLoader->GetPropertyType(info); - if (propertyInfo && propertyInfo->support == GuiInstancePropertyInfo::NotSupport) - { - propertyInfo = 0; - } - currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); - } - } - - if (!propertyInfo) - { - errors.Add(L"Precompile: Cannot find property \"" + propertyName.ToString() + L"\" in type \"" + reprTypeInfo.typeName.ToString() + L"\"."); - } - else - { - WString expressionCode; - if (auto obj = setter->values[0].Cast()) - { - expressionCode = obj->text; - } - - if (setter->binding == GlobalStringKey::_Bind || setter->binding == GlobalStringKey::_Format) - { - WorkflowDataBinding dataBinding; - dataBinding.variableName = repr->instanceName; - - if (setter->binding == GlobalStringKey::_Bind) - { - expressionCode = L"bind(" + expressionCode + L")"; - } - else if (setter->binding == GlobalStringKey::_Format) - { - expressionCode = L"bind($\"" + expressionCode + L"\")"; - } - - Ptr expression; - if (Workflow_ValidateExpression(context, types, errors, info, expressionCode, expression)) - { - dataBinding.propertyInfo = reprTypeInfo.typeDescriptor->GetPropertyByName(propertyName.ToString(), true); - dataBinding.bindExpression = expression; - } - - dataBindings.Add(dataBinding); - } - else if (setter->binding == GlobalStringKey::_Eval) - { - if (propertyInfo->scope != GuiInstancePropertyInfo::Property) - { - WString cacheKey = L"" + expressionCode; - auto assembly = Workflow_CompileExpression(context, types, errors, expressionCode); - context->precompiledCaches.Add(GlobalStringKey::Get(cacheKey), new GuiWorkflowCache(assembly)); - } - else - { - WorkflowDataBinding dataBinding; - dataBinding.variableName = repr->instanceName; - Ptr expression; - if (Workflow_ValidateExpression(context, types, errors, info, expressionCode, expression)) - { - dataBinding.propertyInfo = reprTypeInfo.typeDescriptor->GetPropertyByName(propertyName.ToString(), true); - dataBinding.bindExpression = expression; - } - - dataBindings.Add(dataBinding); - } - } - } - } - - FOREACH(Ptr, value, setter->values) - { - value->Accept(this); - } - } - - FOREACH_INDEXER(Ptr, handler, index, repr->eventHandlers.Values()) - { - if (reprTypeInfo.typeDescriptor) - { - GlobalStringKey propertyName = repr->eventHandlers.Keys()[index]; - Ptr eventInfo; - IGuiInstanceLoader::PropertyInfo info; - info.typeInfo = reprTypeInfo; - info.propertyName = propertyName; - - { - auto currentLoader = GetInstanceLoaderManager()->GetLoader(info.typeInfo.typeName); - - while (currentLoader && !eventInfo) - { - eventInfo = currentLoader->GetEventType(info); - if (eventInfo && eventInfo->support == GuiInstanceEventInfo::NotSupport) - { - eventInfo = 0; - } - currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); - } - } - - if (!eventInfo) - { - errors.Add(L"Precompile: Cannot find event \"" + propertyName.ToString() + L"\" in type \"" + reprTypeInfo.typeName.ToString() + L"\"."); - } - else - { - WString statementCode = handler->value; - - if (handler->binding == GlobalStringKey::_Eval) - { - WString cacheKey = L"<" + repr->instanceName.ToString() + L"><" + propertyName.ToString() + L">" + statementCode; - auto assembly = Workflow_CompileEventHandler(context, types, errors, info, statementCode); - context->precompiledCaches.Add(GlobalStringKey::Get(cacheKey), new GuiWorkflowCache(assembly)); - } - } - } - } - } - - void Visit(GuiConstructorRepr* repr)override - { - Visit((GuiAttSetterRepr*)repr); - } - }; - - void Workflow_PrecompileInstanceContext(Ptr context, types::ErrorList& errors) - { - ITypeDescriptor* rootTypeDescriptor = 0; - types::VariableTypeInfoMap typeInfos; - { - FOREACH(Ptr, parameter, context->parameters) - { - auto type = GetTypeDescriptor(parameter->className.ToString()); - if (!type) - { - errors.Add(L"Precompile: Cannot find type \"" + parameter->className.ToString() + L"\"."); - } - else if (typeInfos.Keys().Contains(parameter->name)) - { - errors.Add(L"Precompile: Parameter \"" + parameter->name.ToString() + L"\" conflict with an existing named object."); - } - else - { - IGuiInstanceLoader::TypeInfo typeInfo; - typeInfo.typeDescriptor = type; - typeInfo.typeName = GlobalStringKey::Get(type->GetTypeName()); - typeInfos.Add(parameter->name, typeInfo); - } - } - - WorkflowReferenceNamesVisitor visitor(context, typeInfos, errors); - context->instance->Accept(&visitor); - rootTypeDescriptor = visitor.rootTypeDescriptor; - } - - if (errors.Count() == 0) - { - WorkflowCompileVisitor visitor(context, typeInfos, errors); - context->instance->Accept(&visitor); - - if (visitor.dataBindings.Count() > 0 && rootTypeDescriptor) - { - auto assembly = Workflow_CompileDataBinding(context, visitor.types, rootTypeDescriptor, errors, visitor.dataBindings); - context->precompiledCaches.Add(GuiWorkflowCache::CacheContextName, new GuiWorkflowCache(assembly)); - } - } - } - -/*********************************************************************** -GuiWorkflowCache -***********************************************************************/ - - const GlobalStringKey& GuiWorkflowCache::CacheTypeName = GlobalStringKey::_Workflow_Assembly_Cache; - const GlobalStringKey& GuiWorkflowCache::CacheContextName = GlobalStringKey::_Workflow_Global_Context; - - GuiWorkflowCache::GuiWorkflowCache() - { - } - - GuiWorkflowCache::GuiWorkflowCache(Ptr _assembly) - :assembly(_assembly) - { - } - - GlobalStringKey GuiWorkflowCache::GetCacheTypeName() - { - return CacheTypeName; - } - -/*********************************************************************** -GuiWorkflowCacheResolver -***********************************************************************/ - - GlobalStringKey GuiWorkflowCacheResolver::GetCacheTypeName() - { - return GuiWorkflowCache::CacheTypeName; - } - - bool GuiWorkflowCacheResolver::Serialize(Ptr cache, stream::IStream& stream) - { - if (auto obj = cache.Cast()) - { - obj->assembly->Serialize(stream); - return true; - } - else - { - return false; - } - } - - Ptr GuiWorkflowCacheResolver::Deserialize(stream::IStream& stream) - { - auto assembly = new WfAssembly(stream); - return new GuiWorkflowCache(assembly); - } - -/*********************************************************************** -Workflow_GetSharedManager -***********************************************************************/ - -#undef ERROR_CODE_PREFIX - - class GuiWorkflowSharedManagerPlugin; - GuiWorkflowSharedManagerPlugin* sharedManagerPlugin = 0; - - class GuiWorkflowSharedManagerPlugin : public Object, public IGuiPlugin - { - protected: - Ptr workflowManager; - - public: - GuiWorkflowSharedManagerPlugin() - { - } - - void Load()override - { - } - - void AfterLoad()override - { - sharedManagerPlugin = this; - - auto manager=GetResourceResolverManager(); - manager->SetCacheResolver(new GuiWorkflowCacheResolver); - } - - void Unload()override - { - sharedManagerPlugin = 0; - } - - WfLexicalScopeManager* GetWorkflowManager() - { - if (!workflowManager) - { - workflowManager = new WfLexicalScopeManager(GetParserManager()->GetParsingTable(L"WORKFLOW")); - } - return workflowManager.Obj(); - } - }; - GUI_REGISTER_PLUGIN(GuiWorkflowSharedManagerPlugin) - - WfLexicalScopeManager* Workflow_GetSharedManager() - { - return sharedManagerPlugin->GetWorkflowManager(); - } - } -} - /*********************************************************************** GUIINSTANCEREPRESENTATION.CPP ***********************************************************************/ @@ -7407,28 +1702,6 @@ namespace vl using namespace templates; using namespace stream; -/*********************************************************************** -GuiValueRepr -***********************************************************************/ - - Ptr GuiValueRepr::LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys) - { - stream::internal::Reader reader(stream); - vint key = -1; - reader << key; - switch (key) - { - case GuiTextRepr::BinaryKey: - return GuiTextRepr::LoadPrecompiledBinary(stream, keys); - case GuiAttSetterRepr::BinaryKey: - return GuiAttSetterRepr::LoadPrecompiledBinary(stream, keys); - case GuiConstructorRepr::BinaryKey: - return GuiConstructorRepr::LoadPrecompiledBinary(stream, keys); - default: - CHECK_FAIL(L"GuiValueRepr::LoadPrecompiledBinary(stream::IStream&, collections::List&)#Internal Error."); - } - } - /*********************************************************************** GuiTextRepr ***********************************************************************/ @@ -7441,9 +1714,9 @@ GuiTextRepr return repr; } - void GuiTextRepr::FillXml(Ptr xml, bool serializePrecompiledResource) + void GuiTextRepr::FillXml(Ptr xml) { - if (!fromStyle || serializePrecompiledResource) + if (!fromStyle) { auto xmlText = MakePtr(); xmlText->content.value = text; @@ -7451,32 +1724,6 @@ GuiTextRepr } } - void GuiTextRepr::CollectUsedKey(collections::List& keys) - { - } - - void GuiTextRepr::SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey) - { - stream::internal::Writer writer(stream); - if (saveKey) - { - vint key = BinaryKey; - writer << key; - } - writer << text; - } - - Ptr GuiTextRepr::LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr) - { - stream::internal::Reader reader(stream); - if (!repr) - { - repr = MakePtr(); - } - reader << repr->text; - return repr; - } - /*********************************************************************** GuiAttSetterRepr ***********************************************************************/ @@ -7506,9 +1753,9 @@ GuiAttSetterRepr return repr; } - void GuiAttSetterRepr::FillXml(Ptr xml, bool serializePrecompiledResource) + void GuiAttSetterRepr::FillXml(Ptr xml) { - if (!fromStyle || serializePrecompiledResource) + if (!fromStyle) { if (instanceName != GlobalStringKey::Empty) { @@ -7526,7 +1773,7 @@ GuiAttSetterRepr { FOREACH(Ptr, repr, value->values) { - repr->FillXml(xml, serializePrecompiledResource); + repr->FillXml(xml); } } else @@ -7554,7 +1801,7 @@ GuiAttSetterRepr { if (!repr.Cast()) { - repr->FillXml(xmlProp, serializePrecompiledResource); + repr->FillXml(xmlProp); } } xml->subNodes.Add(xmlProp); @@ -7593,125 +1840,6 @@ GuiAttSetterRepr } } - void GuiAttSetterRepr::CollectUsedKey(collections::List& keys) - { - keys.Add(instanceName); - - for (vint i = 0; i < setters.Count(); i++) - { - keys.Add(setters.Keys()[i]); - auto value = setters.Values()[i]; - keys.Add(value->binding); - for (vint j = 0; j < value->values.Count(); j++) - { - value->values[j]->CollectUsedKey(keys); - } - } - - for (vint i = 0; i < eventHandlers.Count(); i++) - { - keys.Add(eventHandlers.Keys()[i]); - keys.Add(eventHandlers.Values()[i]->binding); - } - } - - void GuiAttSetterRepr::SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey) - { - stream::internal::Writer writer(stream); - if (saveKey) - { - vint key = BinaryKey; - writer << key; - } - { - vint count = setters.Count(); - writer << count; - for (vint i = 0; i < count; i++) - { - auto keyIndex = keys.IndexOf(setters.Keys()[i]); - auto value = setters.Values()[i]; - auto bindingIndex = keys.IndexOf(value->binding); - CHECK_ERROR(keyIndex != -1 && bindingIndex != -1, L"GuiAttSetterRepr::SavePrecompiledBinary(stream::IStream&, collections::SortedList&)#Internal Error."); - writer << keyIndex << bindingIndex; - - vint valueCount = value->values.Count(); - writer << valueCount; - for (vint j = 0; j < valueCount; j++) - { - value->values[j]->SavePrecompiledBinary(stream, keys, true); - } - } - } - { - vint count = eventHandlers.Count(); - writer << count; - for (vint i = 0; i < count; i++) - { - auto keyIndex = keys.IndexOf(eventHandlers.Keys()[i]); - auto value = eventHandlers.Values()[i]; - auto bindingIndex = keys.IndexOf(value->binding); - CHECK_ERROR(keyIndex != -1 && bindingIndex != -1, L"GuiAttSetterRepr::SavePrecompiledBinary(stream::IStream&, collections::SortedList&)#Internal Error."); - writer << keyIndex << bindingIndex << value->value; - } - } - { - vint instanceNameIndex = keys.IndexOf(instanceName); - CHECK_ERROR(instanceNameIndex != -1, L"GuiAttSetterRepr::SavePrecompiledBinary(stream::IStream&, collections::SortedList&)#Internal Error."); - writer << instanceNameIndex; - } - } - - Ptr GuiAttSetterRepr::LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr) - { - stream::internal::Reader reader(stream); - if (!repr) - { - repr = MakePtr(); - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint keyIndex = -1; - vint bindingIndex = -1; - auto value = MakePtr(); - reader << keyIndex << bindingIndex; - auto key = keys[keyIndex]; - value->binding = keys[bindingIndex]; - repr->setters.Add(key, value); - - vint valueCount = -1; - reader << valueCount; - for (vint j = 0; j < valueCount; j++) - { - auto repr = GuiValueRepr::LoadPrecompiledBinary(stream, keys); - value->values.Add(repr); - } - } - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint keyIndex = -1; - vint bindingIndex = -1; - auto value = MakePtr(); - reader << keyIndex << bindingIndex << value->value; - auto key = keys[keyIndex]; - value->binding = keys[bindingIndex]; - repr->eventHandlers.Add(key, value); - } - } - { - vint instanceNameIndex = -1; - reader << instanceNameIndex; - repr->instanceName = keys[instanceNameIndex]; - } - return repr; - } - /*********************************************************************** GuiConstructorRepr ***********************************************************************/ @@ -7727,9 +1855,9 @@ GuiConstructorRepr return repr; } - void GuiConstructorRepr::FillXml(Ptr xml, bool serializePrecompiledResource) + void GuiConstructorRepr::FillXml(Ptr xml) { - if (!fromStyle || serializePrecompiledResource) + if (!fromStyle) { auto xmlCtor = MakePtr(); if (typeNamespace == GlobalStringKey::Empty) @@ -7749,49 +1877,11 @@ GuiConstructorRepr xml->attributes.Add(attStyle); } - GuiAttSetterRepr::FillXml(xmlCtor, serializePrecompiledResource); + GuiAttSetterRepr::FillXml(xmlCtor); xml->subNodes.Add(xmlCtor); } } - void GuiConstructorRepr::CollectUsedKey(collections::List& keys) - { - GuiAttSetterRepr::CollectUsedKey(keys); - keys.Add(typeNamespace); - keys.Add(typeName); - } - - void GuiConstructorRepr::SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey) - { - stream::internal::Writer writer(stream); - if (saveKey) - { - vint key = BinaryKey; - writer << key; - } - vint typeNamespaceIndex = keys.IndexOf(typeNamespace); - vint typeNameIndex = keys.IndexOf(typeName); - CHECK_ERROR(typeNamespaceIndex != -1 && typeNameIndex != -1, L"GuiConstructorRepr::SavePrecompiledBinary(stream::IStream&, collections::SortedList&)#Internal Error."); - writer << typeNamespaceIndex << typeNameIndex << styleName; - GuiAttSetterRepr::SavePrecompiledBinary(stream, keys, false); - } - - Ptr GuiConstructorRepr::LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr) - { - stream::internal::Reader reader(stream); - if (!repr) - { - repr = MakePtr(); - } - vint typeNamespaceIndex = -1; - vint typeNameIndex = -1; - reader << typeNamespaceIndex << typeNameIndex << repr->styleName; - repr->typeNamespace = keys[typeNamespaceIndex]; - repr->typeName = keys[typeNameIndex]; - GuiAttSetterRepr::LoadPrecompiledBinary(stream, keys, repr); - return repr; - } - /*********************************************************************** GuiInstanceContext ***********************************************************************/ @@ -8177,10 +2267,6 @@ GuiInstanceContext context->states.Add(state); } } - else if (element->name.value == L"ref.Caches") - { - IGuiResourceCache::LoadFromXml(element, context->precompiledCaches); - } else if (!context->instance) { context->instance=LoadCtor(element, errors); @@ -8191,7 +2277,7 @@ GuiInstanceContext return context->instance ? context : nullptr; } - Ptr GuiInstanceContext::SaveToXml(bool serializePrecompiledResource) + Ptr GuiInstanceContext::SaveToXml() { auto xmlInstance = MakePtr(); xmlInstance->name.value = L"Instance"; @@ -8203,13 +2289,10 @@ GuiInstanceContext xmlInstance->attributes.Add(attCodeBehind); } - if (className) - { - auto attClass = MakePtr(); - attClass->name.value = L"ref.Class"; - attClass->value.value = className.Value(); - xmlInstance->attributes.Add(attClass); - } + auto attClass = MakePtr(); + attClass->name.value = L"ref.Class"; + attClass->value.value = className; + xmlInstance->attributes.Add(attClass); for (vint i = 0; i < namespaces.Count(); i++) { @@ -8299,7 +2382,7 @@ GuiInstanceContext } } - if (!serializePrecompiledResource && stylePaths.Count() > 0) + if (stylePaths.Count() > 0) { auto attStyles = MakePtr(); attStyles->name.value = L"ref.Styles"; @@ -8315,237 +2398,13 @@ GuiInstanceContext } } - if (serializePrecompiledResource && precompiledCaches.Count() > 0) - { - auto xmlCaches = MakePtr(); - xmlCaches->name.value = L"ref.Caches"; - xmlInstance->subNodes.Add(xmlCaches); - IGuiResourceCache::SaveToXml(xmlCaches, precompiledCaches); - } - - instance->FillXml(xmlInstance, serializePrecompiledResource); + instance->FillXml(xmlInstance); auto doc = MakePtr(); doc->rootElement = xmlInstance; return doc; } - Ptr GuiInstanceContext::LoadPrecompiledBinary(stream::IStream& stream, collections::List& errors) - { - stream::internal::Reader reader(stream); - List sortedKeys; - { - vint count = 0; - reader << count; - - for (vint i = 0; i < count; i++) - { - WString keyString; - reader << keyString; - sortedKeys.Add(GlobalStringKey::Get(keyString)); - } - } - - auto context = MakePtr(); - context->appliedStyles = true; - { - context->instance = GuiConstructorRepr::LoadPrecompiledBinary(stream, sortedKeys); - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint keyIndex = -1; - vint valueNameIndex = -1; - reader << keyIndex << valueNameIndex; - - auto key = sortedKeys[keyIndex]; - auto ni = MakePtr(); - ni->name = sortedKeys[valueNameIndex]; - context->namespaces.Add(key, ni); - - vint valueCount = -1; - reader << valueCount; - for (vint j = 0; j < valueCount; j++) - { - auto ns = MakePtr(); - reader << ns->prefix << ns->postfix; - ni->namespaces.Add(ns); - } - } - } - { - reader << context->codeBehind << context->className; - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint nameIndex = -1; - vint classNameIndex = -1; - reader << nameIndex << classNameIndex; - - auto parameter = MakePtr(); - parameter->name = sortedKeys[nameIndex]; - parameter->className = sortedKeys[classNameIndex]; - context->parameters.Add(parameter); - } - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint nameIndex = -1; - WString typeName; - bool readonly = false; - reader << nameIndex << typeName << readonly; - - auto prop = MakePtr(); - prop->name = sortedKeys[nameIndex]; - prop->typeName = typeName; - prop->readonly = readonly; - context->properties.Add(prop); - } - } - { - vint count = -1; - reader << count; - for (vint i = 0; i < count; i++) - { - vint nameIndex = -1; - WString typeName; - WString value; - reader << nameIndex << typeName << value; - - auto state = MakePtr(); - state->name = sortedKeys[nameIndex]; - state->typeName = typeName; - state->value = value; - context->states.Add(state); - } - } - IGuiResourceCache::LoadFromBinary(reader, context->precompiledCaches, sortedKeys); - - return context; - } - - void GuiInstanceContext::SavePrecompiledBinary(stream::IStream& stream) - { - stream::internal::Writer writer(stream); - SortedList sortedKeys; - { - List keys; - CollectUsedKey(keys); - CopyFrom(sortedKeys, From(keys).Distinct()); - - vint count = sortedKeys.Count(); - writer << count; - FOREACH(GlobalStringKey, key, sortedKeys) - { - WString keyString = key.ToString(); - writer << keyString; - } - } - { - instance->SavePrecompiledBinary(stream, sortedKeys, false); - } - { - vint count = namespaces.Count(); - writer << count; - for (vint i = 0; i < count; i++) - { - auto keyIndex = sortedKeys.IndexOf(namespaces.Keys()[i]); - auto value = namespaces.Values()[i]; - auto valueNameIndex = sortedKeys.IndexOf(value->name); - CHECK_ERROR(keyIndex != -1 && valueNameIndex != -1, L"GuiInstanceContext::SavePrecompiledBinary(stream::IStream&)#Internal Error."); - writer << keyIndex << valueNameIndex; - - vint valueCount = value->namespaces.Count(); - writer << valueCount; - FOREACH(Ptr, ns, value->namespaces) - { - writer << ns->prefix << ns->postfix; - } - } - } - { - writer << codeBehind << className; - } - { - vint count = parameters.Count(); - writer << count; - FOREACH(Ptr, parameter, parameters) - { - vint nameIndex = sortedKeys.IndexOf(parameter->name); - vint classNameIndex = sortedKeys.IndexOf(parameter->className); - CHECK_ERROR(nameIndex != -1 && classNameIndex != -1, L"GuiInstanceContext::SavePrecompiledBinary(stream::IStream&)#Internal Error."); - writer << nameIndex << classNameIndex; - } - } - { - vint count = properties.Count(); - writer << count; - FOREACH(Ptr, prop, properties) - { - vint nameIndex = sortedKeys.IndexOf(prop->name); - WString typeName = prop->typeName; - bool readonly = prop->readonly; - CHECK_ERROR(nameIndex != -1, L"GuiInstanceContext::SavePrecompiledBinary(stream::IStream&)#Internal Error."); - writer << nameIndex << typeName << readonly; - } - } - { - vint count = states.Count(); - writer << count; - FOREACH(Ptr, state, states) - { - vint nameIndex = sortedKeys.IndexOf(state->name); - WString typeName = state->typeName; - WString value = state->value; - CHECK_ERROR(nameIndex != -1, L"GuiInstanceContext::SavePrecompiledBinary(stream::IStream&)#Internal Error."); - writer << nameIndex << typeName << value; - } - } - - IGuiResourceCache::SaveToBinary(writer, precompiledCaches, sortedKeys); - } - - void GuiInstanceContext::CollectUsedKey(collections::List& keys) - { - instance->CollectUsedKey(keys); - - for (vint i = 0; i < namespaces.Count(); i++) - { - keys.Add(namespaces.Keys()[i]); - keys.Add(namespaces.Values()[i]->name); - } - - for (vint i = 0; i < parameters.Count(); i++) - { - keys.Add(parameters[i]->name); - keys.Add(parameters[i]->className); - } - - for (vint i = 0; i < properties.Count(); i++) - { - keys.Add(properties[i]->name); - } - - for (vint i = 0; i < states.Count(); i++) - { - keys.Add(states[i]->name); - } - - for (vint i = 0; i < precompiledCaches.Count(); i++) - { - keys.Add(precompiledCaches.Keys()[i]); - keys.Add(precompiledCaches.Values()[i]->GetCacheTypeName()); - } - } - bool GuiInstanceContext::ApplyStyles(Ptr resolver, collections::List& errors) { if (!appliedStyles) @@ -8677,8 +2536,7 @@ GuiInstanceStyle } xmlStyle->attributes.Add(attPath); - setter->FillXml(xmlStyle, true); - + setter->FillXml(xmlStyle); return xmlStyle; } @@ -8732,6 +2590,7 @@ namespace vl namespace presentation { using namespace parsing::xml; + using namespace workflow::runtime; /*********************************************************************** GuiInstanceSharedScript @@ -8756,9 +2615,2668 @@ GuiInstanceSharedScript return xml; } + +/*********************************************************************** +GuiInstanceSharedScript +***********************************************************************/ + + void GuiInstanceCompiledWorkflow::Initialize(bool initializeContext) + { + if (binaryToLoad) + { + assembly = new WfAssembly(*binaryToLoad.Obj()); + binaryToLoad = nullptr; + } + + if (initializeContext) + { + context = new WfRuntimeGlobalContext(assembly); + LoadFunction(context, L"")(); + } + } } } +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_COMPOSITIONS.CPP +***********************************************************************/ + +#ifndef VCZH_DEBUG_NO_REFLECTION + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + +/*********************************************************************** +GuiAxisInstanceLoader +***********************************************************************/ + + class GuiAxisInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _AxisDirection; + + public: + GuiAxisInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _AxisDirection = GlobalStringKey::Get(L"AxisDirection"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_AxisDirection); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _AxisDirection) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + bool CanCreate(const TypeInfo& typeInfo)override + { + return typeName == typeInfo.typeName; + } + + Ptr CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + if (typeName == typeInfo.typeName) + { + vint indexAxisDirection = arguments.Keys().IndexOf(_AxisDirection); + if (indexAxisDirection) + { + auto createExpr = MakePtr(); + createExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createExpr->arguments.Add(arguments.GetByIndex(indexAxisDirection)[0].expression); + + auto refVariable = MakePtr(); + refVariable->name.value = variableName.ToString(); + + auto assignExpr = MakePtr(); + assignExpr->op = WfBinaryOperator::Assign; + assignExpr->first = refVariable; + assignExpr->second = createExpr; + + auto assignStat = MakePtr(); + assignStat->expression = assignExpr; + return assignStat; + } + } + return nullptr; + } + }; + +/*********************************************************************** +GuiCompositionInstanceLoader +***********************************************************************/ + + class GuiCompositionInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiCompositionInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + auto info = GuiInstancePropertyInfo::Collection(); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr expr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refOwnedElement = MakePtr(); + refOwnedElement->parent = refComposition; + refOwnedElement->name.value = L"OwnedElement"; + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refOwnedElement; + assign->second = value; + + expr = assign; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refBoundsComposition = MakePtr(); + refBoundsComposition->parent = value; + refBoundsComposition->name.value = L"BoundsComposition"; + + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refAddChild = MakePtr(); + refAddChild->parent = refComposition; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(refBoundsComposition); + + expr = call; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refAddChild = MakePtr(); + refAddChild->parent = refComposition; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(value); + + expr = call; + } + + if (expr) + { + auto stat = MakePtr(); + stat->expression = expr; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiTableCompositionInstanceLoader +***********************************************************************/ + + class GuiTableCompositionInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _Rows, _Columns; + + public: + GuiTableCompositionInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _Rows = GlobalStringKey::Get(L"Rows"); + _Columns = GlobalStringKey::Get(L"Columns"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_Rows); + propertyNames.Add(_Columns); + } + + void GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames) + { + if (propertyInfo.propertyName == _Rows || propertyInfo.propertyName == _Columns) + { + propertyNames.Add(_Rows); + propertyNames.Add(_Columns); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _Rows || propertyInfo.propertyName == _Columns) + { + return GuiInstancePropertyInfo::Array(description::GetTypeDescriptor()); + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == _Rows) + { + auto indexColumns = arguments.Keys().IndexOf(_Columns); + if (indexColumns != -1) + { + auto& rows = arguments.GetByIndex(index); + auto& columns = arguments.GetByIndex(indexColumns); + + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refSetRowsAndColumns = MakePtr(); + refSetRowsAndColumns->parent = refComposition; + refSetRowsAndColumns->name.value = L"SetRowsAndColumns"; + + auto rowsExpr = MakePtr(); + rowsExpr->value.value = itow(rows.Count()); + + auto columnsExpr = MakePtr(); + columnsExpr->value.value = itow(columns.Count()); + + auto call = MakePtr(); + call->function = refSetRowsAndColumns; + call->arguments.Add(rowsExpr); + call->arguments.Add(columnsExpr); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + + for (vint i = 0; i < rows.Count(); i++) + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refSetRowOption = MakePtr(); + refSetRowOption->parent = refComposition; + refSetRowOption->name.value = L"SetRowOption"; + + auto indexExpr = MakePtr(); + indexExpr->value.value = itow(i); + + auto call = MakePtr(); + call->function = refSetRowOption; + call->arguments.Add(indexExpr); + call->arguments.Add(rows[i].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + + for (vint i = 0; i < columns.Count(); i++) + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refSetColumnOption = MakePtr(); + refSetColumnOption->parent = refComposition; + refSetColumnOption->name.value = L"SetColumnOption"; + + auto indexExpr = MakePtr(); + indexExpr->value.value = itow(i); + + auto call = MakePtr(); + call->function = refSetColumnOption; + call->arguments.Add(indexExpr); + call->arguments.Add(columns[i].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiCellCompositionInstanceLoader +***********************************************************************/ + + class GuiCellCompositionInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _Site; + + public: + GuiCellCompositionInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _Site = GlobalStringKey::Get(L"Site"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_Site); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _Site) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == _Site) + { + auto value = arguments.GetByIndex(index)[0].expression; + Value siteValue = ParseConstantArgument(value, typeInfo, L"Site", L"row: column: rowSpan: columnSpan:", errors); + if (siteValue.IsNull()) + { + continue; + } + + { + auto refComposition = MakePtr(); + refComposition->name.value = variableName.ToString(); + + auto refSetSite = MakePtr(); + refSetSite->parent = refComposition; + refSetSite->name.value = L"SetSite"; + + auto call = MakePtr(); + call->function = refSetSite; + { + auto arg = MakePtr(); + arg->value.value = siteValue.GetProperty(L"row").GetText(); + call->arguments.Add(arg); + } + { + auto arg = MakePtr(); + arg->value.value = siteValue.GetProperty(L"column").GetText(); + call->arguments.Add(arg); + } + { + auto arg = MakePtr(); + arg->value.value = siteValue.GetProperty(L"rowSpan").GetText(); + call->arguments.Add(arg); + } + { + auto arg = MakePtr(); + arg->value.value = siteValue.GetProperty(L"columnSpan").GetText(); + call->arguments.Add(arg); + } + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +Initialization +***********************************************************************/ + + void LoadCompositions(IGuiInstanceLoaderManager* manager) + { + manager->SetLoader(new GuiAxisInstanceLoader); + manager->SetLoader(new GuiCompositionInstanceLoader); + manager->SetLoader(new GuiTableCompositionInstanceLoader); + manager->SetLoader(new GuiCellCompositionInstanceLoader); + } + } + } +} + +#endif + +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_DOCUMENT.CPP +***********************************************************************/ + +#ifndef VCZH_DEBUG_NO_REFLECTION + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + +/*********************************************************************** +GuiDocumentItemInstanceLoader +***********************************************************************/ + + class GuiDocumentItemInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _Name; + + public: + GuiDocumentItemInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _Name = GlobalStringKey::Get(L"Name"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_Name); + } + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + auto info = GuiInstancePropertyInfo::Collection(); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + return info; + } + else if (propertyInfo.propertyName == _Name) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + + bool CanCreate(const TypeInfo& typeInfo) + { + return typeName == typeInfo.typeName; + } + + Ptr CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors) + { + if (typeInfo.typeName == GetTypeName()) + { + vint indexName = arguments.Keys().IndexOf(_Name); + if (indexName != -1) + { + auto type = TypeInfoRetriver>::CreateTypeInfo(); + auto createExpr = MakePtr(); + createExpr->type = GetTypeFromTypeInfo(type.Obj()); + createExpr->arguments.Add(arguments.GetByIndex(indexName)[0].expression); + + auto refVariable = MakePtr(); + refVariable->name.value = variableName.ToString(); + + auto assignExpr = MakePtr(); + assignExpr->op = WfBinaryOperator::Assign; + assignExpr->first = refVariable; + assignExpr->second = createExpr; + + auto assignStat = MakePtr(); + assignStat->expression = assignExpr; + return assignStat; + } + } + return nullptr; + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr compositionExpr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto member = MakePtr(); + member->parent = value; + member->name.value = L"BoundsComposition"; + compositionExpr = member; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + compositionExpr = value; + } + + if (compositionExpr) + { + auto refItem = MakePtr(); + refItem->name.value = variableName.ToString(); + + auto refContainer = MakePtr(); + refContainer->parent = refItem; + refContainer->name.value = L"Container"; + + auto refAddChild = MakePtr(); + refAddChild->parent = refContainer; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(compositionExpr); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiDocumentViewerInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiDocumentViewerInstanceLoader : public BASE_TYPE + { + public: + GuiDocumentViewerInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateDocumentViewerStyle") + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto type = values[0].type; + + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddDocumentItem = MakePtr(); + refAddDocumentItem->parent = refControl; + refAddDocumentItem->name.value = L"AddDocumentItem"; + + auto call = MakePtr(); + call->function = refAddDocumentItem; + call->arguments.Add(values[0].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiDocumentLabelInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiDocumentLabelInstanceLoader : public BASE_TYPE + { + public: + GuiDocumentLabelInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateDocumentLabelStyle") + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto type = values[0].type; + + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddDocumentItem = MakePtr(); + refAddDocumentItem->parent = refControl; + refAddDocumentItem->name.value = L"AddDocumentItem"; + + auto call = MakePtr(); + call->function = refAddDocumentItem; + call->arguments.Add(values[0].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; +#undef BASE_TYPE + +/*********************************************************************** +Initialization +***********************************************************************/ + + void LoadDocumentControls(IGuiInstanceLoaderManager* manager) + { + manager->SetLoader(new GuiDocumentItemInstanceLoader); + manager->SetLoader(new GuiDocumentViewerInstanceLoader); + manager->SetLoader(new GuiDocumentLabelInstanceLoader); + } + } + } +} + +#endif + +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_LIST.CPP +***********************************************************************/ + +#ifndef VCZH_DEBUG_NO_REFLECTION + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + + template + Ptr CreateSetControlTemplateStyle(GlobalStringKey variableName, Ptr argument, const IGuiInstanceLoader::TypeInfo& controlTypeInfo, const WString& propertyName, collections::List& errors) + { + using Helper = GuiTemplateControlInstanceLoader; + List controlTemplateTds; + Helper::GetItemTemplateType(argument, controlTemplateTds, controlTypeInfo, GlobalStringKey::_ItemTemplate.ToString(), errors); + + if (controlTemplateTds.Count() > 0) + { + auto refFactory = Helper::CreateTemplateFactory(controlTemplateTds, errors); + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createStyle->arguments.Add(refFactory); + + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refStyleProvider = MakePtr(); + refStyleProvider->parent = refControl; + refStyleProvider->name.value = propertyName; + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refStyleProvider; + assign->second = createStyle; + + auto stat = MakePtr(); + stat->expression = assign; + return stat; + } + + return nullptr; + } + +/*********************************************************************** +GuiSelectableListControlInstanceLoader +***********************************************************************/ + + class GuiSelectableListControlInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiSelectableListControlInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::_ItemTemplate); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::_ItemTemplate) + { + if (auto stat = CreateSetControlTemplateStyle(variableName, arguments.GetByIndex(index)[0].expression, typeInfo, L"StyleProvider", errors)) + { + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiVirtualTreeViewInstanceLoader +***********************************************************************/ + + class GuiVirtualTreeViewInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiVirtualTreeViewInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::_ItemTemplate); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::_ItemTemplate) + { + if (auto stat = CreateSetControlTemplateStyle(variableName, arguments.GetByIndex(index)[0].expression, typeInfo, L"NodeStyleProvider", errors)) + { + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiListViewInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + template + class GuiListViewInstanceLoaderBase : public BASE_TYPE + { + protected: + bool bindable; + GlobalStringKey _View, _IconSize; + + void PrepareAdditionalArgumentsAfterCreation(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr block)override + { + auto view = ListViewViewType::Detail; + Ptr iconSize; + { + vint indexView = arguments.Keys().IndexOf(_View); + if (indexView != -1) + { + auto value = arguments.GetByIndex(indexView)[0].expression; + auto viewValue = ParseConstantArgument(value, typeInfo, L"View", L"", errors); + view = UnboxValue(viewValue); + } + + vint indexIconSize = arguments.Keys().IndexOf(_IconSize); + if (indexIconSize != -1) + { + iconSize = arguments.GetByIndex(indexIconSize)[0].expression; + } + } + + Ptr itemStyleType; + switch (view) + { +#define VIEW_TYPE_CASE(NAME) case ListViewViewType::NAME: itemStyleType = TypeInfoRetriver>::CreateTypeInfo(); break; + VIEW_TYPE_CASE(BigIcon) + VIEW_TYPE_CASE(SmallIcon) + VIEW_TYPE_CASE(List) + VIEW_TYPE_CASE(Tile) + VIEW_TYPE_CASE(Information) + VIEW_TYPE_CASE(Detail) +#undef VIEW_TYPE_CASE + } + + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(itemStyleType.Obj()); + + if (iconSize) + { + createStyle->arguments.Add(iconSize); + + auto falseValue = MakePtr(); + falseValue->value = WfLiteralValue::False; + createStyle->arguments.Add(falseValue); + } + else + { + { + auto stringValue = MakePtr(); + stringValue->value.value = L"x:32 y:32"; + + auto iconSizeValue = MakePtr(); + iconSizeValue->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + iconSizeValue->expression = stringValue; + + createStyle->arguments.Add(iconSizeValue); + } + { + auto trueValue = MakePtr(); + trueValue->value = WfLiteralValue::True; + createStyle->arguments.Add(trueValue); + } + } + + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refChangeItemStyle = MakePtr(); + refChangeItemStyle->parent = refControl; + refChangeItemStyle->name.value = L"ChangeItemStyle"; + + auto call = MakePtr(); + call->function = refChangeItemStyle; + call->arguments.Add(createStyle); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + + public: + GuiListViewInstanceLoaderBase() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateListViewStyle") + { + _View = GlobalStringKey::Get(L"View"); + _IconSize = GlobalStringKey::Get(L"IconSize"); + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_View); + propertyNames.Add(_IconSize); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _View) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + return info; + } + else if (propertyInfo.propertyName == _IconSize) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + }; +#undef BASE_TYPE + + class GuiListViewInstanceLoader : public GuiListViewInstanceLoaderBase + { + }; + +#define BASE_TYPE GuiListViewInstanceLoaderBase + class GuiBindableListViewInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey _ItemSource; + + void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl)override + { + vint indexItemSource = arguments.Keys().IndexOf(_ItemSource); + if (indexItemSource != -1) + { + createControl->arguments.Add(arguments.GetByIndex(indexItemSource)[0].expression); + } + } + public: + GuiBindableListViewInstanceLoader() + { + _ItemSource = GlobalStringKey::Get(L"ItemSource"); + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_ItemSource); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _ItemSource) + { + if (bindable) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + info->bindable = true; + return info; + } + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiTreeViewInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + template + class GuiTreeViewInstanceLoaderBase : public BASE_TYPE + { + protected: + bool bindable; + GlobalStringKey _Nodes, _IconSize; + + void PrepareAdditionalArgumentsAfterCreation(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr block)override + { + vint indexIconSize = arguments.Keys().IndexOf(_IconSize); + if (indexIconSize != -1) + { + Ptr itemStyleType = TypeInfoRetriver>::CreateTypeInfo(); + + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(itemStyleType.Obj()); + { + auto iconSize = arguments.GetByIndex(indexIconSize)[0].expression; + createStyle->arguments.Add(iconSize); + } + { + auto falseValue = MakePtr(); + falseValue->value = WfLiteralValue::False; + createStyle->arguments.Add(falseValue); + } + + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refChangeItemStyle = MakePtr(); + refChangeItemStyle->parent = refControl; + refChangeItemStyle->name.value = L"ChangeItemStyle"; + + auto call = MakePtr(); + call->function = refChangeItemStyle; + call->arguments.Add(createStyle); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + + public: + GuiTreeViewInstanceLoaderBase() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateTreeViewStyle") + { + _Nodes = GlobalStringKey::Get(L"Nodes"); + _IconSize = GlobalStringKey::Get(L"IconSize"); + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (!bindable) + { + propertyNames.Add(_Nodes); + } + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_Nodes); + propertyNames.Add(_IconSize); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _Nodes) + { + if (!bindable) + { + return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); + } + } + else if (propertyInfo.propertyName == _IconSize) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == _Nodes) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refNodes = MakePtr(); + refNodes->parent = refControl; + refNodes->name.value = L"Nodes"; + + auto refChildren = MakePtr(); + refChildren->parent = refNodes; + refChildren->name.value = L"Children"; + + auto refAdd = MakePtr(); + refAdd->parent = refChildren; + refAdd->name.value = L"Add"; + + auto call = MakePtr(); + call->function = refAdd; + call->arguments.Add(arguments.GetByIndex(index)[0].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; +#undef BASE_TYPE + + class GuiTreeViewInstanceLoader : public GuiTreeViewInstanceLoaderBase + { + }; + +#define BASE_TYPE GuiTreeViewInstanceLoaderBase + class GuiBindableTreeViewInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey _ItemSource; + + void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl)override + { + vint indexItemSource = arguments.Keys().IndexOf(_ItemSource); + if (indexItemSource != -1) + { + createControl->arguments.Add(arguments.GetByIndex(indexItemSource)[0].expression); + } + } + public: + GuiBindableTreeViewInstanceLoader() + { + _ItemSource = GlobalStringKey::Get(L"ItemSource"); + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_ItemSource); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _ItemSource) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + info->bindable = true; + return info; + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiBindableTextListInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiBindableTextListInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey _ItemSource; + + void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl)override + { + vint indexItemSource = arguments.Keys().IndexOf(_ItemSource); + if (indexItemSource != -1) + { + createControl->arguments.Add(arguments.GetByIndex(indexItemSource)[0].expression); + } + } + public: + GuiBindableTextListInstanceLoader(const WString& type) + :BASE_TYPE( + L"presentation::controls::GuiBindable" + type + L"TextList", + L"CreateTextListStyle", + L"Create" + type + L"TextListItemStyle" + ) + { + _ItemSource = GlobalStringKey::Get(L"ItemSource"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_ItemSource); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _ItemSource) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiBindableDataColumnInstanceLoader +***********************************************************************/ + + class GuiBindableDataColumnInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _VisualizerTemplates; + GlobalStringKey _EditorTemplate; + + public: + GuiBindableDataColumnInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _VisualizerTemplates = GlobalStringKey::Get(L"VisualizerTemplates"); + _EditorTemplate = GlobalStringKey::Get(L"EditorTemplate"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_VisualizerTemplates); + propertyNames.Add(_EditorTemplate); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _VisualizerTemplates) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + else if (propertyInfo.propertyName == _EditorTemplate) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == _VisualizerTemplates) + { + using Helper = GuiTemplateControlInstanceLoader; + List controlTemplateTds; + Helper::GetItemTemplateType(arguments.GetByIndex(index)[0].expression, controlTemplateTds, typeInfo, _EditorTemplate.ToString(), errors); + + if (controlTemplateTds.Count() > 0) + { + FOREACH_INDEXER(ITypeDescriptor*, controlTemplateTd, index, controlTemplateTds) + { + auto refFactory = Helper::CreateTemplateFactory(controlTemplateTd, errors); + auto createStyle = MakePtr(); + if (index == 0) + { + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + } + else + { + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + } + createStyle->arguments.Add(refFactory); + { + auto refContainer = MakePtr(); + refContainer->name.value = variableName.ToString(); + createStyle->arguments.Add(refContainer); + } + if (index > 0) + { + auto refPreviousFactory = MakePtr(); + refPreviousFactory->name.value = L"" + itow(index - 1); + createStyle->arguments.Add(refPreviousFactory); + } + + auto varDecl = MakePtr(); + varDecl->name.value = L"" + itow(index); + varDecl->expression = createStyle; + + auto stat = MakePtr(); + stat->variable = varDecl; + block->statements.Add(stat); + } + + auto refContainer = MakePtr(); + refContainer->name.value = variableName.ToString(); + + auto refVisualizerFactory = MakePtr(); + refVisualizerFactory->parent = refContainer; + refVisualizerFactory->name.value = L"Visualizer"; + + auto refLastFactory = MakePtr(); + refLastFactory->parent = refContainer; + refLastFactory->name.value = L"" + itow(controlTemplateTds.Count() - 1); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refVisualizerFactory; + assign->second = refLastFactory; + + auto stat = MakePtr(); + stat->expression = assign; + block->statements.Add(stat); + } + } + else if (prop == _EditorTemplate) + { + using Helper = GuiTemplateControlInstanceLoader; + List controlTemplateTds; + Helper::GetItemTemplateType(arguments.GetByIndex(index)[0].expression, controlTemplateTds, typeInfo, _EditorTemplate.ToString(), errors); + + if (controlTemplateTds.Count() > 0) + { + auto refFactory = Helper::CreateTemplateFactory(controlTemplateTds, errors); + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createStyle->arguments.Add(refFactory); + { + auto refContainer = MakePtr(); + refContainer->name.value = variableName.ToString(); + createStyle->arguments.Add(refContainer); + } + + auto refContainer = MakePtr(); + refContainer->name.value = variableName.ToString(); + + auto refEditorFactory = MakePtr(); + refEditorFactory->parent = refContainer; + refEditorFactory->name.value = L"EditorFactory"; + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refEditorFactory; + assign->second = createStyle; + + auto stat = MakePtr(); + stat->expression = assign; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiBindableDataGridInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiBindableDataGridInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey typeName; + GlobalStringKey _ItemSource; + GlobalStringKey _ViewModelContext; + GlobalStringKey _Columns; + + void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl)override + { + auto indexItemSource = arguments.Keys().IndexOf(_ItemSource); + createControl->arguments.Add(arguments.GetByIndex(indexItemSource)[0].expression); + + auto indexViewModelContext = arguments.Keys().IndexOf(_ViewModelContext); + if (indexViewModelContext == -1) + { + auto nullExpr = MakePtr(); + nullExpr->value = WfLiteralValue::Null; + createControl->arguments.Add(nullExpr); + } + else + { + createControl->arguments.Add(arguments.GetByIndex(indexViewModelContext)[0].expression); + } + } + public: + GuiBindableDataGridInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateListViewStyle") + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + _ItemSource = GlobalStringKey::Get(L"ItemSource"); + _ViewModelContext = GlobalStringKey::Get(L"ViewModelContext"); + _Columns = GlobalStringKey::Get(L"Columns"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_Columns); + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_ItemSource); + propertyNames.Add(_ViewModelContext); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _Columns) + { + return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); + } + else if (propertyInfo.propertyName == _ItemSource) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + info->bindable = true; + return info; + } + else if (propertyInfo.propertyName == _ViewModelContext) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->bindable = true; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == _Columns) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddBindableColumn = MakePtr(); + refAddBindableColumn->parent = refControl; + refAddBindableColumn->name.value = L"AddBindableColumn"; + + auto call = MakePtr(); + call->function = refAddBindableColumn; + call->arguments.Add(arguments.GetByIndex(index)[0].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiTreeNodeInstanceLoader +***********************************************************************/ + + class GuiTreeNodeInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _Text, _Image, _Tag; + + public: + GuiTreeNodeInstanceLoader() + :typeName(GlobalStringKey::Get(L"presentation::controls::tree::TreeNode")) + { + _Text = GlobalStringKey::Get(L"Text"); + _Image = GlobalStringKey::Get(L"Image"); + _Tag = GlobalStringKey::Get(L"Tag"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_Text); + propertyNames.Add(_Image); + propertyNames.Add(_Tag); + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _Text) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + else if (propertyInfo.propertyName == _Image) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + else if (propertyInfo.propertyName == _Tag) + { + return GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + } + else if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::Collection(description::GetTypeDescriptor()); + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + bool CanCreate(const TypeInfo& typeInfo)override + { + return typeInfo.typeName == GetTypeName(); + } + + Ptr CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + if (typeInfo.typeName == GetTypeName()) + { + auto createItem = MakePtr(); + createItem->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + + auto createNode = MakePtr(); + createNode->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createNode->arguments.Add(createItem); + + auto refNode = MakePtr(); + refNode->name.value = variableName.ToString(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refNode; + assign->second = createNode; + + auto stat = MakePtr(); + stat->expression = assign; + return stat; + } + return nullptr; + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + if (prop == GlobalStringKey::Empty) + { + auto refNode = MakePtr(); + refNode->name.value = variableName.ToString(); + + auto refChildren = MakePtr(); + refChildren->parent = refNode; + refChildren->name.value = L"Children"; + + auto refAdd = MakePtr(); + refAdd->parent = refChildren; + refAdd->name.value = L"Add"; + + auto call = MakePtr(); + call->function = refAdd; + call->arguments.Add(arguments.GetByIndex(index)[0].expression); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + else if (prop == _Text || prop == _Image || prop == _Tag) + { + { + auto refNode = MakePtr(); + refNode->name.value = variableName.ToString(); + + auto refData = MakePtr(); + refData->parent = refNode; + refData->name.value = L"Data"; + + auto castExpr = MakePtr(); + castExpr->strategy = WfTypeCastingStrategy::Strong; + castExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + castExpr->expression = refData; + + auto refProp = MakePtr(); + refProp->parent = castExpr; + if (prop == _Text) + { + refProp->name.value = L"text"; + } + else if (prop == _Image) + { + refProp->name.value = L"image"; + } + else if (prop == _Tag) + { + refProp->name.value = L"tag"; + } + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refProp; + assign->second = arguments.GetByIndex(index)[0].expression; + + auto stat = MakePtr(); + stat->expression = assign; + block->statements.Add(stat); + } + + if (prop != _Tag) + { + auto refNode = MakePtr(); + refNode->name.value = variableName.ToString(); + + auto refNotifyDataModified = MakePtr(); + refNotifyDataModified->parent = refNode; + refNotifyDataModified->name.value = L"NotifyDataModified"; + + auto call = MakePtr(); + call->function = refNotifyDataModified; + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +Initialization +***********************************************************************/ + + void LoadListControls(IGuiInstanceLoaderManager* manager) + { + manager->SetLoader(new GuiSelectableListControlInstanceLoader); + manager->SetLoader(new GuiVirtualTreeViewInstanceLoader); + + manager->SetLoader(new GuiListViewInstanceLoader); + manager->SetLoader(new GuiBindableListViewInstanceLoader); + + manager->SetLoader(new GuiTreeViewInstanceLoader); + manager->SetLoader(new GuiBindableTreeViewInstanceLoader); + + manager->SetLoader(new GuiBindableTextListInstanceLoader(L"")); + manager->SetLoader(new GuiBindableTextListInstanceLoader(L"Check")); + manager->SetLoader(new GuiBindableTextListInstanceLoader(L"Radio")); + + manager->SetLoader(new GuiBindableDataColumnInstanceLoader); + manager->SetLoader(new GuiBindableDataGridInstanceLoader); + + manager->CreateVirtualType( + GlobalStringKey::Get(description::TypeInfo::TypeName), + new GuiTreeNodeInstanceLoader + ); + } + } + } +} + +#endif + +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_PLUGIN.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + +#ifndef VCZH_DEBUG_NO_REFLECTION + +/*********************************************************************** +GuiControlInstanceLoader +***********************************************************************/ + + class GuiControlInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiControlInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + auto info = GuiInstancePropertyInfo::Collection(); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + if (propertyInfo.typeInfo.typeDescriptor->CanConvertTo(description::GetTypeDescriptor())) + { + info->acceptableTypes.Add(description::GetTypeDescriptor()); + } + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr expr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddComponent = MakePtr(); + refAddComponent->parent = refControl; + refAddComponent->name.value = L"AddComponent"; + + auto call = MakePtr(); + call->function = refAddComponent; + call->arguments.Add(value); + + expr = call; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddControlHostComponent = MakePtr(); + refAddControlHostComponent->parent = refControl; + refAddControlHostComponent->name.value = L"AddControlHostComponent"; + + auto call = MakePtr(); + call->function = refAddControlHostComponent; + call->arguments.Add(value); + + expr = call; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refAddChild = MakePtr(); + refAddChild->parent = refControl; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(value); + + expr = call; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refContainerComposition = MakePtr(); + refContainerComposition->parent = refControl; + refContainerComposition->name.value = L"ContainerComposition"; + + auto refAddChild = MakePtr(); + refAddChild->parent = refContainerComposition; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(value); + + expr = call; + } + + if (expr) + { + auto stat = MakePtr(); + stat->expression = expr; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +GuiComboBoxInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiComboBoxInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey _ListControl; + + void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl)override + { + vint indexListControl = arguments.Keys().IndexOf(_ListControl); + if (indexListControl != -1) + { + createControl->arguments.Add(arguments.GetByIndex(indexListControl)[0].expression); + } + } + public: + GuiComboBoxInstanceLoader() + :BASE_TYPE(L"presentation::controls::GuiComboBox", L"CreateComboBoxStyle") + { + _ListControl = GlobalStringKey::Get(L"ListControl"); + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_ListControl); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _ListControl) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + info->required = true; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + }; +#undef BASE_TYPE + +#endif + +/*********************************************************************** +GuiPredefinedInstanceLoadersPlugin +***********************************************************************/ + + Ptr CreateStandardDataPicker(IGuiInstanceLoader::ArgumentMap&) + { + using TControl = GuiDatePicker; + using TControlStyle = GuiDateComboBoxTemplate_StyleProvider; + using TTemplate = GuiDatePickerTemplate; + + auto controlType = TypeInfoRetriver::CreateTypeInfo(); + auto createControl = MakePtr(); + createControl->type = GetTypeFromTypeInfo(controlType.Obj()); + createControl->arguments.Add(GuiTemplateControlInstanceLoader::CreateIThemeCall(L"CreateDatePickerStyle")); + + return createControl; + } + + void InitializeTrackerProgressBar(const WString& variableName, Ptr block) + { + auto refVariable = MakePtr(); + refVariable->name.value = variableName; + + auto refSetPageSize = MakePtr(); + refSetPageSize->parent = refVariable; + refSetPageSize->name.value = L"SetPageSize"; + + auto refZero = MakePtr(); + refZero->value.value = L"0"; + + auto call = MakePtr(); + call->function = refSetPageSize; + call->arguments.Add(refZero); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + + extern void LoadTabControls(IGuiInstanceLoaderManager* manager); + extern void LoadToolstripControls(IGuiInstanceLoaderManager* manager); + extern void LoadListControls(IGuiInstanceLoaderManager* manager); + extern void LoadDocumentControls(IGuiInstanceLoaderManager* manager); + extern void LoadCompositions(IGuiInstanceLoaderManager* manager); + + class GuiPredefinedInstanceLoadersPlugin : public Object, public IGuiPlugin + { + public: + void Load()override + { + } + + void AfterLoad()override + { + #ifndef VCZH_DEBUG_NO_REFLECTION + IGuiInstanceLoaderManager* manager=GetInstanceLoaderManager(); + + #define ADD_VIRTUAL_TYPE_LOADER(TYPENAME, LOADER)\ + manager->CreateVirtualType(\ + GlobalStringKey::Get(description::TypeInfo::TypeName),\ + new LOADER\ + ) + + #define ADD_TEMPLATE_CONTROL(TYPENAME, STYLE_METHOD, TEMPLATE)\ + manager->SetLoader(\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::" L ## #TYPENAME,\ + L ## #STYLE_METHOD\ + )\ + ) + + #define ADD_TEMPLATE_CONTROL_2(TYPENAME, STYLE_METHOD, ARGUMENT_METHOD, TEMPLATE)\ + manager->SetLoader(\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::" L ## #TYPENAME,\ + L ## #STYLE_METHOD,\ + L ## #ARGUMENT_METHOD\ + )\ + ) + + #define ADD_TEMPLATE_CONTROL_3(TYPENAME, STYLE_METHOD, ARGUMENT_FUNCTION, TEMPLATE)\ + manager->SetLoader(\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::" L ## #TYPENAME,\ + L ## #STYLE_METHOD,\ + ARGUMENT_FUNCTION\ + )\ + ) + + #define ADD_VIRTUAL_CONTROL(VIRTUALTYPENAME, TYPENAME, STYLE_METHOD, TEMPLATE)\ + manager->CreateVirtualType(GlobalStringKey::Get(description::TypeInfo::TypeName),\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ + L ## #STYLE_METHOD\ + )\ + ) + + #define ADD_VIRTUAL_CONTROL_2(VIRTUALTYPENAME, TYPENAME, STYLE_METHOD, ARGUMENT_METHOD, TEMPLATE)\ + manager->CreateVirtualType(GlobalStringKey::Get(description::TypeInfo::TypeName),\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ + L ## #STYLE_METHOD,\ + L ## #ARGUMENT_METHOD\ + )\ + ) + + #define ADD_VIRTUAL_CONTROL_F(VIRTUALTYPENAME, TYPENAME, STYLE_METHOD, TEMPLATE, INIT_FUNCTION)\ + manager->CreateVirtualType(GlobalStringKey::Get(description::TypeInfo::TypeName),\ + new GuiTemplateControlInstanceLoader(\ + L"presentation::controls::Gui" L ## #VIRTUALTYPENAME,\ + L ## #STYLE_METHOD,\ + INIT_FUNCTION\ + )\ + ) + + manager->SetLoader(new GuiControlInstanceLoader); + ADD_VIRTUAL_TYPE_LOADER(GuiComboBoxListControl, GuiComboBoxInstanceLoader); + + ADD_TEMPLATE_CONTROL ( GuiCustomControl, CreateCustomControlStyle, GuiControlTemplate ); + ADD_TEMPLATE_CONTROL ( GuiLabel, CreateLabelStyle, GuiLabelTemplate ); + ADD_TEMPLATE_CONTROL ( GuiButton, CreateButtonStyle, GuiButtonTemplate ); + ADD_TEMPLATE_CONTROL ( GuiScrollContainer, CreateScrollContainerStyle, GuiScrollViewTemplate ); + ADD_TEMPLATE_CONTROL ( GuiWindow, CreateWindowStyle, GuiWindowTemplate ); + ADD_TEMPLATE_CONTROL_2 ( GuiTextList, CreateTextListStyle, CreateTextListItemStyle, GuiTextListTemplate ); + ADD_TEMPLATE_CONTROL ( GuiMultilineTextBox, CreateMultilineTextBoxStyle, GuiMultilineTextBoxTemplate ); + ADD_TEMPLATE_CONTROL ( GuiSinglelineTextBox, CreateTextBoxStyle, GuiSinglelineTextBoxTemplate ); + ADD_TEMPLATE_CONTROL ( GuiDatePicker, CreateDatePickerStyle, GuiDatePickerTemplate ); + ADD_TEMPLATE_CONTROL_3 ( GuiDateComboBox, CreateComboBoxStyle, CreateStandardDataPicker, GuiDateComboBoxTemplate ); + ADD_TEMPLATE_CONTROL ( GuiStringGrid, CreateListViewStyle, GuiListViewTemplate ); + + ADD_VIRTUAL_CONTROL (GroupBox, GuiControl, CreateGroupBoxStyle, GuiControlTemplate ); + ADD_VIRTUAL_CONTROL (MenuSplitter, GuiControl, CreateMenuSplitterStyle, GuiControlTemplate ); + ADD_VIRTUAL_CONTROL (MenuBarButton, GuiToolstripButton, CreateMenuBarButtonStyle, GuiToolstripButtonTemplate ); + ADD_VIRTUAL_CONTROL (MenuItemButton, GuiToolstripButton, CreateMenuItemButtonStyle, GuiToolstripButtonTemplate ); + ADD_VIRTUAL_CONTROL (ToolstripDropdownButton, GuiToolstripButton, CreateToolBarDropdownButtonStyle, GuiToolstripButtonTemplate ); + ADD_VIRTUAL_CONTROL (ToolstripSplitButton, GuiToolstripButton, CreateToolBarSplitButtonStyle, GuiToolstripButtonTemplate ); + ADD_VIRTUAL_CONTROL (ToolstripSplitter, GuiControl, CreateToolBarSplitterStyle, GuiControlTemplate ); + ADD_VIRTUAL_CONTROL (CheckBox, GuiSelectableButton, CreateCheckBoxStyle, GuiSelectableButtonTemplate ); + ADD_VIRTUAL_CONTROL (RadioButton, GuiSelectableButton, CreateRadioButtonStyle, GuiSelectableButtonTemplate ); + ADD_VIRTUAL_CONTROL (HScroll, GuiScroll, CreateHScrollStyle, GuiScrollTemplate ); + ADD_VIRTUAL_CONTROL (VScroll, GuiScroll, CreateVScrollStyle, GuiScrollTemplate ); + ADD_VIRTUAL_CONTROL_F (HTracker, GuiScroll, CreateHTrackerStyle, GuiScrollTemplate, InitializeTrackerProgressBar); + ADD_VIRTUAL_CONTROL_F (VTracker, GuiScroll, CreateVTrackerStyle, GuiScrollTemplate, InitializeTrackerProgressBar); + ADD_VIRTUAL_CONTROL_F (ProgressBar, GuiScroll, CreateProgressBarStyle, GuiScrollTemplate, InitializeTrackerProgressBar); + ADD_VIRTUAL_CONTROL_2 (CheckTextList, GuiTextList, CreateTextListStyle, CreateCheckTextListItemStyle, GuiTextListTemplate ); + ADD_VIRTUAL_CONTROL_2 (RadioTextList, GuiTextList, CreateTextListStyle, CreateRadioTextListItemStyle, GuiTextListTemplate ); + + LoadTabControls(manager); + LoadToolstripControls(manager); + LoadListControls(manager); + LoadDocumentControls(manager); + LoadCompositions(manager); + + #undef ADD_VIRTUAL_TYPE_LOADER + #undef ADD_TEMPLATE_CONTROL + #undef ADD_TEMPLATE_CONTROL_2 + #undef ADD_TEMPLATE_CONTROL_3 + #undef ADD_VIRTUAL_CONTROL + #undef ADD_VIRTUAL_CONTROL_2 + #undef ADD_VIRTUAL_CONTROL_F + #endif + } + + void Unload()override + { + } + }; + GUI_REGISTER_PLUGIN(GuiPredefinedInstanceLoadersPlugin) + } + } +} + +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_TAB.CPP +***********************************************************************/ + +#ifndef VCZH_DEBUG_NO_REFLECTION + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + +/*********************************************************************** +GuiTabInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiTabInstanceLoader : public BASE_TYPE + { + public: + GuiTabInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateTabStyle") + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr expr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refCreatePage = MakePtr(); + refCreatePage->parent = refControl; + refCreatePage->name.value = L"CreatePage"; + + auto refMinus1 = MakePtr(); + refMinus1->value.value = L"-1"; + + auto call = MakePtr(); + call->function = refCreatePage; + call->arguments.Add(value); + call->arguments.Add(refMinus1); + + expr = call; + } + + if (expr) + { + auto stat = MakePtr(); + stat->expression = expr; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiTabPageInstanceLoader +***********************************************************************/ + + class GuiTabPageInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiTabPageInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::TypeName); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + auto info = GuiInstancePropertyInfo::Collection(); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + info->acceptableTypes.Add(description::GetTypeDescriptor()); + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr expr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refBoundsComposition = MakePtr(); + refBoundsComposition->parent = value; + refBoundsComposition->name.value = L"BoundsComposition"; + + expr = refBoundsComposition; + } + else if (type->CanConvertTo(description::GetTypeDescriptor())) + { + expr = value; + } + + if (expr) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refContainerComposition = MakePtr(); + refContainerComposition->parent = refControl; + refContainerComposition->name.value = L"ContainerComposition"; + + auto refAddChild = MakePtr(); + refAddChild->parent = refContainerComposition; + refAddChild->name.value = L"AddChild"; + + auto call = MakePtr(); + call->function = refAddChild; + call->arguments.Add(expr); + + auto stat = MakePtr(); + stat->expression = call; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + +/*********************************************************************** +Initialization +***********************************************************************/ + + void LoadTabControls(IGuiInstanceLoaderManager* manager) + { + manager->SetLoader(new GuiTabInstanceLoader); + manager->SetLoader(new GuiTabPageInstanceLoader); + } + } + } +} + +#endif + +/*********************************************************************** +INSTANCELOADERS\GUIINSTANCELOADER_TOOLSTRIP.CPP +***********************************************************************/ + +#ifndef VCZH_DEBUG_NO_REFLECTION + +namespace vl +{ + namespace presentation + { + namespace instance_loaders + { + Ptr AddControlToToolstrip(GlobalStringKey variableName, IGuiInstanceLoader::ArgumentMap& arguments, collections::List& errors) + { + auto block = MakePtr(); + + FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) + { + const auto& values = arguments.GetByIndex(index); + if (prop == GlobalStringKey::Empty) + { + auto value = values[0].expression; + auto type = values[0].type; + + Ptr expr; + if (type->CanConvertTo(description::GetTypeDescriptor())) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refToolstripItems = MakePtr(); + refToolstripItems->parent = refControl; + refToolstripItems->name.value = L"ToolstripItems"; + + auto refAdd = MakePtr(); + refAdd->parent = refToolstripItems; + refAdd->name.value = L"Add"; + + auto call = MakePtr(); + call->function = refAdd; + call->arguments.Add(value); + + expr = call; + } + + if (expr) + { + auto stat = MakePtr(); + stat->expression = expr; + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + +/*********************************************************************** +GuiToolstripMenuInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiToolstripMenuInstanceLoader : public BASE_TYPE + { + public: + static Ptr ArgumentFunction(ArgumentMap&) + { + auto expr = MakePtr(); + expr->value = WfLiteralValue::Null; + return expr; + } + public: + GuiToolstripMenuInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateMenuStyle", ArgumentFunction) + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + return AddControlToToolstrip(variableName, arguments, errors); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiToolstripMenuBarInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiToolstripMenuBarInstanceLoader : public BASE_TYPE + { + public: + GuiToolstripMenuBarInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateMenuBarStyle") + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + return AddControlToToolstrip(variableName, arguments, errors); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiToolstripToolBarInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiToolstripToolBarInstanceLoader : public BASE_TYPE + { + public: + GuiToolstripToolBarInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateToolBarStyle") + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors)override + { + return AddControlToToolstrip(variableName, arguments, errors); + } + }; +#undef BASE_TYPE + +/*********************************************************************** +GuiToolstripButtonInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiToolstripButtonInstanceLoader : public BASE_TYPE + { + protected: + GlobalStringKey _SubMenu; + + public: + GuiToolstripButtonInstanceLoader() + :BASE_TYPE(description::TypeInfo::TypeName, L"CreateToolBarButtonStyle") + { + _SubMenu = GlobalStringKey::Get(L"SubMenu"); + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(_SubMenu); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _SubMenu) + { + return GuiInstancePropertyInfo::Set(description::GetTypeDescriptor()); + } + return BASE_TYPE::GetPropertyType(propertyInfo); + } + + Ptr GetParameter(const PropertyInfo& propertyInfo, GlobalStringKey variableName, collections::List& errors) + { + if (propertyInfo.typeInfo.typeName == GetTypeName()) + { + if (propertyInfo.propertyName == _SubMenu) + { + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); + + auto refEnsureToolstripSubMenu = MakePtr(); + refEnsureToolstripSubMenu->parent = refControl; + refEnsureToolstripSubMenu->name.value = L"EnsureToolstripSubMenu"; + + auto call = MakePtr(); + call->function = refEnsureToolstripSubMenu; + + return call; + } + } + return nullptr; + } + }; +#undef BASE_TYPE + +/*********************************************************************** +Initialization +***********************************************************************/ + + void LoadToolstripControls(IGuiInstanceLoaderManager* manager) + { + manager->SetLoader(new GuiToolstripMenuInstanceLoader); + manager->SetLoader(new GuiToolstripMenuBarInstanceLoader); + manager->SetLoader(new GuiToolstripToolBarInstanceLoader); + manager->SetLoader(new GuiToolstripButtonInstanceLoader); + } + } + } +} + +#endif + /*********************************************************************** INSTANCEQUERY\GUIINSTANCEQUERY.CPP ***********************************************************************/ @@ -9164,18 +5682,18 @@ L"\r\n" L"\t;" SerializedTable ***********************************************************************/ -const vint parserBufferLength = 6336; // 25801 bytes before compressing +const vint parserBufferLength = 6778; // 34089 bytes before compressing const vint parserBufferBlock = 1024; -const vint parserBufferRemain = 192; +const vint parserBufferRemain = 634; const vint parserBufferRows = 7; const char* parserBuffer[] = { -"\x00\x00\x80\x84\x01\x8C\x01\x83\x20\x00\x61\x00\x33\x20\x03\x30\x84\x00\x32\x00\x65\x00\x11\x20\x05\x39\x88\x00\x72\x00\x39\x20\x0F\x7D\x8F\x7F\x82\x00\xD0\x18\x80\x09\x30\x01\x36\x87\x19\x9B\x94\x96\x82\x89\x94\x8E\x8F\x05\x01\xAB\x97\x8E\x96\x8F\x7E\x04\x01\xD3\x17\x94\x33\x8D\x88\x9A\x8D\x2F\x9D\x8B\x04\x86\x86\x87\x85\x86\x09\x90\x92\x93\x9D\x90\xA1\x98\x80\x0D\xE8\x24\x80\x0C\x37\x85\xA1\x8F\x45\x89\x87\xAE\x8A\xA5\x9C\x97\x91\x1B\x86\x01\x90\x38\x97\x8A\x36\x00\x3C\xB6\xA0\x80\x02\x91\x8D\x93\x93\x09\xAE\x8C\xA0\xB0\x05\x05\x81\x84\x3C\xBC\xAE\xA0\x02\x36\x9C\x9E\x89\x4E\x0E\xA7\x92\x8A\xB1\x81\xB7\xA9\x70\xF4\xB3\xAE\x93\x0F\xB8\xB5\xC7\x7B\xFD\x96\x9F\xB0\x01\xC1\x85\xC1\x00\x4F\x00\x04\xBC\x9D\x93\x36\x00\x67\x85\xE1\x83\x9F\xB5\xB2\x94\x9F\x4D\x9B\x83\xB0\xA0\x02\xA9\x93\xAA\x10\x9A\xDC\xD3\xAF\xC9\xD2\x8F\xB5\x87\xA5\xF1\xA0\xAB\xC0\xA2\xBA\x80\x19\x92\xA6\x3F\x92\x8F\xB1\x86\xC0\x82\x97\xA2\xCC\xB4\xD6\x92\xD2\xAF\x3F\x9B\xB8\x80\x8C\x9B\x8C\xB2\xE4\x97\xCA\xF7\xC6\xCD\xE1\xC6\xB8\xD4\x74\x8E\x01\x95\xEB\xCF\x8A\xCA\xE7\x12\xB2\xCF\xDE\xC0\xD7\xAB\xE8\x00\x3A\x92\xBC\x9D\xDB\x8F\xA4\x01\xE1\x25\x99\x8B\x89\xBE\x8F\xF5\xF9\xC7\xF4\x40\x02\x01\x40\x9F\x64\x56\x4E\x7F\x3B\x50\x79\x68\x00\x62\x40\x4B\x42\x44\x0D\x75\x66\x56\x4D\x11\x01\x4F\x09\x40\x15\x81\x4A\x85\x40\x36\x76\x4B\x84\x87\x1D\x9D\x4F\x84\x40\x21\xA2\x83\x89\x89\x37\x41\x49\x11\x65\x00\x04\x10\x03\x8A\x52\x00\x05\x10\x00\x07\x54\x10\x03\x40\x00\x57\x8A\x8C\x00\x17\x9A\x86\x4D\x83\x2D\xAF\x80\x01\x8C\x33\xB5\x82\x82\x85\x3C\x80\x01\x00\x88\x1D\x78\x8C\x89\x10\x00\x0D\x12\x8C\x00\x15\x01\x4B\x16\x43\x2D\x00\x0A\x1C\x00\x50\x99\x9A\x14\x00\x5F\x00\x0D\x14\x00\x57\x89\x49\x97\x96\x5D\x80\x0F\x94\x0C\x00\x19\x99\x0E\x98\x00\x2A\x07\x90\x89\xFD\x41\x47\x16\x90\x4C\x01\x97\x40\x94\x31\xAE\x83\x81\x8E\x71\x80\x03\x00\x93\xFF\x0E\x9A\x66\x48\x33\x81\x6F\x9D\x92\x28\x37\x84\xA2\x7D\x07\x79\x9A\x66\x4E\x33\x8B\xA7\x85\x0A\x00\x36\x76\x4F\xA0\x00\x58\x19\x67\x90\x73\x89\x9E\x14\x83\x84\x89\x0A\x88\x8B\x36\xB3\x81\x8C\xA5\x34\x80\x06\x8E\xA5\x81\x87\x0F\xA1\x40\x55\x2C\x8B\x8A\x66\x8A\x88\x9B\x08\x00\xEF\x76\x46\xA8\x40\x3A\x75\xA2\x10\x7C\xAE\xA0\xA0\x96\x91\x4B\x80\x49\x97\xAF\x57\x4C\xB0\x96\x8D\x36\xB1\x8B\x8B\xB0\xB5\xA9\xAA\x91\x40\x40\x00\x0A\x03\xAC\x00\x47\x4A\x66\xA4\x2C\x89\xB0\x02\x0E\x00\x2B\x67\x54\xA7\x41\x9A\x66\x8E\xB8\x2E\x00\x0B\x5A\x4D\xE2\xB6\x7A\x4E\x48\xC7\x93\x98\xBB\x85\x0B\x7B\xAF\x6F\x55\x3D\xBC\xA2\x4C\x73\x7B\x5E\x70\x52\x04\xFF\xB9\x6E\x73\x6E\x1B\x6D\xB1\x8F\x67\x9F\x7C\x4A\x4C\x4F\xBB\x7C\x4B\xBD\xB6\x20\x00\x04\x08\x00\x3C\x3D\x46\xC2\xC0\x1B\x7E\x0E\xBC\x40\x14\x5B\xCF\x72\x78\x20\xC0\xC8\x63\x73\xED\x8F\xC5\x58\x4F\x6B\x54\xC8\xC6\xC6\xDD\x4F\x7E\xC7\x7B\x21\xF1\xC8\xC2\xB6\x05\xF6\xC4\x5D\xBB\x31\x00\x05\x25\x40\x19\xF5\xC1\xC2\xCC\xE3\x80\x05\xC5\xA3\x15\xE2\x09\x92\xD2\x2E\xF7\x13\x54\x4F\x52\x55\xCB\x1E\xD1\x0C\x6D\x63\x54\x6C\x9F\xB3\x6C\x7B\x59\x15\xFD\x04\xD6\xD2\x2E\xB9\x77\x45\x43\x3C\x4A\xD5\xC5\x1F\x54\xD8\xA5\xC5\x08\x30\xC3\xD7\xCC\x94\x79\x4D\x72\x67\x63\x12\x50\x46\x5F\xB6\x41\xE6\xCA\x6C\x5D\x1E\xE4\xB7\xD3\xD7\x49\x97\x8C\xD0\xD5\x4E\xE5\x40\xD4\xD5\x53\xD5\xC1\x57\xD5\x56\x6A\x7D\x64\x00\x12\x9D\xD0\xE3\x8A\x67\x50\x42\xD8\x84\x8F\x66\xD0\x00\xDA\x15\xEA\xD0\x00\xDB\x42\xE7\xCF\xDB\x63\x7A\x53\x53\xDC\x65\x10\x74\xCA\xDF\xC1\x74\x5B\xB5\xCA\xC8\x37\xED\xB2\x0C\x00\x1F\x00\xDD\xDA\xE8\x7C\xC5\xD9\xD0\x00\x8D\x83\xEB\xDA\x82\x74\x4B\xC0\xE7\x63\xBB\xD8\xAA\xD0\x04\x39\xEE\xD4\x5E\x11\x23\x49\x47\x18\x7A\xED\x7C\x44\xC3\xEB\x3A\xEE\x4C\xF1\x46\xCE\xD0\xF7\x58\x4F\x3C\xC0\x09\x2A\xED\xA1\xFB\xD6\xF5\xF3\x00\x0F\xF8\x67\xF6\x00\x3D\xD4\xD4\xD2\xBC\xD4\xD1\x60\x94\x52\xB3\x85\xC6\xDF\x8F\x56\x76\x79\x72\x12\x55\xC5\xE3\x63\x51\xC0\x09\xE1\xFD\xE5\x38\x38\xF4\x0E\x74\x37\xF6\x12\x73\x77\x3A\x37\x39\xD5\x25\x28\x3F\x8B\x10\x22\x73\x9C\x60\x02\xE7\x7C\x0B\x7C\xC0\x72\x4A\x73\xFB\x67\x72\xD4\x54\x64\x3C\x05\xA7\x38\x33\x04\x9B\x68\xD5\x5E\x6B\x76\x28\x67\x2B\x23\x10\x89\x6E\x0A\xAE\x67\x4B\xDD\x6D\x5A\x73\xEF\x71\x4B\x94\x73\x74\x6B\xE0\x37\x3C\x38\xED\x27\x38\x8B\x59\x39\x7E\x38\x55\x62\x2B\x54\x70\x76\x62\x60\x3E\x24", -"\xE4\x54\x7A\x79\xE3\x78\x79\xF9\x5A\x7F\x31\xE9\x77\x72\x7C\x40\x37\x7A\x43\x66\x76\x2D\xC7\x32\x76\x7B\xE0\x6B\x74\xC7\x00\x02\x8B\xEC\x67\x7F\x31\xEA\x7F\x6E\x18\xCF\x42\x86\xF9\x7A\x70\x80\x1E\x98\x7C\xE1\x4F\x66\x6B\x0D\x95\x65\x83\xF7\x7C\x85\xD6\x6B\x33\x78\xAE\x40\x04\x84\x00\x0A\x69\x02\xE3\x63\x2B\x06\xB5\x69\x8F\x54\x71\x83\x04\x95\x8B\x77\x0B\xAB\x8E\x70\x6D\x9E\x7C\x07\xC0\x29\x8C\x39\xA1\x85\x8E\x23\x80\x72\x09\xC0\x29\x85\xCE\x6B\x84\x6A\x2D\x80\x93\x0B\xEE\x7C\x4B\x32\x94\x6C\x7E\x36\x83\x39\x53\x45\x35\x6A\x01\x98\x35\x62\x63\x5F\x86\x42\x41\x85\x7A\xDE\x04\x8B\x60\xC9\x78\x76\x4B\x70\x60\x32\xD3\x7E\x2E\x81\x00\x14\x01\x2C\xD0\x8B\x22\x5A\xA5\x75\x24\xA7\x78\x95\xF7\x3C\x20\x21\xBC\x42\x8B\x96\xA4\x72\x6F\x2D\xFF\x81\x8C\x40\x99\x5E\x77\x64\x5C\x90\xFC\x33\x87\x8C\xBC\x35\x90\x98\xCB\x9B\x84\xF4\x28\x90\x70\x72\x5A\x70\x74\x5A\x8F\x39\x17\xCB\x8F\x8A\x9E\x3A\x7C\x8D\xFD\x7F\x7E\x35\xBF\x9C\x2F\x6C\x9F\x87\x22\x8F\x91\x73\x1D\x80\x7B\x8E\xCC\x4C\x83\x2A\x7F\x89\x86\x11\xCF\x8C\x75\x24\x93\x8C\x89\xD2\x7B\x95\x3F\xD1\x84\x7C\x2A\xA4\x94\x7B\x00\x13\x04\x16\xC5\x9C\x9F\x2D\xA3\x9E\xA0\xD1\x69\x7F\x19\xEC\x7C\x7D\x18\xB1\x7F\x93\x8B\x96\x7E\x29\x97\x27\x9C\x44\xA9\x99\xA3\x01\x9A\x98\x08\xE5\x3F\x70\x79\xB8\x8A\x8F\x21\xAD\x23\x3D\xA5\x29\x9F\x40\xAA\x85\x62\x14\x83\x8E\xD2\x06\x9D\xA2\xFE\x48\x70\xA4\x8D\x83\x80\x49\x85\x86\x8F\x93\x9D\x97\x84\x80\x87\x6F\x4B\x92\x88\x92\xC0\x5B\x96\x65\x16\xB4\x98\x28\x97\x22\x95\x91\x24\x92\x87\xEF\x9D\x85\x2A\xC6\x2C\x94\x24\xAE\x97\x2B\x45\x82\xA2\x43\x85\xA0\xA0\x00\x18\x02\xAB\xE2\x9C\xA9\x39\x80\x0A\x61\xE1\x4D\x63\x4A\x95\x74\x49\x40\x17\x66\x99\x56\x9B\x27\xA1\x5D\xBE\x61\xC5\x59\x5E\x89\xF0\x43\xA5\x97\xC9\x91\x31\x36\x90\x2A\x97\x23\xB2\x90\x28\xBE\x8A\x9B\x64\x42\x90\x00\x1A\x00\x03\x18\x59\x87\x98\x60\xF9\xA6\x97\xC1\x8C\x9F\x8C\x83\x7A\x71\x26\xC9\xA6\x8C\xFA\x6B\x9A\xB0\x74\x62\xA4\x47\xBE\x80\x90\x6F\x94\x68\x9C\x8A\xAF\xAE\x58\xD5\x8C\x27\xA6\x68\x9F\xA6\xAA\x91\x6E\x5E\x8E\xBA\xB3\xF4\x3B\xA2\x84\x07\x80\x91\x3D\x8B\x87\x86\x96\x96\x29\x85\x77\x6F\x66\x5D\xDB\x81\xB1\xD5\x99\xB0\x22\xCD\x80\xB6\x5B\xDC\x83\xB5\x83\x80\x06\xB4\x1E\xA8\xB6\x43\x2A\xBD\xB1\xCC\x91\xAB\x8E\x25\xA6\x83\x3C\xA5\x8D\x3C\x14\xAE\xA5\xAE\xE1\x83\x74\x73\xD8\x9C\xB4\xBE\xA0\xAA\xBB\xD7\x8D\x9D\x77\xE4\xA9\xA1\xC7\x0C\xA3\xB7\xCF\x3D\xB5\x73\xA8\x72\xA2\xFA\x51\xB5\xA8\x15\x74\xB0\x46\xA9\xB1\xBD\x60\x9B\xA2\xAA\xDD\x8E\x9B\x67\x8D\xA1\xAC\x25\x90\xA0\x7D\x35\xBA\x82\x22\xF4\xBC\x9C\xFB\xAD\xB0\xBA\x3C\xB1\x90\x02\xA9\xAD\x8E\x7C\xB7\xB7\xBA\xDF\xB4\x2E\x7A\xDC\xBF\xB7\x5C\x91\xC0\x99\xDB\xA2\xBD\x85\xD7\x84\x98\xDD\x99\xBA\xC2\x8C\xB4\xC0\x7B\xCD\x9F\xBD\x8A\x53\xB5\x93\x17\xB4\x84\x81\x98\xB4\x33\xE7\x9C\x9E\x65\x4A\x7E\xB3\xEF\x68\xB7\x66\xB8\xA3\xA9\xC0\x89\x8A\x9D\x88\x9A\xCD\xC4\x35\xB1\x9A\xBA\x3E\xB3\xB6\x4A\xB5\xB8\x96\x7D\x97\xC4\xA0\xFE\xBD\xA8\x76\xA1\xB4\xB9\x24\xE3\xAD\x5D\x35\x0B\xA2\x87\xCC\xC6\xC6\xD2\xAD\xBC\x90\xED\x71\xBC\x8A\xCA\xA8\xA7\x38\x9B\x98\x00\x19\x99\xC5\x97\xF7\xB8\xC0\xD8\x93\xBA\xB6\x0C\xCB\xA5\x91\xAE\xA6\x92\x98\x98\xCB\xA6\x41\xA0\xCF\x69\xEE\x88\x8C\x2F\xE3\xA2\x6B\x90\x91\xB6\xD2\x13\x96\xBA\xA1\xAD\xCC\xA8\x26\xC6\xA9\x9C\xF2\xBA\xC4\xA7\xB7\x83\x94\x39\x96\xCF\x66\xD3\xA0\x89\x8A\x4C\xC9\x40\xD9\x4A\x74\x93\xAE\x7C\xBF\xD8\x65\xBE\x16\x89\xA3\xB9\x33\xEC\x7A\x69\x1D\x58\x83\xCE\x03\xD5\x6A\x6B\x54\x2D\x71\xD7\xB9\xCF\xCC\x4A\x74\x72\x55\x17\x75\x6B\xB2\x6C\xC8\xD0\x9F\x75\xD0\x88\x99\xC6\xC0\x88\x19\x59\xB7\x6D\xB6\xA9\xC7\x10\xBD\x7D\x6F\x80\x7E\x25\xC2\x67\xAD\xF1\x7A\xB8\xD6\x59\xEE\x23\xD3\x80\x62\x73\x21\xB6\xA4\xCF\xC5\x6F\x35\xD4\x78\xC6\xA4\xE0\x61\x66\xD0\xB2\x71\xCA\x90\xFB\xB4\xC7\xAC\xF5\xBB\xAF\xE3\x80\x03\xC9\xC3\xB3\xC0\x8F\xB8\x9A\x03\x23\xF8\xAC\xD6\xDD\xC5\xAC\xC3\x0F\x33\x47\xB4\x97\x03\xAD\x53\xC1\xDF\x8E\xB5\xD2\xA3\xB9\x9F\x66\xD8\x40\x3B\x9E\xB6\xAE\x2A\xDD\xE1\x7C\x25\xDD\x56\x3B\x5C\x5B\xF8\xDB\xD6\x7B\xC0\x49\x40\x6C\x4A\x74\x56\xC0\x2C\x4D\x76\x4A\xA4\x22\xE7\xAF\x97\x46\x6C\x4D\x98\x84\xF3\xBD\x3C\xBB\x26\xB9\xC5\x7B\xD0\x29\x42\xCE\xDC\xD4\x10\x2A\x97\x42\x15\x67\x20\x20\x88\x2E\x2A\x4B\x32\xE2\xB7\xC5\xD6\xE3\xE0", -"\x84\xE6\xDB\x07\xEA\xE5\xC2\xFF\x5B\xE1\x89\xE4\xBB\x76\x3B\x19\x89\xCD\x80\x04\xE3\x33\x96\xE5\xD0\x64\x39\xE1\x44\x9B\xEF\xC2\x97\x1E\xE6\x6A\xCF\xC1\xE4\x55\xA4\xE4\xAB\x93\xDD\x28\xD2\xA4\x45\x67\xCE\xBD\x6A\xE1\xE8\x00\x05\x67\xED\x46\xB2\x2F\x3A\xE6\xEB\x9E\x55\xE2\xE5\x3D\x65\xD1\x03\xFA\x34\x78\x40\xB4\xA7\xD7\x0C\xF7\xE3\x83\x55\x62\x42\xA5\xCD\xD4\x58\xF2\x28\xEF\x46\x38\xCF\xA3\x8A\x45\x42\xC1\x80\x8A\xD4\x65\x64\xE8\x72\x57\xC2\xAF\xD6\x38\x79\x6F\xD4\xD7\xC3\xC6\x99\xEB\xE1\xF0\x72\xF7\xE8\xE1\x89\xF1\xED\x33\xA3\xEB\x95\xE6\x80\x93\xA8\x1A\x7F\xE7\x33\xAB\xE9\x42\xED\x2E\xEF\x2A\x95\x6F\x3F\xF9\x2A\xE4\xEE\xCA\xB7\xEE\x9E\xD3\x48\x0F\xAA\x55\x2E\x22\x0B\x25\x26\x1D\x70\x93\x25\x14\x99\x59\xE6\x83\xF5\xEB\x82\x58\xE5\xBC\x55\x1C\xEB\xF6\x8B\xE1\x41\xE3\xF4\x7F\xF1\xFD\x16\x81\xCE\x95\xF4\x7F\xE5\x90\x9A\xF3\x91\xF0\xE8\x40\x2A\xE8\xB8\xB3\xA1\xD2\xF4\x54\xC2\x48\x7D\x4D\x23\xFA\xDF\x9B\x75\x2E\xC4\xFA\xF1\xF7\x60\xF7\xE1\xEF\xE5\xEA\x69\xC9\xD4\x69\xF8\x54\x63\xF9\xDB\xD4\x6F\xED\xCE\xC9\xF2\xF9\x02\xDF\x7D\xF3\xBE\xA3\x47\xD2\xCD\x27\xF4\xAB\x8A\xF4\xEB\x99\x29\x84\xD8\xD6\xEB\xE6\x52\xF7\xFC\x79\xBD\x69\xE7\x88\xFB\xE5\xE7\xF4\x30\x7E\x15\x31\x74\x86\x68\x3E\x2E\x3C\x71\x73\x77\x46\x1F\x78\x35\x22\x74\x35\x25\x7B\x4A\x4E\x77\x11\x01\x26\x7F\x0B\x2C\x26\x24\x39\x78\x0D\x70\x2A\xEB\x6F\x6F\x99\x75\x2E\xF0\x62\x78\xFA\x72\x57\x30\x74\x73\x5D\x77\x6F\xD7\x7D\x3D\xB6\x7E\x7F\x25\x8F\x75\x83\x72\x76\x53\x14\x76\xA5\x50\x38\xDE\x74\x74\xFF\x7A\x76\x7C\x43\x7E\x0D\x8C\x79\x09\x21\x20\xA0\x74\x67\xEB\x70\x38\xED\x76\x7A\x3E\x19\x7A\x00\x0B\x7A\xAE\x54\x7F\x2E\x5C\x72\xD9\x7C\x82\x25\x8E\x82\x62\x3E\x7B\x30\x61\x28\x94\x76\x78\x85\x62\x7E\x1D\x89\x83\xC7\x7E\x79\x3B\x7D\x83\xCC\x75\x1E\xA3\x7A\x77\x3F\x12\x7D\xD7\x61\x75\x8C\x70\x00\x17\x87\x82\x1A\x8E\x6F\x68\x56\x15\xE6\x23\x70\xD7\x72\x82\xAF\x74\x82\x0B\x23\x3B\xB2\x74\x17\xB3\x3D\x3D\xB8\x07\x7B\x76\x8B\x78\xE0\x43\x78\x80\x78\x37\x89\x73\x3B\x4C\x83\x87\xDA\x7F\x82\x90\x70\x38\xBB\x23\x85\x2D\x86\x79\x37\x87\x85\x4B\x79\x85\x89\x7C\x85\xEA\x7E\x85\xCE\x75\x2B\x67\x12\x42\xAE\x75\x7D\x80\x81\x20\x82\x8E\x73\x2A\x73\x3B\x4E\x83\x12\xBE\x7B\x3B\x59\x2A\x88\x4D\x8C\x88\x98\x38\x83\x8F\x86\x7E\x3C\x82\x67\xC9\x5E\x83\x94\x81\x64\x3E\x1D\x17\xBE\x7A\x44\xD6\x69\x89\x14\x8B\x87\x75\x8E\x12\x77\x85\x58\x00\x04\x0A\x7A\x8C\x8B\xD8\x7B\x73\xA0\x8E\x78\x86\x83\x8A\x80\x45\x8A\xDF\x79\x7D\x55\x8D\x88\x69\x58\x85\xAC\x89\x7C\xCB\x69\x7E\x54\x3F\x83\x0B\x66\x11\xB4\x85\x4B\x09\x17\x8B\x49\x86\x7D\x9F\x83\x8C\x56\x75\x8C\xBC\x77\x8C\xDC\x70\x00\x89\x8B\x8C\x8B\x82\x7C\xCE\x86\x15\xD0\x8B\x83\xD2\x82\x89\xD5\x81\x8B\x80\x36\x89\x09\x65\x7F\x72\x84\x17\x54\x77\x8F\x2E\x14\x7B\xB3\x39\x82\x1E\x63\x78\x83\x88\x8F\x85\x8F\x84\xE5\x8E\x7D\x07\x84\x85\xA8\x8C\x76\x8E\x85\x7E\xEE\x8B\x85\xAE\x8B\x7C\x93\x84\x16\xA3\x71\x84\xEF\x73\x84\x53\x16\x84\x9F\x28\x84\x42\x5A\x84\x00\x9E\x89\xE9\x84\x35\xDB\x71\x79\x70\x60\x4D\x02\x8B\x4A\xA9\x8B\x90\x9B\x70\x89\xAD\x81\x66\x75\x73\x3C\x12\x9E\x7C\x60\x81\x7D\x7C\x43\x7D\x68\x39\x8B\xC2\x8B\x8B\x40\x1D\x8B\xB3\x30\x8C\x2A\x84\x88\x01\x92\x8C\xA1\x80\x83\xDE\x64\x8A\xC0\x7C\x8C\x09\x98\x79\xCF\x8B\x8A\x0D\x96\x75\xF0\x86\x77\xF2\x87\x8D\xED\x45\x8B\x0E\x1C\x8D\x1B\x9E\x8D\xC4\x80\x8E\x84\x81\x94\x87\x81\x85\xE7\x84\x83\xA7\x8A\x8E\x27\x99\x94\x0C\x91\x77\x2B\x90\x6A\x11\x98\x77\x4A\x34\x8F\x98\x8E\x52\x36\x99\x93\x66\x8A\x8F\x6E\x9D\x6F\x67\x50\x70\x10\x1D\x86\xFF\x81\x8E\xF5\x6E\x6D\xCC\x21\x20\xC1\x6F\x18\xE6\x2C\x97\x66\x56\x45\x8A\x75\x25\x3D\x91\x3C\x81\x9C\x13\x2E\x7C\x89\x23\x89\x7F\x84\x88\x93\x1B\x1D\x8B\x0A\x5C\x93\x77\x9E\x93\x1E\x98\x97\x5A\x98\x8C\x4A\x3A\x8C\x07\x9F\x91\x15\x36\x85\x62\x99\x92\xD1\x8E\x90\x2C\x91\x7A\x4F\x98\x66\xD8\x87\x88\xB6\x89\x39\xDD\x8B\x89\xDF\x8F\x93\x6E\x97\x99\xE5\x87\x8E\x9B\x9F\x95\xE1\x7B\x8E\xC5\x74\x35\xA1\x9C\x94\x0F\x94\x8D\x4E\x9F\x92\x3E\x5A\x96\x90\x49\x42\x92\x63\x5C\x94\x68\x80\xE4\x56\x58\xB5\x31\x71\x4C\x64\x62\xBD\x69\x6D\x2A\x7D\x97\x31\x83\x6C\x4A\x3B\x97\xCF\x97\x98\x00\x09\x21\x89\x70\x9D\xE4\x5A\x9D\x74\x9F\x96\x00\x1E\x86\xD5\x9B\x81\x79\x91\x87\x8C\x92\x90\xFA\x69\x7D\x72\x9F\x18", -"\x2A\x31\x31\x1E\x80\x10\x2E\x30\x9E\x1D\x9D\x96\x1B\x1D\x33\x6B\x18\x86\xEB\x93\x12\x3C\x14\x69\x2E\x30\x82\xB8\x7E\x31\xE7\x94\x65\xC5\x51\x51\xE5\x6E\x57\xBC\x4D\x64\xFF\x4F\x64\x69\x87\x56\xF7\x99\x11\x3C\x14\x98\x43\x96\x31\xF1\x6A\x6B\x06\xAE\x45\x56\x6E\x9F\xE6\x63\xA1\xE4\x46\x65\x16\x07\xA1\x55\x66\x5C\x29\x3F\x18\xEC\x9D\x57\x0F\xA9\x6B\x7F\x52\x5A\x4E\x65\xA1\xDF\x67\xA1\xE2\x64\x6F\x1C\x0A\xA2\xF3\x69\x6E\x09\xAA\x9E\x20\xA8\x9F\x00\x0F\x6E\xEE\x94\x35\xE0\x9C\x64\x2B\xAD\x6D\x1E\x30\x6E\x12\xAB\xA3\xE3\x5F\x55\x04\xA7\x57\x9D\x48\x6E\xE3\x5F\xA1\x10\x34\xA3\x1B\xA7\xA3\x15\x34\xA2\x05\xA0\xA4\x15\x6E\x31\xF2\x9C\x73\x00\x07\x9E\x35\x89\x9E\x0E\x33\xA3\x0C\xAD\x9E\x0F\xA0\x9F\x21\x84\x86\x16\x75\x9F\x86\x78\xA4\x2B\x38\x33\x4C\xA3\x99\x74\x1D\x73\x53\xA3\x3B\x56\xA8\x97\x58\xA4\x2C\x49\xAB\xA5\xE6\x2F\x9E\x68\xA2\x8C\x52\xA0\x97\x8F\x9E\x2E\x78\xA0\x00\xBD\x8B\xA0\x8F\x1A\x9F\x54\x3C\x9F\x7B\x8E\x31\xD4\x9B\x73\xDA\x9D\x18\xE5\x90\x6C\xD6\x9F\xA6\x7E\xAC\x13\x17\x84\xA7\x82\xAA\xA8\xE2\x94\xA8\x7B\xAA\x9D\x0F\x05\xA9\x8B\xA0\xA7\x65\xA3\x31\x81\xA9\x9D\xD6\x96\xA1\x43\xAB\x55\x27\xA6\x5C\x3E\xA5\xA2\x18\xAF\x5F\x82\x96\x58\xDF\x3A\x9C\xC3\x5D\xA1\x11\x58\x6C\x63\x44\x68\x67\x40\x47\x64\x6D\x94\x75\x64\x66\x3F\x6D\x53\xF4\x49\x66\x44\x6D\x52\x7E\x60\x6B\x31\x59\x65\x66\x71\x67\xA3\x94\x67\xB4\xA7\x60\xB9\xA8\x96\x3F\x54\x49\xAF\x6E\x39\x9E\x39\x49\x4A\x3B\x49\x5A\x63\x4D\x95\x55\x43\x4C\x58\x43\xC6\x1A\x68\xF8\x58\x85\x8F\x62\x8D\xA5\xAF\xA4\x2F\xA3\x5E\x22\xA6\x9C\x50\xAC\x5E\x50\x67\x58\x99\x6F\xA3\xE1\xA1\xA5\xBC\x6F\x4C\xF0\x54\x46\x29\x65\x4D\xEB\xAD\x63\x72\x4C\x4D\xBB\x32\x63\xB1\x66\x9C\xAE\xA0\x60\xBB\x92\x66\x2B\x6E\x5B\xF4\xAA\x53\xD1\x60\x64\xBB\xAA\x40\x43\x6E\x47\x0F\x6F\x77\x9A\x81\xA1\xA6\xA5\xAE\xB8\x49\x98\x45\x78\x64\x07\xA6\x65\xB6\xA7\x59\x00\xBA\xAD\x65\x67\x6A\x3E\x5C\x67\x63\x89\x2D\xB2\x20\x10\xC3\x92\xA1\xB8\x13\x5C\x01\x23\x22\x57\x13\xA5\x3D\x36\x1F\x25\xB1\x10\x6C\x34\x27\x1D\x1F\x9F\xAD\xA1\xA0\xE8\x33\xB2\x12\xAB\xB2\x00\x13\x02\x84\x2F\xAD\x44\xAE\xB0\x7F\x44\xB3\xA6\xA6\xB3\x00\x05\x02\x84\x23\xA5\x6C\x2A\xB2\x2A\x7A\x21\x27\x03\xB4\x7B\xA3\x3B\x46\xBB\x73\x1A\x28\x29\x2E\xBF\x0F\x85\xA6\x75\xDA\x9D\xB4\x56\x7A\x21\xBB\x21\xB5\x1F\x0C\x29\xFF\x02\x2E\xFF\x0A\x21\xE2\x26\xB2\x62\xB3\xB6\x1B\x2D\xB5\x1C\x2E\x24\x8B\x26\xB2\xE2\x2E\x24\x1A\x26\x2E\x0B\x80\x6D\x74\x42\x21\xEF\x1A\x6A\x96\x35\x6D\x8F\x11\xB2\xA6\xA6\xB6\x24\x26\x1F\x69\xB3\x22\x6B\xB3\x22\x6E\xB8\x74\x20\x79\xB1\x12\x20\x24\xD4\x66\x43\xD6\x68\xB7\x05\xA4\x22\x5E\xBF\x1E\xE8\x24\xB6\x90\xBC\x21\x5E\xB0\x24\x6C\xB3\x22\xE8\x2C\xB7\x64\xBA\xB8\x44\xA6\x1F\x26\x04\xB6\x3A\xBC\x5B\xF3\xA8\x4B\x61\xB1\x10\xEF\x17\xAC\xCF\x5A\x21\x30\xB2\xA1\xFB\xAF\x18\x7A\xBC\x11\x1F\xB9\x29\x64\xBB\x28\x98\xB3\xB6\x9A\xBB\x45\x9C\xBE\xB9\x2E\xA6\xA4\x15\x6F\x21\xAD\xBF\x0F\x17\x80\x24\x6A\xB1\x10\xB3\xB2\xB6\xB5\xBF\x1C\xBC\xBE\xB5\x68\xB4\xB6\x40\x26\x1F\x8F\xB3\x22\xC5\xB7\x33\xF6\x1C\x02\x64\xB3\xB5\x0B\x25\xB5\x01\x12\x27\x63\xBB\xA6\xB0\xB0\x10\x4A\x39\xBD\x7B\xA9\xB2\x01\x1D\x28\xDE\xB9\xA8\x69\x75\xB9\x00\x11\xB8\xA3\x68\x35\xC9\xA3\xB7\x1D\x8C\x6A\x89\xB7\xA1\xBD\xB3\xBC\x26\xBB\xBC\x01\x1D\xBC\x1F\x2F\xBC\x74\x11\xBD\xD3\xB8\xA9\xE2\x96\x1F\xD8\xB2\xB6\xDA\xB6\x1F\xDD\xB0\xC0\xDF\xBB\xBD\xED\x33\xBE\x18\x8E\x28\x1F\x28\xBE\x8C\x31\x1B\xA6\x65\xB8\x01\x17\xB8\x33\x96\x82\x11\xBB\x11\x8C\xBC\x21\x8E\xB4\xB6\xF6\x1C\xBC\x99\xB7\xA1\xFA\xB3\xB6\xD4\xB6\x98\xFD\xB7\xBD\xCA\xBB\xB4\x06\xC3\xC0\xF3\xB5\xC0\xF6\x12\xBE\x04\xC4\xBE\x36\x72\xB6\xBD\xB2\x2E\xEF\x16\xB2\x7D\xBF\x21\x3E\xB5\xA0\x40\xB9\xBA\xA6\xAB\xBA\x3C\x16\xBE\xDE\x97\xAB\xC8\xAF\xC0\xED\x1C\x2C\x42\x6D\x60\xB6\x50\x11\x3A\xC5\xA0\x3C\xCC\x11\x8B\x2F\x0F\x8B\x2C\x2C\xCC\x2D\xBA\xCC\x2B\x2F\xAD\xBB\x16\x1E\x02\xB9\x01\x1B\x2F\x57\xC7\xC1\x00\x12\x2E\x2D\xAC\xC5\x00\x0F\xBA\x03\xAC\x11\xE2\x24\x69\x63\xCD\xBA\xC9\xB0\xC6\xC3\xBD\xBA\x19\xCD\xC5\x01\x1D\xB9\x00\x16\x1F\x26\xB7\xC3\x44\xA9\xC3\x1C\xA2\xB3\x8F\x1E\xC3\x17\x86\xBA\x3E\x62\xC4\x67\x14\xC4\xBC\xA8\xB0\x48\xC7\xC7\xA3\xA1\x51\x40\x20\xC7\x62\xB9\xC4\x44\xAB\xC4\xF6\xB2\xB6\x9F\xB9\x5E\xA1\xBF\x47\x3E\xC8\xA8\xCB", -"\x5C\x6D\xAC\x5F\x5C\xC9\xA8\x2E\x1C\xBF\xC8\xE0\x55\x60\xDD\x6E\xC4\x01\x10\xC5\x58\xC0\x10\x56\xC3\xCA\xD5\x70\x10\x5B\xC4\xC6\xA1\xC9\xC5\xA6\xC2\xC6\xA6\xC6\xC6\xA6\xC2\x2E\x36\xAA\xCA\x02\x11\x10\x4D\xC1\x2F\xB6\xC6\xCA\x6D\xC7\x2D\x00\x14\x69\x72\xC3\x22\x74\xCB\x45\x76\xC1\xAA\xFD\x53\xB1\xC6\x5A\xC7\xE3\x1C\x48\x18\xB9\xAC\x80\xC6\xB0\x46\xC8\x4B\x8A\xC2\xAA\xC6\xC6\xC8\x01\x14\x69\x26\xB1\xCD\xC5\xC4\xA1\xC6\x5D\xC8\x26\xBC\xC9\xDB\x6E\xC9\xE3\x53\xC9\x8E\x1A\xBB\x01\xB7\x67\x71\xB3\xC4\x39\x11\xC8\x0E\x60\x11\xDE\xC8\x61\x96\xCB\xBB\x90\xBD\xBB\xFB\x4F\xBA\x5E\xB2\x2E\x40\x2B\x16\x60\xB1\x10\xC8\xC4\x1D\xCA\xC8\xAB\x7E\xC0\x00\xCD\xCC\x47\x6A\x6F\x47\xD8\xC5\x63\x78\xC4\x4C\x31\xC4\xBA\xB1\xB4\xB6\xC1\xCF\x1C\xC3\xCF\x72\x4B\xCB\xCF\x40\xC8\xC9\xFF\xCA\xC9\xD5\x55\xA5\x84\xC3\xCD\xE8\x30\xCA\x24\x2F\xC4\xAB\xC0\xC6\x5A\xC6\xCA\x53\xCD\xCA\x01\x17\xC6\x65\xC5\xD2\xB1\xC1\x10\x15\x30\xC6\xA5\xC0\xC6\x69\xC4\xCB\x06\xC7\xCB\x0A\xD0\x10\xE8\x22\x2E\x88\xCF\xCB\x36\xCC\x1D\x35\xB7\xB4\x01\x15\xD0\xCB\x37\xD0\x0A\xCB\x21\x7B\xCD\xCF\x41\xC3\xB0\x67\x16\xD1\x40\x5E\xD3\xFE\x4A\xCD\xD4\xC0\x10\x88\xC7\xCD\x19\xDC\xD4\xE8\x3C\xCD\x23\x2D\xCE\x8B\x54\xCE\xB8\x42\xCE\x00\x16\xB1\xEB\x5B\xCC\x15\xD1\x10\x9B\xC9\xBB\xEF\xCC\x5E\x1C\xD0\xD0\x1F\xD0\xD3\x23\xD0\xD2\x01\x19\xCA\xAD\xBE\xC5\xA6\xCD\xD2\x30\xDE\xCA\x60\xC0\xCB\x2E\xD9\xCB\x6A\xC6\xD7\x30\xDB\xCB\x27\xD1\xC7\x0C\xDA\xD3\x3F\xBC\xD3\x00\x1A\xD4\x12\xB2\xD5\x79\xC3\x22\x43\xDA\x51\x45\xD7\xCE\x47\xD0\xD6\x17\xD2\xD8\x26\xAA\xD1\x8F\x10\x24\xD6\xC3\x22\x8E\xD7\xAA\x5D\x54\xD5\x1F\x26\xD5\xE7\x63\xD6\x59\xD3\x22\x94\xCC\xD5\x22\x6E\xD5\x46\xD6\xD6\xC0\x2A\xCE\x47\xC9\xA2\xC4\xCD\xC9\x2C\x68\x4B\x91\xB2\xCF\x01\x14\xCF\xA6\xC7\xCF\x7E\xBA\xCF\x86\xD9\xCC\x88\xD4\xD1\xA3\xD8\xD4\xF9\x61\xD5\x19\xA6\x5C\xC7\xBC\x21\x40\x26\x2E\xC1\xBE\xC6\x1F\x2B\x2F\xA0\xD3\x6E\x64\x6A\x21\x9A\xD5\xA4\x9C\xDF\x47\x26\xBD\xBB\x97\xAD\xCB\x91\xB0\xC3\x93\xB4\x14\x63\xB2\x2E\xA3\xB0\x10\xFB\x21\x4A\xD8\xA5\x4A\x07\x68\xBA\xBC\xD8\xAA\x1D\x63\xDD\xF1\xC5\xCF\x01\x17\x81\xE5\xDC\x21\x8B\x2B\x2F\xF9\xC0\x10\x8B\x2B\x28\x40\x25\xC3\x1B\x2B\xDC\x3C\xB6\x15\x98\xDB\x21\xF8\xBE\x12\xE4\xD5\xB6\xD5\xD5\xCB\x63\xB2\xBB\xD5\xC8\xBB\xA9\xDF\xCD\xAB\xDF\x47\xD9\xD7\x6F\x7C\xC2\x47\xE0\xD3\xE0\x4B\xDD\xDB\x11\x5D\xBB\xAF\xB8\xD3\x1B\x28\xCB\xD2\xD3\xB6\xF4\xD1\xC9\x56\x1B\xDF\xCF\xDE\xB5\xD1\xD6\xA6\xE4\xD9\xD0\x20\xB4\xB6\x07\xEA\x21\x0D\xD7\x33\x0F\xDA\xAF\x40\xD5\xD6\x65\xDC\x2C\xED\xD0\x00\x88\xCE\xC3\x24\xEE\xD7\x38\xC0\xD8\x18\xDC\xE0\x83\xDE\xE0\xE8\x37\xC8\x64\xB5\xD9\x8C\xC4\xDE\x17\xE8\xD5\x92\xCE\xD9\xE3\xCD\xDC\x89\xD1\x5D\x8B\xD0\x10\x61\xD6\xE3\x9B\xD0\xCE\x15\x6B\xE2\xB3\xD5\xE1\x41\xD3\xC7\x32\xE5\xC7\x34\xEC\xE3\x40\xD2\xD9\x3B\xE1\xDE\x97\xDE\xE3\x62\xDC\xE4\xEC\x5A\xD5\x95\xCE\xE5\xA2\xDA\xD8\xA4\xD4\x2C\xCE\xC3\xD0\x56\x1F\xE3\x44\xE0\x11\x1F\xE6\xDE\x00\x1D\xE1\xF1\xCD\xC4\x8B\x2B\x4F\x2D\xEC\xC2\xF0\xD1\xBE\x1D\xCA\xE4\x82\x24\xDE\x44\xBC\xC4\x18\x2F\xE4\x16\x6E\xDE\x01\x10\x24\x22\xA6\xB2\xF9\xD0\x14\x07\xE6\x1F\x6F\xBC\xE6\x83\xEB\xA7\x6C\x2A\xE1\x90\xE3\xDD\x20\xEA\x56\x92\xE2\xE7\x01\x1E\x44\x40\x2D\xD6\x01\x1F\xC5\x68\xDC\xCA\x2C\xDB\xD6\xA6\xC1\xD2\x60\xC2\xD7\x30\xD4\xD7\xBC\xC0\x48\x82\xE0\x10\x40\x28\xC2\x23\x2D\xE7\xF7\xDA\x21\x28\xBE\xE7\x00\x14\xC9\x99\xE8\xDD\x01\x13\xCB\x52\xCE\xE9\x30\xD2\xEA\x30\xD0\xD7\xAD\xB4\xEA\xAD\xB6\xEA\xE2\x23\xC6\x77\xE0\x10\x63\xC9\xC2\x2E\xC4\xA5\x07\xE0\x24\x9E\x99\xE1\x8D\xE9\xEC\x3D\x3D\xBB\xE8\x22\xA2\xE8\x2D\xBA\x6B\xC2\xC3\xF5\xB6\xCA\x2F\xDA\x21\x8B\x2F\xBA\x2C\xC8\xEC\x09\xCB\xEC\x63\x15\x16\xBE\xDF\xEC\x09\xC2\xE9\x6E\xE4\xE9\x62\xB3\xE2\xD6\xDD\x2A\x26\x7C\x15\x12\x84\xE3\x7D\xEA\xE2\x8B\x28\xE9\x29\xD0\x10\xB8\xE2\x2E\x69\xDD\xEB\xA0\xEA\xD6\xA8\xC4\xD2\xC6\xEF\xCA\x28\xD4\xDC\xA8\xEB\xE7\x63\xBB\x16\x0F\x8B\x15\x49\x11\xEF\x4E\xB6\xEE\x16\x7B\xEA\x25\xC9\xEC\x6C\x2F\xEA\x0E\xF9\x7D\x65\xD4\xEB\xF7\xE5\xA3\x22\xDA\xEB\x55\xCD\xEF\xBB\xEE\xF1\xBF\xE3\xF0\xA5\xE2\xF2\xC3\xE9\xED\x07\xF9\x15\x10\x80\xEF\x29\x7D\xF0\xAA\xEE\xE8\x64\x87\xEC\xAD\xEE\xF2\xE2\xEE\x20\xB6\x9B\x21\xB1\xE2\xED\x01\x14\xED\xDA\xE8\xD7\xD6\xEC\xF3\xD8\xE4", -"\xD3\x96\xBD\xD7\xDD\x2D\x74\x2A\xF9\x78\xB0\xEE\xF2\xDE\xE1\xF1\xE1\xE1\xF3\x00\x14\x80\x36\x48\x3E\x47\xF2\xF1\x6D\xE6\xCA\xB3\xC1\xE7\xEA\xD1\x10\x42\xA1\xD4\x9A\xE0\x10\x2B\xDD\xE9\xDA\xDF\xD6\x20\xF2\x2E\xBC\xE2\x2E\xFF\xB5\xEC\x81\x28\xC0\xD7\x74\xF1\x2D\xF9\xEC\xB3\x35\xD6\x19\x04\xDB\x60\xCE\xD6\x60\xCB\xEF\x1D\xFF\xEF\xFE\xE0\x00\xA9\xC2\x2E\xA9\xC6\xF6\xA9\xC0\xEE\xD7\x73\xF3\x26\x9A\x90\x69\x51\xF5\x81\x80\xD3\xFF\x08\x2E\x4B\xA1\x2A\x21\xF1\xF0\x73\xD2\xF2\xDC\xEF\xDA\x01\x1C\xEA\x1F\x21\xEB\x89\xE1\x10\x21\x96\xF3\x05\xC8\xEE\x54\xFF\xE1\x96\xE0\x10\x59\xFE\x24\x5B\xF0\x00\x9C\xE9\xEB\x5F\xFF\xE9\x76\xFF\xF1\xA7\xF4\xF6\x78\xD0\x24\xFF\xBE\xF7\xD9\x7A\xF6\x60\xAF\x8D\x6E\xF0\xF7\x30\xD2\xF7\x5E\xF7\xCA\xFC\xE7\xFA\xAD\xB3\xF6\x1E\xFC\xF7\x4A\xFF\xF7\x4C\xF1\xF8\x48\x9E\xEC\x6B\xF5\xF8\x38\xF0\x10\x89\xF2\xD3\x00\x10\xEC\x7B\xD0\x00\x30\xF9\xEA\x61\xC1\xF9\xBF\xF9\x7D\x95\xF0\x10\x97\xF4\xF8\xD7\x7A\xE1\xBD\xBB\xED\x23\x20\xE0\x00\x15\xE8\xC1\xF6\x71\x3E\xCC\xC0\x49\x74\xB8\xED\x1C\xBE\x69\x5E\xBE\x77\xB0\xBF\x5E\xB2\xBF\xDD\xF2\xBC\x39\xF3\xFD\x35\x83\xFE\x01\x1B\xE8\xE6\xF7\x16\x86\xB6\x88\x7D\x74\xC1\x4C\x60\xC6\x29\x20\xF4\xD7\x68\xFE\x5F\x7E\xF9\x7A\x7F\x11\x75\x6B\x7E\x5A\xA4\x74\x86\x79\x72\x95\x42\xEF\x05\x62\x0F\x6B\x14\x77\x3C\x59\x31\x48\x51\x43\xC1\x31\x76\xFF\x66\x75\x0A\x84\x76\x69\x66\xB2\x4D\x00\xD0\x75\x94\x78\x6B\x77\x3E\x5C\x14\x48\x52\x38\x7A\x17\x4B\xFC\x31\x7D\x83\x3E\x00\xBE\x11\x74\x7C\xE9\x69\x6D\x47\x61\x08\x1D\x06\xE7\x41\x08\x71\x1D\xF5\x24\x7C\xEE\x62\x17\xD2\x58\xFA\x40\x13\x1C\x8D\xC2\x05\x7C\xEC\x61\x61\x92\x52\x0D\x47\x7E\x00\x0B\x01\x32\x80\x29\x61\x7B\xBA\x75\xEF\x78\x6B\xD7\x5D\xFA\x61\x7F\x37\x55\x7E\x44\x32\x28\x58\x7F\x6F\x4A\xF9\x60\x61\x0B\x84\x5B\xBD\x5B\x51\x31\x80\xE8\x71\xFA\x35\x82\xBE\x7A\x75\x38\x83\xF5\x41\x08\x1E\x8E\xFA\x57\x4B\x0F\x9C\x5F\x42\x86\x6B\x68\x17\x22\x8C\x05\xE2\x16\xAF\x62\x7B\x1E\x7F\xF1\x4B\x7E\x12\x68\xF6\x4F\x83\x88\x16\x0F\xD7\x7D\xE2\x57\x4A\xED\x78\xBC\x78\x6A\xC9\x57\x5C\x8E\x7E\x09\x83\x3D\x15\x64\x00\x95\x43\x07\x87\x5F\xF5\x7A\x70\x6A\x5F\x7F\x68\xFE\x2B\x36\xDD\x5C\x09\x87\x73\x23\x31\x5E\x3F\x81\xF4\x7C\x68\xE3\x7D\x81\xD7\x3C\x10\xB5\x83\xF9\x70\xB8\x09\x85\xFA\x50\x5B\x46\x74\x0C\x52\x61\xFD\x71\x09\xA6\x67\xFF\x66\x78\x62\x5E\xFB\x4E\x7F\x42\x82\x90\x1A\x84\x26\x86\x3C\x06\x85\x77\x70\x6B\x0C\x84\xBC\x1B\x80\xF2\x2C\x79\x28\x80\x2F\x4F\x80\x02\x15\x1E\x76\x0C\x70\x50\x60\x6C\x7E\xF0\x7C\x74\x5A\x86\xE8\x36\x86\x16\x57\x5A\x7A\x82\x17\xAF\x7E\x80\x01\x01\xE9\x67\x69\x52\x4A\xDB\x41\xB2\x66\x60\x15\x83\xE9\x5D\x7A\x0B\x92\x75\xB4\x18\xD0\x68\x16\xB3\x77\xDF\x40\x80\x50\x1A\x4E\xB0\x7D\x14\x90\x75\xED\x74\x09\x9F\x12\x93\x16\x0F\x4A\x83\xF2\x66\x60\x01\x6C\x0A\xFB\x46\x01\x7F\x76\x82\x82\xFF\x34\x7E\xD6\x0F\x09\x8E\x63\x68\x6D\x84\x75\x58\x71\x6B\x7E\x3D\x73\x09\xD0\x7E\xC9\x47\x87\x71\x81\x1E\x84\x44\x76\x8B\x09\xA5\x42\x2B\x85\x83\xF2\x85\x13\xB4\x87\x06\x67\xFF\x22\x86\xFE\x6D\x35\xFC\x7B\xB8\x3E\x7F\x5D\x6F\x07\x82\x80\xDE\x6D\x87\x6E\x4C\x20\xAF\x85\x41\x88\xE7\x05\x8A\x21\x9C\x83\x1C\x13\xDF\x6A\x81\xA9\x74\x22\x1A\x12\xE4\x63\x89\x27\x15\x0F\xBE\x87\x4A\x87\xC2\x18\x8B\x7C\x4F\x87\x2E\x8C\x4A\x73\x86\x51\x3C\x10\xEB\x5F\xA9\x09\x7F\x8F\x81\x22\x92\x51\x7E\x81\x2A\x15\x8A\x25\x85\x78\x08\x88\xF7\x07\x88\x81\x89\xA6\x07\x84\x97\x56\x7F\xC9\x51\xFF\x6A\x7E\x48\x87\xA1\x13\x8A\xC9\x69\x85\x16\x8F\x24\x93\x82\x8E\x80\x10\x70\x86\x3A\x92\x7A\x1B\x74\x43\x1A\x11\x8B\x18\x12\x87\x80\x70\x74\x7D\xC3\x6F\xD4\x5A\x11\xD2\x54\xD4\x27\x5D\x4F\x7A\x72\x63\x28\xC2\x56\x88\x6A\x8E\xB5\x1A\x13\x53\x7D\x8A\xD4\x6F\x2B\xBE\x6E\xA8\x8F\x13\xEF\x89\x66\x7D\x72\x05\x76\x2A\x07\x70\xB2\x87\xDB\x6A\x23\x82\x70\x68\x29\x70\x01\xAB\x8A\x40\x77\xBB\x16\x70\x5E\x97\x58\xCE\x6C\xBF\x5C\x11\xDF\x50\x12\xA5\x89\x47\x90\x8B\x59\x8C\x44\x1C\x7F\x0F\x1A\x0A\xD6\x88\xE6\x72\x7A\x33\x88\x29\x8C\x85\x9B\x8E\x08\xFA\x84\x53\x9C\x87\xED\x7D\x1C\x9B\x11\xCA\x81\x13\xEC\x11\x66\x8A\x84\xA0\x81\xC1\x0A\x8B\x9C\x82\x0E\x86\x7C\x45\x84\x8C\x8F\x89\x28\x85\x8B\xC8\x8C\x11\x1A\x11\x13\x90\x8C\x2B\x87\x6C\x62\x8C\x0D\x10\x10\x80\x0B\x6D\x97\x8C\x85\x7A\x23\xB2\x8C\x77\x83", -"\x14\xD7\x89\x02\x67\x8D\xF5\x85\x21\xB8\x87\x87\x8F\xBE\x20\x8C\x87\x0E\x7F\xE6\x86\x22\xBF\x8D\xA9\x88\x97\x42\x8C\x51\x84\x8E\xB1\x8F\x3A\xA5\x5E\x85\x84\x13\xE5\x7D\x52\x91\x60\xCC\x8B\x1F\xAF\x38\xA7\x80\x00\xE2\x58\x20\x9E\x8D\x31\x8C\x69\x52\x7E\x8F\x8D\x0A\xD9\x8E\x71\x96\x38\xB4\x8F\x6B\x63\x82\xDC\x81\x1F\x93\x8F\x86\x1B\x60\xF3\x88\x84\x68\x83\xB3\x2E\xBF\x69\x8D\x4B\x8C\x8F\xD8\x8D\x2A\xA5\x8C\xA3\x84\xFE\x03\x5E\x4D\x80\x08\x74\x59\x3C\x9F\x8D\x97\x3C\x13\xF2\x6E\x86\x18\x8F\x00\x0C\x0C\xA3\x10\x6F\x8B\x11\x56\x5C\x7A\x80\x90\x19\x8B\x3D\x9B\x88\x83\x8E\x1E\xC0\x8E\xF8\x7C\x8E\x9A\x8B\xB4\x6B\x8C\xCF\x8A\x13\xA6\x54\x79\x88\x85\xFF\x86\x22\x92\x91\x0F\x14\x21\xB1\x50\x4F\x1D\x8F\x18\x91\x4F\x56\x8F\xF7\x89\x7D\x45\x8E\x87\x90\x85\xF4\x89\x72\x40", +"\x00\x00\x81\x81\x84\x02\x81\x80\x07\x82\x00\xC3\x00\x01\x30\x03\x38\x01\x31\x0B\x80\x24\x20\x05\x30\x01\x28\x00\x75\x14\x80\x12\x30\x01\x3C\x01\x7F\x20\xA1\xA0\x87\x88\x80\x2B\x8C\x00\x69\x00\x2D\x31\x8C\x8E\x8F\x8B\x8C\x15\xAD\x9F\x82\x91\x95\x00\x84\x8B\x18\x9A\xB2\x94\x91\x90\x07\x9B\x29\x1A\xF4\x38\x90\x97\x96\x8C\x9E\x90\x0B\x37\xA4\x85\x8A\x84\x86\x86\x88\x0C\x93\x95\x8F\x9A\x9D\x8C\x00\x9B\x08\x90\xA8\x28\x90\x04\x36\x89\x99\x3C\xCB\x82\x8D\xAD\x87\x85\x88\xA9\x43\xD5\x9E\x86\x07\x98\x38\x96\x8D\x6E\x00\x02\xA7\xAF\x7A\xB1\x80\x93\x1C\xA9\xAB\x8C\x82\x9C\xA9\x98\xAB\x0D\x37\x8C\x82\xA2\xA1\xBC\x00\x31\x39\xC2\x95\x8E\x21\x8B\x95\x8A\xBA\x76\x80\xB8\xBC\xAB\xBD\xA1\xB5\xBF\x1E\x93\x02\xD2\xBC\xCE\xC0\xC5\x8C\x8A\x80\x0C\xCC\x8E\xC0\x03\x26\x00\x6E\xC2\xA9\x8F\x30\x01\xB8\xC9\x9B\x93\xFA\xAF\xAE\x99\x98\xCC\x01\xA4\x59\x80\x1B\xA9\x9E\xAB\x8B\xD3\xD4\x5C\xAC\xEE\xC7\xA1\xC8\x01\xD8\x95\xB3\x97\xD6\xC1\xC8\x84\x8D\x8A\x33\x55\x95\xB1\xB0\x8B\xC5\xC6\x8D\xD7\x25\xA7\xB2\xDC\xB6\xAE\xBE\xCA\x9F\x08\xC2\x9E\x8E\xB5\xEC\xD3\xEA\xE2\xB0\xDA\xC8\xFC\xE4\xDC\xA2\x98\x07\x37\xE2\xE8\xDA\x83\xD0\xE5\x8B\xDF\x9C\xAB\xED\xC0\xB4\x98\xF1\x82\xA0\x15\x42\x5E\x76\x4C\x58\x45\x40\x75\x4A\x1C\x4E\x43\x5F\x51\xFE\x42\x40\x80\x67\x03\x96\x52\x03\x4D\xAC\x6E\x54\x5D\x83\x01\x4F\x82\x81\x6D\x96\x6C\x58\x42\x43\x15\x50\x42\x73\x57\x74\x51\x07\x4F\x0B\x37\x66\x87\x4F\x8A\x37\x74\x54\x5C\x8B\x2D\xAE\x8C\x4C\x8C\x08\x72\x83\x8C\x8D\x02\x76\x8D\x7F\x4D\x49\x22\x60\x00\x11\x00\x3D\x82\x14\x00\x45\x00\x0A\x40\x15\x00\x04\x48\x40\x8A\x4C\x80\x08\x8B\x8A\x74\x5E\x85\x40\x90\x42\x84\x96\x90\x00\x48\x93\x8B\x92\x93\x00\x01\x01\x8C\x4F\x4A\x85\x4C\x61\x10\x00\x0D\x16\x95\x05\x37\x5B\x11\x45\x0B\x00\x3A\x10\x00\x99\x6C\x9A\x10\x03\x17\x00\x1D\x10\x02\x9A\x0C\x6C\x9E\x98\x9C\x00\x32\x90\x0C\x00\x6C\xB9\x05\x9C\x00\x2A\x00\x0A\x95\x41\x17\xB7\x47\x15\x90\x00\x0C\x1F\x8F\x95\x64\x83\x90\x93\xA1\x02\x68\x85\xA3\x00\x5F\xB4\x41\x9A\x40\xA7\x66\x45\x90\x63\x94\x81\x48\x88\x0A\x49\x99\xA2\x49\x81\x63\x4D\xA6\x68\x00\x40\x45\x91\xA8\x40\x28\xA9\x07\x56\xA9\x21\x58\xA8\x40\x16\xAB\x83\x9F\xA8\x97\x5E\x00\x02\x95\x8E\x47\x49\x0C\x8E\x8F\x48\x85\x93\x91\xAB\x57\x99\x97\x88\xA1\x00\x07\x04\xAC\x48\xA8\x81\x45\x16\x8F\x3D\xA7\x60\xAB\xB2\x2B\x00\x08\x84\x40\x74\x42\xB8\x40\x50\xD3\x82\x1C\xA8\x96\x00\x03\x94\x9B\x91\x5D\xB7\x4C\x9A\xB7\x88\x81\xB7\x4C\x99\x48\x88\x93\x91\x8F\xE2\x93\xB5\xB1\xBA\x08\x40\x10\x02\x02\xCF\xBF\x31\xB5\x42\xAB\x8E\xA6\xB4\xBE\x05\x7A\x07\x6D\xBF\xB6\x93\x9B\xA8\x92\x5E\x88\x4E\x08\x00\xC5\x74\x5D\xC1\x41\xFF\xA3\xB6\x4B\xB9\x56\x89\xC5\xA5\x59\xD9\x8C\x7D\xB8\x4F\x4F\x85\x4F\xAD\x40\x11\x9E\x4F\x9C\x04\x37\x65\xC0\x03\x9F\x0F\xC3\x9C\x68\x6B\x42\x40\x52\x50\x77\x42\x78\x65\x42\xBE\x20\x00\x04\x08\x00\x3C\x0A\x72\x4F\x9F\x3E\x3E\xA9\xC8\x87\x3F\xD0\xC3\xD2\x7B\x56\x6C\xC3\xBB\xCC\x27\x42\x5C\xBD\xBE\x00\x39\xCD\xCE\xCA\x40\xDA\xB3\xD3\x71\x95\x72\x4F\xD1\x41\x17\x58\xD9\x73\xC3\x31\x00\x05\x27\x4D\x53\xC6\x7A\x79\xD6\x56\x41\xD6\xC1\xCE\xA4\xB9\xC2\x08\x97\x28\xAF\xD8\xCC\x00\x77\x1C\x52\x53\x56\x39\xFB\x11\xD6\x59\xBB\x5D\x5F\x54\x7E\xAA\x40\x03\x89\xCE\x3D\x3B\xDF\xD9\x8F\x71\x53\x48\x82\x46\x10\x42\x5F\xD9\xCE\x7D\x3B\xD2\xAD\xCE\x21\x38\x4E\xD4\x7B\x6F\x9C\x65\x60\x57\x9F\x5C\x65\x47\x44\x81\x7C\xB5\xDB\xE5\x96\x6A\xDB\xDD\xDB\x00\x2F\xD1\xDC\x00\x73\xF5\xD9\x4B\xDD\x7B\xFA\xD9\xCE\x56\x5C\x7D\x6B\xA8\x70\xFA\x71\x54\xE2\xE1\x8F\x8B\xE1\x88\x67\x8F\xC0\x01\xE5\xCE\x93\xC0\x05\xE5\xD7\x67\xC9\x74\x98\x61\xEA\x5D\xE1\x6B\x44\xDB\x96\xE9\xF0\xE6\x5B\xC2\x48\xF2\x61\x68\xDE\x4F\xC2\x0C\x00\x1F\x04\xDA\xF4\xD8\xC9\x76\xEA\xDB\x00\x24\xA2\xDF\xDE\xC7\xC4\xD6\x56\xCB\x82\xDC\x64\xFA\xAC\x6F\xE8\xC8\x43\xF5\x94\x49\x76\x13\x49\x0C\x67\x16\x7F\x7E\x42\x52\x07\xD7\xF4\x96\x37\x7C\x47\x79\x7B\x7F\xB8\x02\x28\x6C\x00\x09\x17\xF7\x74\x7B\x3B\x00\xB8\x78\x00\xFA\x65\x36\x01\x80\x03\x7D\xF2\x67\x73\x6F\x63\x45\x4E\x95\x39\x6B\x6C\xCE\x23\x3C\x3E\xD6\x35\x21\xCE\x2E\x7C\x32\xBC\x40\x02\x76\x1E\x93\x3D\x79\x7B\x70\x71\xE0\x3B\x3B\x77\xE4\x60\x28\x79\x66\x29\x25\x03\x5A\x23\x22\xC1\x63\x78\x00\x45\x7C\x0F\x0B\xA4\x7D\x50\xC1\x64\x84\xEC\x79\x6B\x6E", +"\xF9\x33\x85\x3E\xA5\x2D\x85\xEE\x7B\x65\x70\xF2\x64\x49\x2E\x1E\x39\x86\xE4\x53\x83\x6E\x35\x64\x7F\x61\xC1\x79\x82\x99\x45\x4C\x83\xBD\x4E\x38\x00\xD0\x3F\x2E\x74\x66\x2B\x85\xD2\x39\x66\x4E\x39\x6E\x2B\xDE\x24\x7D\x2E\xF5\x5E\x22\x7E\x5C\x66\x6D\xF8\x18\x72\x81\x88\x11\x80\x2E\x9C\x3E\x7F\xFC\x72\x85\x7E\x3A\x8F\x87\x8E\x63\x87\x80\x00\x5C\x7A\x80\x84\x23\x70\x80\x32\x35\x8C\x01\x92\x8C\x33\x0A\xA8\x70\x75\x5A\x9B\x80\x00\x1D\x86\x88\x10\xA6\x3A\x84\x74\x76\x6E\x6E\x31\x75\x88\xAB\x07\x89\x84\xB7\x79\x3D\xFB\x3A\x70\x01\x26\xA9\x73\x5C\x33\x90\x21\x0D\xDC\x2F\x73\x53\x90\x73\x8A\x39\x7D\x84\xDB\x3C\x70\x89\xBD\x42\x8B\x93\x44\x99\x65\x25\xE5\x8A\x22\x25\xA3\x94\x89\xBC\x6F\x8A\x55\x52\x84\x78\x2A\xBB\x6E\x8A\xA7\x98\x88\x06\x99\x7B\x8B\xBD\x5D\x87\x8B\x61\x87\x27\x18\xD4\x3E\x47\x4B\xBB\x68\x8D\x11\x2E\x21\xCE\x6C\x8D\x3A\x37\x80\x02\x8F\x71\x9C\x9A\x47\x4B\x7D\x32\xCE\x49\x37\x86\x00\x14\x03\xFF\x73\x86\x32\x72\x9B\x71\x25\xCE\x68\x9F\xF6\x1C\x36\x90\xF0\x7D\x8D\x9D\x9A\x6D\x7B\x39\xAD\x95\x83\xF3\x67\x79\x67\xC8\x91\x90\x17\x93\x9B\x6F\xC1\x25\x98\x9E\xFB\x95\x9B\xFE\x67\x8C\x76\x83\x41\x79\x7D\xE2\x80\x02\x22\x90\x85\x80\xF7\x59\x97\x75\xB8\x87\x85\x41\xF9\x9E\x33\x84\x88\x8D\x97\xF3\x21\x73\xE0\x25\x9C\x76\x19\x8C\x74\x2B\x36\x8D\x96\x14\xF0\x86\x7A\x3E\x8D\x81\x91\x7F\x95\xA1\xFF\x6B\x97\x9E\x98\x83\x84\xA2\x8C\x82\x93\x0C\x09\x8B\x80\x97\xAB\x3E\x81\x37\xA0\x90\xFF\x14\x84\xA1\x59\x86\xAE\x47\x64\x4D\x99\x17\xBA\x9E\x92\x4B\x8B\xA7\xA2\x25\x9C\x90\x53\x9F\x8C\x97\xFB\x21\xA6\x85\xA4\x86\x97\xDB\x26\xAF\x77\x55\xA9\x22\xA5\x7B\x7A\x84\x0F\xBE\x87\x95\x5A\xA3\x82\x93\x26\x88\x87\x2E\x8A\xA9\x89\xAB\x8B\x88\x86\xA7\x82\x99\x14\xE1\xA0\x97\x1D\x87\x9C\x77\xCA\x93\x6E\x40\xCE\x9E\x8A\x8D\x11\x9F\x8B\xD3\x2E\xAA\x19\x83\x59\x8D\xB2\x1B\x98\x91\xDD\x88\x6A\x47\x60\x9D\xA5\x88\xAE\x9A\x9F\xA0\x28\x9E\x3A\xFB\x8E\xB0\x8E\xA6\x99\xB2\xAD\x88\x83\x30\x3D\xA5\xB2\xE6\x5D\xA0\xB3\x5F\x35\x80\x44\x88\xBE\x23\x89\x82\xAB\x82\xAD\x68\xAE\x54\x91\x2E\xB3\xCB\x9E\x74\xAD\x20\xB8\x77\x2F\xF0\xAF\x6C\xB9\xAE\x92\x78\x00\x01\x74\xCF\x76\x9F\xA4\xAB\x0F\xB7\xB3\xAF\xB3\x21\x3F\xAC\x77\xB7\x80\x8C\x9A\x92\x1D\x86\xA3\x3B\x87\x3E\xA2\x50\x8C\xA4\x7C\x0E\xA8\x7C\x6F\xBF\xA6\xA6\x3B\xB2\xA4\xB8\x67\xB8\xA1\x5A\x9B\xAD\xB4\x84\xA0\xB7\xA3\x56\xB2\xB7\x48\xDA\xA8\x95\x93\x9E\xA8\x9D\x2B\xB4\xA5\x6F\xA5\xB1\xA7\x9C\x80\x00\x03\xEA\xB4\xBA\x55\x26\xB7\xBB\x96\x6D\x78\x66\x56\x49\x70\x00\x68\x48\x21\x9D\x47\x94\x9D\xD5\xAB\x90\x1E\xC2\x21\x69\x9C\x7A\x5C\xB1\x24\x7E\xA5\xF6\x19\x7D\xBA\xE6\xA0\xB3\x22\x93\xA1\x9C\x69\x8C\xC7\xA0\x07\xC1\xB8\x00\x0F\x7B\xA6\x50\x75\x9C\x80\xF9\xA3\x9E\xB2\xDE\xB7\xC3\x70\xFA\x51\x78\xE3\x89\xA8\xB9\xDC\xB5\xC1\x3C\xD5\xA7\x9A\xEC\xA7\x91\xBA\x94\x73\xBB\x82\xF4\xBE\xBD\xEC\x91\xA9\x97\xAC\xAA\xC5\x73\xD6\x9E\x97\xF1\xA5\xA2\x85\x34\x80\x8C\x2B\xDF\x22\x8A\x04\xC0\x25\xC3\x0B\xDF\xB6\x6B\xCF\x79\x9D\xF8\x89\xC8\xC4\x16\xCC\xCB\xC3\x34\x04\x9F\x82\x3F\xBD\xA6\xBE\xB0\xCB\x8A\xA1\xB5\xA9\x53\xA4\xC7\xAE\x39\x7B\xAF\x52\xB9\xCB\xB9\x2D\xE0\xBD\xC5\xD0\xBE\xCA\x74\xC8\xC6\x7F\xF6\x83\xC6\x96\xAA\xB8\xC6\x72\x90\xBF\xB5\x33\xFD\xC7\x85\x24\xB1\x84\x90\xAA\x92\xC9\xAF\x84\xCC\xAE\x2C\xA9\xC1\x44\xB4\xCF\xCC\x23\xF2\xC5\xCD\x41\xB5\xBC\x00\x35\x0C\xA6\x0E\xCA\xC0\xD1\xD6\xAE\xBE\x23\xE4\xA2\xCD\x2E\xEB\xAF\xCC\x36\xC3\x8A\x46\xD3\xA0\xC8\x3B\xEE\xAB\xB6\x79\xC7\x94\x57\xC1\xC9\xA5\x3F\xEF\x95\x98\xB1\x84\xAF\xDB\x66\xA0\xAA\x4D\xEA\xAD\xA9\x2C\xD7\xCD\x56\xC1\x9B\x3F\xB9\xA7\xD6\xAE\xA8\xD7\x4C\x5E\xB7\xB5\xD3\x67\xBE\xA9\x3A\xFB\x34\x98\xA6\x84\xB9\x9B\x35\x93\xC2\x65\x07\xCE\xCA\xF2\x5A\xC9\xA1\x89\x1A\x02\xD9\x98\x6A\xC9\x88\xD2\xC5\x5D\xFB\x9C\x35\x48\xFA\xB7\x03\x4D\x7E\xB7\xD1\x68\xCC\xDF\xC1\x44\xA6\xC2\xD5\x14\xB3\xC3\xEA\x42\xD3\xC2\x19\xC0\x02\x2D\x1C\xB3\xC3\x49\xE4\x7D\x49\x41\x91\xCF\xA6\xFC\x65\x77\xBF\x5F\xD6\xC7\xE4\x68\x73\x57\x3E\x76\x2C\xC7\x74\xA9\xD7\xA3\xA0\xC1\x96\x8D\xCB\xCB\x89\x3A\x5A\xB7\x57\xCB\xBC\x51\x9D\x8F\x6C\xF3\x6B\xCE\x9B\xEC\x78\xBF\xFB\x6A\xC8\xE1\x6E\xE5\x75\xCB\xA8\x6A\x77\x6D\xB7\x9B\xBB\xD9\x5B\x94\x37\xF6\xC2\xBC\x9E\xE4\xB0\x48\x7E\xCD\x77\xB6\x62\xAF\xE1\x67\xBA\xC0\xDC\x7D", +"\x63\x67\xC8\xDE\x9F\x4D\xF4\x54\x68\xC2\x00\x21\x6F\x22\x8E\xCA\xB3\xCA\x0B\xEA\xE5\x09\xC7\xE3\x5F\xBB\xB4\xE5\x05\xB4\xE3\xCC\xB7\x1C\x39\x90\x7B\x6C\xCC\xE6\x63\xC4\x76\x90\xD3\x25\xB0\xDA\x97\x4A\x1A\xD0\x2F\x2B\xA9\x1E\x9E\xE5\x47\x6A\x2F\xCE\xB3\xE1\xE7\x9A\xFB\xA3\x07\x3D\xBA\xE5\xD5\x1D\x84\xE9\x2E\xC6\xEA\x9A\x43\xB9\x66\xD2\x96\x3C\xE9\x8F\xFE\x6F\xE9\xC5\xD9\x64\x59\x4F\x27\x2C\x8D\x08\xDB\xDC\x12\xC2\xE3\x1B\xD0\xD6\x32\xFB\xAF\x67\xDA\xFB\x20\x77\xB6\xC1\xEF\xD0\xCC\x45\xC4\xB8\x2F\xFE\x65\xD2\x78\xED\xA4\xB1\xF5\xE4\x7B\x60\xF9\xE6\xD6\xE3\xE9\xE9\xAE\xC5\xEF\x2D\x48\xF3\x6F\xDA\xB2\x2D\xED\xBE\x76\x70\xEA\x7B\x73\xEE\x59\x51\x26\xEE\x6F\x89\xF4\xE6\xF0\x3B\x8E\xE3\xFE\xED\x7C\xA1\x18\xDF\x2B\x36\x62\x20\xB7\xC2\xEB\x6E\xAC\xEA\xF2\xEB\x61\x7C\xEA\xCE\xE1\x63\xCA\x00\x3E\x11\xEC\xB8\xFC\xE6\xDA\xDE\x91\x6D\x31\xF6\x81\x41\x16\xAF\x6D\xAF\x41\x75\xED\x0E\xA0\x46\x2C\x23\x50\xEE\x1A\xB9\x6A\x42\xC5\xDE\x21\xD3\x19\xA8\x85\x85\x40\x94\x7D\x22\x78\x0E\x2C\x5E\x39\x22\x43\x29\x26\x0E\x90\x9C\x22\x8A\x3F\xE2\x76\xF5\xB6\xE2\xF8\xE3\x6B\xFF\x4F\xE9\xE4\xF3\xEE\xED\xFA\x65\xE2\xDD\xCF\xF8\x65\x22\x2B\x0F\xB7\xBD\xF9\xBD\x4F\xFA\x44\x81\x7B\x51\x51\x75\x7D\x2A\x38\x7D\x1D\x7D\x3E\x6E\x14\x5B\x8C\x23\x41\x7F\x1F\x7F\xC0\x34\x57\xB6\x71\x47\xF3\x7A\x7B\xC1\x79\x6E\xAA\x00\x7C\xB6\x11\x36\x43\x74\x7C\x7C\x59\x33\xF8\x7A\x20\xBC\x3B\x7C\x95\x7E\x78\x63\x6E\x80\xD1\x72\x80\x7B\x34\x80\x57\x70\x67\xDA\x5B\x5A\xDB\x7A\x80\xDE\x70\x7E\x39\x13\x7E\x00\x05\x7E\x56\x57\x7E\x74\x55\x71\xF5\x74\x7F\x1C\x86\x7C\x5C\x18\x7C\xFA\x75\x56\xFC\x76\x79\x5D\x66\x82\x01\x80\x7A\xD4\x71\x14\xEB\x79\x5A\x2D\x88\x63\x2F\x81\x6A\x87\x33\x54\x0D\x87\x52\xFE\x6F\x4A\xA7\x7E\x4D\xDC\x34\x81\xB6\x1C\x3D\xBD\x78\x0B\x18\x86\x19\xDC\x3B\x81\x3A\x7C\x3D\x3E\x8B\x38\x20\x84\x3E\x6C\x2C\x7C\x3D\x85\x84\x27\x57\x82\x48\x83\x2E\x01\x2B\x7E\x06\x8E\x82\xF3\x1A\x80\x40\x19\x11\x88\x10\x82\x37\x57\x72\xE8\x79\x5B\x40\x75\x36\x63\x8C\x83\x81\x85\x86\x27\x17\x86\xA7\x49\x2D\x6A\x83\x7F\x25\x8D\x86\x47\x81\x77\x70\x80\x21\xDE\x43\x87\x4E\x85\x87\x50\x80\x00\xD3\x21\x17\x4B\x4D\x87\x3A\x88\x85\xED\x79\x3E\xF3\x71\x81\x8D\x7A\x75\x59\x89\x75\x5B\x8E\x75\x00\x04\x0A\x5F\x82\x13\x61\x8D\x65\x2A\x34\x86\xF7\x7F\x83\xF9\x7C\x3B\x88\x83\x82\xC1\x7B\x88\xBF\x3E\x86\x8E\x8A\x82\x3A\x7C\x84\x37\x63\x6F\x4F\x84\x5E\x97\x88\x55\x28\x7E\x87\xEA\x7D\x8A\x82\x82\x8A\x1D\x8D\x67\x85\x89\x7C\x80\x23\x84\x8A\x8C\x86\xB7\x8D\x88\xD3\x7F\x88\x1B\x2B\x8B\x2C\x8D\x8B\xDA\x74\x89\xE4\x57\x87\xCC\x5A\x87\x11\x1C\x87\x74\x57\x85\x13\x84\x8A\x96\x1C\x7B\xEC\x77\x81\x92\x79\x81\xC7\x8A\x8E\x84\x80\x84\x2E\x6A\x7C\xCE\x83\x79\xC9\x86\x84\xFA\x5F\x86\xBA\x8A\x75\x92\x8E\x8B\xDA\x8C\x3B\x31\x80\x11\xE1\x75\x16\xE4\x76\x7E\xC3\x8B\x89\xF3\x72\x86\xB5\x8F\x8A\x66\x8C\x19\x73\x3B\x6A\xF1\x86\x1B\x7F\x26\x8B\xD0\x72\x8D\x86\x54\x8D\x72\x8D\x6A\xD9\x7B\x37\xBF\x8C\x3B\xFA\x61\x1A\xC8\x7F\x3B\x55\x88\x5B\xE2\x81\x7C\xA9\x72\x81\x15\x85\x6D\x7F\x7E\x7A\x01\x81\x7B\x01\x13\x7B\x1C\x87\x78\xA0\x89\x60\x81\x8A\x85\x60\x85\x73\x61\x38\x8A\xE9\x83\x93\x06\x95\x8A\xED\x81\x8B\x0B\x90\x00\xB3\x83\x7C\xCF\x8E\x7C\x8C\x85\x8F\xB9\x8A\x84\x05\x86\x91\x07\x89\x91\xE4\x31\x8C\x99\x89\x83\x7F\x8B\x7E\xAB\x84\x76\x9C\x8B\x93\x20\x8D\x93\x69\x84\x8B\xEC\x80\x8D\x11\x94\x94\xD3\x87\x8F\xB6\x19\x8F\xD9\x89\x80\x95\x8C\x8D\x79\x85\x4E\x0C\x10\x8E\x56\x84\x8E\xAA\x80\x00\x23\x91\x8A\xA5\x8C\x7A\xF8\x5F\x7A\x13\x1A\x92\x00\x1C\x92\x81\x8E\x92\x00\x0C\x2E\x6E\x96\x19\x11\x7C\x19\x74\x9B\x7E\x7D\x92\x48\x61\x3C\x5F\x56\x60\x98\xD6\x64\x60\x5D\x6E\x89\xC8\x8F\x92\x30\x73\x8E\xB7\x7A\x8E\xF3\x48\x8E\x85\x9B\x83\x39\x95\x8E\xC9\x8F\x81\xCC\x82\x82\x9A\x74\x84\x42\x91\x8D\x5C\x93\x91\x5E\x9C\x76\x48\x94\x87\x62\x94\x5E\xFD\x8E\x37\xE2\x7C\x15\x36\x8B\x2A\x38\x8F\x4A\x04\x91\x7C\x95\x92\x13\xF6\x7D\x41\x98\x91\x84\x0C\x9F\x4F\xEF\x73\x8F\x43\x9F\x15\xF6\x86\x94\x91\x83\x9A\x93\x85\x9A\x1A\x92\x85\xCB\x8E\x91\xC3\x81\x92\xA5\x82\x93\x6B\x93\x4F\x36\x93\x99\x9C\x81\x9B\x56\x1E\x8A\xB4\x90\x8B\x86\x8F\x36\x57\x9B\x99\x41\x9E\x7F\xBB\x92\x7D\xA0\x9E\x9B\x3A\x70\x96\x18\x9B\x8F\x7A\x68\x87\xB1\x8B\x87\x0F\x8E\x9A\x4F\x96\x8C", +"\xD0\x9E\x11\xD2\x9B\x37\xB5\x92\x8B\x6A\x60\x94\x07\x9D\x99\x5B\x9C\x9B\x45\x91\x87\x47\x9C\x71\xA4\x9C\x7D\xA7\x4C\x94\xBF\x42\x45\x5C\x71\x51\xE6\x60\x73\x11\x5D\x7B\xDE\x3E\x68\x11\x53\x5C\x0E\x71\x63\x2A\x31\x98\xEF\x86\x57\x6F\x3A\x97\x30\x9A\x75\x0E\xAA\x22\x24\x96\x1B\x0E\xA0\x97\x80\x7A\x5F\x6D\x9B\x92\xF2\x74\xA1\x87\x91\x6E\xC4\x56\x68\x9B\x73\x70\x2C\x77\x61\x1C\x0C\x77\x32\x12\x6D\x51\x62\x4F\x26\x9D\x7A\x4B\x3F\x16\x42\x1A\x6D\x50\x39\x33\x2C\x9B\x72\x65\x6D\x6C\x44\x54\xA2\x85\x78\x4F\x04\x7A\xA3\xF0\x54\x6E\x7A\x74\x61\x39\xA0\x6E\x0F\x32\x33\x32\xA0\x00\x16\x07\x13\x73\x39\x70\x1E\x64\xA4\x74\x6C\x64\x41\x31\xA0\x13\x6C\xA3\x05\xAF\xA2\xF8\x58\xA4\x34\x3E\x87\x35\xAA\x33\x84\x79\xA0\x8C\x77\x6E\x43\xAD\xA1\x04\xA8\x6E\x31\xAB\xA5\xC5\x1D\xA4\x16\x72\x13\x41\x38\x9C\x33\x91\x68\x8D\x98\x8C\x1A\xA1\x33\x9C\x1B\xA5\x7F\x93\x37\x76\x98\x8C\x6D\xAA\x96\xD1\x96\x34\x8F\x93\x93\x47\xA5\xA7\x4D\x30\x74\x5D\xA0\x88\x7A\xA9\x97\x7C\xAE\x11\x0E\xAA\x19\x7F\xA2\x13\x19\xA8\xA5\x9C\x1A\xA5\x83\xA4\xA6\x2E\x69\xA7\x18\xA1\xA2\x41\x32\xA1\x71\xA7\xA9\x27\x90\x00\x0F\x09\xA8\x90\xA2\x48\x92\xAC\x11\x42\x1E\x31\x02\x1A\xA6\x0D\xA8\xA9\x00\x00\xA7\x6B\xA3\x5F\x6E\x68\x74\xCF\x62\xA4\x58\x6C\x5E\x89\x6E\x5E\x73\xA7\xA6\x83\xA4\x98\xA7\xAB\x37\x37\xA3\x61\x84\x68\x74\x41\x3C\xAA\x25\xA4\xAB\x91\x6F\x66\x4B\xA2\xAB\x0A\x7F\xAB\x43\x51\xA8\x4C\x34\xAA\x4D\x65\xA8\xAD\xA4\xAC\x02\x60\xAC\x42\x3D\xA8\x56\x11\x36\xC2\xAC\x81\xB7\xA3\xAA\x7E\x9C\xA4\xBC\xAF\xA1\xEA\x8B\xA7\xD6\xAE\x11\x61\x35\x1C\x3B\x8C\xAC\x49\xA3\xA0\x2E\x66\xA8\xE1\xAF\x4D\x2A\xA6\xA2\x45\xA7\x61\x11\x6D\x58\x13\x6C\xA2\x05\x75\x73\x8C\x6B\x59\x08\xA5\xAF\xDF\x62\x62\x5D\x6E\x4F\x60\x68\x54\x1A\x43\x50\xC9\x5D\xAF\xA1\x13\x6C\xD8\x4F\x36\x30\x6E\x7E\xC3\xA2\x51\xAF\xA9\x76\xC0\x93\x6F\x73\x60\x5C\x07\xB0\x4A\xB2\x6C\x9F\x5B\x5B\x67\x28\x53\x64\x38\x40\x81\xC4\x8F\xA5\xFC\xAF\xA3\xE0\x62\x5A\xD1\xAE\xB0\xB5\xAF\x66\xE0\x95\x58\x22\xB5\x67\x16\xB7\x6F\x23\x74\x6B\x50\x43\x8C\xFA\x29\xAD\x83\x6F\xB0\x13\x46\xA5\xBE\xA6\xB3\x9C\x1D\x7B\x85\x4E\x9C\x35\xB7\xB2\xD4\xAD\x41\x8F\x4B\x4C\x27\x64\xB0\x9D\x44\x55\xB0\x58\x49\xFA\x98\x63\x97\x6D\xB2\x22\x73\x6B\x7A\x69\x4A\x1B\xBE\x67\x1D\xB7\x6B\x63\x57\x54\xB7\x97\x8D\xAE\x67\xB4\x9D\x6E\xB4\xA2\x48\x6F\x71\x55\x6B\xC3\x89\x6B\xC5\x38\x4C\x6F\x3A\x4C\x61\x67\x5C\x46\xB9\x33\xD0\x40\x6C\x81\x5C\x62\xCF\x5E\x88\x11\x57\x77\xCE\x28\x10\x6E\xA5\x34\x15\x3A\x32\x38\x20\x2C\x3C\x18\xB3\x43\xA6\xAF\x3A\xA5\x1C\x73\xBE\x4D\x2B\x25\x39\x35\x2C\x20\xEF\xAE\x11\x82\xB7\x6C\x84\xB7\x13\x23\x0D\x2F\x77\xBD\xA7\x79\xBD\xB8\x08\x15\x02\xFD\x2A\xA9\x86\x9D\xA9\x93\xBA\x73\x2B\x27\x02\xFD\x24\xB3\x39\xB0\xB4\x43\x5B\xB8\x43\xAA\xB7\x37\x12\x2B\x87\xBC\x13\x91\xB4\xAE\xB3\x23\xAE\x2C\x29\x2D\xA9\xB4\x13\x1F\x0A\x31\xDC\x23\x31\x39\x2B\x22\xB6\xBB\xB7\xBA\xBB\xBB\x88\x29\xBB\xDC\x2B\x29\x01\x1B\x2B\xBC\xBB\x2B\x15\x3E\xBB\xBC\xB5\xAD\x17\xA6\x19\x7F\x20\xBC\x30\x2F\x97\x4D\x7F\x76\xA1\x42\x52\xFB\x11\x3D\xFA\x6A\x38\x68\x77\x72\x54\xA3\xA4\xFF\x06\xBC\xFE\x27\x13\xC2\xBB\xBB\xC4\xB7\x13\xC6\xBC\xBB\xAB\xBB\x73\xCC\xBC\x22\xCE\xBE\x76\xB6\x37\xB1\x89\x75\x72\xD7\xBC\x19\xD9\xB3\xAB\x01\x1B\xBD\x2D\x21\x3D\xB4\xB7\xBC\x04\x32\x10\xC5\xB8\xBF\x22\x30\xAA\x7F\x2A\xBB\xF4\xB5\x23\x89\x77\xBE\xBC\xB7\xBF\xAD\xB5\x10\xDF\xBA\xBB\xF1\xBA\x70\x15\x3F\x36\xFC\xB1\x10\x7E\xB2\xBF\x80\xB0\x6E\xE3\xB7\x13\xD1\x3D\xB4\xD6\x4B\x22\xA0\xB3\xA4\xCA\xA3\x41\x01\xC8\x28\x75\xB4\x31\x0F\xC1\xBC\x37\x15\x31\x09\xCB\xB7\x0B\xCF\xA4\x0D\xC3\xC2\x00\x11\xC1\x0A\x73\xC1\x17\x65\x23\xDC\xB4\xA9\x89\x7C\xBB\xC6\xB6\xC2\x2C\xC1\xA6\x65\xA3\xA4\x32\xCD\x22\xE7\xB7\xC2\x38\x29\x78\x15\x36\xC0\xBC\xB9\xC2\x0B\x65\x31\xA4\x2C\xC2\x98\xB9\xAA\x9A\xB7\x13\x26\x09\xC3\xE5\xBC\x3D\x15\x3C\x02\x50\xC0\xAA\x61\x3B\xBF\x2C\xC5\xBE\xCB\xBB\xBB\xE9\xBE\x79\x21\x7F\xB5\xD3\xB3\x2C\xFA\x56\x72\xF0\xB9\xB8\x1F\x1C\xBD\x38\xC9\xC5\x25\xC7\x13\x44\xCB\xBB\x46\xC9\x1C\x48\xC9\xC3\x4B\xC0\x71\x21\xA5\x31\x4F\xCA\xC6\xAE\xB2\xC5\x37\x14\xC5\x78\xC9\xBC\xB2\x97\xC0\x02\x15\xC1\xBA\xBA\xC5\xA5\x2A\xBB\x5D\xC5\x6F\xBE\x1E\xB2\x71\x1D\xBE\xB0\x86\x9C\x6F\xC8\x39\xB5\xB5\xBF\x6C\xC9\xC3\x15", +"\x33\xC4\x39\xCF\xC8\x96\x11\xC7\x4A\xC0\xAA\x0E\xA6\xC7\x55\xC9\xC7\x80\xC1\x10\x7C\xC3\xC2\xE5\xB7\xC5\xE2\xBF\xC9\x7E\xCB\x78\x2C\x2F\xC1\x39\x26\xBC\x98\xB3\xBC\x39\xC4\xBA\xF2\xB6\xBA\x08\x1B\xC1\xF2\xBD\xC1\x9C\x14\xC0\x37\x14\xA9\x18\xCC\x42\x8A\xC8\xA8\xDF\x2A\xB1\xE7\x5D\x4A\xB6\xC9\xAC\x3A\xB3\x17\xBB\x2F\x0F\xBB\x21\x3D\x98\xBC\xCA\x01\x11\xC2\x02\x1D\x01\x2D\x26\xBC\xEA\xA2\xCD\x3D\xC8\x10\xC6\xB9\x01\xD3\xC7\x13\x98\xB4\xA9\xCE\xC0\x10\xA6\xA1\x10\x1E\x0B\xCD\x08\x1F\xC3\xE4\xC2\xC2\x08\x19\xCC\xC6\xB6\xBF\xE7\xC2\x10\xC5\x13\xCE\xD8\xC7\x13\x0E\xC8\xCE\x23\xC2\xCB\x0A\x74\xCB\x05\x15\xCC\x4F\xA8\xCB\x42\x1A\xCB\x08\x1C\xCB\xB0\x69\xB4\xD1\xB2\x8C\x98\xB3\x6A\x7C\x65\x6A\x13\x1A\xCF\x33\x67\xCC\xC8\xB2\x10\xF3\xCF\xC0\x0A\xD0\x69\xD3\xA3\x54\x6D\xCC\xC2\x2E\xCF\xA4\x30\xCC\x64\xFE\xC5\x10\x8C\xA5\x10\x13\xBB\x64\x82\x51\x5B\x60\xC1\x17\x06\xC6\x5B\x17\xDF\x64\x2B\xBC\x64\xCA\xC6\xC1\xDC\xCD\xCE\x01\x16\xBC\xE1\xC1\xC9\x08\x11\xD3\x00\x00\xCF\xBD\xB7\x13\xD5\xCE\xD2\x00\x1F\xCE\x3A\xD0\xCC\x05\x1E\xCD\xC6\xB0\xCD\x01\x16\xCD\x37\xD5\xCE\xDE\xBD\xD3\x69\xC5\xD4\x05\x1C\xCE\xF1\xC8\x10\x7F\x95\x31\xBC\xB6\xCF\x4F\xA8\xCF\x02\x11\xD1\x7E\x42\xBA\x13\x4B\xD1\x02\x10\xD0\x48\xBE\x69\x4F\xBE\xD3\x0E\x22\xCC\xCA\x84\xCC\x66\xCC\xCF\x0D\xD1\x10\x7F\x9C\xBB\x56\xD0\x54\xC5\xA8\x74\x15\xD3\xC2\x27\xDB\x6C\x29\xD8\x4E\x5A\xD1\x10\x1D\xD2\x10\x1F\xD3\x6D\x21\xD1\x5E\x23\xD0\xD6\x19\x22\xD6\x08\xDE\xAE\xC8\xA8\xD1\x06\xB8\x4E\x7B\xBF\xCD\x1F\x1C\xAA\x42\xD0\x10\xDC\xB6\xBC\x89\x75\x1C\xB8\xB7\x13\x75\xD0\x10\x5C\xDD\xB5\x3C\x6F\xCB\x05\xD0\xD8\x1C\xBB\xAA\x65\xDC\xD0\x67\xCD\xD3\xAF\xC0\xBE\xB1\xC9\x1E\xA5\xB4\xB9\xF9\xCD\xD9\x58\xD9\xCB\xBB\xB5\xD9\x9F\x47\xD9\x5F\xD5\xD2\x62\xBB\xD6\x01\x68\x53\x6F\x6B\xD2\x35\x2B\xCC\x2D\xD7\xCD\x05\x1C\xD3\xBA\xD2\x10\x34\xD6\xD3\xAD\xC7\x13\x8B\xD0\x00\x44\xD1\xDC\x08\x19\xD3\xBD\xDF\xD2\x37\x19\x33\xC9\xD0\x10\xDD\xCD\xD3\xE6\xCD\xDC\xA1\xC0\x10\xEA\xCC\xD2\x08\x16\xC0\xC6\xBF\xD0\x01\x10\xD5\xBB\xB2\xD5\x0B\x64\xD5\x01\x12\xDB\xAE\xA9\xDA\xFD\xCB\xDA\xF1\x11\xD0\x5E\xDD\xD7\xB0\xD1\xB3\xE2\xD2\xAD\xB4\xD8\x74\x89\x7A\xDD\xF8\xBD\xDE\x26\xBD\xD6\x14\xD9\xC3\x2B\x21\xD7\xDE\x63\xD7\xAD\x43\xD9\x00\x07\xD7\x01\x19\xD7\x2D\xA1\x6B\xBF\xCB\xDE\x56\x1A\xDF\x3E\xA7\xA2\x2A\xD8\xDB\x08\x1D\xCC\xC6\xB6\xBC\xCC\xDA\xD4\x02\x1F\xDC\xD2\xDC\xDB\x12\xE1\x10\xBF\xDD\xD3\xC3\xD5\xDC\xF3\xB4\xCD\x37\x1C\xE1\x32\xD5\x10\xD1\xD7\xE1\x00\x19\xD4\xC6\xDB\xD4\x93\xCD\xD4\x05\x1F\xD4\xA3\xD9\x1D\xA5\xDC\xB9\x37\x14\xDF\x66\xDE\xDF\xAC\xDB\xD7\x03\xDB\x44\x06\xEB\x77\x83\xDB\xD0\xE4\xD7\xD6\x00\x19\xD6\xBB\xB2\xE3\x0C\xDF\xD6\x0F\xC8\xE0\x2B\xA5\xD8\xFD\xDB\xBB\x00\xE0\x10\x02\xE6\x66\x5E\xB2\xBD\x71\x19\xD9\x52\xB3\xCC\x5F\x16\xE4\xF0\xA1\xA5\x86\xD8\x23\x88\xDF\x0F\x8A\xD7\xCA\xD2\xDF\xD8\xBB\xB6\xBC\x34\xE7\xDE\x5D\xDF\xE4\xC2\x89\xE3\x9C\xDB\xE3\x12\xDF\xDE\x43\x52\xDD\xFF\x09\x78\xEA\xA6\xC3\x5E\xEB\xB7\x34\xDD\xE4\x3B\x6B\x3F\xF9\xD6\xC6\x19\xD9\xE5\x6E\xEF\xA9\x4E\xD8\xDF\x00\xCC\xBD\x60\xEC\xC2\x0F\xEB\xBB\x34\xDD\xB6\x62\x41\x6C\x36\xEA\xC1\xA8\xD6\xDF\x13\x44\x23\x5B\xE0\xD3\x80\xEE\xE6\xBB\x24\xA9\x91\xD9\xCE\x47\xD6\xB7\x99\xE0\xD7\x7A\xE8\xE4\x5F\x14\xE4\xFC\xB8\xC9\x32\x13\xE9\x0F\xCB\xE5\x7E\xEB\xE2\xA4\xE0\xE9\x82\xE2\xD9\x39\xC1\xBE\x7F\xE6\xD1\x9D\xEC\xDF\x5F\x12\xC8\x28\xE1\x1E\xE8\xD0\x4A\x8C\xEA\xE6\x57\xDE\xE8\x9C\x1B\xE5\xC3\xDC\xDD\xBA\xB7\xC3\x37\x10\xE4\xBA\xB6\xE5\x1F\x62\xEB\x13\x10\x23\x91\xE9\xDB\x23\xC4\xEB\x38\x2E\xDD\xC9\x10\xDE\x00\x12\xE4\x3D\xE6\xDB\x88\x2C\xE0\x7B\xB9\xDD\xAC\xEC\xC2\xD0\xE8\x39\xD2\xE9\xE6\x79\x77\xCB\x0C\xD1\xDF\x39\xC4\xED\xBC\xE2\x14\xA0\xE8\xBF\xC6\xE0\xA5\x14\xB4\xD7\x4A\xEB\x19\xB2\xE9\xDE\x50\xE0\x00\x68\xEB\xEE\x7B\xED\x4A\xD6\xE2\x10\xD1\x37\xE9\xA8\xE6\xD4\xDC\xE4\xDA\xB3\xC6\xDA\x55\xDD\xE8\x13\xD3\x41\x89\x74\xEC\x7B\xB6\xEE\x05\xFC\x19\xE9\xE7\xBC\xF6\xEE\xE9\x13\x1E\xDF\x4B\xE4\x66\x58\xE4\xE0\x5F\xD2\xE5\xE6\x53\xD6\x55\xE1\xEB\x0A\xEC\xE7\xA9\xEF\xD9\xD2\xD6\xA1\xA9\xE9\xEF\xF3\xBB\x2B\xAC\xAC\xEF\x02\x16\x68\xBB\x29\x78\x86\x65\xC4\x66\xCE\xEC\xDB\xD7\x13\xCF\xB6\x3B\x2B\x24\xC8\x24\xF0\x10\xA7\xE8\x23\x85\xE8\xE9\x9A\xEA\xE2\x0F\xC2", +"\xEA\x56\x1D\xF0\xE4\xBE\xBF\xBC\xBB\xEC\x08\x13\xF1\xF8\xD7\xF3\x1F\x1B\x2B\xF3\xA1\x10\x89\x78\xD8\xD9\xC0\xDA\xBB\xCD\xD3\x16\xE7\xE2\xBE\xD7\x13\xC0\xDD\xE1\xC2\xDF\xE1\x3D\xD8\xDC\x05\x16\xBC\xA3\xC2\x10\x2B\xFB\xC7\xA8\xCB\x97\x45\x32\xF4\xBB\xB5\xCA\x4B\xF7\x13\xBA\xAE\xF4\x3D\xD6\xBC\x1B\x02\xF5\xFF\xC4\xF5\x58\xFD\xD3\x19\xE2\xDD\x1B\xED\xF5\x5C\xFE\xF3\x43\xDB\xE9\x02\x19\x78\x20\xE7\xBC\x84\xC0\xF3\x00\x19\x78\xF4\x8F\x15\x35\xF6\xC5\x20\xF8\x28\x06\xC6\x68\x06\xC8\xD8\x4C\xD4\xE2\x85\xC8\xC0\x48\xDE\xF7\x34\x2B\x2B\xC3\xD4\xF8\x2C\x23\xF8\x69\xFD\x16\x98\x7D\xE6\x37\x14\xC8\x81\xED\xD3\x48\xF1\xE6\x2D\xEC\x14\xC5\x64\x75\x68\x1F\xED\x36\xF9\xCC\x4C\xF1\xFA\x6F\xF7\x13\xDA\xC2\xDD\x14\xE2\xF9\x55\xFA\xF5\x33\xD5\xF7\x78\xFB\xF7\x92\xFE\xF5\x81\xC4\xF6\xD7\xD7\xFA\xA9\x23\x75\x75\x76\x75\x30\xED\xF3\xA9\xC6\x32\x3E\xE0\x00\x61\xFC\xBF\x84\xC8\xF6\x83\xCA\xF8\x4A\xFD\xF6\x85\xF1\xFB\x08\x13\xFB\x92\xF7\xF7\x92\xF5\xFB\x56\xF6\x10\xBA\xF2\xF9\x79\xF2\xDD\xBE\xFA\xDC\x08\x11\xF8\xD0\xFB\xDB\x37\x12\x7A\xAA\xF5\x7A\xC7\xFD\xBF\xAE\xBF\x27\x80\xF5\xF6\x13\xAE\x90\xF9\xB4\x23\x86\xFB\x9D\x9B\xF2\xFD\xDC\xBD\xF8\x29\xE2\xF9\x23\xED\xFD\x00\x09\xF2\x40\x81\xE9\x66\x28\x3B\x5F\xF9\x6E\x67\xE9\x79\xF5\x45\x7F\xF5\x39\xF8\x6F\x7D\xB3\x13\x73\x0F\x64\xF3\x51\x7E\x84\x07\x76\x00\x2D\x95\x28\x7E\x66\x7A\x95\x5F\x79\x01\x8F\x0F\x7F\x7C\xFF\x4E\x75\x05\x0D\xE5\x5D\x7C\x07\x8E\xDF\x07\x66\xD3\x37\x71\xBF\x24\x7A\x41\x40\x32\x62\x14\x40\x7A\x51\x08\x63\x96\x78\x7F\x60\x81\x94\x72\xFF\x1B\x56\xF2\x53\x7C\x38\x16\x04\x90\x5E\xF6\x57\x13\x6E\x5F\x17\x38\x5E\x66\x61\xC4\x79\x10\x01\x8C\xBF\x42\x74\x42\x02\x81\x13\x81\xF9\x7B\x39\x49\x76\xF4\x05\x08\xF6\x63\x79\xAE\x7F\x26\x07\x56\x11\x76\xFD\x05\x09\xDC\x74\x7D\x53\x7D\xC2\x5F\x7F\x01\x8A\xFD\x3F\x7C\x42\x17\x63\x94\x78\x03\x81\x08\x30\x81\x01\x8A\x7F\x01\x96\x7F\xA0\x54\x7B\x0A\x7A\x1A\x54\x05\xD2\x6C\x84\x72\x7B\x3F\x6C\xEE\x48\x09\xAC\x72\x04\x98\x73\x16\x84\x7F\x05\x0C\x0E\x85\x80\x31\x80\x10\x7A\x83\xD0\x6E\x5D\x61\x1A\xF3\x77\x7E\xCF\x48\xF8\x30\x7C\x28\x7B\x72\x06\x61\x48\x61\x82\xF0\x7C\xFB\x03\x83\xF8\x70\x11\x98\x78\xF8\x64\x64\xC5\x7A\xF9\x15\x1B\x7B\x4D\x80\x4A\x81\x6C\x23\x7C\xE9\x6F\x04\xA4\x76\xD2\x6A\x7A\x53\x82\x20\x27\x5E\xA8\x77\x13\x57\x83\xF6\x79\x82\xB6\x7F\x0E\xB5\x82\x70\x6A\x0A\xF5\x7C\x40\x04\x83\x24\x64\x0F\x80\x00\x58\x88\xBF\x6A\x7B\x19\x90\x11\x51\x63\xED\x48\x08\x36\x82\x0A\xD5\x82\x40\x06\x85\x03\x84\xFB\x78\x7C\xF4\x73\x07\xF6\x79\x2B\x86\x5E\x7A\x83\xEC\x45\x87\x3E\x69\x01\xAC\x5E\x20\x97\x09\x87\x79\xD9\x46\x84\x25\x8A\x06\xFB\x7F\x4D\x0A\x84\x62\x7A\xC3\x4D\x85\x61\x82\x10\x0F\x84\x8B\x11\x84\x08\x0D\xF9\x75\x84\x4A\x8B\xBB\x16\x84\x75\x57\x80\xEE\x79\x13\xBB\x5D\x26\x8F\x0B\x9B\x83\xE2\x79\x11\xBB\x11\x45\x7C\x78\xC9\x7F\x06\xD8\x83\xDC\x7C\x7B\x00\x09\x89\x4B\x85\xBF\x77\x13\x7A\x85\x19\x80\x65\xB7\x84\x45\x33\x62\x9D\x3E\xA0\x08\x87\x4D\x11\x55\xFB\x84\x1B\x9E\x7F\x65\x89\xFD\x2D\x87\x8A\x00\x87\x05\x0C\x16\x82\x7D\x34\x8E\x0A\xAC\x12\x39\x89\x48\x1B\x33\x1A\x8D\x87\x41\x2B\x0E\x8D\x6D\x29\x8E\x87\x5B\x71\x1E\xB1\x81\x77\x88\x07\x82\x09\x84\x61\x86\xA8\x86\x0B\x85\x08\x7F\x81\x0B\xE9\x86\x40\x0C\x89\xE3\x80\x20\xAE\x87\x81\x80\xA2\x1D\x56\x41\x88\x08\x08\x89\x1B\x9A\x82\x86\x8C\x05\x8E\x8B\x48\x83\x6E\x12\x8F\x0F\x94\x87\x8A\x8B\x22\x17\x8B\x32\x59\x88\xB2\x86\x18\x65\x74\xEE\x51\xFE\x23\x60\x10\x74\x11\xD1\x19\x34\x63\x74\x8D\x83\xFF\x16\x4E\x7F\x7B\x15\xDB\x38\x73\x5B\x49\xAA\x0E\x80\x42\x0A\xDA\x6B\x85\x1F\x0E\x1B\xB0\x64\x16\x61\x15\xDE\x4E\xD6\x38\x84\x1B\x89\x6C\x17\x8A\x0A\x13\x1F\x7F\x4B\x69\x5F\x47\x34\x43\x35\x67\x0C\x8E\x0F\x15\xEE\x86\x42\x9C\x16\xB7\x7A\x06\x97\x65\x9F\x06\x16\xB6\x0C\x5A\x95\x8A\x6B\x4B\x2D\x88\x09\xED\x35\x31\x7E\x4F\x88\x19\x85\x5B\x75\x0B\x9F\x81\xBD\x81\xCC\x78\x4E\xC0\x6E\x7B\xA0\x62\x30\x85\x09\xAC\x8C\x17\xE4\x4E\x37\x47\x4B\x9C\x09\x17\xA3\x60\x76\x81\x10\x27\x8A\x27\x9C\x5E\xBB\x17\x40\x59\x77\xFE\x7A\x13\xAE\x89\x40\x01\x88\x34\x8C\x53\x70\x51\x80\x8B\x22\x2E\x80\xFF\x5B\x72\x1E\x80\x7F\x46\x61\x8A\x11\xF8\x42\x89\x5A\x84\x80\x9A\x7F\x2F\xB6\x81\xA2\x15\x02\xB2\x7A\xFA\x5F\x62\xF3\x72\x05\xA3\x63\xF7\x5D", +"\x02\xE6\x63\x96\x66\x71\xFC\x5B\x36\x9B\x87\x98\x8A\x0E\xD8\x63\x24\x84\x81\x5C\x66\x37\x9E\x63\x44\x6F\xD5\x0C\x64\x0B\x9A\x61\x25\x58\x2C\xBF\x06\x22\x8A\x17\x88\x08\x6D\x95\x81\xEB\x3E\x94\x78\x87\x89\x8E\x00\xDA\x70\xF7\x51\x8D\xC7\x5F\x7C\x55\x18\x3F\x83\x02\xC3\x8B\x14\x60\x8F\x3B\x46\x39\xBF\x86\x25\x8B\xC5\x06\x66\x74\x88\x64\x28\x83\x44\x02\x8F\x7D\x34\x1C\xD8\x8D\xC3\x47\x8E\x23\x8C\x77\x6A\x8E\x9F\x89\x04\x9B\x8A\x1E\x61\x87\xF0\x8C\x03\x72\x8E\xE7\x74\xF4\x3D\x8D\x6E\x13\x8E\xF9\x8B\x3F\x16\x8F\xFE\x8E\x1A\xDA\x8C\x77\x87\x5E\xCA\x8C\x27\x8C\x90\x50\x6F\x1E\xCC\x84\x60\x97\x56\xB8\x89\x41\x8E\x3D\xE3\x5B\xE5\x42\x86\x5D\x98\x5F\x5B\x73\x45\x32\x6F\x13\x9B\x09\x88\x17\x00\x6D\x75\x6B\x60\x21\x2B\x90\xDE\x5F\xF0\x48\x74\x51\x96\x6E\x05\x0D\x97\x65\x0D\x5C\x71\xEE\x46\x65\xB5\x6C\x8A\x31\x95\xD9\x41\x92\x87\x69\xC3\x35\x91\xC7\x6D\x25\x6E\x74\x86\x67\x91\x14\x93\x78\x2C\x91\xD1\x67\x8F\x01\x96\xF4\x7E\x77\xBD\x5A\x03\xEB\x5F\x2F\x7B\x8F\xD6\x5F\x07\xA5\x62\x5D\x76\x19\x00\x93\x3C\x8F\x60\x62\x71\x3A\x8F\x90\xFC\x8C\x03\x88\x0A\x0F\x94\x42\xFE\x8D\x47\x53\x8B\x2D\x77\x21\xF6\x88\x93\x9F\x82\x4E\x97\x49\xBE\x61\x28\x9A\xBB\x03\x90\x9C\x9E\x90\xBB\x8A\x72\x52\x85\xF9\x87\x1B\x8B\x90\x73\x9B\x88\xF5\x8C\x4A\xB7\x8F\x13\x87\xB1\x58\x91\x23\x7D\x37\x69\x91\xA2\x1E\x93\x84\x88\xBF\x76\x91\x44\x82\x91\xC8\x45\x43\x8F\x8F\xE6\x80\x01\x9B\x90\x7D\x98\x81\x34\x15\x4A\x80\x8E\x61\x43\x21\xDA\x91\x71\x9C\x92\x6B\x94\x7B\x6D\x92\x03\x83\x24\xE3\x80\xA4\x85\x45\x92\x94\x4F\x9F\x90\xD6\x5E\x27\xE4\x8F\xA5\x90\x12\xDC\x5B\x45\x30\x89\x38\x9B\xCA\x50\x93\x97\x9C\x5F\x95\x65\x1F\xB2\x62\x4E\x65\xC7\x4E\x63\xA9\x93\x49\xA9\x96\x52\xBD\x93\x4A\x9F\x27\xAB\x96\xF9\x42\x93\x05\x0B\xE6\x5B\x95\x25\x26\x28\xD7\x8E\x6B\x8B\x94\xA5\x8F\x81\x79\x94\x84\x03\x2B\xBC\x5D\x6A\x9C\x4B\xBD\x97\x4E\x93\x94\x03\x94\x00\xE2\x86\xAB\x83\x96\xE3\x8E\x36\x86\x97\x40\x99\x03\x83\x97\x0E\x9F\x65\x9D\x90\x4D\x95\x90\x92\x8C\x2D\x23\x95\x9D\x85\x95\xF9\x83\x57\xAE\x5D\x4E\x6E\x2B\xF8\x90\x54\x5D\x96\xBF\x97\x8F\x6D\x94\x71\x99\x27\xCA\x7C\xAC\x8D\x11\x2B\x15\x50\x34\x95\x8E\x8D\x22\x2F\x90\xA1\x64\x96\x2C\x17\x82\x77\x75\x0C\x61\xE3\x04\x78\x9B\x7E\x60\x40\x96\x3B\x83\x98\xED\x8B\x22\x5E\x97\xC4\x92\x7C\x1D\x84\x4E\xBB\x5B\x0C\x95\x10\x16\x99\x7B\x80\x97\x5F\x79\x5F\x8B\x3C\x07\x99\x2C\xBF\x8C\x75\x9D\x6B\xCD\x94\x42\x86\x8E\x18\x87\x2B\xB2\x8C\xBC\x8C\x7E\x22\x9C\x55\x88\x98\x7E\x99\x9B\x24\x9A\x40\x0A\x96\x27\x9B\xDE\x69\x96\x47\x61\x04\xEC\x97\x47\x0E\x97\x7B\x5B\x06\xA2\x65\x98\x9C\x7E\x7B\x97\xC7\x83\x97\x17\x99\x20\x00", }; void GuiIqGetParserBuffer(vl::stream::MemoryStream& stream) @@ -9554,6 +6072,10 @@ namespace vl using namespace parsing::tabling; using namespace parsing::xml; using namespace stream; + using namespace presentation; + using namespace presentation::elements; + using namespace presentation::compositions; + using namespace presentation::controls; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -10243,7 +6765,8 @@ Type Declaration BEGIN_CLASS_MEMBER(GuiResourceNodeBase) CLASS_MEMBER_PROPERTY_READONLY_FAST(Parent) CLASS_MEMBER_PROPERTY_READONLY_FAST(Name) - CLASS_MEMBER_PROPERTY_FAST(Path) + CLASS_MEMBER_PROPERTY_READONLY_FAST(ResourcePath) + CLASS_MEMBER_PROPERTY_FAST(FileContentPath) END_CLASS_MEMBER(GuiResourceNodeBase) BEGIN_CLASS_MEMBER(GuiResourceItem) @@ -10274,6 +6797,7 @@ Type Declaration CLASS_MEMBER_METHOD(ClearFolders, NO_PARAMETER) CLASS_MEMBER_METHOD(GetValueByPath, { L"path" }) CLASS_MEMBER_METHOD(GetFolderByPath, { L"path" }) + CLASS_MEMBER_METHOD(CreateValueByPath, { L"path" _ L"typeName" _ L"value" }) END_CLASS_MEMBER(GuiResourceFolder) BEGIN_CLASS_MEMBER(GuiResource) @@ -10288,6 +6812,12 @@ Type Declaration CLASS_MEMBER_METHOD(GetStringByPath, {L"path"}) END_CLASS_MEMBER(GuiResource) + BEGIN_CLASS_MEMBER(GuiResourcePathResolver) + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr, WString), {L"resource" _ L"workingDirectory"}) + + CLASS_MEMBER_METHOD(ResolveResource, {L"protocol" _ L"path"}) + END_CLASS_MEMBER(GuiResourcePathResolver) + BEGIN_CLASS_MEMBER(IGuiGraphicsElement) CLASS_MEMBER_BASE(IDescriptable) END_CLASS_MEMBER(IGuiGraphicsElement) @@ -10547,6 +7077,8 @@ namespace vl using namespace parsing::tabling; using namespace parsing::xml; using namespace stream; + using namespace presentation; + using namespace presentation::compositions; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -10919,9 +7451,11 @@ namespace vl using namespace parsing::analyzing; using namespace parsing::xml; using namespace stream; - using namespace list; - using namespace tree; - using namespace text; + using namespace presentation; + using namespace presentation::controls; + using namespace presentation::controls::list; + using namespace presentation::controls::tree; + using namespace presentation::elements::text; using namespace theme; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -11046,6 +7580,7 @@ Type Declaration CLASS_MEMBER_METHOD(ContainsSubscription, {L"subscription"}) CLASS_MEMBER_METHOD(AddComponent, {L"component"}) + CLASS_MEMBER_METHOD(AddControlHostComponent, {L"controlHost"}) CLASS_MEMBER_METHOD(RemoveComponent, {L"component"}) CLASS_MEMBER_METHOD(ContainsComponent, {L"component"}) END_CLASS_MEMBER(GuiInstanceRootObject) @@ -11349,7 +7884,7 @@ Type Declaration BEGIN_CLASS_MEMBER(GuiTooltip) CLASS_MEMBER_BASE(GuiPopup) - CONTROL_CONSTRUCTOR_CONTROLLER(GuiPopup) + CONTROL_CONSTRUCTOR_CONTROLLER(GuiTooltip) CLASS_MEMBER_PROPERTY_FAST(PreferredContentWidth) CLASS_MEMBER_PROPERTY_FAST(TemporaryContentControl) @@ -12125,11 +8660,12 @@ Type Declaration BEGIN_CLASS_MEMBER(GuiToolstripButton) CLASS_MEMBER_BASE(GuiMenuButton) - CONTROL_CONSTRUCTOR_CONTROLLER(GuiToolstripToolBar) + CONTROL_CONSTRUCTOR_CONTROLLER(GuiToolstripButton) CLASS_MEMBER_PROPERTY_FAST(Command) CLASS_MEMBER_PROPERTY_READONLY_FAST(ToolstripSubMenu) + CLASS_MEMBER_METHOD(EnsureToolstripSubMenu, NO_PARAMETER) CLASS_MEMBER_METHOD(CreateToolstripSubMenu, {L"subMenuStyleController"}) END_CLASS_MEMBER(GuiToolstripButton) @@ -12754,6 +9290,8 @@ namespace vl namespace description { using namespace collections; + using namespace presentation; + using namespace presentation::elements; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -13047,6 +9585,8 @@ namespace vl namespace description { using namespace collections; + using namespace presentation; + using namespace presentation::compositions; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -13190,6 +9730,8 @@ namespace vl { namespace description { + using namespace presentation::controls; + class GuiReflectionPlugin : public Object, public IGuiPlugin { public: @@ -13235,6 +9777,10 @@ namespace vl using namespace parsing::tabling; using namespace parsing::xml; using namespace stream; + using namespace presentation; + using namespace presentation::compositions; + using namespace presentation::controls; + using namespace presentation::templates; #ifndef VCZH_DEBUG_NO_REFLECTION @@ -13446,6 +9992,191 @@ Type Declaration GuiGridEditorTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_REFLECTION) END_CLASS_MEMBER(GuiGridEditorTemplate) + BEGIN_CLASS_MEMBER(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControl::IStyleController) + CLASS_MEMBER_BASE(GuiControl::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiControlTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiControlTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiLabelTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiLabel::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiLabelTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiLabelTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiSinglelineTextBoxTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiSinglelineTextBox::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiSinglelineTextBoxTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiSinglelineTextBoxTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiDocumentLabelTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiDocumentLabel::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiDocumentLabelTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiDocumentLabelTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiMultilineTextBoxTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollViewTemplate_StyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiMultilineTextBoxTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiMultilineTextBoxTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiDocumentViewerTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiDocumentViewer::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiDocumentViewerTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiDocumentViewerTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiMenuTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiWindow::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiMenuTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiMenuTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiWindowTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiWindow::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiWindowTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiWindowTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiButton::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiButtonTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiButtonTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiSelectableButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiSelectableButton::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiSelectableButtonTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiSelectableButtonTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiToolstripButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiMenuButton::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiToolstripButtonTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiToolstripButtonTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiListViewColumnHeaderTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiToolstripButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiListViewColumnHeader::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiListViewColumnHeaderTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiListViewColumnHeaderTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiComboBoxTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiToolstripButtonTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiComboBoxBase::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiComboBoxTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiComboBoxTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiDatePickerTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiDatePicker::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiDatePickerTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiDatePickerTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiDateComboBoxTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiComboBoxTemplate_StyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiDateComboBoxTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiDateComboBoxTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiScrollTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScroll::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiScrollTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiScrollTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiScrollViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollView::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiScrollViewTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiScrollViewTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiTextListTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollView::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiTextListTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiTextListTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiListViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiListViewBase::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiListViewTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiListViewTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiTreeViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiScrollViewTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiVirtualTreeView::IStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiTreeViewTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiTreeViewTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiTabTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiControlTemplate_StyleProvider) + CLASS_MEMBER_BASE(GuiTab::IStyleController) + + CLASS_MEMBER_CONSTRUCTOR(GuiTabTemplate_StyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiTabTemplate_StyleProvider) + + BEGIN_CLASS_MEMBER(GuiListItemTemplate_ItemStyleController) + CLASS_MEMBER_BASE(GuiListControl::IItemStyleController) + + CLASS_MEMBER_CONSTRUCTOR(Ptr(GuiListItemTemplate_ItemStyleProvider*), { L"itemStyleProvider" }) + END_CLASS_MEMBER(GuiListItemTemplate_ItemStyleController) + + BEGIN_CLASS_MEMBER(GuiListItemTemplate_ItemStyleProvider) + CLASS_MEMBER_BASE(GuiSelectableListControl::IItemStyleProvider) + + CLASS_MEMBER_CONSTRUCTOR(GuiListItemTemplate_ItemStyleProvider*(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiListItemTemplate_ItemStyleProvider) + + BEGIN_CLASS_MEMBER(GuiTreeItemTemplate_ItemStyleProvider) + CLASS_MEMBER_BASE(tree::INodeItemStyleProvider) + CLASS_MEMBER_BASE(tree::INodeProviderCallback) + + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr), { L"factory" }) + END_CLASS_MEMBER(GuiTreeItemTemplate_ItemStyleProvider) + + BEGIN_CLASS_MEMBER(GuiBindableDataVisualizer) + CLASS_MEMBER_CONSTRUCTOR(Ptr(), NO_PARAMETER) + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr), { L"decoratedVisualizer" }) + END_CLASS_MEMBER(GuiBindableDataVisualizer) + + BEGIN_CLASS_MEMBER(GuiBindableDataVisualizer::Factory) + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr, list::BindableDataColumn*), { L"templateFactory" _ L"ownerColumn" }) + END_CLASS_MEMBER(GuiBindableDataVisualizer::Factory) + + BEGIN_CLASS_MEMBER(GuiBindableDataVisualizer::DecoratedFactory) + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr, list::BindableDataColumn*, Ptr), { L"templateFactory" _ L"ownerColumn" _ L"decoratedFactory" }) + END_CLASS_MEMBER(GuiBindableDataVisualizer::DecoratedFactory) + + BEGIN_CLASS_MEMBER(GuiBindableDataEditor) + CLASS_MEMBER_CONSTRUCTOR(Ptr(), NO_PARAMETER) + END_CLASS_MEMBER(GuiBindableDataEditor) + + BEGIN_CLASS_MEMBER(GuiBindableDataEditor::Factory) + CLASS_MEMBER_CONSTRUCTOR(Ptr(Ptr, list::BindableDataColumn*), { L"templateFactory" _ L"ownerColumn" }) + END_CLASS_MEMBER(GuiBindableDataEditor::Factory) + #undef INTERFACE_EXTERNALCTOR #undef _ @@ -13483,3 +10214,1903 @@ Type Loader } } } + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWCODEGEN.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace workflow; + using namespace workflow::analyzer; + using namespace workflow::runtime; + using namespace reflection::description; + using namespace collections; + + using namespace controls; + using namespace compositions; + +#define ERROR_CODE_PREFIX L"================================================================" + +/*********************************************************************** +Workflow_ValidateStatement +***********************************************************************/ + + bool Workflow_ValidateStatement(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, types::ErrorList& errors, const WString& code, Ptr statement) + { + bool failed = false; + auto module = Workflow_CreateModuleWithInitFunction(context, resolvingResult, rootTypeDescriptor, statement); + + Workflow_GetSharedManager()->Clear(true, true); + Workflow_GetSharedManager()->AddModule(module); + Workflow_GetSharedManager()->Rebuild(true); + if (Workflow_GetSharedManager()->errors.Count() > 0) + { + errors.Add(ERROR_CODE_PREFIX L"Failed to analyze the workflow code \"" + code + L"\"."); + FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) + { + errors.Add(error->errorMessage); + } + failed = true; + } + + return !failed; + } + +/*********************************************************************** +Workflow_PrecompileInstanceContext (Passes) +***********************************************************************/ + + extern ITypeDescriptor* Workflow_CollectReferences(Ptr context, types::ResolvingResult& resolvingResult, types::ErrorList& errors); + extern void Workflow_GenerateCreating(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr statements, types::ErrorList& errors); + extern void Workflow_GenerateBindings(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr statements, types::ErrorList& errors); + +/*********************************************************************** +Workflow_PrecompileInstanceContext +***********************************************************************/ + + Ptr Workflow_PrecompileInstanceContext(Ptr context, types::ErrorList& errors) + { + ITypeDescriptor* rootTypeDescriptor = 0; + if (context->className == L"") + { + errors.Add( + L"Precompile: Instance \"" + + (context->instance->typeNamespace == GlobalStringKey::Empty + ? context->instance->typeName.ToString() + : context->instance->typeNamespace.ToString() + L":" + context->instance->typeName.ToString() + ) + + L"\" should have the class name specified in the ref.Class attribute."); + } + + types::ResolvingResult resolvingResult; + rootTypeDescriptor = Workflow_CollectReferences(context, resolvingResult, errors); + + if (errors.Count() == 0) + { + auto statements = MakePtr(); + Workflow_GenerateCreating(context, resolvingResult, rootTypeDescriptor, statements, errors); + Workflow_GenerateBindings(context, resolvingResult, rootTypeDescriptor, statements, errors); + auto module = Workflow_CreateModuleWithInitFunction(context, resolvingResult, rootTypeDescriptor, statements); + + Workflow_GetSharedManager()->Clear(true, true); + Workflow_GetSharedManager()->AddModule(module); + Workflow_GetSharedManager()->Rebuild(true); + + if (Workflow_GetSharedManager()->errors.Count() == 0) + { + return GenerateAssembly(Workflow_GetSharedManager()); + } + else + { + errors.Add(ERROR_CODE_PREFIX L"Unexpected errors are encountered when initializing data binding."); + FOREACH(Ptr, error, Workflow_GetSharedManager()->errors) + { + errors.Add(error->errorMessage); + } + errors.Add(ERROR_CODE_PREFIX L"Print code for reference:"); + errors.Add(Workflow_ModuleToString(module)); + } + } + + return nullptr; + } + +/*********************************************************************** +Workflow_RunPrecompiledScript +***********************************************************************/ + + Ptr Workflow_RunPrecompiledScript(Ptr resource, Ptr resourceItem, description::Value rootInstance) + { + auto compiled = resourceItem->GetContent().Cast(); + auto globalContext = MakePtr(compiled->assembly); + + LoadFunction(globalContext, L"")(); + auto resolver = MakePtr(resource, resource->GetWorkingDirectory()); + LoadFunction)>(globalContext, L"")(rootInstance, resolver); + + return globalContext; + } + +/*********************************************************************** +GuiWorkflowSharedManagerPlugin +***********************************************************************/ + +#undef ERROR_CODE_PREFIX + + class GuiWorkflowSharedManagerPlugin; + GuiWorkflowSharedManagerPlugin* sharedManagerPlugin = 0; + + class GuiWorkflowSharedManagerPlugin : public Object, public IGuiPlugin + { + protected: + Ptr workflowManager; + + public: + GuiWorkflowSharedManagerPlugin() + { + } + + void Load()override + { + } + + void AfterLoad()override + { + sharedManagerPlugin = this; + } + + void Unload()override + { + sharedManagerPlugin = 0; + } + + WfLexicalScopeManager* GetWorkflowManager() + { + if (!workflowManager) + { + workflowManager = new WfLexicalScopeManager(GetParserManager()->GetParsingTable(L"WORKFLOW")); + } + return workflowManager.Obj(); + } + }; + GUI_REGISTER_PLUGIN(GuiWorkflowSharedManagerPlugin) + + WfLexicalScopeManager* Workflow_GetSharedManager() + { + return sharedManagerPlugin->GetWorkflowManager(); + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWCOLLECTREFERENCES.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace reflection::description; + using namespace collections; + using namespace workflow::analyzer; + +/*********************************************************************** +WorkflowReferenceNamesVisitor +***********************************************************************/ + + class WorkflowReferenceNamesVisitor : public Object, public GuiValueRepr::IVisitor + { + public: + Ptr context; + types::ResolvingResult& resolvingResult; + vint& generatedNameCount; + types::ErrorList& errors; + + List& candidatePropertyTypeInfos; + IGuiInstanceLoader::TypeInfo resolvedTypeInfo; + vint selectedPropertyTypeInfo = -1; + + WorkflowReferenceNamesVisitor(Ptr _context, types::ResolvingResult& _resolvingResult, List& _candidatePropertyTypeInfos, vint& _generatedNameCount, types::ErrorList& _errors) + :context(_context) + , resolvingResult(_resolvingResult) + , candidatePropertyTypeInfos(_candidatePropertyTypeInfos) + , generatedNameCount(_generatedNameCount) + , errors(_errors) + { + } + + void Visit(GuiTextRepr* repr)override + { + if (selectedPropertyTypeInfo == -1) + { + selectedPropertyTypeInfo = 0; + } + + auto candidate = candidatePropertyTypeInfos[selectedPropertyTypeInfo]; + auto propertyInfo = candidate.propertyInfo; + auto td = candidate.info->acceptableTypes[0]; + + if (auto serializer = td->GetValueSerializer()) + { + if (serializer->Validate(repr->text)) + { + resolvingResult.propertyResolvings.Add(repr, candidate); + } + else + { + auto error + = L"Precompile: Property \"" + + propertyInfo.propertyName.ToString() + + L"\" of type \"" + + propertyInfo.typeInfo.typeName.ToString() + + L"\" does not accept a value of text \"" + + repr->text + + L"\" because it is not in a correct format of the serializable type \"" + + td->GetTypeName() + + L"\"."; + errors.Add(error); + } + } + else + { + auto error + = L"Precompile: Property \"" + + propertyInfo.propertyName.ToString() + + L"\" of type \"" + + propertyInfo.typeInfo.typeName.ToString() + + L"\" does not accept a value of text \"" + + repr->text + + L"\" because its type \"" + + td->GetTypeName() + + L"\" is not serializable."; + errors.Add(error); + } + } + + void Visit(GuiAttSetterRepr* repr)override + { + if (candidatePropertyTypeInfos.Count() > 0) + { + resolvingResult.propertyResolvings.Add(repr, candidatePropertyTypeInfos[selectedPropertyTypeInfo]); + } + + if (repr->instanceName == GlobalStringKey::Empty) + { + if (resolvedTypeInfo.typeDescriptor->GetValueSerializer() == nullptr) + { + auto name = GlobalStringKey::Get(L"" + itow(generatedNameCount++)); + repr->instanceName = name; + resolvingResult.typeInfos.Add(name, resolvedTypeInfo); + } + } + else if (resolvingResult.typeInfos.Keys().Contains(repr->instanceName)) + { + errors.Add(L"Precompile: Referece name \"" + repr->instanceName.ToString() + L"\" conflict with an existing named object."); + } + else if (resolvedTypeInfo.typeDescriptor->GetValueSerializer()) + { + errors.Add(L"Precompile: Reference name \"" + repr->instanceName.ToString() + L"\" cannot be added to a non-reference instance of type \"" + resolvedTypeInfo.typeName.ToString() + L"\"."); + } + else + { + resolvingResult.typeInfos.Add(repr->instanceName, resolvedTypeInfo); + } + + auto loader = GetInstanceLoaderManager()->GetLoader(resolvedTypeInfo.typeName); + + FOREACH_INDEXER(Ptr, setter, index, repr->setters.Values()) + { + List possibleInfos; + auto prop = repr->setters.Keys()[index]; + IGuiInstanceLoader::PropertyInfo propertyInfo(resolvedTypeInfo, prop); + + auto errorPrefix = L"Precompile: Property \"" + propertyInfo.propertyName.ToString() + L"\" of type \"" + resolvedTypeInfo.typeName.ToString() + L"\""; + + { + auto currentLoader = loader; + + while (currentLoader) + { + if (auto propertyTypeInfo = currentLoader->GetPropertyType(propertyInfo)) + { + if (propertyTypeInfo->support == GuiInstancePropertyInfo::NotSupport) + { + errors.Add(errorPrefix + L" is not supported."); + break; + } + else + { + types::PropertyResolving resolving; + resolving.loader = currentLoader; + resolving.propertyInfo = propertyInfo; + resolving.info = propertyTypeInfo; + possibleInfos.Add(resolving); + + if (setter->binding == GlobalStringKey::_Set) + { + break; + } + } + + if (!propertyTypeInfo->tryParent) + { + break; + } + } + currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); + } + } + + if (possibleInfos.Count() == 0) + { + errors.Add(errorPrefix + L" does not exist."); + } + else + { + if (setter->binding == GlobalStringKey::Empty) + { + FOREACH(Ptr, value, setter->values) + { + WorkflowReferenceNamesVisitor visitor(context, resolvingResult, possibleInfos, generatedNameCount, errors); + value->Accept(&visitor); + } + } + else if (setter->binding == GlobalStringKey::_Set) + { + if (possibleInfos[0].info->support == GuiInstancePropertyInfo::SupportSet) + { + auto setTarget = dynamic_cast(setter->values[0].Obj()); + + WorkflowReferenceNamesVisitor visitor(context, resolvingResult, possibleInfos, generatedNameCount, errors); + auto td = possibleInfos[0].info->acceptableTypes[0]; + visitor.selectedPropertyTypeInfo = 0; + visitor.resolvedTypeInfo.typeDescriptor = td; + visitor.resolvedTypeInfo.typeName = GlobalStringKey::Get(td->GetTypeName()); + setTarget->Accept(&visitor); + + if (auto propInfo = resolvedTypeInfo.typeDescriptor->GetPropertyByName(prop.ToString(), true)) + { + resolvingResult.typeOverrides.Add(setTarget->instanceName, CopyTypeInfo(propInfo->GetReturn())); + } + } + else + { + errors.Add(errorPrefix + L" does not support the \"-set\" binding."); + } + } + else if (setter->binding != GlobalStringKey::Empty) + { + auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding); + if (binder) + { + if (possibleInfos[0].info->scope == GuiInstancePropertyInfo::Constructor) + { + if (!possibleInfos[0].info->bindable) + { + errors.Add(errorPrefix + L" cannot be assigned using binding \"-" + setter->binding.ToString() + L"\". Because it is a non-bindable constructor argument."); + } + else if (!binder->ApplicableToConstructorArgument()) + { + errors.Add(errorPrefix + L" cannot be assigned using binding \"-" + setter->binding.ToString() + L"\". Because it is a constructor argument, and this binding does not apply to any constructor argument."); + } + } + } + else + { + errors.Add(errorPrefix + L" cannot be assigned using an unexisting binding \"-" + setter->binding.ToString() + L"\"."); + } + + if (setter->values.Count() == 1 && setter->values[0].Cast()) + { + resolvingResult.propertyResolvings.Add(setter->values[0].Obj(), possibleInfos[0]); + } + else + { + errors.Add(L"Precompile: Binder \"" + setter->binding.ToString() + L"\" requires the text value of property \"" + propertyInfo.propertyName.ToString() + L"\"."); + } + } + } + } + + Group properties; + CopyFrom( + properties, + From(repr->setters) + .SelectMany([=](Pair> item) + { + return From(item.value->values) + .Where([=](Ptr value) + { + return resolvingResult.propertyResolvings.Keys().Contains(value.Obj()); + }) + .Select([=](Ptr value) + { + auto loader = resolvingResult.propertyResolvings[value.Obj()].loader; + return Pair(item.key, loader); + }); + }) + .Distinct() + ); + + if (context->instance.Obj() != repr) + { + List ctorProps; + loader->GetConstructorParameters(resolvedTypeInfo, ctorProps); + FOREACH(GlobalStringKey, prop, ctorProps) + { + auto info = loader->GetPropertyType(IGuiInstanceLoader::PropertyInfo(resolvedTypeInfo, prop)); + if (info->required && !properties.Contains(prop, loader)) + { + errors.Add(L"Precompile: Missing constructor argument \"" + prop.ToString() + L"\" of type \"" + resolvedTypeInfo.typeName.ToString() + L"\"."); + } + } + } + + while (properties.Count() > 0) + { + auto prop = properties.Keys()[0]; + auto loader = properties.GetByIndex(0)[0]; + IGuiInstanceLoader::PropertyInfo propertyInfo(resolvedTypeInfo, prop); + + List pairProps; + loader->GetPairedProperties(propertyInfo, pairProps); + if (pairProps.Count() > 0) + { + List missingProps; + FOREACH(GlobalStringKey, key, pairProps) + { + if (!properties.Contains(key, loader)) + { + missingProps.Add(key); + } + } + + if (missingProps.Count() > 0) + { + WString error + = L"Precompile: When you assign to property \"" + + prop.ToString() + + L"\" of type \"" + + resolvedTypeInfo.typeName.ToString() + + L"\", the following missing properties are required: "; + FOREACH_INDEXER(GlobalStringKey, key, index, missingProps) + { + if (index > 0)error += L", "; + error += L"\"" + key.ToString() + L"\""; + } + error += L"."; + errors.Add(error); + } + + FOREACH(GlobalStringKey, key, pairProps) + { + properties.Remove(key, loader); + } + } + else + { + properties.Remove(prop, loader); + } + } + + FOREACH(Ptr, handler, repr->eventHandlers.Values()) + { + if (handler->binding != GlobalStringKey::Empty) + { + auto binder = GetInstanceLoaderManager()->GetInstanceEventBinder(handler->binding); + if (!binder) + { + errors.Add(L"The appropriate IGuiInstanceEventBinder of binding \"-" + handler->binding.ToString() + L"\" cannot be found."); + } + } + } + } + + void Visit(GuiConstructorRepr* repr)override + { + bool found = false; + + if (repr == context->instance.Obj()) + { + auto fullName = GlobalStringKey::Get(context->className); + auto td = GetInstanceLoaderManager()->GetTypeDescriptorForType(fullName); + if (td) + { + found = true; + resolvedTypeInfo.typeName = fullName; + resolvedTypeInfo.typeDescriptor = td; + } + } + + if (!found) + { + auto source = FindInstanceLoadingSource(context, repr); + resolvedTypeInfo.typeName = source.typeName; + resolvedTypeInfo.typeDescriptor = GetInstanceLoaderManager()->GetTypeDescriptorForType(source.typeName); + } + + if (resolvedTypeInfo.typeDescriptor) + { + for (vint i = 0; i < candidatePropertyTypeInfos.Count(); i++) + { + const auto& tds = candidatePropertyTypeInfos[i].info->acceptableTypes; + for (vint j = 0; j < tds.Count(); j++) + { + if (resolvedTypeInfo.typeDescriptor->CanConvertTo(tds[j])) + { + selectedPropertyTypeInfo = i; + goto FINISH_MATCHING; + } + } + } + FINISH_MATCHING: + + if (selectedPropertyTypeInfo == -1 && candidatePropertyTypeInfos.Count() > 0) + { + auto propertyInfo = candidatePropertyTypeInfos[0].propertyInfo; + auto error + = L"Precompile: Property \"" + + propertyInfo.propertyName.ToString() + + L"\" of type \"" + + propertyInfo.typeInfo.typeName.ToString() + + L"\" does not accept a value of type \"" + + resolvedTypeInfo.typeName.ToKey() + + L"\" because it only accepts value of the following types: "; + + for (vint i = 0; i < candidatePropertyTypeInfos.Count(); i++) + { + const auto& tds = candidatePropertyTypeInfos[i].info->acceptableTypes; + for (vint j = 0; j < tds.Count(); j++) + { + if (i != 0 || j != 0) + { + error += L", "; + } + error += L"\"" + tds[j]->GetTypeName() + L"\""; + } + } + + error += L"."; + errors.Add(error); + } + else + { + if (repr->setters.Count() == 1 && repr->setters.Keys()[0]==GlobalStringKey::Empty) + { + auto setter = repr->setters.Values()[0]; + if (setter->values.Count() == 1) + { + if (auto text = setter->values[0].Cast()) + { + if (candidatePropertyTypeInfos.Count() == 0) + { + errors.Add(L"Precompile: Type \"" + resolvedTypeInfo.typeName.ToString() + L"\" cannot be used to create an instance."); + } + else + { + Visit(text.Obj()); + auto index = resolvingResult.propertyResolvings.Keys().IndexOf(text.Obj()); + if (index != -1) + { + auto value = resolvingResult.propertyResolvings.Values()[index]; + resolvingResult.propertyResolvings.Remove(text.Obj()); + resolvingResult.propertyResolvings.Add(repr, value); + } + } + return; + } + } + } + + if (context->instance.Obj() != repr) + { + auto loader = GetInstanceLoaderManager()->GetLoader(resolvedTypeInfo.typeName); + while (loader) + { + if (loader->CanCreate(resolvedTypeInfo)) + { + break; + } + loader = GetInstanceLoaderManager()->GetParentLoader(loader); + } + if (!loader) + { + errors.Add(L"Precompile: Type \"" + resolvedTypeInfo.typeName.ToString() + L"\" cannot be used to create an instance."); + } + } + Visit((GuiAttSetterRepr*)repr); + } + } + else + { + errors.Add( + L"Precompile: Failed to find type \"" + + (repr->typeNamespace == GlobalStringKey::Empty + ? repr->typeName.ToString() + : repr->typeNamespace.ToString() + L":" + repr->typeName.ToString() + ) + + L"\"."); + } + } + }; + + ITypeDescriptor* Workflow_CollectReferences(Ptr context, types::ResolvingResult& resolvingResult, types::ErrorList& errors) + { + FOREACH(Ptr, parameter, context->parameters) + { + auto type = GetTypeDescriptor(parameter->className.ToString()); + if (!type) + { + errors.Add(L"Precompile: Cannot find type \"" + parameter->className.ToString() + L"\"."); + } + else if (resolvingResult.typeInfos.Keys().Contains(parameter->name)) + { + errors.Add(L"Precompile: Parameter \"" + parameter->name.ToString() + L"\" conflict with an existing named object."); + } + else + { + { + IGuiInstanceLoader::TypeInfo typeInfo; + typeInfo.typeDescriptor = type; + typeInfo.typeName = GlobalStringKey::Get(type->GetTypeName()); + resolvingResult.typeInfos.Add(parameter->name, typeInfo); + } + { + auto elementType = MakePtr(ITypeInfo::TypeDescriptor); + elementType->SetTypeDescriptor(type); + + auto pointerType = MakePtr(ITypeInfo::SharedPtr); + pointerType->SetElementType(elementType); + + resolvingResult.typeOverrides.Add(parameter->name, pointerType); + } + } + } + + List infos; + vint generatedNameCount = 0; + WorkflowReferenceNamesVisitor visitor(context, resolvingResult, infos, generatedNameCount, errors); + context->instance->Accept(&visitor); + return visitor.resolvedTypeInfo.typeDescriptor; + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWGENERATEBINDINGS.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace workflow; + using namespace collections; + +/*********************************************************************** +WorkflowGenerateBindingVisitor +***********************************************************************/ + + class WorkflowGenerateBindingVisitor : public Object, public GuiValueRepr::IVisitor + { + public: + Ptr context; + types::ResolvingResult& resolvingResult; + description::ITypeDescriptor* rootTypeDescriptor; + Ptr statements; + types::ErrorList& errors; + + WorkflowGenerateBindingVisitor(Ptr _context, types::ResolvingResult& _resolvingResult, description::ITypeDescriptor* _rootTypeDescriptor, Ptr _statements, types::ErrorList& _errors) + :context(_context) + , resolvingResult(_resolvingResult) + , rootTypeDescriptor(_rootTypeDescriptor) + , errors(_errors) + , statements(_statements) + { + } + + void Visit(GuiTextRepr* repr)override + { + } + + void Visit(GuiAttSetterRepr* repr)override + { + IGuiInstanceLoader::TypeInfo reprTypeInfo; + if (repr->instanceName != GlobalStringKey::Empty) + { + reprTypeInfo = resolvingResult.typeInfos[repr->instanceName]; + } + + if (reprTypeInfo.typeDescriptor && reprTypeInfo.typeDescriptor->GetValueSerializer() == nullptr) + { + FOREACH_INDEXER(Ptr, setter, index, repr->setters.Values()) + { + auto propertyName = repr->setters.Keys()[index]; + if (setter->binding != GlobalStringKey::Empty && setter->binding != GlobalStringKey::_Set) + { + auto propertyInfo = resolvingResult.propertyResolvings[setter->values[0].Obj()].info; + if (propertyInfo->scope != GuiInstancePropertyInfo::Constructor) + { + WString expressionCode = setter->values[0].Cast()->text; + + auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding); + if (binder) + { + auto instancePropertyInfo = reprTypeInfo.typeDescriptor->GetPropertyByName(propertyName.ToString(), true); + if (instancePropertyInfo) + { + if (auto statement = binder->GenerateInstallStatement(repr->instanceName, instancePropertyInfo, expressionCode, errors)) + { + if (Workflow_ValidateStatement(context, resolvingResult, rootTypeDescriptor, errors, expressionCode, statement)) + { + statements->statements.Add(statement); + } + } + } + else + { + errors.Add(L"Precompile: Binder \"" + setter->binding.ToString() + L"\" requires property \"" + propertyName.ToString() + L"\" to physically appear in type \"" + reprTypeInfo.typeName.ToString() + L"\"."); + } + } + else + { + errors.Add(L"The appropriate IGuiInstanceBinder of binding \"-" + setter->binding.ToString() + L"\" cannot be found."); + } + } + } + else + { + FOREACH(Ptr, value, setter->values) + { + value->Accept(this); + } + } + } + } + + FOREACH_INDEXER(Ptr, handler, index, repr->eventHandlers.Values()) + { + if (reprTypeInfo.typeDescriptor) + { + GlobalStringKey propertyName = repr->eventHandlers.Keys()[index]; + auto td = reprTypeInfo.typeDescriptor; + auto eventInfo = td->GetEventByName(propertyName.ToString(), true); + + if (!eventInfo) + { + errors.Add(L"Precompile: Event \"" + propertyName.ToString() + L"\" cannot be found in type \"" + reprTypeInfo.typeName.ToString() + L"\"."); + } + else + { + Ptr statement; + + if (handler->binding == GlobalStringKey::Empty) + { + statement = Workflow_InstallEvent(repr->instanceName, eventInfo, handler->value); + } + else + { + auto binder = GetInstanceLoaderManager()->GetInstanceEventBinder(handler->binding); + if (binder) + { + statement = binder->GenerateInstallStatement(repr->instanceName, eventInfo, handler->value, errors); + } + else + { + errors.Add(L"The appropriate IGuiInstanceEventBinder of binding \"-" + handler->binding.ToString() + L"\" cannot be found."); + } + } + + if (statement) + { + if (Workflow_ValidateStatement(context, resolvingResult, rootTypeDescriptor, errors, handler->value, statement)) + { + statements->statements.Add(statement); + } + } + } + } + } + } + + void Visit(GuiConstructorRepr* repr)override + { + Visit((GuiAttSetterRepr*)repr); + } + }; + + void Workflow_GenerateBindings(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr statements, types::ErrorList& errors) + { + WorkflowGenerateBindingVisitor visitor(context, resolvingResult, rootTypeDescriptor, statements, errors); + context->instance->Accept(&visitor); + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWGENERATECREATING.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace collections; + using namespace workflow; + using namespace workflow::analyzer; + using namespace reflection::description; + +/*********************************************************************** +WorkflowGenerateCreatingVisitor +***********************************************************************/ + + class WorkflowGenerateCreatingVisitor : public Object, public GuiValueRepr::IVisitor + { + public: + Ptr context; + types::ResolvingResult& resolvingResult; + description::ITypeDescriptor* rootTypeDescriptor; + Ptr statements; + types::ErrorList& errors; + + WorkflowGenerateCreatingVisitor(Ptr _context, types::ResolvingResult& _resolvingResult, description::ITypeDescriptor* _rootTypeDescriptor, Ptr _statements, types::ErrorList& _errors) + :context(_context) + , resolvingResult(_resolvingResult) + , rootTypeDescriptor(_rootTypeDescriptor) + , errors(_errors) + , statements(_statements) + { + } + + IGuiInstanceLoader::ArgumentInfo GetArgumentInfo(GuiValueRepr* repr) + { + ITypeDescriptor* td = nullptr; + bool serializable = false; + WString textValue; + GuiConstructorRepr* ctor = nullptr; + + if (auto text = dynamic_cast(repr)) + { + td = resolvingResult.propertyResolvings[repr].info->acceptableTypes[0]; + serializable = true; + textValue = text->text; + } + else if (ctor = dynamic_cast(repr)) + { + if (ctor->instanceName == GlobalStringKey::Empty) + { + td = resolvingResult.propertyResolvings[repr].info->acceptableTypes[0]; + } + else + { + td = resolvingResult.typeInfos[ctor->instanceName].typeDescriptor; + } + if (td->GetValueSerializer() != nullptr) + { + serializable = true; + textValue = ctor->setters.Values()[0]->values[0].Cast()->text; + } + } + + IGuiInstanceLoader::ArgumentInfo argumentInfo; + argumentInfo.type = td; + + if (serializable) + { + if (td == description::GetTypeDescriptor()) + { + auto str = MakePtr(); + str->value.value = textValue; + argumentInfo.expression = str; + } + else + { + auto str = MakePtr(); + str->value.value = textValue; + + auto type = MakePtr(ITypeInfo::TypeDescriptor); + type->SetTypeDescriptor(td); + + auto cast = MakePtr(); + cast->type = GetTypeFromTypeInfo(type.Obj()); + cast->strategy = WfTypeCastingStrategy::Strong; + cast->expression = str; + + argumentInfo.expression = cast; + } + } + else + { + repr->Accept(this); + + auto ref = MakePtr(); + ref->name.value = ctor->instanceName.ToString(); + argumentInfo.expression = ref; + } + + return argumentInfo; + } + + void Visit(GuiTextRepr* repr)override + { + } + + void Visit(GuiAttSetterRepr* repr)override + { + auto reprTypeInfo = resolvingResult.typeInfos[repr->instanceName]; + + if (reprTypeInfo.typeDescriptor && reprTypeInfo.typeDescriptor->GetValueSerializer() == nullptr) + { + Group usedProps; + FOREACH(GlobalStringKey, prop, From(repr->setters.Keys()).Reverse()) + { + auto setter = repr->setters[prop]; + IGuiInstanceLoader::PropertyInfo propInfo(reprTypeInfo, prop); + if (setter->binding == GlobalStringKey::_Set) + { + auto setTarget = dynamic_cast(setter->values[0].Obj()); + auto info = resolvingResult.propertyResolvings[setTarget]; + vint errorCount = errors.Count(); + if (auto expr = info.loader->GetParameter(propInfo, repr->instanceName, errors)) + { + auto refInstance = MakePtr(); + refInstance->name.value = setTarget->instanceName.ToString(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refInstance; + assign->second = expr; + + auto stat = MakePtr(); + stat->expression = assign; + + statements->statements.Add(stat); + } + else if (errorCount == errors.Count()) + { + errors.Add(L"Precompile: Something is wrong when retriving the property \"" + prop.ToString() + L"\" from an instance of type \"" + reprTypeInfo.typeName.ToString() + L"\"."); + } + setTarget->Accept(this); + } + else if (setter->binding == GlobalStringKey::Empty) + { + FOREACH(Ptr, value, setter->values) + { + auto info = resolvingResult.propertyResolvings[value.Obj()]; + if (info.info->scope == GuiInstancePropertyInfo::Property) + { + if (info.info->support == GuiInstancePropertyInfo::SupportCollection) + { + if (!usedProps.Contains(prop, info.loader)) + { + usedProps.Add(prop, info.loader); + } + + vint errorCount = errors.Count(); + IGuiInstanceLoader::ArgumentMap arguments; + arguments.Add(prop, GetArgumentInfo(value.Obj())); + if (auto stat = info.loader->AssignParameters(reprTypeInfo, repr->instanceName, arguments, errors)) + { + statements->statements.Add(stat); + } + else if (errorCount == errors.Count()) + { + errors.Add(L"Precompile: Something is wrong when assigning to property " + prop.ToString() + L" to an instance of type \"" + reprTypeInfo.typeName.ToString() + L"\"."); + } + } + else if (!usedProps.Contains(prop, info.loader)) + { + List pairedProps; + info.loader->GetPairedProperties(propInfo, pairedProps); + if (pairedProps.Count() == 0) + { + pairedProps.Add(prop); + } + + IGuiInstanceLoader::ArgumentMap arguments; + FOREACH(GlobalStringKey, pairedProp, pairedProps) + { + usedProps.Add(pairedProp, info.loader); + auto pairedSetter = repr->setters[pairedProp]; + FOREACH(Ptr, pairedValue, pairedSetter->values) + { + auto pairedInfo = resolvingResult.propertyResolvings[pairedValue.Obj()]; + if (pairedInfo.loader == info.loader) + { + arguments.Add(pairedProp, GetArgumentInfo(pairedValue.Obj())); + } + } + } + + vint errorCount = errors.Count(); + if (auto stat = info.loader->AssignParameters(reprTypeInfo, repr->instanceName, arguments, errors)) + { + statements->statements.Add(stat); + } + else if (errorCount == errors.Count()) + { + WString propNames; + FOREACH_INDEXER(GlobalStringKey, pairedProp, propIndex, pairedProps) + { + if (propIndex > 0)propNames += L", "; + propNames += L"\"" + pairedProp.ToString() + L"\""; + } + errors.Add(L"Precompile: Something is wrong when assigning to properties " + propNames + L" to an instance of type \"" + reprTypeInfo.typeName.ToString() + L"\"."); + } + } + } + } + } + } + } + } + + void Visit(GuiConstructorRepr* repr)override + { + if (context->instance.Obj() == repr) + { + { + auto refInstance = MakePtr(); + refInstance->name.value = repr->instanceName.ToString(); + + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refInstance; + assign->second = refThis; + + auto stat = MakePtr(); + stat->expression = assign; + + statements->statements.Add(stat); + } + FOREACH(Ptr, parameter, context->parameters) + { + auto refInstance = MakePtr(); + refInstance->name.value = parameter->name.ToString(); + + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto refParameter = MakePtr(); + refParameter->parent = refThis; + refParameter->name.value = parameter->name.ToString(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refInstance; + assign->second = refParameter; + + auto stat = MakePtr(); + stat->expression = assign; + + statements->statements.Add(stat); + } + } + else + { + auto typeInfo = resolvingResult.typeInfos[repr->instanceName]; + auto loader = GetInstanceLoaderManager()->GetLoader(typeInfo.typeName); + while (loader) + { + if (loader->CanCreate(typeInfo)) + { + break; + } + loader = GetInstanceLoaderManager()->GetParentLoader(loader); + } + + List ctorProps; + loader->GetConstructorParameters(typeInfo, ctorProps); + + IGuiInstanceLoader::ArgumentMap arguments; + FOREACH(GlobalStringKey, prop, ctorProps) + { + auto index = repr->setters.Keys().IndexOf(prop); + if (index != -1) + { + auto setter = repr->setters.Values()[index]; + if (setter->binding == GlobalStringKey::Empty) + { + FOREACH(Ptr, value, setter->values) + { + auto argument = GetArgumentInfo(value.Obj()); + if (argument.type && argument.expression) + { + arguments.Add(prop, argument); + } + } + } + else + { + errors.Add(L"Precompile: "); + } + } + } + + vint errorCount = errors.Count(); + if (auto ctorStats = loader->CreateInstance(typeInfo, repr->instanceName, arguments, errors)) + { + statements->statements.Add(ctorStats); + } + else if (errorCount == errors.Count()) + { + errors.Add(L"Precompile: Something is wrong when creating an isntance of type \"" + typeInfo.typeName.ToString() + L"\"."); + } + } + Visit((GuiAttSetterRepr*)repr); + } + }; + + void Workflow_GenerateCreating(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr statements, types::ErrorList& errors) + { + WorkflowGenerateCreatingVisitor visitor(context, resolvingResult, rootTypeDescriptor, statements, errors); + context->instance->Accept(&visitor); + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWINSTALLBINDINGS.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace workflow; + using namespace workflow::analyzer; + using namespace reflection::description; + using namespace collections; + + using namespace controls; + using namespace compositions; + +/*********************************************************************** +Workflow_InstallBindProperty +***********************************************************************/ + + Ptr Workflow_InstallUriProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& protocol, const WString& path) + { + auto subBlock = MakePtr(); + { + auto refResolver = MakePtr(); + refResolver->name.value = L""; + + auto member = MakePtr(); + member->parent = refResolver; + member->name.value = L"ResolveResource"; + + auto valueProtocol = MakePtr(); + valueProtocol->value.value = protocol; + + auto valuePath = MakePtr(); + valuePath->value.value = path; + + auto call = MakePtr(); + call->function = member; + call->arguments.Add(valueProtocol); + call->arguments.Add(valuePath); + + auto varDesc = MakePtr(); + varDesc->name.value = L""; + varDesc->expression = call; + + auto varStat = MakePtr(); + varStat->variable = varDesc; + subBlock->statements.Add(varStat); + } + { + auto refResourceItem = MakePtr(); + refResourceItem->name.value = L""; + + auto isNull = MakePtr(); + isNull->expression = refResourceItem; + isNull->test = WfTypeTesting::IsNull; + + auto valueException = MakePtr(); + valueException->value.value = L"Resource \"" + protocol + L"://" + path + L"\" does not exist."; + + auto raiseStat = MakePtr(); + raiseStat->expression = valueException; + + auto ifBlock = MakePtr(); + ifBlock->statements.Add(raiseStat); + + auto ifStat = MakePtr(); + ifStat->expression = isNull; + ifStat->trueBranch = ifBlock; + subBlock->statements.Add(ifStat); + } + + auto td = propertyInfo->GetReturn()->GetTypeDescriptor(); + Ptr convertedType; + if (td->GetValueSerializer()) + { + convertedType = TypeInfoRetriver>::CreateTypeInfo(); + } + else if (td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor()) + { + convertedType = TypeInfoRetriver>::CreateTypeInfo(); + } + else + { + convertedType = CopyTypeInfo(propertyInfo->GetReturn()); + } + + { + auto refResourceItem = MakePtr(); + refResourceItem->name.value = L""; + + auto cast = MakePtr(); + cast->expression = refResourceItem; + cast->type = GetTypeFromTypeInfo(convertedType.Obj()); + cast->strategy = WfTypeCastingStrategy::Weak; + + auto varDesc = MakePtr(); + varDesc->name.value = L""; + varDesc->expression = cast; + + auto varStat = MakePtr(); + varStat->variable = varDesc; + subBlock->statements.Add(varStat); + } + { + auto refResourceValue = MakePtr(); + refResourceValue->name.value = L""; + + auto isNull = MakePtr(); + isNull->expression = refResourceValue; + isNull->test = WfTypeTesting::IsNull; + + auto valueException = MakePtr(); + valueException->value.value = L"Resource \"" + protocol + L"://" + path + L"\" cannot be read as type \"" + convertedType->GetTypeDescriptor()->GetTypeName() + L"\"."; + + auto raiseStat = MakePtr(); + raiseStat->expression = valueException; + + auto ifBlock = MakePtr(); + ifBlock->statements.Add(raiseStat); + + auto ifStat = MakePtr(); + ifStat->expression = isNull; + ifStat->trueBranch = ifBlock; + subBlock->statements.Add(ifStat); + } + + Ptr evalExpression; + if (td->GetValueSerializer()) + { + auto refResourceValue = MakePtr(); + refResourceValue->name.value = L""; + + auto member = MakePtr(); + member->parent = refResourceValue; + member->name.value = L"Text"; + + auto cast = MakePtr(); + cast->expression = member; + cast->type = GetTypeFromTypeInfo(propertyInfo->GetReturn()); + cast->strategy = WfTypeCastingStrategy::Strong; + + evalExpression = cast; + } + else if (td == description::GetTypeDescriptor()) + { + auto refResourceValue = MakePtr(); + refResourceValue->name.value = L""; + + auto member = MakePtr(); + member->parent = refResourceValue; + member->name.value = L"Image"; + + evalExpression = member; + } + else + { + auto refResourceValue = MakePtr(); + refResourceValue->name.value = L""; + + evalExpression = refResourceValue; + } + + { + auto refSubscribee = MakePtr(); + refSubscribee->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = refSubscribee; + member->name.value = propertyInfo->GetName(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = member; + assign->second = evalExpression; + + auto stat = MakePtr(); + stat->expression = assign; + subBlock->statements.Add(stat); + } + return subBlock; + } + +/*********************************************************************** +Workflow_InstallBindProperty +***********************************************************************/ + + Ptr Workflow_InstallBindProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, Ptr bindExpression) + { + auto subBlock = MakePtr(); + { + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto member = MakePtr(); + member->parent = refThis; + member->name.value = L"AddSubscription"; + + auto call = MakePtr(); + call->function = member; + call->arguments.Add(bindExpression); + + auto var = MakePtr(); + var->name.value = L""; + var->expression = call; + + auto stat = MakePtr(); + stat->variable = var; + subBlock->statements.Add(stat); + } + { + auto callback = MakePtr(); + callback->anonymity = WfFunctionAnonymity::Anonymous; + callback->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj());; + { + auto arg = MakePtr(); + arg->name.value = L""; + arg->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + callback->arguments.Add(arg); + } + auto callbackBlock = MakePtr(); + callback->statement = callbackBlock; + { + auto refSubscribee = MakePtr(); + refSubscribee->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = refSubscribee; + member->name.value = propertyInfo->GetName(); + + auto var = MakePtr(); + var->name.value = L""; + var->expression = member; + + auto stat = MakePtr(); + stat->variable = var; + callbackBlock->statements.Add(stat); + } + { + ITypeInfo* propertyType = propertyInfo->GetReturn(); + if (propertyInfo->GetSetter() && propertyInfo->GetSetter()->GetParameterCount() == 1) + { + propertyType = propertyInfo->GetSetter()->GetParameter(0)->GetType(); + } + + auto refValue = MakePtr(); + refValue->name.value = L""; + + auto cast = MakePtr(); + cast->strategy = WfTypeCastingStrategy::Strong; + cast->expression = refValue; + cast->type = GetTypeFromTypeInfo(propertyType); + + auto var = MakePtr(); + var->name.value = L""; + var->expression = cast; + + auto stat = MakePtr(); + stat->variable = var; + callbackBlock->statements.Add(stat); + } + { + auto refOld = MakePtr(); + refOld->name.value = L""; + + auto refNew = MakePtr(); + refNew->name.value = L""; + + auto compare = MakePtr(); + compare->op = WfBinaryOperator::EQ; + compare->first = refOld; + compare->second = refNew; + + auto ifStat = MakePtr(); + ifStat->expression = compare; + callbackBlock->statements.Add(ifStat); + + auto ifBlock = MakePtr(); + ifStat->trueBranch = ifBlock; + + auto returnStat = MakePtr(); + ifBlock->statements.Add(returnStat); + } + { + auto refSubscribee = MakePtr(); + refSubscribee->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = refSubscribee; + member->name.value = propertyInfo->GetName(); + + auto refNew = MakePtr(); + refNew->name.value = L""; + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = member; + assign->second = refNew; + + auto stat = MakePtr(); + stat->expression = assign; + callbackBlock->statements.Add(stat); + } + + auto funcExpr = MakePtr(); + funcExpr->function = callback; + + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto member = MakePtr(); + member->parent = refThis; + member->name.value = L"Subscribe"; + + auto call = MakePtr(); + call->function = member; + call->arguments.Add(funcExpr); + + auto stat = MakePtr(); + stat->expression = call; + subBlock->statements.Add(stat); + } + { + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto member = MakePtr(); + member->parent = refThis; + member->name.value = L"Update"; + + auto call = MakePtr(); + call->function = member; + + auto stat = MakePtr(); + stat->expression = call; + subBlock->statements.Add(stat); + } + + return subBlock; + } + +/*********************************************************************** +Workflow_InstallEvalProperty +***********************************************************************/ + + Ptr Workflow_InstallEvalProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, Ptr evalExpression) + { + auto refSubscribee = MakePtr(); + refSubscribee->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = refSubscribee; + member->name.value = propertyInfo->GetName(); + + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = member; + assign->second = evalExpression; + + auto stat = MakePtr(); + stat->expression = assign; + + return stat; + } + +/*********************************************************************** +Workflow_InstallEvent +***********************************************************************/ + + Ptr Workflow_InstallEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, const WString& handlerName) + { + vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1; + + auto subBlock = MakePtr(); + { + auto var = MakePtr(); + var->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = var; + member->name.value = eventInfo->GetName(); + + auto refThis = MakePtr(); + refThis->name.value = L""; + + auto handler = MakePtr(); + handler->parent = refThis; + handler->name.value = handlerName; + + auto call = MakePtr(); + call->function = handler; + for (vint i = 0; i < count; i++) + { + auto argument = MakePtr(); + argument->name.value = L"$" + itow(i + 1); + call->arguments.Add(argument); + } + + auto eventHandler = MakePtr(); + eventHandler->body = call; + + auto attachEvent = MakePtr(); + attachEvent->event = member; + attachEvent->function = eventHandler; + + auto stat = MakePtr(); + stat->expression = attachEvent; + subBlock->statements.Add(stat); + } + + return subBlock; + } + +/*********************************************************************** +Workflow_InstallEvalEvent +***********************************************************************/ + + Ptr Workflow_InstallEvalEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, Ptr evalStatement) + { + auto func = MakePtr(); + func->anonymity = WfFunctionAnonymity::Anonymous; + func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + + vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1; + bool standardName = false; + if (count == 2) + { + auto senderType = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(1)->GetTypeDescriptor(); + auto argumentType = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(2)->GetTypeDescriptor(); + if (senderType == GetTypeDescriptor()) + { + auto expectedType = GetTypeDescriptor(); + List types; + types.Add(argumentType); + for (vint i = 0; i < types.Count(); i++) + { + auto type = types[i]; + if (type == expectedType) + { + standardName = true; + break; + } + vint baseCount = type->GetBaseTypeDescriptorCount(); + for (vint j = 0; j < baseCount; j++) + { + auto baseType = type->GetBaseTypeDescriptor(j); + if (!types.Contains(baseType)) + { + types.Add(baseType); + } + } + } + } + } + + if (standardName) + { + { + auto arg = MakePtr(); + arg->name.value = L"sender"; + arg->type = GetTypeFromTypeInfo(eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(1)); + func->arguments.Add(arg); + } + { + auto arg = MakePtr(); + arg->name.value = L"arguments"; + arg->type = GetTypeFromTypeInfo(eventInfo->GetHandlerType()->GetElementType()->GetGenericArgument(2)); + func->arguments.Add(arg); + } + } + else + { + auto type = TypeInfoRetriver::CreateTypeInfo(); + for (vint i = 0; i < count; i++) + { + auto arg = MakePtr(); + arg->name.value = L"" + itow(i + 1); + arg->type = GetTypeFromTypeInfo(type.Obj()); + func->arguments.Add(arg); + } + } + + auto funcBlock = MakePtr(); + funcBlock->statements.Add(evalStatement); + func->statement = funcBlock; + + auto subBlock = MakePtr(); + + { + auto eventHandlerLambda = MakePtr(); + eventHandlerLambda->function = func; + + auto eventHandler = MakePtr(); + eventHandler->name.value = L""; + eventHandler->expression = eventHandlerLambda; + + auto stat = MakePtr(); + stat->variable = eventHandler; + subBlock->statements.Add(stat); + } + { + auto var = MakePtr(); + var->name.value = variableName.ToString(); + + auto member = MakePtr(); + member->parent = var; + member->name.value = eventInfo->GetName(); + + auto eventHandler = MakePtr(); + eventHandler->name.value = L""; + + auto attachEvent = MakePtr(); + attachEvent->event = member; + attachEvent->function = eventHandler; + + auto stat = MakePtr(); + stat->expression = attachEvent; + subBlock->statements.Add(stat); + } + + return subBlock; + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWMODULE.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace workflow; + using namespace workflow::analyzer; + using namespace reflection::description; + using namespace collections; + +/*********************************************************************** +Workflow_CreateEmptyModule +***********************************************************************/ + + Ptr Workflow_CreateEmptyModule(Ptr context) + { + auto module = MakePtr(); + vint index = context->namespaces.Keys().IndexOf(GlobalStringKey()); + if (index != -1) + { + auto nss = context->namespaces.Values()[index]; + FOREACH(Ptr, ns, nss->namespaces) + { + auto path = MakePtr(); + module->paths.Add(path); + + auto pathCode = ns->prefix + L"*" + ns->postfix; + auto reading = pathCode.Buffer(); + while (reading) + { + auto delimiter = wcsstr(reading, L"::"); + auto begin = reading; + auto end = delimiter ? delimiter : begin + wcslen(reading); + + auto wildcard = wcschr(reading, L'*'); + if (wildcard >= end) + { + wildcard = nullptr; + } + + auto item = MakePtr(); + path->items.Add(item); + if (wildcard) + { + if (begin < wildcard) + { + auto fragment = MakePtr(); + item->fragments.Add(fragment); + fragment->name.value = WString(begin, vint(wildcard - begin)); + } + { + auto fragment = MakePtr(); + item->fragments.Add(fragment); + } + if (wildcard + 1 < end) + { + auto fragment = MakePtr(); + item->fragments.Add(fragment); + fragment->name.value = WString(wildcard + 1, vint(end - wildcard - 1)); + } + } + else if (begin < end) + { + auto fragment = MakePtr(); + item->fragments.Add(fragment); + fragment->name.value = WString(begin, vint(end - begin)); + } + + if (delimiter) + { + reading = delimiter + 2; + } + else + { + reading = nullptr; + } + } + } + } + return module; + } + + Ptr Workflow_CreateModuleWithInitFunction(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr functionBody) + { + auto module = Workflow_CreateEmptyModule(context); + Workflow_CreateVariablesForReferenceValues(module, resolvingResult); + + auto thisParam = MakePtr(); + thisParam->name.value = L""; + { + Ptr elementType = new TypeInfoImpl(ITypeInfo::TypeDescriptor); + elementType->SetTypeDescriptor(rootTypeDescriptor); + + Ptr pointerType = new TypeInfoImpl(ITypeInfo::RawPtr); + pointerType->SetElementType(elementType); + + thisParam->type = GetTypeFromTypeInfo(pointerType.Obj()); + } + + auto resolverParam = MakePtr(); + resolverParam->name.value = L""; + { + Ptr elementType = new TypeInfoImpl(ITypeInfo::TypeDescriptor); + elementType->SetTypeDescriptor(description::GetTypeDescriptor()); + + Ptr pointerType = new TypeInfoImpl(ITypeInfo::RawPtr); + pointerType->SetElementType(elementType); + + resolverParam->type = GetTypeFromTypeInfo(pointerType.Obj()); + } + + auto func = MakePtr(); + func->anonymity = WfFunctionAnonymity::Named; + func->name.value = L""; + func->arguments.Add(thisParam); + func->arguments.Add(resolverParam); + func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + func->statement = functionBody; + module->declarations.Add(func); + + return module; + } + +/*********************************************************************** +Variable +***********************************************************************/ + + void Workflow_CreatePointerVariable(Ptr module, GlobalStringKey name, description::ITypeDescriptor* type, description::ITypeInfo* typeOverride) + { + auto var = MakePtr(); + var->name.value = name.ToString(); + + if (typeOverride) + { + var->type = GetTypeFromTypeInfo(typeOverride); + } + + if (!var->type) + { + if (auto ctors = type->GetConstructorGroup()) + { + if (ctors->GetMethodCount() > 0) + { + auto ctor = ctors->GetMethod(0); + var->type = GetTypeFromTypeInfo(ctor->GetReturn()); + } + } + } + + if (!var->type) + { + Ptr elementType = new TypeInfoImpl(ITypeInfo::TypeDescriptor); + elementType->SetTypeDescriptor(type); + + Ptr pointerType = new TypeInfoImpl(ITypeInfo::RawPtr); + pointerType->SetElementType(elementType); + + var->type = GetTypeFromTypeInfo(pointerType.Obj()); + } + + auto literal = MakePtr(); + literal->value = WfLiteralValue::Null; + var->expression = literal; + + module->declarations.Add(var); + } + + void Workflow_CreateVariablesForReferenceValues(Ptr module, types::ResolvingResult& resolvingResult) + { + const auto& typeInfos = resolvingResult.typeInfos; + for (vint i = 0; i < typeInfos.Count(); i++) + { + auto key = typeInfos.Keys()[i]; + auto value = typeInfos.Values()[i].typeDescriptor; + + ITypeInfo* typeOverride = nullptr; + vint index = resolvingResult.typeOverrides.Keys().IndexOf(key); + if (index != -1) + { + typeOverride = resolvingResult.typeOverrides.Values()[index].Obj(); + } + Workflow_CreatePointerVariable(module, key, value, typeOverride); + } + } + } +} + +/*********************************************************************** +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWPARSER.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + using namespace workflow; + +/*********************************************************************** +Parser +***********************************************************************/ + + Ptr Workflow_ParseExpression(const WString& code, types::ErrorList& errors) + { + auto parser = GetParserManager()->GetParser(L"WORKFLOW-EXPRESSION"); + return parser->TypedParse(code, errors); + } + + Ptr Workflow_ParseStatement(const WString& code, types::ErrorList& errors) + { + auto parser = GetParserManager()->GetParser(L"WORKFLOW-STATEMENT"); + return parser->TypedParse(code, errors); + } + +/*********************************************************************** +Workflow_ModuleToString +***********************************************************************/ + + WString Workflow_ModuleToString(Ptr module) + { + stream::MemoryStream stream; + { + stream::StreamWriter writer(stream); + WfPrint(module, L"", writer); + } + stream.SeekFromBegin(0); + stream::StreamReader reader(stream); + return reader.ReadToEnd(); + } + } +} diff --git a/Import/GacUIReflection.h b/Import/GacUIReflection.h index e49f07f3..eed469c4 100644 --- a/Import/GacUIReflection.h +++ b/Import/GacUIReflection.h @@ -231,10 +231,7 @@ Instance Representation virtual void Accept(IVisitor* visitor) = 0; virtual Ptr Clone() = 0; - virtual void FillXml(Ptr xml, bool serializePrecompiledResource) = 0; - virtual void CollectUsedKey(collections::List& keys) = 0; - virtual void SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey) = 0; - static Ptr LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys); + virtual void FillXml(Ptr xml) = 0; }; class GuiTextRepr : public GuiValueRepr, public Description @@ -246,10 +243,7 @@ Instance Representation void Accept(IVisitor* visitor)override{visitor->Visit(this);} Ptr Clone()override; - void FillXml(Ptr xml, bool serializePrecompiledResource)override; - void CollectUsedKey(collections::List& keys)override; - void SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey)override; - static Ptr LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr = 0); + void FillXml(Ptr xml)override; }; class GuiAttSetterRepr : public GuiValueRepr, public Description @@ -281,10 +275,7 @@ Instance Representation void Accept(IVisitor* visitor)override{visitor->Visit(this);} void CloneBody(Ptr repr); Ptr Clone()override; - void FillXml(Ptr xml, bool serializePrecompiledResource)override; - void CollectUsedKey(collections::List& keys)override; - void SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey)override; - static Ptr LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr = 0); + void FillXml(Ptr xml)override; }; class GuiConstructorRepr : public GuiAttSetterRepr, public Description @@ -298,10 +289,7 @@ Instance Representation void Accept(IVisitor* visitor)override{visitor->Visit(this);} Ptr Clone()override; - void FillXml(Ptr xml, bool serializePrecompiledResource)override; - void CollectUsedKey(collections::List& keys)override; - void SavePrecompiledBinary(stream::IStream& stream, collections::SortedList& keys, bool saveKey)override; - static Ptr LoadPrecompiledBinary(stream::IStream& stream, collections::List& keys, Ptr repr = 0); + void FillXml(Ptr xml)override; }; /*********************************************************************** @@ -355,7 +343,6 @@ Instance Context { public: typedef collections::List> NamespaceList; - typedef collections::Dictionary> CacheMap; struct NamespaceInfo : public Object, public Description { @@ -387,7 +374,7 @@ Instance Context Ptr instance; NamespaceMap namespaces; bool codeBehind = true; - Nullable className; + WString className; ParameterList parameters; PropertyList properties; StateList states; @@ -395,7 +382,6 @@ Instance Context bool appliedStyles = false; StyleContextList styles; - CacheMap precompiledCaches; static void CollectDefaultAttributes(GuiAttSetterRepr::ValueList& values, Ptr xml, collections::List& errors); static void CollectAttributes(GuiAttSetterRepr::SetteValuerMap& setters, Ptr xml, collections::List& errors); @@ -403,10 +389,7 @@ Instance Context static void FillAttSetter(Ptr setter, Ptr xml, collections::List& errors); static Ptr LoadCtor(Ptr xml, collections::List& errors); static Ptr LoadFromXml(Ptr xml, collections::List& errors); - static Ptr LoadPrecompiledBinary(stream::IStream& stream, collections::List& errors); - Ptr SaveToXml(bool serializePrecompiledResource); - void SavePrecompiledBinary(stream::IStream& stream); - void CollectUsedKey(collections::List& keys); + Ptr SaveToXml(); bool ApplyStyles(Ptr resolver, collections::List& errors); }; @@ -459,40 +442,6 @@ namespace vl { using namespace reflection; -/*********************************************************************** -Instance Environment -***********************************************************************/ - - class IGuiInstanceBindingContext; - - class GuiInstanceContextScope : public Object, public Description - { - typedef collections::Dictionary ValueMap; - typedef collections::List ErrorList; - typedef collections::Dictionary> BindingContextMap; - public: - GlobalStringKey typeName; - description::Value rootInstance; - ValueMap referenceValues; - BindingContextMap bindingContexts; - ErrorList errors; - }; - - class GuiInstanceEnvironment : public Object, public Description - { - public: - Ptr context; - Ptr resolver; - Ptr scope; - - GuiInstanceEnvironment(Ptr _context, Ptr _resolver) - :context(_context) - , resolver(_resolver) - { - scope = new GuiInstanceContextScope; - } - }; - /*********************************************************************** Instance Loader ***********************************************************************/ @@ -517,15 +466,13 @@ Instance Loader Property, // property of the class }; - Support support; - bool tryParent; - bool required; - PropertyScope scope; + Support support = NotSupport; + bool tryParent = false; + bool required = false; // only apply to constructor + bool bindable = false; // only apply to constructor + PropertyScope scope = Property; TypeDescriptorList acceptableTypes; - GuiInstancePropertyInfo(); - ~GuiInstancePropertyInfo(); - static Ptr Unsupported(); static Ptr Assign(description::ITypeDescriptor* typeDescriptor = 0); static Ptr AssignWithParent(description::ITypeDescriptor* typeDescriptor = 0); @@ -535,26 +482,6 @@ Instance Loader static Ptr Array(description::ITypeDescriptor* typeDescriptor = 0); }; - class GuiInstanceEventInfo : public IDescriptable, public Description - { - typedef collections::List TypeDescriptorList; - public: - enum Support - { - NotSupport, - SupportAssign, - }; - - Support support; - description::ITypeDescriptor* argumentType; - - GuiInstanceEventInfo(); - ~GuiInstanceEventInfo(); - - static Ptr Unsupported(); - static Ptr Assign(description::ITypeDescriptor* typeDescriptor); - }; - class IGuiInstanceLoader : public IDescriptable, public Description { public: @@ -598,96 +525,59 @@ Instance Loader } }; - virtual GlobalStringKey GetTypeName() = 0; + struct ArgumentInfo + { + Ptr expression; + description::ITypeDescriptor* type; + }; - virtual bool IsDeserializable(const TypeInfo& typeInfo); - virtual description::Value Deserialize(const TypeInfo& typeInfo, const WString& text); - virtual bool IsCreatable(const TypeInfo& typeInfo); - virtual description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments); - virtual bool IsInitializable(const TypeInfo& typeInfo); - virtual Ptr InitializeInstance(const TypeInfo& typeInfo, description::Value instance); + typedef collections::Group ArgumentMap; + + virtual GlobalStringKey GetTypeName() = 0; virtual void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames); virtual void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames); + virtual void GetPairedProperties(const PropertyInfo& propertyInfo, collections::List& propertyNames); virtual Ptr GetPropertyType(const PropertyInfo& propertyInfo); - virtual bool GetPropertyValue(PropertyValue& propertyValue); - virtual bool SetPropertyValue(PropertyValue& propertyValue); - virtual void GetEventNames(const TypeInfo& typeInfo, collections::List& eventNames); - virtual Ptr GetEventType(const PropertyInfo& eventInfo); - virtual bool SetEventValue(PropertyValue& propertyValue); + virtual bool CanCreate(const TypeInfo& typeInfo); + virtual Ptr CreateInstance(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors); + virtual Ptr AssignParameters(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors); + virtual Ptr GetParameter(const PropertyInfo& propertyInfo, GlobalStringKey variableName, collections::List& errors); }; /*********************************************************************** Instance Binder ***********************************************************************/ - class IGuiInstanceBindingContext : public IDescriptable, public Description - { - public: - virtual GlobalStringKey GetContextName() = 0; - virtual void Initialize(Ptr env) = 0; - }; - - class IGuiInstanceBindingContextFactory : public IDescriptable, public Description - { - public: - virtual GlobalStringKey GetContextName() = 0; - virtual Ptr CreateContext() = 0; - }; - - template - class GuiInstanceBindingContextFactory : public IGuiInstanceBindingContextFactory - { - protected: - GlobalStringKey contextName; - public: - GuiInstanceBindingContextFactory(GlobalStringKey _contextName) - :contextName(_contextName) - { - } - - GlobalStringKey GetContextName()override - { - return contextName; - } - - Ptr CreateContext()override - { - return new T; - } - }; - class IGuiInstanceBinder : public IDescriptable, public Description { public: virtual GlobalStringKey GetBindingName() = 0; virtual bool ApplicableToConstructorArgument() = 0; - virtual bool RequireInstanceName() = 0; - virtual void GetRequiredContexts(collections::List& contextNames) = 0; - virtual void GetExpectedValueTypes(collections::List& expectedTypes) = 0; - virtual description::Value GetValue(Ptr env, const description::Value& propertyValue) = 0; - virtual bool SetPropertyValue(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue) = 0; + virtual Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& code, collections::List& errors) = 0; }; class IGuiInstanceEventBinder : public IDescriptable, public Description { public: virtual GlobalStringKey GetBindingName() = 0; - virtual bool RequireInstanceName() = 0; - virtual void GetRequiredContexts(collections::List& contextNames) = 0; - virtual bool AttachEvent(Ptr env, IGuiInstanceLoader* loader, GlobalStringKey instanceName, IGuiInstanceLoader::PropertyValue& propertyValue) = 0; + virtual Ptr GenerateInstallStatement(GlobalStringKey variableName, description::IEventInfo* eventInfo, const WString& code, collections::List& errors) = 0; }; /*********************************************************************** Instance Loader Manager ***********************************************************************/ + class GuiInstanceConstructorResult : public Object + { + public: + Ptr context; + }; + class IGuiInstanceLoaderManager : public IDescriptable, public Description { public: - virtual bool AddInstanceBindingContextFactory(Ptr factory) = 0; - virtual IGuiInstanceBindingContextFactory* GetInstanceBindingContextFactory(GlobalStringKey contextName) = 0; virtual bool AddInstanceBinder(Ptr binder) = 0; virtual IGuiInstanceBinder* GetInstanceBinder(GlobalStringKey bindingName) = 0; virtual bool AddInstanceEventBinder(Ptr binder) = 0; @@ -701,17 +591,33 @@ Instance Loader Manager virtual GlobalStringKey GetParentTypeForVirtualType(GlobalStringKey virtualType) = 0; virtual bool SetResource(const WString& name, Ptr resource) = 0; virtual Ptr GetResource(const WString& name) = 0; + virtual Ptr RunInstanceConstructor(const WString& classFullName, description::Value instance) = 0; }; struct InstanceLoadingSource { IGuiInstanceLoader* loader; GlobalStringKey typeName; + Ptr item; Ptr context; - InstanceLoadingSource() :loader(0){} - InstanceLoadingSource(IGuiInstanceLoader* _loader, GlobalStringKey _typeName) :loader(_loader), typeName(_typeName){} - InstanceLoadingSource(Ptr _context) :loader(0), context(_context){} + InstanceLoadingSource() + :loader(0) + { + } + + InstanceLoadingSource(IGuiInstanceLoader* _loader, GlobalStringKey _typeName) + :loader(_loader) + , typeName(_typeName) + { + } + + InstanceLoadingSource(Ptr _item) + :loader(0) + , item(_item) + , context(item->GetContent().Cast()) + { + } operator bool()const { @@ -720,73 +626,30 @@ Instance Loader Manager }; extern IGuiInstanceLoaderManager* GetInstanceLoaderManager(); - extern InstanceLoadingSource FindInstanceLoadingSource( - Ptr context, - GuiConstructorRepr* ctor - ); - Ptr LoadInstanceFromContext( - Ptr context, - Ptr resolver, - description::ITypeDescriptor* expectedType = 0 - ); - extern Ptr LoadInstance( - Ptr resource, - const WString& instancePath, - description::ITypeDescriptor* expectedType = 0 - ); - extern Ptr InitializeInstanceFromContext( - Ptr context, - Ptr resolver, - description::Value instance - ); - extern Ptr InitializeInstance( - Ptr resource, - const WString& instancePath, - description::Value instance - ); - extern void LogInstanceLoaderManager(stream::TextWriter& writer); + extern InstanceLoadingSource FindInstanceLoadingSource(Ptr context, GuiConstructorRepr* ctor); /*********************************************************************** Instance Scope Wrapper ***********************************************************************/ - class IGuiInstancePartialClass - { - public: - virtual Ptr GetScope() = 0; - }; - template - class GuiInstancePartialClass : public IGuiInstancePartialClass + class GuiInstancePartialClass { private: - GlobalStringKey className; - Ptr scope; + WString className; + Ptr context; protected: bool InitializeFromResource() { - if (scope) return false; - if (auto loader = GetInstanceLoaderManager()->GetLoader(className)) + if (!context) { - IGuiInstanceLoader::TypeInfo typeInfo(className, description::GetTypeDescriptor()); - if (loader->IsInitializable(typeInfo)) + auto value = description::Value::From(dynamic_cast(this)); + if (auto result = GetInstanceLoaderManager()->RunInstanceConstructor(className, value)) { - auto value = description::Value::From(dynamic_cast(this)); - if ((scope = loader->InitializeInstance(typeInfo, value))) - { -#ifdef _DEBUG - CHECK_ERROR(scope->errors.Count() == 0, L"vl::presentation::GuiInstancePartialClass::InitializeFromResource()#There is something wrong with the resource."); -#endif - return true; - } + context = result->context; + return true; } -#ifdef _DEBUG - else - { - CHECK_FAIL(L"vl::presentation::GuiInstancePartialClass::InitializeFromResource()#Cannot initialize this instance from the resource."); - } -#endif } return false; } @@ -795,18 +658,14 @@ Instance Scope Wrapper void LoadInstanceReference(const WString& name, TControl*& reference) { reference = 0; - vint index = scope->referenceValues.Keys().IndexOf(GlobalStringKey::Get(name)); - if (index == -1) - { - scope->errors.Add(L"Failed to find instance reference \"" + name + L"\"."); - return; - } + vint index = context->assembly->variableNames.IndexOf(name); + CHECK_ERROR(index != -1, L"GuiInstancePartialClass::LoadInstanceReference(const WString&, TControl*&)#Failed to find instance reference."); - auto value = scope->referenceValues.Values()[index]; + auto value = context->globalVariables->variables[index]; auto td = description::GetTypeDescriptor(); if (!value.GetTypeDescriptor() || !value.GetTypeDescriptor()->CanConvertTo(td)) { - scope->errors.Add(L"Failed to convert instance reference \"" + name + L"\" to \"" + td->GetTypeName() + L"\"."); + CHECK_ERROR(index != -1, L"GuiInstancePartialClass::LoadInstanceReference(const WString&, TControl*&)#Wrong instance reference type."); return; } @@ -814,18 +673,13 @@ Instance Scope Wrapper } public: GuiInstancePartialClass(const WString& _className) - :className(GlobalStringKey::Get(_className)) + :className(_className) { } virtual ~GuiInstancePartialClass() { } - - Ptr GetScope() - { - return scope; - } }; #define GUI_INSTANCE_REFERENCE(NAME) LoadInstanceReference(L ## #NAME, this->NAME) @@ -834,6 +688,90 @@ Instance Scope Wrapper #endif +/*********************************************************************** +GUIINSTANCEHELPERTYPES.H +***********************************************************************/ +/*********************************************************************** +Vczh Library++ 3.0 +Developer: Zihan Chen(vczh) +GacUI Reflection: Instance Helper Types + +Interfaces: +***********************************************************************/ + +#ifndef VCZH_PRESENTATION_REFLECTION_GUIINSTANCEHELPERTYPES +#define VCZH_PRESENTATION_REFLECTION_GUIINSTANCEHELPERTYPES + + +#if defined(__APPLE__) || defined(__APPLE_CC__) + +using namespace vl; +using namespace vl::presentation; +using namespace vl::presentation::elements; +using namespace vl::presentation::compositions; +using namespace vl::presentation::controls; +using namespace vl::presentation::templates; +using namespace vl::presentation::theme; + +#endif + +namespace vl +{ + namespace presentation + { + +/*********************************************************************** +Helper Types +***********************************************************************/ + + namespace helper_types + { + struct SiteValue + { + vint row; + vint column; + vint rowSpan; + vint columnSpan; + + SiteValue() :row(0), column(0), rowSpan(1), columnSpan(1){} + }; + + enum class ListViewViewType + { + BigIcon, + SmallIcon, + List, + Tile, + Information, + Detail, + }; + } + } + +#ifndef VCZH_DEBUG_NO_REFLECTION + + namespace reflection + { + namespace description + { + +/*********************************************************************** +Type List +***********************************************************************/ + +#define GUIREFLECTIONHELPERTYPES_TYPELIST(F)\ + F(presentation::helper_types::SiteValue)\ + F(presentation::helper_types::ListViewViewType)\ + + GUIREFLECTIONHELPERTYPES_TYPELIST(DECL_TYPE_INFO) + } + } + +#endif +} + +#endif + /*********************************************************************** GUIINSTANCESHAREDSCRIPT.H ***********************************************************************/ @@ -862,6 +800,28 @@ namespace vl static Ptr LoadFromXml(Ptr xml, collections::List& errors); Ptr SaveToXml(); }; + + class GuiInstanceCompiledWorkflow : public Object, public Description + { + public: + enum AssemblyType + { + ViewModel, + Shared, + InstanceCtor, + InstanceClass, + }; + + collections::List codes; + Ptr binaryToLoad; + + AssemblyType type = AssemblyType::Shared; + WString classFullName; + Ptr assembly; + Ptr context; + + void Initialize(bool initializeContext); + }; } } @@ -967,6 +927,7 @@ Type List F(presentation::GuiResourceItem)\ F(presentation::GuiResourceFolder)\ F(presentation::GuiResource)\ + F(presentation::GuiResourcePathResolver)\ F(presentation::elements::IGuiGraphicsElement)\ F(presentation::compositions::GuiGraphicsComposition)\ F(presentation::compositions::GuiGraphicsComposition::MinSizeLimitation)\ @@ -987,33 +948,33 @@ Type Declaration ***********************************************************************/ template<> - struct TypedValueSerializerProvider + struct TypedValueSerializerProvider { - static Color GetDefaultValue(); - static bool Serialize(const Color& input, WString& output); - static bool Deserialize(const WString& input, Color& output); + static presentation::Color GetDefaultValue(); + static bool Serialize(const presentation::Color& input, WString& output); + static bool Deserialize(const WString& input, presentation::Color& output); }; template<> - struct CustomTypeDescriptorSelector + struct CustomTypeDescriptorSelector { public: - typedef SerializableTypeDescriptor> CustomTypeDescriptorImpl; + typedef SerializableTypeDescriptor> CustomTypeDescriptorImpl; }; template<> - struct TypedValueSerializerProvider + struct TypedValueSerializerProvider { - static GlobalStringKey GetDefaultValue(); - static bool Serialize(const GlobalStringKey& input, WString& output); - static bool Deserialize(const WString& input, GlobalStringKey& output); + static presentation::GlobalStringKey GetDefaultValue(); + static bool Serialize(const presentation::GlobalStringKey& input, WString& output); + static bool Deserialize(const WString& input, presentation::GlobalStringKey& output); }; template<> - struct CustomTypeDescriptorSelector + struct CustomTypeDescriptorSelector { public: - typedef SerializableTypeDescriptor> CustomTypeDescriptorImpl; + typedef SerializableTypeDescriptor> CustomTypeDescriptorImpl; }; /*********************************************************************** @@ -1022,6 +983,9 @@ Interface Proxy namespace interface_proxy { + using namespace presentation; + using namespace presentation::controls; + class GuiControl_IStyleController : public ValueInterfaceRoot, public virtual GuiControl::IStyleController { public: @@ -1252,6 +1216,9 @@ Interface Proxy #pragma warning(disable:4250) namespace interface_proxy { + using namespace presentation; + using namespace presentation::compositions; + class composition_IGuiGraphicsAnimation : public ValueInterfaceRoot, public virtual IGuiGraphicsAnimation { public: @@ -3375,85 +3342,135 @@ Type Loader #endif /*********************************************************************** -GUIINSTANCEHELPERTYPES.H +TYPEDESCRIPTORS\GUIREFLECTIONTEMPLATES.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 Developer: Zihan Chen(vczh) -GacUI Reflection: Instance Helper Types +GacUI Reflection: Basic Interfaces: ***********************************************************************/ -#ifndef VCZH_PRESENTATION_REFLECTION_GUIINSTANCEHELPERTYPES -#define VCZH_PRESENTATION_REFLECTION_GUIINSTANCEHELPERTYPES +#ifndef VCZH_PRESENTATION_REFLECTION_GUIREFLECTIOTEMPLATES +#define VCZH_PRESENTATION_REFLECTION_GUIREFLECTIOTEMPLATES -#if defined(__APPLE__) || defined(__APPLE_CC__) - -using namespace vl; -using namespace vl::presentation; -using namespace vl::presentation::elements; -using namespace vl::presentation::compositions; -using namespace vl::presentation::controls; -using namespace vl::presentation::templates; -using namespace vl::presentation::theme; - -#endif - namespace vl { - namespace presentation - { - -/*********************************************************************** -Helper Types -***********************************************************************/ - - namespace helper_types - { - struct SiteValue - { - vint row; - vint column; - vint rowSpan; - vint columnSpan; - - SiteValue() :row(0), column(0), rowSpan(1), columnSpan(1){} - }; - - enum class ListViewViewType - { - BigIcon, - SmallIcon, - List, - Tile, - Information, - Detail, - }; - } - } - -#ifndef VCZH_DEBUG_NO_REFLECTION - namespace reflection { namespace description { +#ifndef VCZH_DEBUG_NO_REFLECTION + /*********************************************************************** Type List ***********************************************************************/ -#define GUIREFLECTIONHELPERTYPES_TYPELIST(F)\ - F(presentation::helper_types::SiteValue)\ - F(presentation::helper_types::ListViewViewType)\ +#define GUIREFLECTIONTEMPLATES_TYPELIST(F)\ + F(presentation::templates::BoolOption)\ + F(presentation::templates::GuiTemplate)\ + F(presentation::templates::GuiTemplate::IFactory)\ + F(presentation::templates::GuiControlTemplate)\ + F(presentation::templates::GuiLabelTemplate)\ + F(presentation::templates::GuiSinglelineTextBoxTemplate)\ + F(presentation::templates::GuiDocumentLabelTemplate)\ + F(presentation::templates::GuiMultilineTextBoxTemplate)\ + F(presentation::templates::GuiDocumentViewerTemplate)\ + F(presentation::templates::GuiMenuTemplate)\ + F(presentation::templates::GuiWindowTemplate)\ + F(presentation::templates::GuiButtonTemplate)\ + F(presentation::templates::GuiSelectableButtonTemplate)\ + F(presentation::templates::GuiToolstripButtonTemplate)\ + F(presentation::templates::GuiListViewColumnHeaderTemplate)\ + F(presentation::templates::GuiComboBoxTemplate)\ + F(presentation::templates::GuiDatePickerTemplate)\ + F(presentation::templates::GuiDateComboBoxTemplate)\ + F(presentation::templates::GuiScrollTemplate)\ + F(presentation::templates::GuiScrollViewTemplate)\ + F(presentation::templates::GuiTextListTemplate)\ + F(presentation::templates::GuiListViewTemplate)\ + F(presentation::templates::GuiTreeViewTemplate)\ + F(presentation::templates::GuiTabTemplate)\ + F(presentation::templates::GuiListItemTemplate)\ + F(presentation::templates::GuiTreeItemTemplate)\ + F(presentation::templates::GuiGridVisualizerTemplate)\ + F(presentation::templates::GuiGridEditorTemplate)\ + F(presentation::templates::GuiControlTemplate_StyleProvider)\ + F(presentation::templates::GuiLabelTemplate_StyleProvider)\ + F(presentation::templates::GuiSinglelineTextBoxTemplate_StyleProvider)\ + F(presentation::templates::GuiDocumentLabelTemplate_StyleProvider)\ + F(presentation::templates::GuiMultilineTextBoxTemplate_StyleProvider)\ + F(presentation::templates::GuiDocumentViewerTemplate_StyleProvider)\ + F(presentation::templates::GuiMenuTemplate_StyleProvider)\ + F(presentation::templates::GuiWindowTemplate_StyleProvider)\ + F(presentation::templates::GuiButtonTemplate_StyleProvider)\ + F(presentation::templates::GuiSelectableButtonTemplate_StyleProvider)\ + F(presentation::templates::GuiToolstripButtonTemplate_StyleProvider)\ + F(presentation::templates::GuiListViewColumnHeaderTemplate_StyleProvider)\ + F(presentation::templates::GuiComboBoxTemplate_StyleProvider)\ + F(presentation::templates::GuiDatePickerTemplate_StyleProvider)\ + F(presentation::templates::GuiDateComboBoxTemplate_StyleProvider)\ + F(presentation::templates::GuiScrollTemplate_StyleProvider)\ + F(presentation::templates::GuiScrollViewTemplate_StyleProvider)\ + F(presentation::templates::GuiTextListTemplate_StyleProvider)\ + F(presentation::templates::GuiListViewTemplate_StyleProvider)\ + F(presentation::templates::GuiTreeViewTemplate_StyleProvider)\ + F(presentation::templates::GuiTabTemplate_StyleProvider)\ + F(presentation::templates::GuiListItemTemplate_ItemStyleController)\ + F(presentation::templates::GuiListItemTemplate_ItemStyleProvider)\ + F(presentation::templates::GuiTreeItemTemplate_ItemStyleProvider)\ + F(presentation::templates::GuiBindableDataVisualizer)\ + F(presentation::templates::GuiBindableDataVisualizer::Factory)\ + F(presentation::templates::GuiBindableDataVisualizer::DecoratedFactory)\ + F(presentation::templates::GuiBindableDataEditor)\ + F(presentation::templates::GuiBindableDataEditor::Factory)\ - GUIREFLECTIONHELPERTYPES_TYPELIST(DECL_TYPE_INFO) - } - } + GUIREFLECTIONTEMPLATES_TYPELIST(DECL_TYPE_INFO) + +/*********************************************************************** +Interface Proxy +***********************************************************************/ + +#pragma warning(push) +#pragma warning(disable:4250) + namespace interface_proxy + { + using namespace presentation; + using namespace presentation::templates; + + class GuiTemplate_IFactory : public ValueInterfaceRoot, public virtual GuiTemplate::IFactory + { + public: + GuiTemplate_IFactory(Ptr _proxy) + :ValueInterfaceRoot(_proxy) + { + } + + static Ptr Create(Ptr proxy) + { + return new GuiTemplate_IFactory(proxy); + } + + GuiTemplate* CreateTemplate(const Value& viewModel)override + { + return INVOKEGET_INTERFACE_PROXY(CreateTemplate, viewModel); + } + }; + } +#pragma warning(pop) + +/*********************************************************************** +Type Loader +***********************************************************************/ #endif + + extern bool LoadGuiTemplateTypes(); + } + } } #endif @@ -3506,6 +3523,10 @@ GuiEventInfoImpl template class GuiEventInfoImpl : public EventInfoImpl { + using GuiGraphicsComposition = presentation::compositions::GuiGraphicsComposition; + + template + using GuiGraphicsEvent = presentation::compositions::GuiGraphicsEvent; protected: typedef Func*(DescriptableObject*, bool)> EventRetriverFunction; @@ -3690,7 +3711,7 @@ namespace vl #endif /*********************************************************************** -GUIINSTANCELOADER_WORKFLOWCOMPILER.H +WORKFLOWCODEGEN\GUIINSTANCELOADER_WORKFLOWCODEGEN.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 @@ -3700,8 +3721,8 @@ GacUI Reflection: Instance Schema Representation Interfaces: ***********************************************************************/ -#ifndef VCZH_PRESENTATION_REFLECTION_GUIINSTANCESCHE_WORKFLOWCOMPILER -#define VCZH_PRESENTATION_REFLECTION_GUIINSTANCESCHE_WORKFLOWCOMPILER +#ifndef VCZH_PRESENTATION_REFLECTION_GUIINSTANCESCHE_WORKFLOWCODEGEN +#define VCZH_PRESENTATION_REFLECTION_GUIINSTANCESCHE_WORKFLOWCODEGEN namespace vl @@ -3710,168 +3731,527 @@ namespace vl { namespace types { - typedef collections::Dictionary VariableTypeMap; + struct PropertyResolving + { + IGuiInstanceLoader* loader = nullptr; + IGuiInstanceLoader::PropertyInfo propertyInfo; + Ptr info; + }; + typedef collections::Dictionary VariableTypeInfoMap; + typedef collections::Dictionary> TypeOverrideMap; + typedef collections::Dictionary PropertyResolvingMap; typedef collections::List ErrorList; + + struct ResolvingResult + { + VariableTypeInfoMap typeInfos; + TypeOverrideMap typeOverrides; + PropertyResolvingMap propertyResolvings; + }; } - extern workflow::analyzer::WfLexicalScopeManager* Workflow_GetSharedManager(); + extern workflow::analyzer::WfLexicalScopeManager* Workflow_GetSharedManager(); /*********************************************************************** -WorkflowCompiler +WorkflowCompiler (Parser) ***********************************************************************/ - - extern Ptr Workflow_CreateEmptyModule(Ptr context); - - extern void Workflow_CreatePointerVariable(Ptr module, GlobalStringKey name, description::ITypeDescriptor* type); - extern void Workflow_GetVariableTypes(Ptr env, types::VariableTypeMap& types); - extern void Workflow_CreateVariablesForReferenceValues(Ptr module, types::VariableTypeMap& types); - extern void Workflow_SetVariablesForReferenceValues(Ptr context, Ptr env); - - extern bool Workflow_ValidateExpression(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, IGuiInstanceLoader::PropertyInfo& bindingTarget, const WString& expressionCode, Ptr& expression); - extern Ptr Workflow_CompileExpression(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, const WString& expressionCode); - extern Ptr Workflow_CompileEventHandler(Ptr context, types::VariableTypeMap& types, types::ErrorList& errors, IGuiInstanceLoader::PropertyInfo& bindingTarget, const WString& statementCode); - - struct WorkflowDataBinding - { - GlobalStringKey variableName; - description::IPropertyInfo* propertyInfo = 0; - Ptr bindExpression; // WfBindExpression for bind, else for assign - }; - - extern WString Workflow_ModuleToString(Ptr module); - extern Ptr Workflow_CompileDataBinding(Ptr context, types::VariableTypeMap& types, description::ITypeDescriptor* thisType, types::ErrorList& errors, collections::List& dataBindings); - - extern void Workflow_PrecompileInstanceContext(Ptr context, types::ErrorList& errors); + + extern Ptr Workflow_ParseExpression(const WString& code, types::ErrorList& errors); + extern Ptr Workflow_ParseStatement(const WString& code, types::ErrorList& errors); + extern WString Workflow_ModuleToString(Ptr module); /*********************************************************************** -GuiWorkflowCache +WorkflowCompiler (Installation) ***********************************************************************/ - class GuiWorkflowCache : public Object, public IGuiResourceCache - { - public: - static const GlobalStringKey& CacheTypeName; - static const GlobalStringKey& CacheContextName; + extern Ptr Workflow_InstallUriProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, const WString& protocol, const WString& path); + extern Ptr Workflow_InstallBindProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, Ptr bindExpression); + extern Ptr Workflow_InstallEvalProperty(GlobalStringKey variableName, description::IPropertyInfo* propertyInfo, Ptr evalExpression); + extern Ptr Workflow_InstallEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, const WString& handlerName); + extern Ptr Workflow_InstallEvalEvent(GlobalStringKey variableName, description::IEventInfo* eventInfo, Ptr evalStatement); - Ptr assembly; +/*********************************************************************** +WorkflowCompiler (Compile) +***********************************************************************/ - GuiWorkflowCache(); - GuiWorkflowCache(Ptr _assembly); + extern Ptr Workflow_CreateEmptyModule(Ptr context); + extern Ptr Workflow_CreateModuleWithInitFunction(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, Ptr functionBody); - GlobalStringKey GetCacheTypeName()override; - }; + extern void Workflow_CreatePointerVariable(Ptr module, GlobalStringKey name, description::ITypeDescriptor* type, description::ITypeInfo* typeOverride); + extern void Workflow_CreateVariablesForReferenceValues(Ptr module, types::ResolvingResult& resolvingResult); - class GuiWorkflowCacheResolver : public Object, public IGuiResourceCacheResolver - { - public: - GlobalStringKey GetCacheTypeName()override; - bool Serialize(Ptr cache, stream::IStream& stream)override; - Ptr Deserialize(stream::IStream& stream)override; - }; + extern bool Workflow_ValidateStatement(Ptr context, types::ResolvingResult& resolvingResult, description::ITypeDescriptor* rootTypeDescriptor, types::ErrorList& errors, const WString& code, Ptr statement); + extern Ptr Workflow_PrecompileInstanceContext(Ptr context, types::ErrorList& errors); + extern Ptr Workflow_RunPrecompiledScript(Ptr resource, Ptr resourceItem, description::Value rootInstance); } } #endif /*********************************************************************** -TYPEDESCRIPTORS\GUIREFLECTIONTEMPLATES.H -***********************************************************************/ -/*********************************************************************** -Vczh Library++ 3.0 -Developer: Zihan Chen(vczh) -GacUI Reflection: Basic - -Interfaces: +INSTANCELOADERS\GUIINSTANCELOADER_TEMPLATECONTROL.H ***********************************************************************/ -#ifndef VCZH_PRESENTATION_REFLECTION_GUIREFLECTIOTEMPLATES -#define VCZH_PRESENTATION_REFLECTION_GUIREFLECTIOTEMPLATES - +#ifndef VCZH_PRESENTATION_REFLECTION_INSTANCELOADERS_GUIINSTANCELOADER_TEMPLATECONTROL +#define VCZH_PRESENTATION_REFLECTION_INSTANCELOADERS_GUIINSTANCELOADER_TEMPLATECONTROL namespace vl { - namespace reflection + namespace presentation { - namespace description + namespace instance_loaders { + using namespace collections; + using namespace reflection::description; + using namespace controls; + using namespace compositions; + using namespace theme; + using namespace helper_types; + + using namespace elements; + using namespace compositions; + using namespace controls; + using namespace templates; + + using namespace workflow; + using namespace workflow::analyzer; #ifndef VCZH_DEBUG_NO_REFLECTION /*********************************************************************** -Type List +Helper Functions ***********************************************************************/ -#define GUIREFLECTIONTEMPLATES_TYPELIST(F)\ - F(presentation::templates::BoolOption)\ - F(presentation::templates::GuiTemplate)\ - F(presentation::templates::GuiTemplate::IFactory)\ - F(presentation::templates::GuiControlTemplate)\ - F(presentation::templates::GuiLabelTemplate)\ - F(presentation::templates::GuiSinglelineTextBoxTemplate)\ - F(presentation::templates::GuiDocumentLabelTemplate)\ - F(presentation::templates::GuiMultilineTextBoxTemplate)\ - F(presentation::templates::GuiDocumentViewerTemplate)\ - F(presentation::templates::GuiMenuTemplate)\ - F(presentation::templates::GuiWindowTemplate)\ - F(presentation::templates::GuiButtonTemplate)\ - F(presentation::templates::GuiSelectableButtonTemplate)\ - F(presentation::templates::GuiToolstripButtonTemplate)\ - F(presentation::templates::GuiListViewColumnHeaderTemplate)\ - F(presentation::templates::GuiComboBoxTemplate)\ - F(presentation::templates::GuiDatePickerTemplate)\ - F(presentation::templates::GuiDateComboBoxTemplate)\ - F(presentation::templates::GuiScrollTemplate)\ - F(presentation::templates::GuiScrollViewTemplate)\ - F(presentation::templates::GuiTextListTemplate)\ - F(presentation::templates::GuiListViewTemplate)\ - F(presentation::templates::GuiTreeViewTemplate)\ - F(presentation::templates::GuiTabTemplate)\ - F(presentation::templates::GuiListItemTemplate)\ - F(presentation::templates::GuiTreeItemTemplate)\ - F(presentation::templates::GuiGridVisualizerTemplate)\ - F(presentation::templates::GuiGridEditorTemplate)\ - - GUIREFLECTIONTEMPLATES_TYPELIST(DECL_TYPE_INFO) - -/*********************************************************************** -Interface Proxy -***********************************************************************/ - -#pragma warning(push) -#pragma warning(disable:4250) - namespace interface_proxy + template + Value ParseConstantArgument(Ptr value, const IGuiInstanceLoader::TypeInfo& typeInfo, const WString& propertyName, const WString& formatSample, collections::List& errors) { - class GuiTemplate_IFactory : public ValueInterfaceRoot, public virtual GuiTemplate::IFactory + auto castExpr = value.Cast(); + if (!castExpr) { - public: - GuiTemplate_IFactory(Ptr _proxy) - :ValueInterfaceRoot(_proxy) - { - } + errors.Add(L"Precompile: The value of property \"" + propertyName + L"\" of type \"" + typeInfo.typeName.ToString() + L"\" should be a constant."); + } + auto stringExpr = castExpr->expression.Cast(); + if (!stringExpr) + { + errors.Add(L"Precompile: The value of property \"" + propertyName + L"\" of type \"" + typeInfo.typeName.ToString() + L"\" should be a constant."); + } - static Ptr Create(Ptr proxy) - { - return new GuiTemplate_IFactory(proxy); - } + Value siteValue; + if (!description::GetTypeDescriptor()->GetValueSerializer()->Parse(stringExpr->value.value, siteValue)) + { + errors.Add(L"Precompile: \"" + stringExpr->value.value + L"\" is not in a right format." + (formatSample == L"" ? WString() : L" It should be \"" + formatSample + L"\", in which components are all optional.")); + } - GuiTemplate* CreateTemplate(const Value& viewModel)override - { - return INVOKEGET_INTERFACE_PROXY(CreateTemplate, viewModel); - } - }; + return siteValue; } -#pragma warning(pop) /*********************************************************************** -Type Loader +GuiVrtualTypeInstanceLoader ***********************************************************************/ -#endif + template + class GuiTemplateControlInstanceLoader : public Object, public IGuiInstanceLoader + { + typedef Ptr ArgumentRawFunctionType(ArgumentMap&); + typedef void InitRawFunctionType(const WString&, Ptr); + typedef Func ArgumentFunctionType; + typedef Func InitFunctionType; - extern bool LoadGuiTemplateTypes(); + protected: + GlobalStringKey typeName; + WString styleMethod; + ArgumentFunctionType argumentFunction; + InitFunctionType initFunction; + + virtual void PrepareAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr block) + { + } + + virtual void AddAdditionalArguments(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr createControl) + { + } + + virtual void PrepareAdditionalArgumentsAfterCreation(const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, collections::List& errors, Ptr block) + { + } + public: + + static Ptr CreateIThemeCall(const WString& method) + { + auto refPresentation = MakePtr(); + refPresentation->name.value = L"presentation"; + + auto refTheme = MakePtr(); + refTheme->parent = refPresentation; + refTheme->name.value = L"theme"; + + auto refITheme = MakePtr(); + refITheme->parent = refTheme; + refITheme->name.value = L"ITheme"; + + auto refGetCurrentTheme = MakePtr(); + refGetCurrentTheme->parent = refITheme; + refGetCurrentTheme->name.value = L"GetCurrentTheme"; + + auto call = MakePtr(); + call->function = refGetCurrentTheme; + + auto refStyleMethod = MakePtr(); + refStyleMethod->parent = call; + refStyleMethod->name.value = method; + + auto createStyle = MakePtr(); + createStyle->function = refStyleMethod; + return createStyle; + } + + static Ptr CreateStyleMethodArgument(const WString& method, ArgumentMap& arguments) + { + vint indexControlTemplate = arguments.Keys().IndexOf(GlobalStringKey::_ControlTemplate); + if (indexControlTemplate == -1) + { + auto refControlStyle = MakePtr(); + refControlStyle->name.value = L""; + + auto refCreateArgument = MakePtr(); + refCreateArgument->parent = refControlStyle; + refCreateArgument->name.value = L"CreateArgument"; + + auto call = MakePtr(); + call->function = refCreateArgument; + + return call; + } + else + { + return CreateIThemeCall(method); + } + } + + static Ptr CreateTemplateFactory(List& controlTemplateTds, collections::List& errors) + { + auto templateType = TypeInfoRetriver::CreateTypeInfo(); + auto factoryType = TypeInfoRetriver>::CreateTypeInfo(); + + auto refFactory = MakePtr(); + refFactory->type = GetTypeFromTypeInfo(factoryType.Obj()); + { + auto funcCreateTemplate = MakePtr(); + funcCreateTemplate->anonymity = WfFunctionAnonymity::Named; + funcCreateTemplate->name.value = L"CreateTemplate"; + funcCreateTemplate->returnType = GetTypeFromTypeInfo(templateType.Obj()); + + auto argViewModel = MakePtr(); + argViewModel->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); + argViewModel->name.value = L""; + funcCreateTemplate->arguments.Add(argViewModel); + + auto block = MakePtr(); + funcCreateTemplate->statement = block; + + ITypeDescriptor* stopControlTemplateTd = nullptr; + FOREACH(ITypeDescriptor*, controlTemplateTd, controlTemplateTds) + { + if (stopControlTemplateTd) + { + errors.Add(L"Precompile: Type \"" + controlTemplateTd->GetTypeName() + L"\" will never be tried, because \"" + stopControlTemplateTd->GetTypeName() + L"\", which is listed before, has a default constructor. So whatever the view model is, it will be the last choice."); + continue; + } + + ITypeInfo* viewModelType = nullptr; + { + auto ctors = controlTemplateTd->GetConstructorGroup(); + if (ctors->GetMethodCount() != 1) + { + errors.Add(L"Precompile: To use type \"" + controlTemplateTd->GetTypeName() + L"\" as a control template or item template, it should have exactly one constructor."); + continue; + } + + auto ctor = ctors->GetMethod(0); + if (ctor->GetParameterCount() > 1) + { + errors.Add(L"Precompile: To use type \"" + controlTemplateTd->GetTypeName() + L"\" as a control template or item template, its constructor cannot have more than one parameter."); + continue; + } + + if (ctor->GetParameterCount() != 0) + { + viewModelType = ctor->GetParameter(0)->GetType(); + } + } + + if (!viewModelType) + { + stopControlTemplateTd = controlTemplateTd; + } + + auto subBlock = MakePtr(); + block->statements.Add(subBlock); + + Ptr controlTemplateType; + { + auto elementType = MakePtr(ITypeInfo::TypeDescriptor); + elementType->SetTypeDescriptor(controlTemplateTd); + + auto pointerType = MakePtr(ITypeInfo::RawPtr); + pointerType->SetElementType(elementType); + + controlTemplateType = pointerType; + } + + Ptr returnStatBlock; + if (viewModelType) + { + auto refViewModel = MakePtr(); + refViewModel->name.value = L""; + + auto condition = MakePtr(); + condition->test = WfTypeTesting::IsType; + condition->expression = refViewModel; + condition->type = GetTypeFromTypeInfo(viewModelType); + + auto ifStat = MakePtr(); + ifStat->expression = condition; + + returnStatBlock = MakePtr(); + ifStat->trueBranch = returnStatBlock; + } + else + { + returnStatBlock = subBlock; + } + + { + auto createControlTemplate = MakePtr(); + createControlTemplate->type = GetTypeFromTypeInfo(controlTemplateType.Obj()); + if (viewModelType) + { + auto refViewModel = MakePtr(); + refViewModel->name.value = L""; + createControlTemplate->arguments.Add(refViewModel); + } + + auto varTemplate = MakePtr(); + varTemplate->type = GetTypeFromTypeInfo(templateType.Obj()); + varTemplate->name.value = L"