Esempio n. 1
0
 private void OnCellClick(object sender, CellClickEventArgs e)
 {
     if (e.ClickCount == 2 && e.Model != null)
     {
         var arrayInstance = dlvArrays.SelectedObject <ArrayInstanceInformation>();
         if (arrayInstance != null)
         {
             var address = arrayInstance.Address;
             var type    = ClrDump.GetObjectType(address);
             if (type == null)
             {
                 Log($"Can't find type for instance: {address:X}", LogLevelType.Error);
                 return;
             }
             var clrDumpObject = new ClrDumpObject(ClrDump, type, address);
             InstanceDetailsCommand.Display(this, clrDumpObject);
         }
     }
 }
        public static void SetUpAddressColumn(this ObjectListView listView, OLVColumn col, UIClrDumpModule dumpModule, string suffix = null)
        {
            col.AspectToStringFormat = "{0:X}";
            col.TextAlign            = HorizontalAlignment.Right;
            col.Width = 150;

            listView.CellClick += (o, e) =>
            {
                if (e.ClickCount == 2 && e.Column == col)
                {
                    if (e.Model == null)
                    {
                        return;
                    }
                    var cellItem = listView.SelectedItem?.GetSubItem(col.Index);
                    if (cellItem == null)
                    {
                        return;
                    }
                    var addressObj = cellItem.ModelValue;
                    if (addressObj is ulong)
                    {
                        var address = (ulong)addressObj;
                        if (address == 0)
                        {
                            return;
                        }
                        var type = dumpModule.ClrDump.GetObjectType(address);
                        if (type == null)
                        {
                            dumpModule.Log($"Can't find type for instance: {address:X}", LogLevelType.Error);
                            return;
                        }
                        var clrDumpObject = new ClrDumpObject(dumpModule.ClrDump, type, address);
                        InstanceDetailsCommand.Display(dumpModule, clrDumpObject);
                    }
                }
            };
            listView.RegisterDataProvider(() =>
            {
                var cellItem = listView.SelectedItem?.GetSubItem(col.Index);
                if (cellItem == null)
                {
                    return(null);
                }
                var addressObj = cellItem.ModelValue;
                if (addressObj is ulong)
                {
                    var address       = (ulong)addressObj;
                    var type          = dumpModule.ClrDump.GetObjectType(address);
                    var clrDumpObject = new ClrDumpObject(dumpModule.ClrDump, type, address);
                    return(clrDumpObject);
                }
                return(null);
            }, dumpModule, suffix
                                          );
            listView.FormatCell += (o, e) =>
            {
                if (e.Column != col || e.SubItem.ModelValue == null)
                {
                    return;
                }
                var addressObj = e.SubItem.ModelValue;
                if (addressObj is ulong)
                {
                    var address  = (ulong)addressObj;
                    var bookmark = dumpModule.ClrDump.ClrDumpInfo.GetBookmark(address);
                    if (bookmark != null)
                    {
                        e.SubItem.BackColor = bookmark.Color;
                    }
                }
            };
            var tooltipGetter = listView.CellToolTipGetter;

            listView.CellToolTipGetter = (column, modelObject) =>
            {
                if (column == col)
                {
                    if (modelObject == null || !(modelObject is ulong))
                    {
                        return(null);
                    }
                    if (modelObject is ulong)
                    {
                        var address  = (ulong)modelObject;
                        var bookmark = dumpModule.ClrDump.ClrDumpInfo.GetBookmark(address);
                        if (bookmark != null)
                        {
                            return(bookmark.Comment);
                        }
                    }
                }
                if (tooltipGetter != null)
                {
                    return(tooltipGetter(column, modelObject));
                }
                return(null);
            };
            listView.UseCellFormatEvents = true;
            listView.AddMenuSeparator();
            listView.SelectedIndexChanged += (sender, evt) =>
            {
                var cellItem = listView.SelectedItem?.GetSubItem(col.Index);
                if (cellItem == null)
                {
                    return;
                }
                var addressObj = cellItem.ModelValue;
                if (addressObj is ulong)
                {
                    var address       = (ulong)addressObj;
                    var type          = dumpModule.ClrDump.GetObjectType(address);
                    var clrDumpObject = new ClrDumpObject(dumpModule.ClrDump, type, address);
                    dumpModule.MessageBus.SendMessage(new SelectedClrDumpObjectMessage(clrDumpObject));
                }
            };
            var menuItem = new ToolStripMenuItem("Copy Address");

            //            menuItem.Image = command.Icon;
            listView.ContextMenuStrip.Items.Add(menuItem);
            menuItem.Click += (o, e) =>
            {
                var cellItem = listView.SelectedItem?.GetSubItem(col.Index);
                if (cellItem == null)
                {
                    return;
                }
                var addressObj = cellItem.ModelValue;
                if (addressObj is ulong)
                {
                    var address = (ulong)addressObj;
                    Clipboard.SetText(address.ToString("X"));
                }
            };
        }