public override void ItemDidExpand(NSNotification notification) { //var outlineView = (NSOutlineView) notification.Object; if (!notification.UserInfo.TryGetValue(NSObjectKey, out var value)) { return; } var node = value as MacObjectValueNode; if (node == null) { return; } node.HideValueButton = true; treeView.ReloadItem(node, false); treeView.ExpandNode(node.Target); }
public void ReloadChildren(ObjectValueNode node) { if (!TryGetValue(node, out var parent)) { return; } treeView.BeginUpdates(); try { NSIndexSet indexes; NSRange range; if (parent.Children.Count > 0) { range = new NSRange(0, parent.Children.Count); indexes = NSIndexSet.FromNSRange(range); var removed = new List <MacObjectValueNode> (); foreach (var child in parent.Children) { Remove(child, removed); } parent.Children.Clear(); if (parent.Target is RootObjectValueNode) { treeView.RemoveItems(indexes, null, NSTableViewAnimation.None); } else { treeView.RemoveItems(indexes, parent, NSTableViewAnimation.None); } for (int i = 0; i < removed.Count; i++) { removed[i].Dispose(); } } for (int i = 0; i < node.Children.Count; i++) { Add(parent, node.Children[i]); } // if we did not load all the children, add a Show More node if (!node.ChildrenLoaded) { Add(parent, new ShowMoreValuesObjectValueNode(node)); } range = new NSRange(0, parent.Children.Count); indexes = NSIndexSet.FromNSRange(range); if (parent.Target is RootObjectValueNode) { treeView.InsertItems(indexes, null, NSTableViewAnimation.None); } else { treeView.InsertItems(indexes, parent, NSTableViewAnimation.None); } // if we loaded children and discovered that the node does not actually have any children, // update the node and reload the data. // TOOD: it would be nice to know this before the node is expanded so we don't see the "loading" node flash if (!node.HasChildren) { treeView.ReloadItem(parent); } else { RestoreExpandedState(node.Children); } } finally { treeView.EndUpdates(); } }
public void ReloadChildren(ObjectValueNode node) { if (!TryGetValue(node, out var parent)) { return; } treeView.BeginUpdates(); NSIndexSet indexes; NSRange range; if (parent.Children.Count > 0) { range = new NSRange(0, parent.Children.Count); indexes = NSIndexSet.FromNSRange(range); foreach (var child in parent.Children) { mapping.Remove(child.Target); child.Dispose(); } parent.Children.Clear(); if (parent.Target is RootObjectValueNode) { treeView.RemoveItems(indexes, null, NSTableViewAnimation.None); } else { treeView.RemoveItems(indexes, parent, NSTableViewAnimation.None); } } for (int i = 0; i < node.Children.Count; i++) { Add(parent, node.Children[i]); } // if we did not load all the children, add a Show More node if (!node.ChildrenLoaded) { Add(parent, new ShowMoreValuesObjectValueNode(node)); } range = new NSRange(0, parent.Children.Count); indexes = NSIndexSet.FromNSRange(range); if (parent.Target is RootObjectValueNode) { treeView.InsertItems(indexes, null, NSTableViewAnimation.None); } else { treeView.InsertItems(indexes, parent, NSTableViewAnimation.None); } // if we loaded children and discovered that the node does not actually have any children, // update the node and reload the data. // TOOD: it would be nice to know this before the node is expanded so we don't see the "loading" node flash if (!node.HasChildren) { treeView.ReloadItem(parent); } else { // expand any items that we loaded that were expanded previously foreach (var n in node.Children) { if (treeView.Controller.GetNodeWasExpandedAtLastCheckpoint(n)) { if (TryGetValue(n, out MacObjectValueNode x)) { treeView.ExpandItem(x); } } } } treeView.EndUpdates(); }
public void LoadChildren(ObjectValueNode node, int startIndex, int count) { if (!TryGetValue(node, out var parent)) { return; } treeView.BeginUpdates(); try { int lastIndex = parent.Children.Count - 1; bool needShowMore = !node.ChildrenLoaded; bool haveShowMore = false; NSIndexSet indexes = null; NSRange range; if (lastIndex >= 0 && parent.Children[lastIndex].Target is ShowMoreValuesObjectValueNode) { haveShowMore = true; } if (startIndex < parent.Children.Count) { // Note: This can only happen if we have either a "Loading..." node or a "Show More" node. var removed = new List <MacObjectValueNode> (); int extra = parent.Children.Count - startIndex; if (lastIndex == 0 && parent.Children[0].Target is LoadingObjectValueNode) { // Remove the "Loading..." node indexes = NSIndexSet.FromIndex(0); Remove(parent.Children[0], removed); parent.Children.Clear(); } else if (haveShowMore && extra == 1) { // Only remove the "Show More" node if we don't need it anymore... if (!needShowMore) { indexes = NSIndexSet.FromIndex(lastIndex); Remove(parent.Children[lastIndex], removed); parent.Children.RemoveAt(lastIndex); } } else { // Unexpected, but let's try to deal with this... range = new NSRange(startIndex, extra); indexes = NSIndexSet.FromNSRange(range); for (int i = parent.Children.Count - 1; i >= startIndex; i--) { Remove(parent.Children[i], removed); parent.Children.RemoveAt(i); } haveShowMore = false; } if (indexes != null) { if (parent.Target is RootObjectValueNode) { treeView.RemoveItems(indexes, null, NSTableViewAnimation.None); } else { treeView.RemoveItems(indexes, parent, NSTableViewAnimation.None); } for (int i = 0; i < removed.Count; i++) { removed[i].Dispose(); } } } for (int i = startIndex; i < startIndex + count; i++) { Insert(parent, i, node.Children[i]); } // Add a "Show More" node only if we need one and don't already have one. if (needShowMore && !haveShowMore) { Add(parent, new ShowMoreValuesObjectValueNode(node)); count++; } range = new NSRange(startIndex, count); indexes = NSIndexSet.FromNSRange(range); if (parent.Target is RootObjectValueNode) { treeView.InsertItems(indexes, null, NSTableViewAnimation.None); } else { treeView.InsertItems(indexes, parent, NSTableViewAnimation.None); } // if we loaded children and discovered that the node does not actually have any children, // update the node and reload the data. // TOOD: it would be nice to know this before the node is expanded so we don't see the "loading" node flash if (!node.HasChildren) { treeView.ReloadItem(parent); } else { RestoreExpandedState(node.Children); } } finally { treeView.EndUpdates(); } }