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