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(); }
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); }); } }