diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index 8452e9fa..58035cec 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -5832,7 +5832,7 @@ GuiBindableDataColumn } } - const description::Value& BindableDataColumn::GetViewModelContext() + description::Value BindableDataColumn::GetViewModelContext() { return dataProvider->viewModelContext; } @@ -5973,7 +5973,7 @@ GuiBindableDataProvider } } - const description::Value& BindableDataProvider::GetViewModelContext() + description::Value BindableDataProvider::GetViewModelContext() { return viewModelContext; } @@ -6803,7 +6803,7 @@ DataGridContentProvider::ItemContent for(vint i=0;iCreateVisualizer(font, styleProvider); + dataVisualizers[i] = factory->CreateVisualizer(font, styleProvider, contentProvider->dataProvider->GetViewModelContext()); } textTable->SetRowsAndColumns(1, columnCount); @@ -6976,7 +6976,7 @@ DataGridContentProvider if(editorFactory) { currentEditorOpening=true; - currentEditor=editorFactory->CreateEditor(this); + currentEditor = editorFactory->CreateEditor(this, dataProvider->GetViewModelContext()); currentEditor->BeforeEditCell(dataProvider, row, column); dataProvider->BeforeEditCell(row, column, currentEditor.Obj()); currentEditorOpening=false; @@ -7556,10 +7556,7 @@ DataVisualizerBase ***********************************************************************/ DataVisualizerBase::DataVisualizerBase(Ptr _decoratedDataVisualizer) - :factory(0) - ,styleProvider(0) - ,boundsComposition(0) - ,decoratedDataVisualizer(_decoratedDataVisualizer) + :decoratedDataVisualizer(_decoratedDataVisualizer) { } @@ -7625,9 +7622,6 @@ DataEditorBase ***********************************************************************/ DataEditorBase::DataEditorBase() - :factory(0) - ,callback(0) - ,boundsComposition(0) { } @@ -8420,6 +8414,11 @@ StructuredDataProvider commandExecutor=value; } + description::Value StructuredDataProvider::GetViewModelContext() + { + return structuredDataProvider->GetViewModelContext(); + } + vint StructuredDataProvider::GetColumnCount() { return structuredDataProvider->GetColumnCount(); @@ -8776,6 +8775,11 @@ StructuredDataProviderBase } } + description::Value StructuredDataProviderBase::GetViewModelContext() + { + return description::Value(); + } + vint StructuredDataProviderBase::GetColumnCount() { return columns.Count(); @@ -24227,38 +24231,6 @@ GuiComboBoxTemplate FinalizeAggregation(); } -/*********************************************************************** -GuiDatePickerTemplate -***********************************************************************/ - - GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_IMPL) - - GuiDatePickerTemplate::GuiDatePickerTemplate() - { - GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_EVENT_INIT) - } - - GuiDatePickerTemplate::~GuiDatePickerTemplate() - { - FinalizeAggregation(); - } - -/*********************************************************************** -GuiDateComboBoxTemplate -***********************************************************************/ - - GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_IMPL) - - GuiDateComboBoxTemplate::GuiDateComboBoxTemplate() - { - GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_EVENT_INIT) - } - - GuiDateComboBoxTemplate::~GuiDateComboBoxTemplate() - { - FinalizeAggregation(); - } - /*********************************************************************** GuiScrollTemplate ***********************************************************************/ @@ -24394,6 +24366,38 @@ GuiTabTemplate FinalizeAggregation(); } +/*********************************************************************** +GuiDatePickerTemplate +***********************************************************************/ + + GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_IMPL) + + GuiDatePickerTemplate::GuiDatePickerTemplate() + { + GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_EVENT_INIT) + } + + GuiDatePickerTemplate::~GuiDatePickerTemplate() + { + FinalizeAggregation(); + } + +/*********************************************************************** +GuiDateComboBoxTemplate +***********************************************************************/ + + GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_IMPL) + + GuiDateComboBoxTemplate::GuiDateComboBoxTemplate() + { + GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_EVENT_INIT) + } + + GuiDateComboBoxTemplate::~GuiDateComboBoxTemplate() + { + FinalizeAggregation(); + } + /*********************************************************************** GuiListItemTemplate ***********************************************************************/ @@ -24501,7 +24505,7 @@ namespace vl return new TEMPLATE##_StyleProvider(controlTemplate->Get##PROPERTY());\ #define GET_FACTORY_FROM_TEMPLATE_OPT(TEMPLATE, PROPERTY)\ - if (controlTemplate->Get##PROPERTY() == nullptr)\ + if (!controlTemplate->Get##PROPERTY())\ {\ return nullptr;\ }\ @@ -24511,16 +24515,11 @@ namespace vl GuiControlTemplate_StyleProvider ***********************************************************************/ - GuiControlTemplate_StyleProvider::GuiControlTemplate_StyleProvider(Ptr factory, description::Value viewModel) + GuiControlTemplate_StyleProvider::GuiControlTemplate_StyleProvider(TemplateProperty factory, description::Value viewModel) :associatedStyleController(0) - , controlTemplate(0) + , controlTemplate(factory(viewModel)) { - GuiTemplate* itemTemplate = factory->CreateTemplate(viewModel); - if (!(controlTemplate = dynamic_cast(itemTemplate))) - { - delete itemTemplate; - CHECK_FAIL(L"GuiControlTemplate_StyleProvider::GuiControlTemplate_StyleProvider()#An instance of GuiTemplate is expected."); - } + CHECK_ERROR(controlTemplate, L"GuiControlTemplate_StyleProvider::GuiControlTemplate_StyleProvider()#An instance of GuiControlTemplate is expected."); } GuiControlTemplate_StyleProvider::~GuiControlTemplate_StyleProvider() @@ -24566,7 +24565,7 @@ GuiControlTemplate_StyleProvider GuiLabelTemplate_StyleProvider ***********************************************************************/ - GuiLabelTemplate_StyleProvider::GuiLabelTemplate_StyleProvider(Ptr factory) + GuiLabelTemplate_StyleProvider::GuiLabelTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24593,7 +24592,7 @@ GuiLabelTemplate_StyleProvider GuiSinglelineTextBoxTemplate_StyleProvider ***********************************************************************/ - GuiSinglelineTextBoxTemplate_StyleProvider::GuiSinglelineTextBoxTemplate_StyleProvider(Ptr factory) + GuiSinglelineTextBoxTemplate_StyleProvider::GuiSinglelineTextBoxTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24630,7 +24629,7 @@ GuiSinglelineTextBoxTemplate_StyleProvider GuiDocumentLabelTemplate_StyleProvider ***********************************************************************/ - GuiDocumentLabelTemplate_StyleProvider::GuiDocumentLabelTemplate_StyleProvider(Ptr factory) + GuiDocumentLabelTemplate_StyleProvider::GuiDocumentLabelTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24652,7 +24651,7 @@ GuiDocumentLabelTemplate_StyleProvider GuiMenuTemplate_StyleProvider ***********************************************************************/ - GuiMenuTemplate_StyleProvider::GuiMenuTemplate_StyleProvider(Ptr factory) + GuiMenuTemplate_StyleProvider::GuiMenuTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { } @@ -24665,7 +24664,7 @@ GuiMenuTemplate_StyleProvider GuiWindowTemplate_StyleProvider ***********************************************************************/ - GuiWindowTemplate_StyleProvider::GuiWindowTemplate_StyleProvider(Ptr factory) + GuiWindowTemplate_StyleProvider::GuiWindowTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) , window(0) { @@ -24793,7 +24792,7 @@ GuiWindowTemplate_StyleProvider GuiButtonTemplate_StyleProvider ***********************************************************************/ - GuiButtonTemplate_StyleProvider::GuiButtonTemplate_StyleProvider(Ptr factory) + GuiButtonTemplate_StyleProvider::GuiButtonTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24815,7 +24814,7 @@ GuiButtonTemplate_StyleProvider GuiSelectableButtonTemplate_StyleProvider ***********************************************************************/ - GuiSelectableButtonTemplate_StyleProvider::GuiSelectableButtonTemplate_StyleProvider(Ptr factory) + GuiSelectableButtonTemplate_StyleProvider::GuiSelectableButtonTemplate_StyleProvider(TemplateProperty factory) :GuiButtonTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24837,7 +24836,7 @@ GuiSelectableButtonTemplate_StyleProvider GuiToolstripButtonTemplate_StyleProvider ***********************************************************************/ - GuiToolstripButtonTemplate_StyleProvider::GuiToolstripButtonTemplate_StyleProvider(Ptr factory) + GuiToolstripButtonTemplate_StyleProvider::GuiToolstripButtonTemplate_StyleProvider(TemplateProperty factory) :GuiSelectableButtonTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24884,7 +24883,7 @@ GuiToolstripButtonTemplate_StyleProvider GuiListViewColumnHeaderTemplate_StyleProvider ***********************************************************************/ - GuiListViewColumnHeaderTemplate_StyleProvider::GuiListViewColumnHeaderTemplate_StyleProvider(Ptr factory) + GuiListViewColumnHeaderTemplate_StyleProvider::GuiListViewColumnHeaderTemplate_StyleProvider(TemplateProperty factory) :GuiToolstripButtonTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24906,7 +24905,7 @@ GuiListViewColumnHeaderTemplate_StyleProvider GuiComboBoxTemplate_StyleProvider ***********************************************************************/ - GuiComboBoxTemplate_StyleProvider::GuiComboBoxTemplate_StyleProvider(Ptr factory) + GuiComboBoxTemplate_StyleProvider::GuiComboBoxTemplate_StyleProvider(TemplateProperty factory) :GuiToolstripButtonTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -24933,92 +24932,11 @@ GuiComboBoxTemplate_StyleProvider controlTemplate->SetTextVisible(value); } -/*********************************************************************** -GuiDatePickerTemplate_StyleProvider -***********************************************************************/ - - GuiDatePickerTemplate_StyleProvider::GuiDatePickerTemplate_StyleProvider(Ptr factory) - :GuiControlTemplate_StyleProvider(factory) - { - if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) - { - CHECK_FAIL(L"GuiDatePickerTemplate_StyleProvider::GuiDatePickerTemplate_StyleProvider()#An instance of GuiDatePickerTemplate is expected."); - } - } - - GuiDatePickerTemplate_StyleProvider::~GuiDatePickerTemplate_StyleProvider() - { - delete controlTemplate; - } - - controls::GuiSelectableButton::IStyleController* GuiDatePickerTemplate_StyleProvider::CreateDateButtonStyle() - { - GET_FACTORY_FROM_TEMPLATE(GuiSelectableButtonTemplate, DateButtonTemplate); - } - - GuiTextListTemplate_StyleProvider* GuiDatePickerTemplate_StyleProvider::CreateTextListStyle() - { - GET_FACTORY_FROM_TEMPLATE(GuiTextListTemplate, DateTextListTemplate); - } - - controls::GuiTextList* GuiDatePickerTemplate_StyleProvider::CreateTextList() - { - auto style = CreateTextListStyle(); - return new GuiTextList(style, style->CreateArgument()); - } - - controls::GuiComboBoxListControl::IStyleController* GuiDatePickerTemplate_StyleProvider::CreateComboBoxStyle() - { - GET_FACTORY_FROM_TEMPLATE(GuiComboBoxTemplate, DateComboBoxTemplate); - } - - Color GuiDatePickerTemplate_StyleProvider::GetBackgroundColor() - { - return controlTemplate->GetBackgroundColor(); - } - - Color GuiDatePickerTemplate_StyleProvider::GetPrimaryTextColor() - { - return controlTemplate->GetPrimaryTextColor(); - } - - Color GuiDatePickerTemplate_StyleProvider::GetSecondaryTextColor() - { - return controlTemplate->GetSecondaryTextColor(); - } - -/*********************************************************************** -GuiDateComboBoxTemplate_StyleProvider -***********************************************************************/ - - GuiDateComboBoxTemplate_StyleProvider::GuiDateComboBoxTemplate_StyleProvider(Ptr factory) - :GuiComboBoxTemplate_StyleProvider(factory) - { - if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) - { - CHECK_FAIL(L"GuiDateComboBoxTemplate_StyleProvider::GuiDateComboBoxTemplate_StyleProvider()#An instance of GuiDateComboBoxTemplate is expected."); - } - } - - GuiDateComboBoxTemplate_StyleProvider::~GuiDateComboBoxTemplate_StyleProvider() - { - } - - controls::GuiDatePicker* GuiDateComboBoxTemplate_StyleProvider::CreateArgument() - { - return new GuiDatePicker(CreateDatePickerStyle()); - } - - controls::GuiDatePicker::IStyleProvider* GuiDateComboBoxTemplate_StyleProvider::CreateDatePickerStyle() - { - GET_FACTORY_FROM_TEMPLATE(GuiDatePickerTemplate, DatePickerTemplate); - } - /*********************************************************************** GuiScrollTemplate_StyleProvider ***********************************************************************/ - GuiScrollTemplate_StyleProvider::GuiScrollTemplate_StyleProvider(Ptr factory) + GuiScrollTemplate_StyleProvider::GuiScrollTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25055,7 +24973,7 @@ GuiScrollTemplate_StyleProvider GuiScrollViewTemplate_StyleProvider ***********************************************************************/ - GuiScrollViewTemplate_StyleProvider::GuiScrollViewTemplate_StyleProvider(Ptr factory) + GuiScrollViewTemplate_StyleProvider::GuiScrollViewTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25094,7 +25012,7 @@ GuiScrollViewTemplate_StyleProvider GuiSinglelineTextBoxTemplate_StyleProvider ***********************************************************************/ - GuiMultilineTextBoxTemplate_StyleProvider::GuiMultilineTextBoxTemplate_StyleProvider(Ptr factory) + GuiMultilineTextBoxTemplate_StyleProvider::GuiMultilineTextBoxTemplate_StyleProvider(TemplateProperty factory) :GuiScrollViewTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25124,7 +25042,7 @@ GuiSinglelineTextBoxTemplate_StyleProvider GuiDocumentViewerTemplate_StyleProvider ***********************************************************************/ - GuiDocumentViewerTemplate_StyleProvider::GuiDocumentViewerTemplate_StyleProvider(Ptr factory) + GuiDocumentViewerTemplate_StyleProvider::GuiDocumentViewerTemplate_StyleProvider(TemplateProperty factory) :GuiScrollViewTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25169,7 +25087,7 @@ GuiTextListTemplate_StyleProvider::ItemStyleProvider GuiTextListTemplate_StyleProvider ***********************************************************************/ - GuiTextListTemplate_StyleProvider::GuiTextListTemplate_StyleProvider(Ptr factory) + GuiTextListTemplate_StyleProvider::GuiTextListTemplate_StyleProvider(TemplateProperty factory) :GuiScrollViewTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25206,7 +25124,7 @@ GuiTextListTemplate_StyleProvider GuiListViewTemplate_StyleProvider ***********************************************************************/ - GuiListViewTemplate_StyleProvider::GuiListViewTemplate_StyleProvider(Ptr factory) + GuiListViewTemplate_StyleProvider::GuiListViewTemplate_StyleProvider(TemplateProperty factory) :GuiScrollViewTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25248,7 +25166,7 @@ GuiListViewTemplate_StyleProvider GuiTreeViewTemplate_StyleProvider ***********************************************************************/ - GuiTreeViewTemplate_StyleProvider::GuiTreeViewTemplate_StyleProvider(Ptr factory) + GuiTreeViewTemplate_StyleProvider::GuiTreeViewTemplate_StyleProvider(TemplateProperty factory) :GuiScrollViewTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25280,6 +25198,26 @@ GuiTreeViewTemplate_StyleProvider GuiTabTemplate_StyleProvider ***********************************************************************/ + controls::GuiSelectableButton::IStyleController* GuiTabTemplate_StyleProvider::CreateHeaderTemplate() + { + GET_FACTORY_FROM_TEMPLATE(GuiSelectableButtonTemplate, HeaderTemplate); + } + + controls::GuiButton::IStyleController* GuiTabTemplate_StyleProvider::CreateDropdownTemplate() + { + GET_FACTORY_FROM_TEMPLATE(GuiButtonTemplate, DropdownTemplate); + } + + controls::GuiMenu::IStyleController* GuiTabTemplate_StyleProvider::CreateMenuTemplate() + { + GET_FACTORY_FROM_TEMPLATE(GuiMenuTemplate, MenuTemplate); + } + + controls::GuiToolstripButton::IStyleController* GuiTabTemplate_StyleProvider::CreateMenuItemTemplate() + { + GET_FACTORY_FROM_TEMPLATE(GuiToolstripButtonTemplate, MenuItemTemplate); + } + void GuiTabTemplate_StyleProvider::OnHeaderButtonClicked(compositions::GuiGraphicsComposition* sender, compositions::GuiEventArgs& arguments) { if(commandExecutor) @@ -25414,27 +25352,7 @@ GuiTabTemplate_StyleProvider headerController=new GuiSelectableButton::MutexGroupController; } - controls::GuiSelectableButton::IStyleController* GuiTabTemplate_StyleProvider::CreateHeaderTemplate() - { - GET_FACTORY_FROM_TEMPLATE(GuiSelectableButtonTemplate, HeaderTemplate); - } - - controls::GuiButton::IStyleController* GuiTabTemplate_StyleProvider::CreateDropdownTemplate() - { - GET_FACTORY_FROM_TEMPLATE(GuiButtonTemplate, DropdownTemplate); - } - - controls::GuiMenu::IStyleController* GuiTabTemplate_StyleProvider::CreateMenuTemplate() - { - GET_FACTORY_FROM_TEMPLATE(GuiMenuTemplate, MenuTemplate); - } - - controls::GuiToolstripButton::IStyleController* GuiTabTemplate_StyleProvider::CreateMenuItemTemplate() - { - GET_FACTORY_FROM_TEMPLATE(GuiToolstripButtonTemplate, MenuItemTemplate); - } - - GuiTabTemplate_StyleProvider::GuiTabTemplate_StyleProvider(Ptr factory) + GuiTabTemplate_StyleProvider::GuiTabTemplate_StyleProvider(TemplateProperty factory) :GuiControlTemplate_StyleProvider(factory) { if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) @@ -25530,11 +25448,92 @@ GuiTabTemplate_StyleProvider return headerButtons[index]->QueryTypedService(); } +/*********************************************************************** +GuiDatePickerTemplate_StyleProvider +***********************************************************************/ + + GuiDatePickerTemplate_StyleProvider::GuiDatePickerTemplate_StyleProvider(TemplateProperty factory) + :GuiControlTemplate_StyleProvider(factory) + { + if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) + { + CHECK_FAIL(L"GuiDatePickerTemplate_StyleProvider::GuiDatePickerTemplate_StyleProvider()#An instance of GuiDatePickerTemplate is expected."); + } + } + + GuiDatePickerTemplate_StyleProvider::~GuiDatePickerTemplate_StyleProvider() + { + delete controlTemplate; + } + + controls::GuiSelectableButton::IStyleController* GuiDatePickerTemplate_StyleProvider::CreateDateButtonStyle() + { + GET_FACTORY_FROM_TEMPLATE(GuiSelectableButtonTemplate, DateButtonTemplate); + } + + GuiTextListTemplate_StyleProvider* GuiDatePickerTemplate_StyleProvider::CreateTextListStyle() + { + GET_FACTORY_FROM_TEMPLATE(GuiTextListTemplate, DateTextListTemplate); + } + + controls::GuiTextList* GuiDatePickerTemplate_StyleProvider::CreateTextList() + { + auto style = CreateTextListStyle(); + return new GuiTextList(style, style->CreateArgument()); + } + + controls::GuiComboBoxListControl::IStyleController* GuiDatePickerTemplate_StyleProvider::CreateComboBoxStyle() + { + GET_FACTORY_FROM_TEMPLATE(GuiComboBoxTemplate, DateComboBoxTemplate); + } + + Color GuiDatePickerTemplate_StyleProvider::GetBackgroundColor() + { + return controlTemplate->GetBackgroundColor(); + } + + Color GuiDatePickerTemplate_StyleProvider::GetPrimaryTextColor() + { + return controlTemplate->GetPrimaryTextColor(); + } + + Color GuiDatePickerTemplate_StyleProvider::GetSecondaryTextColor() + { + return controlTemplate->GetSecondaryTextColor(); + } + +/*********************************************************************** +GuiDateComboBoxTemplate_StyleProvider +***********************************************************************/ + + GuiDateComboBoxTemplate_StyleProvider::GuiDateComboBoxTemplate_StyleProvider(TemplateProperty factory) + :GuiComboBoxTemplate_StyleProvider(factory) + { + if (!(controlTemplate = dynamic_cast(GetBoundsComposition()))) + { + CHECK_FAIL(L"GuiDateComboBoxTemplate_StyleProvider::GuiDateComboBoxTemplate_StyleProvider()#An instance of GuiDateComboBoxTemplate is expected."); + } + } + + GuiDateComboBoxTemplate_StyleProvider::~GuiDateComboBoxTemplate_StyleProvider() + { + } + + controls::GuiDatePicker* GuiDateComboBoxTemplate_StyleProvider::CreateArgument() + { + return new GuiDatePicker(CreateDatePickerStyle()); + } + + controls::GuiDatePicker::IStyleProvider* GuiDateComboBoxTemplate_StyleProvider::CreateDatePickerStyle() + { + GET_FACTORY_FROM_TEMPLATE(GuiDatePickerTemplate, DatePickerTemplate); + } + /*********************************************************************** GuiControlTemplate_ItemStyleProvider ***********************************************************************/ - GuiControlTemplate_ItemStyleProvider::GuiControlTemplate_ItemStyleProvider(Ptr _factory) + GuiControlTemplate_ItemStyleProvider::GuiControlTemplate_ItemStyleProvider(TemplateProperty _factory) :factory(_factory) { } @@ -25560,7 +25559,7 @@ GuiControlTemplate_ItemStyleProvider GuiTextListItemTemplate_ItemStyleProvider ***********************************************************************/ - GuiTextListItemTemplate_ItemStyleProvider::GuiTextListItemTemplate_ItemStyleProvider(Ptr _factory) + GuiTextListItemTemplate_ItemStyleProvider::GuiTextListItemTemplate_ItemStyleProvider(TemplateProperty _factory) :factory(_factory) { } @@ -25594,18 +25593,12 @@ GuiTextListItemTemplate_ItemStyleProvider if (auto controller = dynamic_cast(style)) { Value viewModel = listControl->GetItemProvider()->GetBindingValue(itemIndex); - GuiTemplate* itemTemplate = factory->CreateTemplate(viewModel); - if (auto listItemTemplate = dynamic_cast(itemTemplate)) - { - listItemTemplate->SetFont(listControl->GetFont()); - listItemTemplate->SetIndex(itemIndex); - listItemTemplate->SetTextColor(listControl->GetTextListStyleProvider()->GetTextColor()); - controller->SetTemplate(listItemTemplate); - } - else - { - delete itemTemplate; - } + auto listItemTemplate = factory(viewModel); + CHECK_ERROR(listItemTemplate, L"GuiTextListItemTemplate_ItemStyleProvider::Install()#An instance of GuiTextListItemTemplate is expected."); + listItemTemplate->SetFont(listControl->GetFont()); + listItemTemplate->SetIndex(itemIndex); + listItemTemplate->SetTextColor(listControl->GetTextListStyleProvider()->GetTextColor()); + controller->SetTemplate(listItemTemplate); } } @@ -25744,7 +25737,7 @@ GuiTreeItemTemplate_ItemStyleProvider UpdateExpandingButton(node); } - GuiTreeItemTemplate_ItemStyleProvider::GuiTreeItemTemplate_ItemStyleProvider(Ptr _factory) + GuiTreeItemTemplate_ItemStyleProvider::GuiTreeItemTemplate_ItemStyleProvider(TemplateProperty _factory) :factory(_factory) { @@ -25797,17 +25790,11 @@ GuiTreeItemTemplate_ItemStyleProvider if (auto controller = dynamic_cast(style)) { Value viewModel = treeListControl->GetNodeRootProvider()->GetBindingValue(node); - GuiTemplate* itemTemplate = factory->CreateTemplate(viewModel); - if (auto treeItemTemplate = dynamic_cast(itemTemplate)) - { - treeItemTemplate->SetFont(treeListControl->GetFont()); - treeItemTemplate->SetIndex(itemIndex); - controller->SetTemplate(treeItemTemplate); - } - else - { - delete itemTemplate; - } + auto treeItemTemplate = factory(viewModel); + CHECK_ERROR(treeItemTemplate, L"GuiTreeItemTemplate_ItemStyleProvider::Install()#An instance of GuiTreeItemTemplate is expected."); + treeItemTemplate->SetFont(treeListControl->GetFont()); + treeItemTemplate->SetIndex(itemIndex); + controller->SetTemplate(treeItemTemplate); } } @@ -25903,9 +25890,8 @@ GuiTreeItemTemplate_ItemStyleController GuiBindableDataVisualizer::Factory ***********************************************************************/ - GuiBindableDataVisualizer::Factory::Factory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn) + GuiBindableDataVisualizer::Factory::Factory(TemplateProperty _templateFactory) :templateFactory(_templateFactory) - , ownerColumn(_ownerColumn) { } @@ -25913,13 +25899,12 @@ GuiBindableDataVisualizer::Factory { } - Ptr GuiBindableDataVisualizer::Factory::CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider) + Ptr GuiBindableDataVisualizer::Factory::CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext) { - auto visualizer = DataVisualizerFactory::CreateVisualizer(font, styleProvider).Cast(); + auto visualizer = DataVisualizerFactory::CreateVisualizer(font, styleProvider, viewModelContext).Cast(); if (visualizer) { visualizer->templateFactory = templateFactory; - visualizer->ownerColumn = ownerColumn; } return visualizer; } @@ -25928,10 +25913,9 @@ GuiBindableDataVisualizer::Factory GuiBindableDataVisualizer::DecoratedFactory ***********************************************************************/ - GuiBindableDataVisualizer::DecoratedFactory::DecoratedFactory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn, Ptr _decoratedFactory) + GuiBindableDataVisualizer::DecoratedFactory::DecoratedFactory(TemplateProperty _templateFactory, Ptr _decoratedFactory) :DataDecoratableVisualizerFactory(_decoratedFactory) , templateFactory(_templateFactory) - , ownerColumn(_ownerColumn) { } @@ -25939,13 +25923,12 @@ GuiBindableDataVisualizer::DecoratedFactory { } - Ptr GuiBindableDataVisualizer::DecoratedFactory::CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider) + Ptr GuiBindableDataVisualizer::DecoratedFactory::CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext) { - auto visualizer = DataDecoratableVisualizerFactory::CreateVisualizer(font, styleProvider).Cast(); + auto visualizer = DataDecoratableVisualizerFactory::CreateVisualizer(font, styleProvider, viewModelContext).Cast(); if (visualizer) { visualizer->templateFactory = templateFactory; - visualizer->ownerColumn = ownerColumn; } return visualizer; } @@ -25956,12 +25939,8 @@ GuiBindableDataVisualizer compositions::GuiBoundsComposition* GuiBindableDataVisualizer::CreateBoundsCompositionInternal(compositions::GuiBoundsComposition* decoratedComposition) { - GuiTemplate* itemTemplate = templateFactory->CreateTemplate(ownerColumn->GetViewModelContext()); - if (!(visualizerTemplate = dynamic_cast(itemTemplate))) - { - delete itemTemplate; - CHECK_FAIL(L"GuiBindableDataVisualizer::CreateBoundsCompositionInternal(presentation::compositions::GuiBoundsComposition*)#An instance of GuiGridVisualizerTemplate is expected."); - } + visualizerTemplate = templateFactory(viewModelContext); + CHECK_ERROR(visualizerTemplate, L"GuiBindableDataVisualizer::CreateBoundsCompositionInternal()#An instance of GuiGridVisualizerTemplate is expected."); if (decoratedComposition) { @@ -26017,9 +25996,8 @@ GuiBindableDataVisualizer GuiBindableDataEditor::Factory ***********************************************************************/ - GuiBindableDataEditor::Factory::Factory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn) + GuiBindableDataEditor::Factory::Factory(TemplateProperty _templateFactory) :templateFactory(_templateFactory) - , ownerColumn(_ownerColumn) { } @@ -26027,13 +26005,12 @@ GuiBindableDataEditor::Factory { } - Ptr GuiBindableDataEditor::Factory::CreateEditor(controls::list::IDataEditorCallback* callback) + Ptr GuiBindableDataEditor::Factory::CreateEditor(controls::list::IDataEditorCallback* callback, const description::Value& viewModelContext) { - auto editor = DataEditorFactory::CreateEditor(callback).Cast(); + auto editor = DataEditorFactory::CreateEditor(callback, viewModelContext).Cast(); if (editor) { editor->templateFactory = templateFactory; - editor->ownerColumn = ownerColumn; // Invoke GuiBindableDataEditor::CreateBoundsCompositionInternal // so that GuiBindableDataEditor::BeforeEditCell is able to set RowValue and CellValue to the editor @@ -26048,12 +26025,8 @@ GuiBindableDataEditor compositions::GuiBoundsComposition* GuiBindableDataEditor::CreateBoundsCompositionInternal() { - GuiTemplate* itemTemplate = templateFactory->CreateTemplate(ownerColumn->GetViewModelContext()); - if (!(editorTemplate = dynamic_cast(itemTemplate))) - { - delete itemTemplate; - CHECK_FAIL(L"GuiBindableDataEditor::CreateBoundsCompositionInternal()#An instance of GuiGridEditorTemplate is expected."); - } + editorTemplate = templateFactory(viewModelContext); + CHECK_ERROR(editorTemplate, L"GuiBindableDataEditor::CreateBoundsCompositionInternal()#An instance of GuiGridEditorTemplate is expected."); editorTemplate->CellValueChanged.AttachMethod(this, &GuiBindableDataEditor::editorTemplate_CellValueChanged); return editorTemplate; diff --git a/Import/GacUI.h b/Import/GacUI.h index 41b6860d..687affd3 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -8228,6 +8228,15 @@ namespace vl { namespace presentation { + template + using ItemProperty = Func; + + template + using WritableItemProperty = Func; + + template + using TemplateProperty = Func; + namespace controls { @@ -11804,12 +11813,6 @@ namespace vl { class GuiListViewBase; - template - using ItemProperty = Func; - - template - using WritableItemProperty = Func; - namespace list { @@ -15268,7 +15271,7 @@ Datagrid Interfaces /// The created data visualizer. /// The font for the list view control. /// The style provider for the list view control. - virtual Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider)=0; + virtual Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext)=0; }; /// The visualizer for each cell in [T:vl.presentation.controls.GuiVirtualDataGrid]. @@ -15326,7 +15329,7 @@ Datagrid Interfaces /// Create a data editor. /// The created data editor. /// The callback for the created editor to send notification. - virtual Ptr CreateEditor(IDataEditorCallback* callback)=0; + virtual Ptr CreateEditor(IDataEditorCallback* callback, const description::Value& viewModelContext)=0; }; /// The editor for each cell in [T:vl.presentation.controls.GuiVirtualDataGrid]. @@ -15371,90 +15374,93 @@ Datagrid Interfaces public: /// The identifier for this view. static const wchar_t* const Identifier; - + /// Set the command executor. /// The command executor. - virtual void SetCommandExecutor(IDataProviderCommandExecutor* value)=0; + virtual void SetCommandExecutor(IDataProviderCommandExecutor* value) = 0; + /// Get the view model context. It is used to create data visualizers and data editors. + /// The view model context. + virtual description::Value GetViewModelContext() = 0; /// Get the number of all columns. /// The number of all columns. - virtual vint GetColumnCount()=0; + virtual vint GetColumnCount() = 0; /// Get the text for the column. /// The text for the column. /// The index for the column. - virtual WString GetColumnText(vint column)=0; + virtual WString GetColumnText(vint column) = 0; /// Get the size for the column. /// The size for the column. /// The index for the column. - virtual vint GetColumnSize(vint column)=0; + virtual vint GetColumnSize(vint column) = 0; /// Set the size for the column. /// The index for the column. /// The new size for the column. - virtual void SetColumnSize(vint column, vint value)=0; + virtual void SetColumnSize(vint column, vint value) = 0; /// Get the popup binded to the column. /// The popup binded to the column. /// The index of the column. - virtual GuiMenu* GetColumnPopup(vint column)=0; + virtual GuiMenu* GetColumnPopup(vint column) = 0; /// Test is a column sortable. /// Returns true if this column is sortable. /// The index of the column. - virtual bool IsColumnSortable(vint column)=0; + virtual bool IsColumnSortable(vint column) = 0; /// Set the column sorting state to update the data. /// The index of the column. Set to -1 means go back to the unsorted state. /// Set to true if the data is sorted in ascending order. - virtual void SortByColumn(vint column, bool ascending)=0; + virtual void SortByColumn(vint column, bool ascending) = 0; /// Get the sorted columm. If no column is under a sorted state, it returns -1. /// The column number. - virtual vint GetSortedColumn()=0; + virtual vint GetSortedColumn() = 0; /// Test is the sort order ascending. /// Returns true if the sort order is ascending. - virtual bool IsSortOrderAscending()=0; - + virtual bool IsSortOrderAscending() = 0; + /// Get the number of all rows. /// The number of all rows. - virtual vint GetRowCount()=0; + virtual vint GetRowCount() = 0; /// Get the large image for the row. /// The large image. /// The row number. - virtual Ptr GetRowLargeImage(vint row)=0; + virtual Ptr GetRowLargeImage(vint row) = 0; /// Get the small image for the row. /// The small image. /// The row number. - virtual Ptr GetRowSmallImage(vint row)=0; + virtual Ptr GetRowSmallImage(vint row) = 0; /// Get the column span for the cell. /// The column span for the cell. /// The row number for the cell. /// The column number for the cell. - virtual vint GetCellSpan(vint row, vint column)=0; + virtual vint GetCellSpan(vint row, vint column) = 0; /// Get the text for the cell. /// The text for the cell. /// The row number for the cell. /// The column number for the cell. - virtual WString GetCellText(vint row, vint column)=0; + virtual WString GetCellText(vint row, vint column) = 0; /// Get the data visualizer factory that creates data visualizers for visualizing the cell. /// The data visualizer factory. The data grid control to use the predefined data visualizer if this function returns null. /// The row number for the cell. /// The column number for the cell. - virtual IDataVisualizerFactory* GetCellDataVisualizerFactory(vint row, vint column)=0; + virtual IDataVisualizerFactory* GetCellDataVisualizerFactory(vint row, vint column) = 0; /// Called before visualizing the cell. /// The row number for the cell. /// The column number for the cell. /// The data visualizer to be updated. - virtual void VisualizeCell(vint row, vint column, IDataVisualizer* dataVisualizer)=0; + virtual void VisualizeCell(vint row, vint column, IDataVisualizer* dataVisualizer) = 0; /// Get the data editor factory that creates data editors for editing the cell. /// The data editor factory. Returns null to disable editing. /// The row number for the cell. /// The column number for the cell. - virtual IDataEditorFactory* GetCellDataEditorFactory(vint row, vint column)=0; + virtual IDataEditorFactory* GetCellDataEditorFactory(vint row, vint column) = 0; /// Called before editing the cell. /// The row number for the cell. /// The column number for the cell. /// The data editor. - virtual void BeforeEditCell(vint row, vint column, IDataEditor* dataEditor)=0; + virtual void BeforeEditCell(vint row, vint column, IDataEditor* dataEditor) = 0; /// Called when saving data for the editing cell. /// The row number for the cell. /// The column number for the cell. /// The data editor. - virtual void SaveCellData(vint row, vint column, IDataEditor* dataEditor)=0; + virtual void SaveCellData(vint row, vint column, IDataEditor* dataEditor) = 0; }; /*********************************************************************** @@ -15555,6 +15561,9 @@ DataSource Extensions /// Set the command executor. /// The command executor. virtual void SetCommandExecutor(IDataProviderCommandExecutor* value)=0; + /// Get the view model context. It is used to create data visualizers and data editors. + /// The view model context. + virtual description::Value GetViewModelContext() = 0; /// Get the number of all columns. /// The number of all columns. virtual vint GetColumnCount()=0; @@ -15764,6 +15773,7 @@ Structured DataSource Extensions void SetAdditionalFilter(Ptr value); void SetCommandExecutor(IDataProviderCommandExecutor* value)override; + description::Value GetViewModelContext()override; vint GetColumnCount()override; WString GetColumnText(vint column)override; vint GetColumnSize(vint column)override; @@ -15887,6 +15897,7 @@ Structured DataSource Extensions ~StructuredDataProviderBase(); void SetCommandExecutor(IDataProviderCommandExecutor* value)override; + description::Value GetViewModelContext()override; vint GetColumnCount()override; IStructuredColumnProvider* GetColumn(vint column)override; Ptr GetRowLargeImage(vint row)override; @@ -16113,17 +16124,18 @@ Extension Bases template friend class DataDecoratableVisualizerFactory; protected: - IDataVisualizerFactory* factory; + IDataVisualizerFactory* factory = nullptr; FontProperties font; - GuiListViewBase::IStyleProvider* styleProvider; - compositions::GuiBoundsComposition* boundsComposition; + GuiListViewBase::IStyleProvider* styleProvider = nullptr; + description::Value viewModelContext; + compositions::GuiBoundsComposition* boundsComposition = nullptr; Ptr decoratedDataVisualizer; virtual compositions::GuiBoundsComposition* CreateBoundsCompositionInternal(compositions::GuiBoundsComposition* decoratedComposition)=0; public: /// Create the data visualizer. /// The decorated data visualizer inside the current data visualizer. - DataVisualizerBase(Ptr _decoratedDataVisualizer=0); + DataVisualizerBase(Ptr _decoratedDataVisualizer = nullptr); ~DataVisualizerBase(); IDataVisualizerFactory* GetFactory()override; @@ -16137,12 +16149,13 @@ Extension Bases class DataVisualizerFactory : public Object, public virtual IDataVisualizerFactory, public Description> { public: - Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider)override + Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext)override { - DataVisualizerBase* dataVisualizer=new TVisualizer; - dataVisualizer->factory=this; - dataVisualizer->font=font; - dataVisualizer->styleProvider=styleProvider; + DataVisualizerBase* dataVisualizer = new TVisualizer; + dataVisualizer->factory = this; + dataVisualizer->font = font; + dataVisualizer->styleProvider = styleProvider; + dataVisualizer->viewModelContext = viewModelContext; return dataVisualizer; } }; @@ -16158,13 +16171,14 @@ Extension Bases { } - Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider)override + Ptr CreateVisualizer(const FontProperties& font, GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext)override { - Ptr decoratedDataVisualizer=decoratedFactory->CreateVisualizer(font, styleProvider); - DataVisualizerBase* dataVisualizer=new TVisualizer(decoratedDataVisualizer); - dataVisualizer->factory=this; - dataVisualizer->font=font; - dataVisualizer->styleProvider=styleProvider; + Ptr decoratedDataVisualizer = decoratedFactory->CreateVisualizer(font, styleProvider, viewModelContext); + DataVisualizerBase* dataVisualizer = new TVisualizer(decoratedDataVisualizer); + dataVisualizer->factory = this; + dataVisualizer->font = font; + dataVisualizer->styleProvider = styleProvider; + dataVisualizer->viewModelContext = viewModelContext; return dataVisualizer; } }; @@ -16175,9 +16189,10 @@ Extension Bases template friend class DataEditorFactory; protected: - IDataEditorFactory* factory; - IDataEditorCallback* callback; - compositions::GuiBoundsComposition* boundsComposition; + IDataEditorFactory* factory = nullptr; + IDataEditorCallback* callback = nullptr; + description::Value viewModelContext; + compositions::GuiBoundsComposition* boundsComposition = nullptr; virtual compositions::GuiBoundsComposition* CreateBoundsCompositionInternal()=0; public: @@ -16195,11 +16210,12 @@ Extension Bases class DataEditorFactory : public Object, public virtual IDataEditorFactory, public Description> { public: - Ptr CreateEditor(IDataEditorCallback* callback)override + Ptr CreateEditor(IDataEditorCallback* callback, const description::Value& viewModelContext)override { - DataEditorBase* dataEditor=new TEditor; - dataEditor->factory=this; - dataEditor->callback=callback; + DataEditorBase* dataEditor = new TEditor; + dataEditor->factory = this; + dataEditor->callback = callback; + dataEditor->viewModelContext = viewModelContext; return dataEditor; } }; @@ -17208,7 +17224,7 @@ GuiBindableDataGrid /// Get the view model context which will be used as a view model to create visualizers and editors. /// The value model context. - const description::Value& GetViewModelContext(); + description::Value GetViewModelContext(); }; /// Data provider object for [T:vl.presentation.controls.GuiBindableDataGrid]. @@ -17230,7 +17246,7 @@ GuiBindableDataGrid vint GetRowCount()override; description::Value GetRowValue(vint row); - const description::Value& GetViewModelContext(); + description::Value GetViewModelContext()override; bool InsertBindableColumn(vint index, Ptr column); bool AddBindableColumn(Ptr column); bool RemoveBindableColumn(Ptr column); @@ -18205,16 +18221,6 @@ namespace vl class GuiTemplate : public compositions::GuiBoundsComposition, public controls::GuiInstanceRootObject, public Description { public: - /// Factory interface for creating instances. - class IFactory : public IDescriptable, public Description - { - public: - /// Create a instance. - /// The created template. - /// The view model for binding. - virtual GuiTemplate* CreateTemplate(const description::Value& viewModel) = 0; - }; - /// Create a template. GuiTemplate(); ~GuiTemplate(); @@ -18317,8 +18323,8 @@ Control Template F(GuiWindowTemplate, bool, TitleBar)\ F(GuiWindowTemplate, bool, CustomizedBorder)\ F(GuiWindowTemplate, bool, Maximized)\ - F(GuiWindowTemplate, Ptr, TooltipTemplate)\ - F(GuiWindowTemplate, Ptr, ShortcutKeyTemplate) + F(GuiWindowTemplate, TemplateProperty, TooltipTemplate)\ + F(GuiWindowTemplate, TemplateProperty, ShortcutKeyTemplate) GuiWindowTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) }; @@ -18354,7 +18360,7 @@ Control Template ~GuiToolstripButtonTemplate(); #define GuiToolstripButtonTemplate_PROPERTIES(F)\ - F(GuiToolstripButtonTemplate, Ptr, SubMenuTemplate)\ + F(GuiToolstripButtonTemplate, TemplateProperty, SubMenuTemplate)\ F(GuiToolstripButtonTemplate, bool, SubMenuExisting)\ F(GuiToolstripButtonTemplate, bool, SubMenuOpening)\ F(GuiToolstripButtonTemplate, controls::GuiButton*, SubMenuHost)\ @@ -18389,35 +18395,6 @@ Control Template GuiComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) }; - class GuiDatePickerTemplate : public GuiControlTemplate, public AggregatableDescription - { - public: - GuiDatePickerTemplate(); - ~GuiDatePickerTemplate(); - -#define GuiDatePickerTemplate_PROPERTIES(F)\ - F(GuiDatePickerTemplate, Ptr, DateButtonTemplate)\ - F(GuiDatePickerTemplate, Ptr, DateTextListTemplate)\ - F(GuiDatePickerTemplate, Ptr, DateComboBoxTemplate)\ - F(GuiDatePickerTemplate, Color, BackgroundColor)\ - F(GuiDatePickerTemplate, Color, PrimaryTextColor)\ - F(GuiDatePickerTemplate, Color, SecondaryTextColor)\ - - GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) - }; - - class GuiDateComboBoxTemplate : public GuiComboBoxTemplate, public AggregatableDescription - { - public: - GuiDateComboBoxTemplate(); - ~GuiDateComboBoxTemplate(); - -#define GuiDateComboBoxTemplate_PROPERTIES(F)\ - F(GuiDateComboBoxTemplate, Ptr, DatePickerTemplate)\ - - GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) - }; - class GuiScrollTemplate : public GuiControlTemplate, public AggregatableDescription { public: @@ -18440,8 +18417,8 @@ Control Template ~GuiScrollViewTemplate(); #define GuiScrollViewTemplate_PROPERTIES(F)\ - F(GuiScrollViewTemplate, Ptr, HScrollTemplate)\ - F(GuiScrollViewTemplate, Ptr, VScrollTemplate)\ + F(GuiScrollViewTemplate, TemplateProperty, HScrollTemplate)\ + F(GuiScrollViewTemplate, TemplateProperty, VScrollTemplate)\ F(GuiScrollViewTemplate, vint, DefaultScrollSize)\ GuiScrollViewTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) @@ -18480,8 +18457,8 @@ Control Template ~GuiTextListTemplate(); #define GuiTextListTemplate_PROPERTIES(F)\ - F(GuiTextListTemplate, Ptr, BackgroundTemplate)\ - F(GuiTextListTemplate, Ptr, BulletTemplate)\ + F(GuiTextListTemplate, TemplateProperty, BackgroundTemplate)\ + F(GuiTextListTemplate, TemplateProperty, BulletTemplate)\ F(GuiTextListTemplate, Color, TextColor)\ GuiTextListTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) @@ -18494,8 +18471,8 @@ Control Template ~GuiListViewTemplate(); #define GuiListViewTemplate_PROPERTIES(F)\ - F(GuiListViewTemplate, Ptr, BackgroundTemplate)\ - F(GuiListViewTemplate, Ptr, ColumnHeaderTemplate)\ + F(GuiListViewTemplate, TemplateProperty, BackgroundTemplate)\ + F(GuiListViewTemplate, TemplateProperty, ColumnHeaderTemplate)\ F(GuiListViewTemplate, Color, PrimaryTextColor)\ F(GuiListViewTemplate, Color, SecondaryTextColor)\ F(GuiListViewTemplate, Color, ItemSeparatorColor)\ @@ -18510,8 +18487,8 @@ Control Template ~GuiTreeViewTemplate(); #define GuiTreeViewTemplate_PROPERTIES(F)\ - F(GuiTreeViewTemplate, Ptr, BackgroundTemplate)\ - F(GuiTreeViewTemplate, Ptr, ExpandingDecoratorTemplate)\ + F(GuiTreeViewTemplate, TemplateProperty, BackgroundTemplate)\ + F(GuiTreeViewTemplate, TemplateProperty, ExpandingDecoratorTemplate)\ F(GuiTreeViewTemplate, Color, TextColor)\ GuiTreeViewTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) @@ -18524,16 +18501,45 @@ Control Template ~GuiTabTemplate(); #define GuiTabTemplate_PROPERTIES(F)\ - F(GuiTabTemplate, Ptr, HeaderTemplate)\ - F(GuiTabTemplate, Ptr, DropdownTemplate)\ - F(GuiTabTemplate, Ptr, MenuTemplate)\ - F(GuiTabTemplate, Ptr, MenuItemTemplate)\ + F(GuiTabTemplate, TemplateProperty, HeaderTemplate)\ + F(GuiTabTemplate, TemplateProperty, DropdownTemplate)\ + F(GuiTabTemplate, TemplateProperty, MenuTemplate)\ + F(GuiTabTemplate, TemplateProperty, MenuItemTemplate)\ F(GuiTabTemplate, vint, HeaderPadding)\ F(GuiTabTemplate, compositions::GuiGraphicsComposition*, HeaderComposition)\ GuiTabTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) }; + class GuiDatePickerTemplate : public GuiControlTemplate, public AggregatableDescription + { + public: + GuiDatePickerTemplate(); + ~GuiDatePickerTemplate(); + +#define GuiDatePickerTemplate_PROPERTIES(F)\ + F(GuiDatePickerTemplate, TemplateProperty, DateButtonTemplate)\ + F(GuiDatePickerTemplate, TemplateProperty, DateTextListTemplate)\ + F(GuiDatePickerTemplate, TemplateProperty, DateComboBoxTemplate)\ + F(GuiDatePickerTemplate, Color, BackgroundColor)\ + F(GuiDatePickerTemplate, Color, PrimaryTextColor)\ + F(GuiDatePickerTemplate, Color, SecondaryTextColor)\ + + GuiDatePickerTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) + }; + + class GuiDateComboBoxTemplate : public GuiComboBoxTemplate, public AggregatableDescription + { + public: + GuiDateComboBoxTemplate(); + ~GuiDateComboBoxTemplate(); + +#define GuiDateComboBoxTemplate_PROPERTIES(F)\ + F(GuiDateComboBoxTemplate, TemplateProperty, DatePickerTemplate)\ + + GuiDateComboBoxTemplate_PROPERTIES(GUI_TEMPLATE_PROPERTY_DECL) + }; + /*********************************************************************** Item Template ***********************************************************************/ @@ -18646,7 +18652,7 @@ Control Template GuiControlTemplate* controlTemplate; public: - GuiControlTemplate_StyleProvider(Ptr factory, description::Value viewModel = description::Value()); + GuiControlTemplate_StyleProvider(TemplateProperty factory, description::Value viewModel = description::Value()); ~GuiControlTemplate_StyleProvider(); compositions::GuiBoundsComposition* GetBoundsComposition()override; @@ -18667,7 +18673,7 @@ Control Template GuiLabelTemplate* controlTemplate; public: - GuiLabelTemplate_StyleProvider(Ptr factory); + GuiLabelTemplate_StyleProvider(TemplateProperty factory); ~GuiLabelTemplate_StyleProvider(); Color GetDefaultTextColor()override; @@ -18683,7 +18689,7 @@ Control Template GuiSinglelineTextBoxTemplate* controlTemplate; public: - GuiSinglelineTextBoxTemplate_StyleProvider(Ptr factory); + GuiSinglelineTextBoxTemplate_StyleProvider(TemplateProperty factory); ~GuiSinglelineTextBoxTemplate_StyleProvider(); void SetFocusableComposition(compositions::GuiGraphicsComposition* value)override; @@ -18699,7 +18705,7 @@ Control Template GuiDocumentLabelTemplate* controlTemplate; public: - GuiDocumentLabelTemplate_StyleProvider(Ptr factory); + GuiDocumentLabelTemplate_StyleProvider(TemplateProperty factory); ~GuiDocumentLabelTemplate_StyleProvider(); Ptr GetBaselineDocument()override; @@ -18711,7 +18717,7 @@ Control Template , public Description { public: - GuiMenuTemplate_StyleProvider(Ptr factory); + GuiMenuTemplate_StyleProvider(TemplateProperty factory); ~GuiMenuTemplate_StyleProvider(); }; @@ -18725,7 +18731,7 @@ Control Template controls::GuiWindow* window; public: - GuiWindowTemplate_StyleProvider(Ptr factory); + GuiWindowTemplate_StyleProvider(TemplateProperty factory); ~GuiWindowTemplate_StyleProvider(); void AttachWindow(controls::GuiWindow* _window)override; @@ -18756,7 +18762,7 @@ Control Template GuiButtonTemplate* controlTemplate; public: - GuiButtonTemplate_StyleProvider(Ptr factory); + GuiButtonTemplate_StyleProvider(TemplateProperty factory); ~GuiButtonTemplate_StyleProvider(); void Transfer(controls::GuiButton::ControlState value)override; @@ -18771,7 +18777,7 @@ Control Template GuiSelectableButtonTemplate* controlTemplate; public: - GuiSelectableButtonTemplate_StyleProvider(Ptr factory); + GuiSelectableButtonTemplate_StyleProvider(TemplateProperty factory); ~GuiSelectableButtonTemplate_StyleProvider(); void SetSelected(bool value)override; @@ -18786,7 +18792,7 @@ Control Template GuiToolstripButtonTemplate* controlTemplate; public: - GuiToolstripButtonTemplate_StyleProvider(Ptr factory); + GuiToolstripButtonTemplate_StyleProvider(TemplateProperty factory); ~GuiToolstripButtonTemplate_StyleProvider(); controls::GuiMenu::IStyleController* CreateSubMenuStyleController()override; @@ -18806,7 +18812,7 @@ Control Template GuiListViewColumnHeaderTemplate* controlTemplate; public: - GuiListViewColumnHeaderTemplate_StyleProvider(Ptr factory); + GuiListViewColumnHeaderTemplate_StyleProvider(TemplateProperty factory); ~GuiListViewColumnHeaderTemplate_StyleProvider(); void SetColumnSortingState(controls::GuiListViewColumnHeader::ColumnSortingState value)override; @@ -18821,7 +18827,7 @@ Control Template GuiComboBoxTemplate* controlTemplate; public: - GuiComboBoxTemplate_StyleProvider(Ptr factory); + GuiComboBoxTemplate_StyleProvider(TemplateProperty factory); ~GuiComboBoxTemplate_StyleProvider(); void SetCommandExecutor(controls::GuiComboBoxBase::ICommandExecutor* value)override; @@ -18829,44 +18835,6 @@ Control Template void SetTextVisible(bool value)override; }; - class GuiTextListTemplate_StyleProvider; - - class GuiDatePickerTemplate_StyleProvider - : public GuiControlTemplate_StyleProvider - , public virtual controls::GuiDatePicker::IStyleProvider - , public Description - { - protected: - GuiDatePickerTemplate* controlTemplate; - - public: - GuiDatePickerTemplate_StyleProvider(Ptr factory); - ~GuiDatePickerTemplate_StyleProvider(); - - controls::GuiSelectableButton::IStyleController* CreateDateButtonStyle()override; - GuiTextListTemplate_StyleProvider* CreateTextListStyle(); - controls::GuiTextList* CreateTextList()override; - controls::GuiComboBoxListControl::IStyleController* CreateComboBoxStyle()override; - Color GetBackgroundColor()override; - Color GetPrimaryTextColor()override; - Color GetSecondaryTextColor()override; - }; - - class GuiDateComboBoxTemplate_StyleProvider - : public GuiComboBoxTemplate_StyleProvider - , public Description - { - protected: - GuiDateComboBoxTemplate* controlTemplate; - - public: - GuiDateComboBoxTemplate_StyleProvider(Ptr factory); - ~GuiDateComboBoxTemplate_StyleProvider(); - - controls::GuiDatePicker* CreateArgument(); - controls::GuiDatePicker::IStyleProvider* CreateDatePickerStyle(); - }; - class GuiScrollTemplate_StyleProvider : public GuiControlTemplate_StyleProvider , public virtual controls::GuiScroll::IStyleController @@ -18876,7 +18844,7 @@ Control Template GuiScrollTemplate* controlTemplate; public: - GuiScrollTemplate_StyleProvider(Ptr factory); + GuiScrollTemplate_StyleProvider(TemplateProperty factory); ~GuiScrollTemplate_StyleProvider(); void SetCommandExecutor(controls::GuiScroll::ICommandExecutor* value)override; @@ -18894,7 +18862,7 @@ Control Template GuiScrollViewTemplate* controlTemplate; public: - GuiScrollViewTemplate_StyleProvider(Ptr factory); + GuiScrollViewTemplate_StyleProvider(TemplateProperty factory); ~GuiScrollViewTemplate_StyleProvider(); controls::GuiScroll::IStyleController* CreateHorizontalScrollStyle()override; @@ -18911,7 +18879,7 @@ Control Template GuiMultilineTextBoxTemplate* controlTemplate; public: - GuiMultilineTextBoxTemplate_StyleProvider(Ptr factory); + GuiMultilineTextBoxTemplate_StyleProvider(TemplateProperty factory); ~GuiMultilineTextBoxTemplate_StyleProvider(); void SetFocusableComposition(compositions::GuiGraphicsComposition* value)override; @@ -18926,7 +18894,7 @@ Control Template GuiDocumentViewerTemplate* controlTemplate; public: - GuiDocumentViewerTemplate_StyleProvider(Ptr factory); + GuiDocumentViewerTemplate_StyleProvider(TemplateProperty factory); ~GuiDocumentViewerTemplate_StyleProvider(); Ptr GetBaselineDocument()override; @@ -18955,7 +18923,7 @@ Control Template controls::GuiSelectableButton::IStyleController* CreateBulletStyleController()override; }; public: - GuiTextListTemplate_StyleProvider(Ptr factory); + GuiTextListTemplate_StyleProvider(TemplateProperty factory); ~GuiTextListTemplate_StyleProvider(); controls::GuiSelectableButton::IStyleController* CreateItemBackground()override; @@ -18974,7 +18942,7 @@ Control Template GuiListViewTemplate* controlTemplate; public: - GuiListViewTemplate_StyleProvider(Ptr factory); + GuiListViewTemplate_StyleProvider(TemplateProperty factory); ~GuiListViewTemplate_StyleProvider(); controls::GuiSelectableButton::IStyleController* CreateItemBackground()override; @@ -18993,7 +18961,7 @@ Control Template GuiTreeViewTemplate* controlTemplate; public: - GuiTreeViewTemplate_StyleProvider(Ptr factory); + GuiTreeViewTemplate_StyleProvider(TemplateProperty factory); ~GuiTreeViewTemplate_StyleProvider(); controls::GuiSelectableButton::IStyleController* CreateItemBackground()override; @@ -19036,7 +19004,7 @@ Control Template void Initialize(); public: - GuiTabTemplate_StyleProvider(Ptr factory); + GuiTabTemplate_StyleProvider(TemplateProperty factory); ~GuiTabTemplate_StyleProvider(); void SetCommandExecutor(controls::GuiTab::ICommandExecutor* value)override; @@ -19049,6 +19017,42 @@ Control Template compositions::IGuiAltAction* GetTabAltAction(vint index)override; }; + class GuiDatePickerTemplate_StyleProvider + : public GuiControlTemplate_StyleProvider + , public virtual controls::GuiDatePicker::IStyleProvider + , public Description + { + protected: + GuiDatePickerTemplate* controlTemplate; + + public: + GuiDatePickerTemplate_StyleProvider(TemplateProperty factory); + ~GuiDatePickerTemplate_StyleProvider(); + + controls::GuiSelectableButton::IStyleController* CreateDateButtonStyle()override; + GuiTextListTemplate_StyleProvider* CreateTextListStyle(); + controls::GuiTextList* CreateTextList()override; + controls::GuiComboBoxListControl::IStyleController* CreateComboBoxStyle()override; + Color GetBackgroundColor()override; + Color GetPrimaryTextColor()override; + Color GetSecondaryTextColor()override; + }; + + class GuiDateComboBoxTemplate_StyleProvider + : public GuiComboBoxTemplate_StyleProvider + , public Description + { + protected: + GuiDateComboBoxTemplate* controlTemplate; + + public: + GuiDateComboBoxTemplate_StyleProvider(TemplateProperty factory); + ~GuiDateComboBoxTemplate_StyleProvider(); + + controls::GuiDatePicker* CreateArgument(); + controls::GuiDatePicker::IStyleProvider* CreateDatePickerStyle(); + }; + /*********************************************************************** Item Template (GuiControlTemplate) ***********************************************************************/ @@ -19059,10 +19063,10 @@ Item Template (GuiControlTemplate) , public Description { protected: - Ptr factory; + TemplateProperty factory; public: - GuiControlTemplate_ItemStyleProvider(Ptr _factory); + GuiControlTemplate_ItemStyleProvider(TemplateProperty _factory); ~GuiControlTemplate_ItemStyleProvider(); void AttachComboBox(controls::GuiComboBoxListControl* value)override; @@ -19083,11 +19087,11 @@ Item Template (GuiTextListItemTemplate) { friend class GuiTextListItemTemplate_ItemStyleController; protected: - Ptr factory; + TemplateProperty factory; controls::GuiVirtualTextList* listControl = nullptr; public: - GuiTextListItemTemplate_ItemStyleProvider(Ptr _factory); + GuiTextListItemTemplate_ItemStyleProvider(TemplateProperty _factory); ~GuiTextListItemTemplate_ItemStyleProvider(); void AttachListControl(controls::GuiListControl* value)override; @@ -19141,7 +19145,7 @@ Item Template (GuiTreeItemTemplate) { friend class GuiTreeItemTemplate_ItemStyleController; protected: - Ptr factory; + TemplateProperty factory; controls::GuiVirtualTreeListControl* treeListControl = nullptr; controls::GuiListControl::IItemStyleProvider* itemStyleProvider = nullptr; @@ -19153,7 +19157,7 @@ Item Template (GuiTreeItemTemplate) void OnItemCollapsed(controls::tree::INodeProvider* node)override; public: - GuiTreeItemTemplate_ItemStyleProvider(Ptr _factory); + GuiTreeItemTemplate_ItemStyleProvider(TemplateProperty _factory); ~GuiTreeItemTemplate_ItemStyleProvider(); void BindItemStyleProvider(controls::GuiListControl::IItemStyleProvider* styleProvider)override; @@ -19206,32 +19210,29 @@ Item Template (GuiGridVisualizerTemplate) class Factory : public controls::list::DataVisualizerFactory { protected: - Ptr templateFactory; - controls::list::BindableDataColumn* ownerColumn; + TemplateProperty templateFactory; public: - Factory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn); + Factory(TemplateProperty _templateFactory); ~Factory(); - Ptr CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider)override; + Ptr CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext)override; }; class DecoratedFactory : public controls::list::DataDecoratableVisualizerFactory { protected: - Ptr templateFactory; - controls::list::BindableDataColumn* ownerColumn; + TemplateProperty templateFactory; public: - DecoratedFactory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn, Ptr _decoratedFactory); + DecoratedFactory(TemplateProperty _templateFactory, Ptr _decoratedFactory); ~DecoratedFactory(); - Ptr CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider)override; + Ptr CreateVisualizer(const FontProperties& font, controls::GuiListViewBase::IStyleProvider* styleProvider, const description::Value& viewModelContext)override; }; protected: - Ptr templateFactory; - controls::list::BindableDataColumn* ownerColumn = nullptr; + TemplateProperty templateFactory; GuiGridVisualizerTemplate* visualizerTemplate = nullptr; compositions::GuiBoundsComposition* CreateBoundsCompositionInternal(compositions::GuiBoundsComposition* decoratedComposition)override; @@ -19254,19 +19255,17 @@ Item Template (GuiGridEditorTemplate) class Factory : public controls::list::DataEditorFactory { protected: - Ptr templateFactory; - controls::list::BindableDataColumn* ownerColumn; + TemplateProperty templateFactory; public: - Factory(Ptr _templateFactory, controls::list::BindableDataColumn* _ownerColumn); + Factory(TemplateProperty _templateFactory); ~Factory(); - Ptr CreateEditor(controls::list::IDataEditorCallback* callback)override; + Ptr CreateEditor(controls::list::IDataEditorCallback* callback, const description::Value& viewModelContext)override; }; protected: - Ptr templateFactory; - controls::list::BindableDataColumn* ownerColumn = nullptr; + TemplateProperty templateFactory; GuiGridEditorTemplate* editorTemplate = nullptr; compositions::GuiBoundsComposition* CreateBoundsCompositionInternal()override; diff --git a/Import/GacUICompiler.cpp b/Import/GacUICompiler.cpp index 45713026..287a0f87 100644 --- a/Import/GacUICompiler.cpp +++ b/Import/GacUICompiler.cpp @@ -146,7 +146,7 @@ GuiInstancePropertyInfo Ptr GuiInstancePropertyInfo::AssignWithParent(Ptr typeInfo) { auto info = Assign(typeInfo); - info->tryParent = true; + info->mergability = MergeWithParent; return info; } @@ -160,7 +160,7 @@ GuiInstancePropertyInfo Ptr GuiInstancePropertyInfo::CollectionWithParent(Ptr typeInfo) { auto info = Collection(typeInfo); - info->tryParent = true; + info->mergability = MergeWithParent; return info; } @@ -188,11 +188,11 @@ IGuiInstanceLoader { } - void IGuiInstanceLoader::GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) + void IGuiInstanceLoader::GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) { } - void IGuiInstanceLoader::GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames) + void IGuiInstanceLoader::GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames) { } @@ -510,26 +510,30 @@ GuiDefaultInstanceLoader //*********************************************************************************** - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { - CollectPropertyNames(typeInfo, typeInfo.typeInfo->GetTypeDescriptor(), propertyNames); - } - - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - CTOR_PARAM_PREFIX - - if (auto ctor = GetInstanceConstructor(typeInfo.typeInfo->GetTypeDescriptor())) + if (CanCreate(typeInfo)) { - vint count = ctor->GetParameterCount(); - for (vint i = 0; i < count; i++) + CTOR_PARAM_PREFIX + + if (auto ctor = GetInstanceConstructor(typeInfo.typeInfo->GetTypeDescriptor())) { - const auto& name = ctor->GetParameter(i)->GetName(); - propertyNames.Add(GlobalStringKey::Get(CTOR_PARAM_NAME(name))); + vint count = ctor->GetParameterCount(); + for (vint i = 0; i < count; i++) + { + const auto& name = ctor->GetParameter(i)->GetName(); + propertyNames.Add(GlobalStringKey::Get(CTOR_PARAM_NAME(name))); + } } } } + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + GetRequiredPropertyNames(typeInfo, propertyNames); + CollectPropertyNames(typeInfo, typeInfo.typeInfo->GetTypeDescriptor(), propertyNames); + } + PropertyType GetPropertyTypeCached(const PropertyInfo& propertyInfo) { CTOR_PARAM_PREFIX @@ -553,7 +557,8 @@ GuiDefaultInstanceLoader const auto& name = ctor->GetParameter(i)->GetName(); if (CTOR_PARAM_NAME(name) == propertyInfo.propertyName.ToString()) { - result->scope = GuiInstancePropertyInfo::ViewModel; + result->usage = GuiInstancePropertyInfo::ConstructorArgument; + result->bindability = GuiInstancePropertyInfo::Bindable; } } } @@ -1404,6 +1409,321 @@ namespace vl using namespace workflow; using namespace workflow::analyzer; using namespace controls; + using namespace templates; + +/*********************************************************************** +GuiTemplatePropertyDeserializer +***********************************************************************/ + + class GuiTemplatePropertyDeserializer : public Object, public IGuiInstanceDeserializer + { + protected: + Ptr stringType; + + bool IsTemplatePropertyType(ITypeInfo* propType) + { + if (propType->GetDecorator() == ITypeInfo::SharedPtr) + { + auto genericType = propType->GetElementType(); + if (genericType->GetDecorator() == ITypeInfo::Generic && genericType->GetGenericArgumentCount() == 2) + { + if (genericType->GetElementType()->GetTypeDescriptor() == description::GetTypeDescriptor()) + { + if (genericType->GetGenericArgument(1)->GetTypeDescriptor() == description::GetTypeDescriptor()) + { + auto returnType = genericType->GetGenericArgument(0); + if (returnType->GetDecorator() == ITypeInfo::RawPtr) + { + if (returnType->GetElementType()->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) + { + return true; + } + } + } + } + } + } + return false; + } + + bool IsDataVisualizerFactoryType(ITypeInfo* propType) + { + return propType->GetDecorator() == ITypeInfo::SharedPtr && propType->GetTypeDescriptor() == description::GetTypeDescriptor(); + } + + bool IsDataEditorFactoryType(ITypeInfo* propType) + { + return propType->GetDecorator() == ITypeInfo::SharedPtr && propType->GetTypeDescriptor() == description::GetTypeDescriptor(); + } + + public: + GuiTemplatePropertyDeserializer() + { + stringType = TypeInfoRetriver::CreateTypeInfo(); + } + + bool CanDeserialize(description::ITypeInfo* typeInfo)override + { + return IsTemplatePropertyType(typeInfo); + } + + description::ITypeInfo* DeserializeAs(description::ITypeInfo* typeInfo)override + { + return stringType.Obj(); + } + + static void GetItemTemplateType( + types::ResolvingResult& resolvingResult, + WString typeNamesString, + List& tds, + GuiResourceTextPos tagPosition, + GuiResourceError::List& errors + ) + { + List typeNames; + SplitBySemicolon(typeNamesString, typeNames); + if (typeNames.Count() == 0) + { + errors.Add(GuiResourceError({ resolvingResult.resource }, tagPosition, + L"Precompile: Template list \"" + + typeNamesString + + L"\" cannot be empty.")); + } + + FOREACH(WString, controlTemplateName, typeNames) + { + auto controlTemplateTd = description::GetTypeDescriptor(controlTemplateName); + if (!controlTemplateTd) + { + errors.Add(GuiResourceError({ resolvingResult.resource }, tagPosition, + L"Precompile: Type \"" + + controlTemplateName + + L"\" does not exist.")); + continue; + } + tds.Add(controlTemplateTd); + } + } + + static Ptr CreateTemplateFactory( + types::ResolvingResult& resolvingResult, + List& controlTemplateTds, + ITypeInfo* templateType, + GuiResourceTextPos tagPosition, + GuiResourceError::List& errors + ) + { + auto funcCreateTemplate = MakePtr(); + funcCreateTemplate->anonymity = WfFunctionAnonymity::Anonymous; + funcCreateTemplate->returnType = GetTypeFromTypeInfo(templateType); + + 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 (!controlTemplateTd->CanConvertTo(templateType->GetTypeDescriptor())) + { + errors.Add(GuiResourceError({ resolvingResult.resource }, tagPosition, + L"Precompile: Type \"" + + controlTemplateTd->GetTypeName() + + L"\" cannot be used here because it requires \"" + + templateType->GetTypeDescriptor()->GetTypeName() + + L"\" or its derived classes.")); + } + + if (stopControlTemplateTd) + { + errors.Add(GuiResourceError({ resolvingResult.resource }, tagPosition, + 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(GuiResourceError({ resolvingResult.resource }, tagPosition, + 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(GuiResourceError({ resolvingResult.resource }, tagPosition, + 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(controlTemplateTd, TypeInfoHint::Normal); + auto pointerType = MakePtr(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(); + subBlock->statements.Add(ifStat); + 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""; + + auto cast = MakePtr(); + cast->strategy = WfTypeCastingStrategy::Strong; + cast->expression = refViewModel; + cast->type = GetTypeFromTypeInfo(viewModelType); + createControlTemplate->arguments.Add(cast); + } + + auto returnStat = MakePtr(); + returnStat->expression = createControlTemplate; + returnStatBlock->statements.Add(returnStat); + } + } + + if (!stopControlTemplateTd) + { + auto value = MakePtr(); + value->value.value = L"Cannot find a matched control template to create."; + + auto raiseStat = MakePtr(); + raiseStat->expression = value; + + block->statements.Add(raiseStat); + } + + auto expr = MakePtr(); + expr->function = funcCreateTemplate; + return expr; + } + + static Ptr CreateDataVisualizerFactory( + types::ResolvingResult& resolvingResult, + List& controlTemplateTds, + GuiResourceTextPos tagPosition, + GuiResourceError::List& errors + ) + { + auto templateType = TypeInfoRetriver::CreateTypeInfo(); + Ptr previousFactory; + FOREACH_INDEXER(ITypeDescriptor*, controlTemplateTd, index, controlTemplateTds) + { + List tds; + tds.Add(controlTemplateTd); + auto refFactory = CreateTemplateFactory(resolvingResult, tds, templateType.Obj(), tagPosition, errors); + auto createStyle = MakePtr(); + if (index == 0) + { + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + } + else + { + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + } + createStyle->arguments.Add(refFactory); + + if (index > 0) + { + createStyle->arguments.Add(previousFactory); + } + previousFactory = createStyle; + } + return previousFactory; + } + + static Ptr CreateDataEditorFactory( + types::ResolvingResult& resolvingResult, + List& controlTemplateTds, + GuiResourceTextPos tagPosition, + GuiResourceError::List& errors + ) + { + auto templateType = TypeInfoRetriver::CreateTypeInfo(); + auto refFactory = CreateTemplateFactory(resolvingResult, controlTemplateTds, templateType.Obj(), tagPosition, errors); + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createStyle->arguments.Add(refFactory); + return createStyle; + } + + Ptr Deserialize(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, description::ITypeInfo* typeInfo, Ptr valueExpression, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override + { + auto stringExpr = valueExpression.Cast(); + + List tds; + GetItemTemplateType(resolvingResult, stringExpr->value.value, tds, tagPosition, errors); + + if (IsDataVisualizerFactoryType(typeInfo)) + { + return CreateDataVisualizerFactory(resolvingResult, tds, tagPosition, errors); + } + else if (IsDataEditorFactoryType(typeInfo)) + { + return CreateDataEditorFactory(resolvingResult, tds, tagPosition, errors); + } + else + { + auto templateType = typeInfo->GetElementType()->GetGenericArgument(0); + return CreateTemplateFactory(resolvingResult, tds, templateType, tagPosition, errors); + } + } + }; /*********************************************************************** GuiItemPropertyDeserializer @@ -1661,6 +1981,7 @@ GuiPredefinedInstanceDeserializersPlugin void AfterLoad()override { IGuiInstanceLoaderManager* manager = GetInstanceLoaderManager(); + manager->AddInstanceDeserializer(new GuiTemplatePropertyDeserializer); manager->AddInstanceDeserializer(new GuiItemPropertyDeserializer); } @@ -3375,21 +3696,25 @@ GuiAxisInstanceLoader return typeName; } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { - if (typeInfo.typeName == GetTypeName()) + if (CanCreate(typeInfo)) { propertyNames.Add(_AxisDirection); } } + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + GetRequiredPropertyNames(typeInfo, propertyNames); + } + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override { if (propertyInfo.propertyName == _AxisDirection) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } return IGuiInstanceLoader::GetPropertyType(propertyInfo); @@ -3402,7 +3727,7 @@ GuiAxisInstanceLoader Ptr CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override { - if (typeName == typeInfo.typeName) + if (CanCreate(typeInfo)) { vint indexAxisDirection = arguments.Keys().IndexOf(_AxisDirection); if (indexAxisDirection != -1) @@ -3894,9 +4219,9 @@ GuiDocumentItemInstanceLoader return typeName; } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { - if (typeInfo.typeName == GetTypeName()) + if (CanCreate(typeInfo)) { propertyNames.Add(_Name); } @@ -3904,6 +4229,7 @@ GuiDocumentItemInstanceLoader void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { + GetRequiredPropertyNames(typeInfo, propertyNames); propertyNames.Add(GlobalStringKey::Empty); } @@ -3919,8 +4245,7 @@ GuiDocumentItemInstanceLoader else if (propertyInfo.propertyName == _Name) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } return IGuiInstanceLoader::GetPropertyType(propertyInfo); @@ -3934,7 +4259,7 @@ GuiDocumentItemInstanceLoader Ptr CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override { - if (typeInfo.typeName == GetTypeName()) + if (CanCreate(typeInfo)) { vint indexName = arguments.Keys().IndexOf(_Name); if (indexName != -1) @@ -4018,22 +4343,25 @@ GuiDocumentItemInstanceLoader }; /*********************************************************************** -GuiDocumentViewerInstanceLoader +GuiDocumentInstanceLoaderBase ***********************************************************************/ -#define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiDocumentViewerInstanceLoader : public BASE_TYPE + template + class GuiDocumentInstanceLoaderBase : public TBaseType { public: - GuiDocumentViewerInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateDocumentViewerStyle") + using PropertyInfo = IGuiInstanceLoader::PropertyInfo; + using ArgumentMap = IGuiInstanceLoader::ArgumentMap; + + GuiDocumentInstanceLoaderBase(const WString& _typeName, const WString& _styleMethod) + :TBaseType(_typeName, _styleMethod) { } void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { propertyNames.Add(GlobalStringKey::Empty); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); + TBaseType::GetPropertyNames(typeInfo, propertyNames); } Ptr GetPropertyType(const PropertyInfo& propertyInfo)override @@ -4042,7 +4370,7 @@ GuiDocumentViewerInstanceLoader { return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver>::CreateTypeInfo()); } - return BASE_TYPE::GetPropertyType(propertyInfo); + return TBaseType::GetPropertyType(propertyInfo); } Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override @@ -4075,7 +4403,21 @@ GuiDocumentViewerInstanceLoader { return block; } - return BASE_TYPE::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); + return TBaseType::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); + } + }; + +/*********************************************************************** +GuiDocumentViewerInstanceLoader +***********************************************************************/ + +#define BASE_TYPE GuiTemplateControlInstanceLoader + class GuiDocumentViewerInstanceLoader : public GuiDocumentInstanceLoaderBase + { + public: + GuiDocumentViewerInstanceLoader() + :GuiDocumentInstanceLoaderBase(description::TypeInfo::content.typeName, L"CreateDocumentViewerStyle") + { } }; #undef BASE_TYPE @@ -4085,61 +4427,13 @@ GuiDocumentLabelInstanceLoader ***********************************************************************/ #define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiDocumentLabelInstanceLoader : public BASE_TYPE + class GuiDocumentLabelInstanceLoader : public GuiDocumentInstanceLoaderBase { public: GuiDocumentLabelInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateDocumentLabelStyle") + :GuiDocumentInstanceLoaderBase(description::TypeInfo::content.typeName, L"CreateDocumentLabelStyle") { } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver>::CreateTypeInfo()); - } - return BASE_TYPE::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override - { - auto block = MakePtr(); - - FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) - { - const auto& values = arguments.GetByIndex(index); - if (prop == GlobalStringKey::Empty) - { - 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 BASE_TYPE::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); - } }; #undef BASE_TYPE @@ -4172,53 +4466,43 @@ namespace vl namespace instance_loaders { - template - Ptr CreateSetControlTemplateStyle(types::ResolvingResult& resolvingResult, GlobalStringKey variableName, Ptr argument, const IGuiInstanceLoader::TypeInfo& controlTypeInfo, const WString& propertyName, GuiResourceTextPos attPosition, GuiResourceError::List& errors) + template + Ptr CreateSetControlTemplateStyle(types::ResolvingResult& resolvingResult, GlobalStringKey variableName, Ptr argument, const WString& propertyName) { - using Helper = GuiTemplateControlInstanceLoader; - List controlTemplateTds; - Helper::GetItemTemplateType(resolvingResult, argument, controlTemplateTds, controlTypeInfo, GlobalStringKey::_ItemTemplate.ToString(), attPosition, errors); + auto createStyle = MakePtr(); + createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); + createStyle->arguments.Add(argument); - if (controlTemplateTds.Count() > 0) - { - auto refFactory = Helper::CreateTemplateFactory(resolvingResult, controlTemplateTds, attPosition, errors); - auto createStyle = MakePtr(); - createStyle->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); - createStyle->arguments.Add(refFactory); + auto refControl = MakePtr(); + refControl->name.value = variableName.ToString(); - auto refControl = MakePtr(); - refControl->name.value = variableName.ToString(); + auto refStyleProvider = MakePtr(); + refStyleProvider->parent = refControl; + refStyleProvider->name.value = propertyName; - auto refStyleProvider = MakePtr(); - refStyleProvider->parent = refControl; - refStyleProvider->name.value = propertyName; + auto assign = MakePtr(); + assign->op = WfBinaryOperator::Assign; + assign->first = refStyleProvider; + assign->second = createStyle; - auto assign = MakePtr(); - assign->op = WfBinaryOperator::Assign; - assign->first = refStyleProvider; - assign->second = createStyle; - - auto stat = MakePtr(); - stat->expression = assign; - return stat; - } - - return nullptr; + auto stat = MakePtr(); + stat->expression = assign; + return stat; } /*********************************************************************** -GuiSelectableListControlInstanceLoader +GuiVirtualTextListControlInstanceLoader ***********************************************************************/ - class GuiSelectableListControlInstanceLoader : public Object, public IGuiInstanceLoader + class GuiVirtualTextListControlInstanceLoader : public Object, public IGuiInstanceLoader { protected: GlobalStringKey typeName; public: - GuiSelectableListControlInstanceLoader() + GuiVirtualTextListControlInstanceLoader() { - typeName = GlobalStringKey::Get(description::TypeInfo::content.typeName); + typeName = GlobalStringKey::Get(description::TypeInfo::content.typeName); } GlobalStringKey GetTypeName()override @@ -4235,7 +4519,7 @@ GuiSelectableListControlInstanceLoader { if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) { - auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver>::CreateTypeInfo()); return info; } return IGuiInstanceLoader::GetPropertyType(propertyInfo); @@ -4250,66 +4534,7 @@ GuiSelectableListControlInstanceLoader const auto& values = arguments.GetByIndex(index); if (prop == GlobalStringKey::_ItemTemplate) { - if (auto stat = CreateSetControlTemplateStyle(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, typeInfo, L"StyleProvider", attPosition, 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::content.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(TypeInfoRetriver::CreateTypeInfo()); - return info; - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::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(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, typeInfo, L"NodeStyleProvider", attPosition, errors)) + if (auto stat = CreateSetControlTemplateStyle(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, L"StyleProvider")) { block->statements.Add(stat); } @@ -4349,14 +4574,20 @@ GuiComboBoxInstanceLoader _ListControl = GlobalStringKey::Get(L"ListControl"); } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { - if (typeInfo.typeName == GetTypeName()) + if (CanCreate(typeInfo)) { propertyNames.Add(_ListControl); - propertyNames.Add(GlobalStringKey::_ItemTemplate); } - BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); + BASE_TYPE::GetRequiredPropertyNames(typeInfo, propertyNames); + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + GetRequiredPropertyNames(typeInfo, propertyNames); + propertyNames.Add(GlobalStringKey::_ItemTemplate); + BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); } Ptr GetPropertyType(const PropertyInfo& propertyInfo)override @@ -4364,13 +4595,12 @@ GuiComboBoxInstanceLoader if (propertyInfo.propertyName == _ListControl) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->required = true; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } else if (propertyInfo.propertyName == GlobalStringKey::_ItemTemplate) { - auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver>::CreateTypeInfo()); return info; } return BASE_TYPE::GetPropertyType(propertyInfo); @@ -4385,7 +4615,7 @@ GuiComboBoxInstanceLoader const auto& values = arguments.GetByIndex(index); if (prop == GlobalStringKey::_ItemTemplate) { - if (auto stat = CreateSetControlTemplateStyle(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, typeInfo, L"StyleProvider", attPosition, errors)) + if (auto stat = CreateSetControlTemplateStyle(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, L"StyleProvider")) { block->statements.Add(stat); } @@ -4543,14 +4773,14 @@ GuiListViewInstanceLoader _IconSize = GlobalStringKey::Get(L"IconSize"); } - void GetConstructorParameters(const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override + void GetPropertyNames(const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override { - if (typeInfo.typeName == BASE_TYPE::GetTypeName()) + if (CanCreate(typeInfo)) { propertyNames.Add(_View); propertyNames.Add(_IconSize); } - BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); + BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); } Ptr GetPropertyType(const typename BASE_TYPE::PropertyInfo& propertyInfo)override @@ -4558,13 +4788,13 @@ GuiListViewInstanceLoader if (propertyInfo.propertyName == _View) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } else if (propertyInfo.propertyName == _IconSize) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; return info; } return BASE_TYPE::GetPropertyType(propertyInfo); @@ -4580,6 +4810,65 @@ GuiListViewInstanceLoader { }; +/*********************************************************************** +GuiVirtualTreeViewInstanceLoader +***********************************************************************/ + + class GuiVirtualTreeViewInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + + public: + GuiVirtualTreeViewInstanceLoader() + { + typeName = GlobalStringKey::Get(description::TypeInfo::content.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(TypeInfoRetriver>::CreateTypeInfo()); + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::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(resolvingResult, variableName, arguments.GetByIndex(index)[0].expression, L"NodeStyleProvider")) + { + block->statements.Add(stat); + } + } + } + + if (block->statements.Count() > 0) + { + return block; + } + return nullptr; + } + }; + /*********************************************************************** GuiTreeViewInstanceLoader ***********************************************************************/ @@ -4639,6 +4928,10 @@ GuiTreeViewInstanceLoader void GetPropertyNames(const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override { + if (CanCreate(typeInfo)) + { + propertyNames.Add(_IconSize); + } if (!bindable) { propertyNames.Add(_Nodes); @@ -4646,30 +4939,21 @@ GuiTreeViewInstanceLoader BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); } - void GetConstructorParameters(const typename BASE_TYPE::TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == BASE_TYPE::GetTypeName()) - { - propertyNames.Add(_IconSize); - } - BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); - } - Ptr GetPropertyType(const typename BASE_TYPE::PropertyInfo& propertyInfo)override { - if (propertyInfo.propertyName == _Nodes) + if (propertyInfo.propertyName == _IconSize) + { + auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); + info->usage = GuiInstancePropertyInfo::ConstructorArgument; + return info; + } + else if (propertyInfo.propertyName == _Nodes) { if (!bindable) { return GuiInstancePropertyInfo::Collection(TypeInfoRetriver>::CreateTypeInfo()); } } - else if (propertyInfo.propertyName == _IconSize) - { - auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - return info; - } return BASE_TYPE::GetPropertyType(propertyInfo); } @@ -4733,183 +5017,6 @@ GuiTreeViewInstanceLoader } }; -/*********************************************************************** -GuiBindableTextListInstanceLoader -***********************************************************************/ - -#define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiBindableTextListInstanceLoader : public BASE_TYPE - { - public: - GuiBindableTextListInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateTextListStyle", L"CreateTextListItemStyle") - { - } - - GlobalStringKey GetTypeName()override - { - return typeName; - } - }; -#undef BASE_TYPE - -/*********************************************************************** -GuiBindableDataColumnInstanceLoader -***********************************************************************/ - - class GuiBindableDataColumnInstanceLoader : public Object, public IGuiInstanceLoader - { - protected: - GlobalStringKey typeName; - GlobalStringKey _VisualizerTemplates; - GlobalStringKey _EditorTemplate; - - public: - GuiBindableDataColumnInstanceLoader() - { - typeName = GlobalStringKey::Get(description::TypeInfo::content.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(TypeInfoRetriver::CreateTypeInfo()); - } - else if (propertyInfo.propertyName == _EditorTemplate) - { - return GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override - { - auto block = MakePtr(); - - FOREACH_INDEXER(GlobalStringKey, prop, index, arguments.Keys()) - { - if (prop == _VisualizerTemplates) - { - using Helper = GuiTemplateControlInstanceLoader; - List controlTemplateTds; - Helper::GetItemTemplateType(resolvingResult, arguments.GetByIndex(index)[0].expression, controlTemplateTds, typeInfo, _EditorTemplate.ToString(), attPosition, errors); - - if (controlTemplateTds.Count() > 0) - { - FOREACH_INDEXER(ITypeDescriptor*, controlTemplateTd, index, controlTemplateTds) - { - auto refFactory = Helper::CreateTemplateFactory(resolvingResult, controlTemplateTd, attPosition, 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"VisualizerFactory"; - - 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(resolvingResult, arguments.GetByIndex(index)[0].expression, controlTemplateTds, typeInfo, _EditorTemplate.ToString(), attPosition, errors); - - if (controlTemplateTds.Count() > 0) - { - auto refFactory = Helper::CreateTemplateFactory(resolvingResult, controlTemplateTds, attPosition, 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 ***********************************************************************/ @@ -4952,32 +5059,24 @@ GuiBindableDataGridInstanceLoader void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { + propertyNames.Add(_ViewModelContext); propertyNames.Add(_Columns); BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - if (typeInfo.typeName == GetTypeName()) - { - propertyNames.Add(_ViewModelContext); - } - BASE_TYPE::GetConstructorParameters(typeInfo, propertyNames); - } - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override { - if (propertyInfo.propertyName == _Columns) - { - return GuiInstancePropertyInfo::Collection(TypeInfoRetriver>::CreateTypeInfo()); - } - else if (propertyInfo.propertyName == _ViewModelContext) + if (propertyInfo.propertyName == _ViewModelContext) { auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->bindable = true; + info->usage = GuiInstancePropertyInfo::ConstructorArgument; + info->bindability = GuiInstancePropertyInfo::Bindable; return info; } + else if (propertyInfo.propertyName == _Columns) + { + return GuiInstancePropertyInfo::Collection(TypeInfoRetriver>::CreateTypeInfo()); + } return BASE_TYPE::GetPropertyType(propertyInfo); } @@ -5075,7 +5174,7 @@ GuiTreeNodeInstanceLoader Ptr CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override { - if (typeInfo.typeName == GetTypeName()) + if (CanCreate(typeInfo)) { auto createItem = MakePtr(); createItem->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); @@ -5204,18 +5303,15 @@ Initialization new GuiComboBoxInstanceLoader ); - manager->SetLoader(new GuiSelectableListControlInstanceLoader); - manager->SetLoader(new GuiVirtualTreeViewInstanceLoader); + manager->SetLoader(new GuiVirtualTextListControlInstanceLoader); manager->SetLoader(new GuiListViewInstanceLoader); manager->SetLoader(new GuiBindableListViewInstanceLoader); + manager->SetLoader(new GuiVirtualTreeViewInstanceLoader); manager->SetLoader(new GuiTreeViewInstanceLoader); manager->SetLoader(new GuiBindableTreeViewInstanceLoader); - manager->SetLoader(new GuiBindableTextListInstanceLoader); - - manager->SetLoader(new GuiBindableDataColumnInstanceLoader); manager->SetLoader(new GuiBindableDataGridInstanceLoader); manager->CreateVirtualType( @@ -5232,6 +5328,61 @@ Initialization /*********************************************************************** INSTANCELOADERS\GUIINSTANCELOADER_PLUGIN.CPP ***********************************************************************/ +/* +GuiInstanceLoader_Plugin.cpp + GuiControl + default: GuiControl*, GuiGraphicsComposition* + GuiInstanceRootObject + default: GuiComponent* +GuiInstanceLoader_TemplateControl + GuiControl + ctor: ControlTemplate(ItemTemplate) +GuiInstanceLoader_Compositions.cpp + GuiAxis + ctor: AxisDirection + GuiComposition + default: GuiControl*, GuiGraphicsComposition*, Ptr + GuiTableComposition + Rows, Columns: array(GuiCellOption) + GuiCellComposition + Site: SiteValue +GuiInstanceLoader_Document.cpp + GuiDocumentItem + default: GuiControl*, GuiGraphicsComposition* + GuiDocumentViewer, GuiDocumentLable + default: Ptr +GuiInstanceLoader_List.cpp + GuiVirtualTextList + ItemTemplate: TemplateProperty + GuiComboBox + ItemTemplate: TemplateProperty + GuiListView, GuiBindableListView + ctor: View(ListViewViewType), IconSize(Size) + GuiVirtualTreeView + ItemTemplate: TemplateProperty + GuiTreeView, GuiBindableTreeView + ctor: IconSize(Size) + Nodes: array(Ptr) + GuiBindableDataGrid + ctor: ViewModelContext + Columns: collection(Ptr) + tree::TreeNode + Text, Image, Tag +GuiInstanceLoader_Tab.cpp + GuiTab + default: GuiTabPage* + GuiTabPage + default: GuiControl*, GuiGraphicsComposition* +GuiInstanceLoader_Templates.cpp + GuiTemplate + ctor: \w+(ItemTemplate) +GuiInstanceLoader_Toolstrip.cpp + GuiToolstripMenu, GuiToolstripMenuBar, GuiToolstripToolBar + default: collection(GuiControl*) + GuiToolstripButton + SubMenu-set: GuiToolstripMenu* +*/ + namespace vl { @@ -5504,6 +5655,7 @@ GuiPredefinedInstanceLoadersPlugin ADD_TEMPLATE_CONTROL ( GuiScrollContainer, CreateScrollContainerStyle, GuiScrollViewTemplate ); ADD_TEMPLATE_CONTROL ( GuiWindow, CreateWindowStyle, GuiWindowTemplate ); ADD_TEMPLATE_CONTROL_2 ( GuiTextList, CreateTextListStyle, CreateTextListItemStyle, GuiTextListTemplate ); + ADD_TEMPLATE_CONTROL_2 ( GuiBindableTextList, CreateTextListStyle, CreateTextListItemStyle, GuiTextListTemplate ); ADD_TEMPLATE_CONTROL ( GuiMultilineTextBox, CreateMultilineTextBoxStyle, GuiMultilineTextBoxTemplate ); ADD_TEMPLATE_CONTROL ( GuiSinglelineTextBox, CreateTextBoxStyle, GuiSinglelineTextBoxTemplate ); ADD_TEMPLATE_CONTROL ( GuiDatePicker, CreateDatePickerStyle, GuiDatePickerTemplate ); @@ -5789,7 +5941,7 @@ GuiTemplateInstanceLoader return typeName; } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override { List tds; tds.Add(typeInfo.typeInfo->GetTypeDescriptor()); @@ -5797,132 +5949,28 @@ GuiTemplateInstanceLoader for (vint i = 0; i < tds.Count(); i++) { auto td = tds[i]; - vint propCount = td->GetPropertyCount(); - for (vint i = 0; i < propCount; i++) + if (td != description::GetTypeDescriptor()) { - auto prop = td->GetProperty(i); - if (prop->IsWritable() && prop->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor()) + vint propCount = td->GetPropertyCount(); + for (vint i = 0; i < propCount; i++) { - propertyNames.Add(GlobalStringKey::Get(prop->GetName())); + auto prop = td->GetProperty(i); + if (prop->IsWritable() && INVLOC.EndsWith(prop->GetName(), L"Template", Locale::None)) + { + propertyNames.Add(GlobalStringKey::Get(prop->GetName())); + } + } + + vint baseCount = td->GetBaseTypeDescriptorCount(); + for (vint i = 0; i < baseCount; i++) + { + auto baseTd = td->GetBaseTypeDescriptor(i); + if (!tds.Contains(baseTd)) + { + tds.Add(baseTd); + } } } - - vint baseCount = td->GetBaseTypeDescriptorCount(); - for (vint i = 0; i < baseCount; i++) - { - auto baseTd = td->GetBaseTypeDescriptor(i); - if (!tds.Contains(baseTd)) - { - tds.Add(baseTd); - } - } - } - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (auto prop = propertyInfo.typeInfo.typeInfo->GetTypeDescriptor()->GetPropertyByName(propertyInfo.propertyName.ToString(), true)) - { - if (prop->IsWritable() && prop->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor()) - { - auto info = GuiInstancePropertyInfo::Assign(TypeInfoRetriver::CreateTypeInfo()); - info->scope = GuiInstancePropertyInfo::Constructor; - info->bindable = false; - - if (prop->GetOwnerTypeDescriptor() != description::GetTypeDescriptor()) - { - info->required = true; - } - return info; - } - } - return IGuiInstanceLoader::GetPropertyType(propertyInfo); - } - - bool CanCreate(const TypeInfo& typeInfo)override - { - if (typeInfo.typeInfo->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) - { - auto group = typeInfo.typeInfo->GetTypeDescriptor()->GetConstructorGroup(); - if (group && group->GetMethodCount() == 1) - { - auto ctor = group->GetMethod(0); - if (ctor->GetParameterCount() == 0) - { - return true; - } - } - } - return false; - } - - Ptr CreateInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos tagPosition, GuiResourceError::List& errors)override - { - if (!CanCreate(typeInfo)) - { - return nullptr; - } - - auto block = MakePtr(); - { - auto createExpr = MakePtr(); - createExpr->type = GetTypeFromTypeInfo(MakePtr(typeInfo.typeInfo->GetTypeDescriptor(), TypeInfoHint::Normal).Obj()); - - 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; - block->statements.Add(assignStat); - } - - if (auto stat = InitializeRootInstance(precompileContext, resolvingResult, typeInfo, variableName, arguments, errors)) - { - CopyFrom(block->statements, stat.Cast()->statements, true); - } - return block; - } - - Ptr InitializeRootInstance(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceError::List& errors)override - { - if (arguments.Count() > 0) - { - auto block = MakePtr(); - using Helper = GuiTemplateControlInstanceLoader; - - FOREACH_INDEXER(GlobalStringKey, propKey, index, arguments.Keys()) - { - List tds; - auto argument = arguments.GetByIndex(index)[0]; - Helper::GetItemTemplateType(resolvingResult, argument.expression, tds, typeInfo, propKey.ToString(), argument.attPosition, errors); - auto refFactory = Helper::CreateTemplateFactory(resolvingResult, tds, argument.attPosition, errors); - - auto refVariable = MakePtr(); - refVariable->name.value = variableName.ToString(); - - auto member = MakePtr(); - member->parent = refVariable; - member->name.value = propKey.ToString(); - - auto assignExpr = MakePtr(); - assignExpr->op = WfBinaryOperator::Assign; - assignExpr->first = member; - assignExpr->second = refFactory; - - auto assignStat = MakePtr(); - assignStat->expression = assignExpr; - block->statements.Add(assignStat); - } - return block; - } - else - { - return nullptr; } } }; @@ -6002,12 +6050,61 @@ namespace vl return nullptr; } +/*********************************************************************** +GuiToolstripInstanceLoaderBase +***********************************************************************/ + + template + class GuiToolstripInstanceLoaderBase : public TBaseType + { + public: + using ArgumentMap = IGuiInstanceLoader::ArgumentMap; + using PropertyInfo = IGuiInstanceLoader::PropertyInfo; + + GuiToolstripInstanceLoaderBase(const WString& _typeName, const WString& _styleMethod, Ptr(*_argumentFunction)(ArgumentMap&)) + :TBaseType(_typeName, _styleMethod, _argumentFunction) + { + } + + GuiToolstripInstanceLoaderBase(const WString& _typeName, const WString& _styleMethod) + :TBaseType(_typeName, _styleMethod) + { + } + + void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + propertyNames.Add(GlobalStringKey::Empty); + TBaseType::GetPropertyNames(typeInfo, propertyNames); + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == GlobalStringKey::Empty) + { + return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver::CreateTypeInfo()); + } + return TBaseType::GetPropertyType(propertyInfo); + } + + Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override + { + if (auto statement = AddControlToToolstrip(variableName, arguments, errors)) + { + return statement; + } + else + { + return TBaseType::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); + } + } + }; + /*********************************************************************** GuiToolstripMenuInstanceLoader ***********************************************************************/ #define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiToolstripMenuInstanceLoader : public BASE_TYPE + class GuiToolstripMenuInstanceLoader : public GuiToolstripInstanceLoaderBase { public: static Ptr ArgumentFunction(ArgumentMap&) @@ -6018,36 +6115,9 @@ GuiToolstripMenuInstanceLoader } public: GuiToolstripMenuInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateMenuStyle", ArgumentFunction) + :GuiToolstripInstanceLoaderBase(description::TypeInfo::content.typeName, L"CreateMenuStyle", ArgumentFunction) { } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver::CreateTypeInfo()); - } - return BASE_TYPE::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override - { - if (auto statement = AddControlToToolstrip(variableName, arguments, errors)) - { - return statement; - } - else - { - return BASE_TYPE::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); - } - } }; #undef BASE_TYPE @@ -6056,40 +6126,13 @@ GuiToolstripMenuBarInstanceLoader ***********************************************************************/ #define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiToolstripMenuBarInstanceLoader : public BASE_TYPE + class GuiToolstripMenuBarInstanceLoader : public GuiToolstripInstanceLoaderBase { public: GuiToolstripMenuBarInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateMenuBarStyle") + :GuiToolstripInstanceLoaderBase(description::TypeInfo::content.typeName, L"CreateMenuBarStyle") { } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver::CreateTypeInfo()); - } - return BASE_TYPE::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override - { - if (auto statement = AddControlToToolstrip(variableName, arguments, errors)) - { - return statement; - } - else - { - return BASE_TYPE::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); - } - } }; #undef BASE_TYPE @@ -6098,40 +6141,13 @@ GuiToolstripToolBarInstanceLoader ***********************************************************************/ #define BASE_TYPE GuiTemplateControlInstanceLoader - class GuiToolstripToolBarInstanceLoader : public BASE_TYPE + class GuiToolstripToolBarInstanceLoader : public GuiToolstripInstanceLoaderBase { public: GuiToolstripToolBarInstanceLoader() - :BASE_TYPE(description::TypeInfo::content.typeName, L"CreateToolBarStyle") + :GuiToolstripInstanceLoaderBase(description::TypeInfo::content.typeName, L"CreateToolBarStyle") { } - - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - propertyNames.Add(GlobalStringKey::Empty); - BASE_TYPE::GetPropertyNames(typeInfo, propertyNames); - } - - Ptr GetPropertyType(const PropertyInfo& propertyInfo)override - { - if (propertyInfo.propertyName == GlobalStringKey::Empty) - { - return GuiInstancePropertyInfo::CollectionWithParent(TypeInfoRetriver::CreateTypeInfo()); - } - return BASE_TYPE::GetPropertyType(propertyInfo); - } - - Ptr AssignParameters(GuiResourcePrecompileContext& precompileContext, types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceTextPos attPosition, GuiResourceError::List& errors)override - { - if (auto statement = AddControlToToolstrip(variableName, arguments, errors)) - { - return statement; - } - else - { - return BASE_TYPE::AssignParameters(precompileContext, resolvingResult, typeInfo, variableName, arguments, attPosition, errors); - } - } }; #undef BASE_TYPE @@ -7934,7 +7950,7 @@ Workflow_GetPropertyTypes } } - if (!propertyTypeInfo->tryParent) + if (propertyTypeInfo->mergability == GuiInstancePropertyInfo::NotMerge) { break; } @@ -8140,9 +8156,9 @@ WorkflowReferenceNamesVisitor auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding); if (binder) { - if (possibleInfos[0].info->scope == GuiInstancePropertyInfo::Constructor) + if (possibleInfos[0].info->usage == GuiInstancePropertyInfo::ConstructorArgument) { - if (!possibleInfos[0].info->bindable) + if (possibleInfos[0].info->bindability == GuiInstancePropertyInfo::NotBindable) { errors.Add(GuiResourceError({ resolvingResult.resource }, setter->attPosition, errorPrefix + @@ -8208,15 +8224,33 @@ WorkflowReferenceNamesVisitor if (resolvingResult.context->instance.Obj() != repr) { - List ctorProps; - loader->GetConstructorParameters(resolvedTypeInfo, ctorProps); - FOREACH(GlobalStringKey, prop, ctorProps) + List requiredProps; { - auto info = loader->GetPropertyType(IGuiInstanceLoader::PropertyInfo(resolvedTypeInfo, prop)); - if (info->required && !properties.Contains(prop, loader)) + auto currentLoader = loader; + while (currentLoader) { + currentLoader->GetRequiredPropertyNames(resolvedTypeInfo, requiredProps); + currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); + } + } + FOREACH(GlobalStringKey, prop, From(requiredProps).Distinct()) + { + if (!properties.Keys().Contains(prop)) + { + Ptr info; + { + auto currentLoader = loader; + while (currentLoader && !info) + { + info = currentLoader->GetPropertyType({ resolvedTypeInfo, prop }); + currentLoader = GetInstanceLoaderManager()->GetParentLoader(currentLoader); + } + } + errors.Add(GuiResourceError({ resolvingResult.resource }, repr->tagPosition, - L"Precompile: Missing constructor argument \"" + + L"Precompile: Missing required " + + WString(info->usage == GuiInstancePropertyInfo::ConstructorArgument ? L"constructor argument" : L"required property") + + L" \"" + prop.ToString() + L"\" of type \"" + resolvedTypeInfo.typeName.ToString() + @@ -8419,7 +8453,16 @@ WorkflowReferenceNamesVisitor if (repr == resolvingResult.context->instance.Obj()) { List propertyNames; - loader->GetConstructorParameters(resolvedTypeInfo, propertyNames); + loader->GetPropertyNames(resolvedTypeInfo, propertyNames); + for (vint i = propertyNames.Count() - 1; i >= 0; i--) + { + auto info = loader->GetPropertyType({ resolvedTypeInfo, propertyNames[i] }); + if (!info || info->usage == GuiInstancePropertyInfo::Property) + { + propertyNames.RemoveAt(i); + } + } + if (propertyNames.Count() == 1) { if (propertyNames[0] != GlobalStringKey::_ControlTemplate) @@ -8543,7 +8586,7 @@ WorkflowGenerateBindingVisitor if (auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding)) { auto propertyResolving = resolvingResult.propertyResolvings[setter->values[0].Obj()]; - if (propertyResolving.info->scope == GuiInstancePropertyInfo::Property) + if (propertyResolving.info->usage == GuiInstancePropertyInfo::Property) { WString expressionCode = setter->values[0].Cast()->text; auto instancePropertyInfo = reprTypeInfo.typeInfo->GetTypeDescriptor()->GetPropertyByName(propertyName.ToString(), true); @@ -8973,7 +9016,7 @@ WorkflowGenerateCreatingVisitor FOREACH(Ptr, value, setter->values) { auto info = resolvingResult.propertyResolvings[value.Obj()]; - if (info.info->scope == GuiInstancePropertyInfo::Property) + if (info.info->usage == GuiInstancePropertyInfo::Property) { if (info.info->support == GuiInstancePropertyInfo::SupportCollection) { @@ -9003,51 +9046,53 @@ WorkflowGenerateCreatingVisitor void FillCtorArguments(GuiConstructorRepr* repr, IGuiInstanceLoader* loader, const IGuiInstanceLoader::TypeInfo& typeInfo, IGuiInstanceLoader::ArgumentMap& arguments) { List ctorProps; - loader->GetConstructorParameters(typeInfo, ctorProps); + loader->GetPropertyNames(typeInfo, ctorProps); WORKFLOW_ENVIRONMENT_VARIABLE_ADD 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(setter->attPosition, value.Obj()); - if (argument.typeInfo && argument.expression) - { - arguments.Add(prop, argument); - } - } - } - else if (auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding)) - { - auto propInfo = IGuiInstanceLoader::PropertyInfo(typeInfo, prop); - auto resolvedPropInfo = loader->GetPropertyType(propInfo); - auto value = setter->values[0].Cast(); - if (auto expression = binder->GenerateConstructorArgument(precompileContext, resolvingResult, loader, propInfo, resolvedPropInfo, value->text, value->tagPosition, errors)) - { - Workflow_RecordScriptPosition(precompileContext, value->tagPosition, expression); + auto propInfo = loader->GetPropertyType({ typeInfo,prop }); + if (propInfo->usage != GuiInstancePropertyInfo::ConstructorArgument) continue; - IGuiInstanceLoader::ArgumentInfo argument; - argument.expression = expression; - argument.typeInfo = resolvedPropInfo->acceptableTypes[0]; - argument.attPosition = setter->attPosition; + auto index = repr->setters.Keys().IndexOf(prop); + if (index == -1) continue; + + auto setter = repr->setters.Values()[index]; + if (setter->binding == GlobalStringKey::Empty) + { + FOREACH(Ptr, value, setter->values) + { + auto argument = GetArgumentInfo(setter->attPosition, value.Obj()); + if (argument.typeInfo && argument.expression) + { arguments.Add(prop, argument); } } - else + } + else if (auto binder = GetInstanceLoaderManager()->GetInstanceBinder(setter->binding)) + { + auto propInfo = IGuiInstanceLoader::PropertyInfo(typeInfo, prop); + auto resolvedPropInfo = loader->GetPropertyType(propInfo); + auto value = setter->values[0].Cast(); + if (auto expression = binder->GenerateConstructorArgument(precompileContext, resolvingResult, loader, propInfo, resolvedPropInfo, value->text, value->tagPosition, errors)) { - errors.Add(GuiResourceError({ resolvingResult.resource }, setter->attPosition, - L"[INTERNAL ERROR] Precompile: The appropriate IGuiInstanceBinder of binding \"-" + - setter->binding.ToString() + - L"\" cannot be found.")); + Workflow_RecordScriptPosition(precompileContext, value->tagPosition, expression); + + IGuiInstanceLoader::ArgumentInfo argument; + argument.expression = expression; + argument.typeInfo = resolvedPropInfo->acceptableTypes[0]; + argument.attPosition = setter->attPosition; + arguments.Add(prop, argument); } } + else + { + errors.Add(GuiResourceError({ resolvingResult.resource }, setter->attPosition, + L"[INTERNAL ERROR] Precompile: The appropriate IGuiInstanceBinder of binding \"-" + + setter->binding.ToString() + + L"\" cannot be found.")); + } } WORKFLOW_ENVIRONMENT_VARIABLE_REMOVE diff --git a/Import/GacUICompiler.h b/Import/GacUICompiler.h index a2a73c6e..8814325d 100644 --- a/Import/GacUICompiler.h +++ b/Import/GacUICompiler.h @@ -483,18 +483,28 @@ Instance Loader SupportSet, }; - enum PropertyScope + enum PropertyUsage { - ViewModel, // - Constructor, // constructor parameter that is not ViewModel - Property, // property of the class + ConstructorArgument, + Property, + }; + + enum PropertyBindability + { + Bindable, + NotBindable, + }; + + enum PropertyMergability + { + MergeWithParent, + NotMerge, }; Support support = NotSupport; - bool tryParent = false; - bool required = false; // only apply to constructor - bool bindable = false; // only apply to constructor - PropertyScope scope = Property; + PropertyUsage usage = Property; + PropertyBindability bindability = NotBindable; + PropertyMergability mergability = NotMerge; TypeInfoList acceptableTypes; static Ptr Unsupported(); @@ -565,8 +575,8 @@ Instance Loader virtual GlobalStringKey GetTypeName() = 0; virtual void ClearReflectionCache(); + virtual void GetRequiredPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames); 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); @@ -1006,10 +1016,6 @@ GuiVrtualTypeInstanceLoader ArgumentFunctionType argumentFunction; InitFunctionType initFunction; - virtual void PrepareAdditionalArguments(types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceError::List& errors, Ptr block) - { - } - virtual void AddAdditionalArguments(types::ResolvingResult& resolvingResult, const TypeInfo& typeInfo, GlobalStringKey variableName, ArgumentMap& arguments, GuiResourceError::List& errors, Ptr createControl) { } @@ -1071,247 +1077,6 @@ GuiVrtualTypeInstanceLoader } } - static Ptr CreateTemplateFactory(types::ResolvingResult& resolvingResult, List& controlTemplateTds, GuiResourceTextPos attPosition, GuiResourceError::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(TypeInfoRetriver::CreateTypeInfo().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(GuiResourceError({ resolvingResult.resource }, attPosition, - 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(GuiResourceError({ resolvingResult.resource }, attPosition, - 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(GuiResourceError({ resolvingResult.resource }, attPosition, - 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(controlTemplateTd, TypeInfoHint::Normal); - auto pointerType = MakePtr(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(); - subBlock->statements.Add(ifStat); - 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""; - - auto cast = MakePtr(); - cast->strategy = WfTypeCastingStrategy::Strong; - cast->expression = refViewModel; - cast->type = GetTypeFromTypeInfo(viewModelType); - createControlTemplate->arguments.Add(cast); - } - - auto varTemplate = MakePtr(); - varTemplate->type = GetTypeFromTypeInfo(templateType.Obj()); - varTemplate->name.value = L"