private void DisposeDataNodes() { lock ( _dataNodes ) { foreach (IntHashTable.Entry e in _dataNodes) { ResourceTreeDataNode node = (ResourceTreeDataNode)e.Value; node.Dispose(); } _dataNodes.Clear(); } }
private void RemoveNode(JetListViewNode parentNode, IResource resource) { if (parentNode.Nodes.Contains(resource)) { parentNode.Nodes.Remove(resource); } if (!_listView.NodeCollection.Contains(resource)) { ResourceTreeDataNode dataNode = (ResourceTreeDataNode)_dataNodes [resource.Id]; if (dataNode != null) { dataNode.Dispose(); lock ( _dataNodes ) { _dataNodes.Remove(resource.Id); } } } }
/// <summary> /// For an existing tree node (incl. the originaly-present root), sets up the sorting for that node, /// and expands it by adding all the "child" resources as child nodes. /// </summary> private void ExpandResource(JetListViewNode parentNode, IResource parentResource) { ////////////////// // Apply sorting UserOrderSortSettings settings = null; // Get the per-property sort settings as a string (written to each node) string nodeSort = Core.ResourceTreeManager.GetResourceNodeSort(parentResource); if (nodeSort != null) // Apply, if available { settings = UserOrderSortSettings.Parse(Core.ResourceStore, nodeSort); } else { settings = new UserOrderSortSettings(); } // Apply the user-order sorting (it's writter as a property on the parent with an ordered list of child resources) settings.SetUserOrder(parentResource); // Submit the sorting order to the node _listView.NodeCollection.SetItemComparer( parentNode.Data , new ResourceComparer(null, new UserOrderResourceComparer(settings), true)); ///////////////// // Get Children ResourceTreeDataNode dataNode; lock ( _dataNodes ) { dataNode = (ResourceTreeDataNode)_dataNodes [parentResource.Id]; if (dataNode == null) { IResourceList childResources = null; int parentProp = _parentProp; if (_resourceChildProvider != null) { childResources = _resourceChildProvider.GetChildResources(parentResource); } if (childResources == null) { childResources = parentResource.GetLinksToLive(null, _parentProp); } else { parentProp = 0; } dataNode = new ResourceTreeDataNode(this, _listView, parentResource, parentProp, childResources); _dataNodes [parentResource.Id] = dataNode; } } //////////////////// // Submit Children lock (dataNode.ChildResources) { // Add 'em! foreach (IResource res in dataNode.ChildResources.ValidResources) { AddNode(parentNode, res); // This also calls an ExpandResource for that node } // Listen for changes to the children resources of the node (not to the node resource itself) dataNode.AttachHandlers(); } }