Example #1
0
        public virtual void ExpandMembers(bool showControls, bool showFields, bool showProperties)
        {
            if (Object == null)
            {
                return;
            }



            Nodes.Clear();

            if (ObjectType.BaseType != null && (ObjectType.BaseType != typeof(object) && ObjectType.BaseType != typeof(System.ValueType)))
            {
                MemberNode n = new MemberNode("(base)", "", ObjectType.BaseType)
                {
                    ObjectType = ObjectType.BaseType,
                    Object     = Object,
                    Member     = null
                };
                n.ImageId = (int)IconEnum.PublicField;

                if (CanExpandNodeWithType(n.ObjectType))
                {
                    n.HasChildren = true;
                }

                Nodes.Add(n);
            }

            var events = ObjectType.GetEventsOfType(true, false);

            if (events.Count > 0)
            {
                MemberNode n = new MemberNode("(all wired events)", "", ObjectType)
                {
                    ObjectType = ObjectType,
                    Object     = Object,
                    Member     = null
                };
                n.ImageId = (int)IconEnum.PublicEvent;

                foreach (var ev in events)
                {
                    EventNode eventNode = new EventNode(ev, Object);
                    eventNode.ExpandMembers();

                    // add if has wired events
                    if (eventNode.Nodes.Count > 0)
                    {
                        n.Nodes.Add(eventNode);
                    }
                }

                Nodes.Add(n);
            }

            if (ObjectType != typeof(string))
            {
                try
                {
                    object[] array = LocalsHelper.AsObjectArrayFromIenumerable(Object);
                    if (array != null)
                    {
                        AddIEnumerableNodes(array);
                    }

                    //var ienumerableInterface = ObjectType.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)).FirstOrDefault();
                    //if (ienumerableInterface != null)
                    //{
                    //    object[] items = LocalsHelper.AsObjectArrayFromGenericIenumerable(Object);
                    //    AddIEnumerableNodes(items);
                    //}
                    //else
                    //{
                    //    var ienumerableNonGenericInterface = ObjectType.GetInterfaces().Where(i => i.IsAssignableFrom(typeof(IEnumerable))).FirstOrDefault();
                    //    if (ienumerableInterface != null)
                    //    {
                    //        object[] items = LocalsHelper.AsObjectArrayFromIenumerable(Object);
                    //        AddIEnumerableNodes(items);
                    //    }
                    //    else
                    //    {
                    //        var icollection = ObjectType.GetInterfaces().Where(i => i.IsAssignableFrom(typeof(ICollection))).FirstOrDefault();
                    //        if (icollection != null)
                    //        {
                    //            object[] items = LocalsHelper.AsObjectArrayFromIenumerable(Object);
                    //            AddIEnumerableNodes(items);
                    //        }

                    //    }
                    //}
                }
                catch (Exception)
                {
                }
            }

            foreach (var f in ObjectType.GetFieldsOfType(false, false)
                     .OrderBy(f => f.Name))
            {
                if (!f.Name.Contains(">k__BackingField"))
                {
                    MemberNode n = new MemberNode(f);
                    AddNode(this, n, showControls, showFields, showProperties);
                }
            }

            foreach (var p in ObjectType.GetPropertiesOfType(false, true)
                     .Where(p => p.GetIndexParameters().Length <= 0)
                     .OrderBy(p => p.Name))
            {
                MemberNode n = new MemberNode(p);
                AddNode(this, n, showControls, showFields, showProperties);
            }

            foreach (var ev in ObjectType.GetEventsOfType(false, true)
                     .OrderBy(e => e.Name))
            {
                EventNode n = new EventNode(ev, null);
                this.Nodes.Add(n);
                n.ExpandMembers();
            }

            if (Nodes.Count <= 0)
            {
                HasChildren = false;
            }
        }
        public LocalsWindow(string thisName, object obj)
        {
            this.thisObject = obj;

            InitializeComponent();

            if (!string.IsNullOrEmpty(thisName))
            {
                Text = "Locals & Watches - " + thisName;
            }

            tree.Columns.Add(new TreeListColumn("Name", "Name")
            {
                AutoSize = true
            });

            var valueCol = new TreeListColumn("Value", "Value")
            {
                AutoSize = true
            };

            valueCol.CellFormatConditions = new RunTimeDebuggers.Controls.TreeList.ConditionalFormatting[] {
                new RunTimeDebuggers.Controls.TreeList.ConditionalFormatting(n => n is ILocalsNode && ((ILocalsNode)n).Changed,
                                                                             new RunTimeDebuggers.Controls.TreeList.TextFormatting(valueCol.CellFormat)
                {
                    ForeColor = Color.Red
                })
            };

            tree.Columns.Add(valueCol);
            tree.Columns.Add(new TreeListColumn("Type", "Type")
            {
                AutoSize = true
            });

            FillImageListForMemberIcons(imgs);

            tree.Images = imgs;

            if (obj != null)
            {
                rootNode = new MemberNode(thisName + " (this)", obj, obj == null ? null : obj.GetType().ToSignatureString())
                {
                    Object     = obj,
                    ObjectType = obj.GetType(),
                    Member     = null
                };
                rootNode.HasChildren = true;
                rootNode.ImageId     = (int)IconEnum.PublicField;
                rootNode.ExpandMembers(btnShowControls.Checked, btnShowFields.Checked, btnShowProperties.Checked);
                rootNode.Expand();
                tree.Nodes.Add(rootNode);
            }

            tree.RowOptions.ShowHeader = false;

            tree.NotifyBeforeExpand += new TreeListView.NotifyBeforeExpandHandler(tree_NotifyBeforeExpand);

            exprBox = new ExpressionBox(obj);
            exprBox.ExpressionEvaluated += new ExpressionBox.ExpressionEvaluatedHandler(exprBox_ExpressionEvaluated);
            exprBox.Dock = DockStyle.Fill;
            pnl.Controls.Add(exprBox);

            FillControlTree();
        }