示例#1
0
        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();
            }
        }