diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index a18fe0f0..14325226 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -8429,6 +8429,14 @@ NodeItemProvider { return -2; } + if (index == -1) + { + // Parent returned -1, which means parent has no parent (is a root node) + // Check if this parent is OUR root - if not, this is a foreign node +#define ERROR_MESSAGE_PREFIX L"vl::presentation::controls::tree::NodeItemProvider::CalculateNodeVisibilityIndexInternal(INodeProvider*)#" + CHECK_ERROR(parent.Obj() == root->GetRootNode().Obj(), ERROR_MESSAGE_PREFIX L"The node does not belong to the tree associated with this NodeItemProvider."); +#undef ERROR_MESSAGE_PREFIX + } vint count = parent->GetChildCount(); for (vint i = 0; i < count; i++) @@ -8451,24 +8459,6 @@ NodeItemProvider return -1; } - vint NodeItemProvider::CalculateNodeVisibilityIndex(INodeProvider* node) - { - vint result = CalculateNodeVisibilityIndexInternal(node); - return result < 0 ? -1 : result; - } - - Ptr NodeItemProvider::RequestNode(vint index) - { - if(root->CanGetNodeByVisibleIndex()) - { - return root->GetNodeByVisibleIndex(index+1); - } - else - { - return GetNodeByOffset(root->GetRootNode(), index+1); - } - } - NodeItemProvider::NodeItemProvider(Ptr _root) :root(_root) { @@ -8485,6 +8475,28 @@ NodeItemProvider return root; } + Ptr NodeItemProvider::RequestNode(vint index) + { + if (index < 0 || index >= Count()) + { + return nullptr; + } + else if (root->CanGetNodeByVisibleIndex()) + { + return root->GetNodeByVisibleIndex(index + 1); + } + else + { + return GetNodeByOffset(root->GetRootNode(), index + 1); + } + } + + vint NodeItemProvider::CalculateNodeVisibilityIndex(INodeProvider* node) + { + vint result = CalculateNodeVisibilityIndexInternal(node); + return result < 0 ? -1 : result; + } + vint NodeItemProvider::Count() { return root->GetRootNode()->CalculateTotalVisibleNodes()-1; @@ -8492,20 +8504,20 @@ NodeItemProvider WString NodeItemProvider::GetTextValue(vint itemIndex) { - if (auto node = RequestNode(itemIndex)) - { - return root->GetTextValue(node.Obj()); - } - return L""; +#define ERROR_MESSAGE_PREFIX L"vl::presentation::controls::tree::NodeItemProvider::GetTextValue(vint)#" + CHECK_ERROR(0 <= itemIndex && itemIndex < Count(), ERROR_MESSAGE_PREFIX L"Index out of range."); + auto node = RequestNode(itemIndex); + return root->GetTextValue(node.Obj()); +#undef ERROR_MESSAGE_PREFIX } description::Value NodeItemProvider::GetBindingValue(vint itemIndex) { - if (auto node = RequestNode(itemIndex)) - { - return root->GetBindingValue(node.Obj()); - } - return Value(); +#define ERROR_MESSAGE_PREFIX L"vl::presentation::controls::tree::NodeItemProvider::GetBindingValue(vint)#" + CHECK_ERROR(0 <= itemIndex && itemIndex < Count(), ERROR_MESSAGE_PREFIX L"Index out of range."); + auto node = RequestNode(itemIndex); + return root->GetBindingValue(node.Obj()); +#undef ERROR_MESSAGE_PREFIX } IDescriptable* NodeItemProvider::RequestView(const WString& identifier) @@ -8627,7 +8639,7 @@ MemoryNodeProvider void MemoryNodeProvider::OnChildTotalVisibleNodesChanged(vint offset) { totalVisibleNodeCount+=offset; - if(parent) + if(parent && parent->GetExpanding()) { parent->OnChildTotalVisibleNodesChanged(offset); } @@ -15547,39 +15559,6 @@ TreeViewItem TreeViewItemRootProvider ***********************************************************************/ - Ptr TreeViewItemRootProvider::GetNodeImage(INodeProvider* node) - { - MemoryNodeProvider* memoryNode=dynamic_cast(node); - if(memoryNode) - { - Ptr data=memoryNode->GetData().Cast(); - if(data) - { - return data->image; - } - } - return 0; - } - - WString TreeViewItemRootProvider::GetTextValue(INodeProvider* node) - { - MemoryNodeProvider* memoryNode = dynamic_cast(node); - if (memoryNode) - { - Ptr data = memoryNode->GetData().Cast(); - if (data) - { - return data->text; - } - } - return L""; - } - - description::Value TreeViewItemRootProvider::GetBindingValue(INodeProvider* node) - { - return Value::From(GetTreeViewData(node)); - } - TreeViewItemRootProvider::TreeViewItemRootProvider() { } @@ -15588,18 +15567,6 @@ TreeViewItemRootProvider { } - IDescriptable* TreeViewItemRootProvider::RequestView(const WString& identifier) - { - if(identifier==ITreeViewItemView::Identifier) - { - return (ITreeViewItemView*)this; - } - else - { - return MemoryNodeRootProvider::RequestView(identifier); - } - } - Ptr TreeViewItemRootProvider::GetTreeViewData(INodeProvider* node) { MemoryNodeProvider* memoryNode=GetMemoryNode(node); @@ -15630,6 +15597,51 @@ TreeViewItemRootProvider memoryNode->NotifyDataModified(); } } + + Ptr TreeViewItemRootProvider::GetNodeImage(INodeProvider* node) + { + MemoryNodeProvider* memoryNode = dynamic_cast(node); + if (memoryNode) + { + Ptr data = memoryNode->GetData().Cast(); + if (data) + { + return data->image; + } + } + return 0; + } + + WString TreeViewItemRootProvider::GetTextValue(INodeProvider* node) + { + MemoryNodeProvider* memoryNode = dynamic_cast(node); + if (memoryNode) + { + Ptr data = memoryNode->GetData().Cast(); + if (data) + { + return data->text; + } + } + return L""; + } + + description::Value TreeViewItemRootProvider::GetBindingValue(INodeProvider* node) + { + return Value::From(GetTreeViewData(node)); + } + + IDescriptable* TreeViewItemRootProvider::RequestView(const WString& identifier) + { + if (identifier == ITreeViewItemView::Identifier) + { + return (ITreeViewItemView*)this; + } + else + { + return MemoryNodeRootProvider::RequestView(identifier); + } + } } /*********************************************************************** diff --git a/Import/GacUI.h b/Import/GacUI.h index aa618459..62e02f03 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -1363,9 +1363,7 @@ NodeItemProvider void OnItemExpanded(INodeProvider* node)override; void OnItemCollapsed(INodeProvider* node)override; vint CalculateNodeVisibilityIndexInternal(INodeProvider* node); - vint CalculateNodeVisibilityIndex(INodeProvider* node)override; - Ptr RequestNode(vint index)override; public: /// Create an item provider using a node root provider. /// The node root provider. @@ -1375,6 +1373,14 @@ NodeItemProvider /// Get the owned node root provider. /// The node root provider. Ptr GetRoot(); + + // ===================== list::INodeItemView ===================== + + Ptr RequestNode(vint index)override; + vint CalculateNodeVisibilityIndex(INodeProvider* node)override; + + // ===================== list::IItemProvider ===================== + vint Count()override; WString GetTextValue(vint itemIndex)override; description::Value GetBindingValue(vint itemIndex)override; @@ -11265,18 +11271,11 @@ TreeViewItemRootProvider , public virtual ITreeViewItemView , public Description { - protected: - - Ptr GetNodeImage(INodeProvider* node)override; - WString GetTextValue(INodeProvider* node)override; - description::Value GetBindingValue(INodeProvider* node)override; public: /// Create a item root provider. TreeViewItemRootProvider(); ~TreeViewItemRootProvider(); - IDescriptable* RequestView(const WString& identifier)override; - /// Get the object from a node. /// The object. /// The node to get the tree view item. @@ -11288,6 +11287,16 @@ TreeViewItemRootProvider /// Notify the tree view control that the node is changed. This is required when content in a is modified, but both or [M:vl.presentation.controls.tree.MemoryNodeProvider.SetData] are not called. /// The node. void UpdateTreeViewData(INodeProvider* node); + + // ===================== list::ITreeViewItemView ===================== + + Ptr GetNodeImage(INodeProvider* node)override; + WString GetTextValue(INodeProvider* node)override; + description::Value GetBindingValue(INodeProvider* node)override; + + // ===================== list::IItemProvider ===================== + + IDescriptable* RequestView(const WString& identifier)override; }; } diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 index 23363ef4..6b0c048f 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 and b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x64 differ diff --git a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 index b65fe364..7783c123 100644 Binary files a/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 and b/Tutorial/GacUI_HelloWorlds/UIRes/Xml.bin.x86 differ