void RestoreExpandedState(ObjectValueNode node)
 {
     if (treeView.Controller.GetNodeWasExpandedAtLastCheckpoint(node))
     {
         if (TryGetValue(node, out var item))
         {
             treeView.ExpandItem(item);
         }
     }
 }
 public void Expand()
 {
     treeView.ExpandItem(treeView.ItemAtRow(0), false);
 }
        public void Replace(ObjectValueNode node, ObjectValueNode[] replacementNodes)
        {
            if (!TryGetValue(node, out var item))
            {
                return;
            }

            var parent = item.Parent;
            int index  = -1;

            if (parent == null)
            {
                return;
            }

            for (int i = 0; i < parent.Children.Count; i++)
            {
                if (parent.Children[i] == item)
                {
                    index = i;
                    break;
                }
            }

            if (index == -1)
            {
                return;
            }

            parent.Children.RemoveAt(index);
            mapping.Remove(item.Target);
            item.Dispose();

            treeView.BeginUpdates();

            var indexes = new NSIndexSet(index);

            if (parent.Target is RootObjectValueNode)
            {
                treeView.RemoveItems(indexes, null, NSTableViewAnimation.None);
            }
            else
            {
                treeView.RemoveItems(indexes, parent, NSTableViewAnimation.None);
            }

            if (replacementNodes.Length > 0)
            {
                for (int i = 0; i < replacementNodes.Length; i++)
                {
                    Insert(parent, index + i, replacementNodes [i]);
                }

                var range = new NSRange(index, replacementNodes.Length);
                indexes = NSIndexSet.FromNSRange(range);

                if (parent.Target is RootObjectValueNode)
                {
                    treeView.InsertItems(indexes, null, NSTableViewAnimation.None);
                }
                else
                {
                    treeView.InsertItems(indexes, parent, NSTableViewAnimation.None);
                }

                foreach (var n in replacementNodes)
                {
                    if (treeView.Controller.GetNodeWasExpandedAtLastCheckpoint(n))
                    {
                        if (TryGetValue(n, out MacObjectValueNode x))
                        {
                            treeView.ExpandItem(x);
                        }
                    }
                }
            }

            treeView.EndUpdates();
        }