Ejemplo n.º 1
0
        void FillInnerExceptionsStore(TreeStore store, ExceptionInfo exception, TreeIter parentIter = default(TreeIter))
        {
            TreeIter iter;

            if (parentIter.Equals(TreeIter.Zero))
            {
                iter = store.AppendValues(exception);
                ReverseInnerExceptions [exception] = null;
            }
            else
            {
                ReverseInnerExceptions [exception] = (ExceptionInfo)store.GetValue(parentIter, 0);
                iter = store.AppendValues(parentIter, exception);
            }
            var updateInnerExceptions = new System.Action(() => {
                if (!InnerExceptionsStore.IterHasChild(iter))
                {
                    var innerExceptions = exception.InnerExceptions;
                    if (innerExceptions != null && innerExceptions.Count > 0)
                    {
                        foreach (var inner in innerExceptions)
                        {
                            FillInnerExceptionsStore(store, inner, iter);
                        }
                    }
                    else
                    {
                        var inner = exception.InnerException;
                        if (inner != null)
                        {
                            FillInnerExceptionsStore(store, inner, iter);
                        }
                    }
                }
            });

            exception.Changed += delegate {
                Application.Invoke((o, args) => {
                    InnerExceptionsStore.EmitRowChanged(InnerExceptionsStore.GetPath(iter), iter);
                    updateInnerExceptions();
                    InnerExceptionsTreeView.ExpandRow(InnerExceptionsStore.GetPath(iter), true);
                });
            };
            updateInnerExceptions();
        }
Ejemplo n.º 2
0
        private void UpdateStore(object sourceObj, ToolboxChangedArgs args)
        {
            ToolboxChangedArgs.ChangeTypes changeType = args.ChangeType;
            ToolboxItem changedItem = args.ChangedItem;
            TreeStore   store       = this.Model as TreeStore;

            if (changeType == ToolboxChangedArgs.ChangeTypes.ItemUnselected)
            {
                foreach (TreePath path in this.Selection.GetSelectedRows())
                {
                    TreeIter iter;
                    if (store.GetIter(out iter, path))
                    {
                        ToolboxItem val = GetItem(iter);
                        if (val == changedItem)
                        {
                            this.Selection.UnselectIter(iter);
                        }
                    }
                }
            }
            else if (changeType == ToolboxChangedArgs.ChangeTypes.ItemAdded)
            {
                ToolboxDrawer containingDrawer = null;
                ToolboxItem   itemBefore       = null;
                foreach (ToolboxDrawer drawer in source.Drawers)
                {
                    ToolboxItem prev = null;
                    foreach (ToolboxItem item in drawer.GetContents())
                    {
                        if (item == changedItem)
                        {
                            containingDrawer = drawer;
                            itemBefore       = prev;
                        }
                        prev = item;
                    }
                }
                store.Foreach((model, path, iter) => {
                    if (itemBefore == null)
                    {
                        if (GetItem(iter) == containingDrawer)
                        {
                            TreeIter node = store.PrependNode(iter);
                            store.SetValue(node, 0, changedItem);
                            return(true);
                        }
                    }
                    else
                    {
                        if (GetItem(iter) == itemBefore)
                        {
                            TreeIter parent;
                            store.IterParent(out parent, iter);
                            TreeIter node = store.InsertNodeAfter(parent, iter);
                            store.SetValue(node, 0, changedItem);
                            return(true);
                        }
                    }
                    return(false);
                });
            }
            else
            {
                store.Foreach((model, path, iter) => {
                    if (GetItem(iter) == changedItem)
                    {
                        if (changeType == ToolboxChangedArgs.ChangeTypes.ItemRemoved)
                        {
                            store.Remove(ref iter);
                        }
                        else if (changeType == ToolboxChangedArgs.ChangeTypes.ItemRenamed)
                        {
                            store.EmitRowChanged(path, iter);
                        }
                        return(true);
                    }
                    return(false);
                });
            }
        }