diff --git a/ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs b/ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs index d47f49a1a..a8353bde0 100644 --- a/ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs @@ -26,44 +26,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class AssemblyRefTableTreeNode : MetadataTableTreeNode + internal class AssemblyRefTableTreeNode : MetadataTableTreeNode { public AssemblyRefTableTreeNode(MetadataFile metadataFile) : base(TableIndex.AssemblyRef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - AssemblyRefEntry scrollTargetEntry = default; - foreach (var row in metadataFile.Metadata.AssemblyReferences) { - AssemblyRefEntry entry = new AssemblyRefEntry(metadataFile, row); - if (scrollTarget == MetadataTokens.GetRowNumber(row)) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new AssemblyRefEntry(metadataFile, row)); } - - return true; + return list; } - struct AssemblyRefEntry + internal struct AssemblyRefEntry { readonly MetadataFile metadataFile; readonly AssemblyReferenceHandle handle; diff --git a/ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs b/ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs index 66332e212..d5b60fee1 100644 --- a/ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs @@ -17,6 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Collections.Generic; using System.Reflection; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; @@ -25,33 +26,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class AssemblyTableTreeNode : MetadataTableTreeNode + internal class AssemblyTableTreeNode : MetadataTableTreeNode { public AssemblyTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Assembly, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); if (metadataFile.Metadata.IsAssembly) { - view.ItemsSource = new[] { new AssemblyEntry(metadataFile.Metadata, metadataFile.MetadataOffset) }; + return [new AssemblyEntry(metadataFile.Metadata, metadataFile.MetadataOffset)]; } else { - view.ItemsSource = Array.Empty(); + return []; } - - tabPage.Content = view; - return true; } - readonly struct AssemblyEntry + internal readonly struct AssemblyEntry { readonly int metadataOffset; readonly MetadataReader metadata; diff --git a/ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs b/ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs index 4d654da91..29e13d307 100644 --- a/ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs @@ -26,45 +26,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class ClassLayoutTableTreeNode : MetadataTableTreeNode + internal class ClassLayoutTableTreeNode : MetadataTableTreeNode { public ClassLayoutTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ClassLayout, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); var length = metadataFile.Metadata.GetTableRowCount(TableIndex.ClassLayout); ReadOnlySpan ptr = metadataFile.Metadata.AsReadOnlySpan(); - ClassLayoutEntry scrollTargetEntry = default; for (int rid = 1; rid <= length; rid++) { - ClassLayoutEntry entry = new ClassLayoutEntry(metadataFile, ptr, rid); - if (scrollTarget == rid) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new ClassLayoutEntry(metadataFile, ptr, rid)); } - return true; + return list; } readonly struct ClassLayout @@ -81,7 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct ClassLayoutEntry + internal struct ClassLayoutEntry { readonly MetadataFile metadataFile; readonly ClassLayout classLayout; diff --git a/ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs b/ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs index 2b2ea571f..a5ad6df3d 100644 --- a/ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs @@ -21,50 +21,27 @@ using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using ICSharpCode.Decompiler.Metadata; -using ICSharpCode.ILSpy.ViewModels; namespace ICSharpCode.ILSpy.Metadata { - internal class ConstantTableTreeNode : MetadataTableTreeNode + internal class ConstantTableTreeNode : MetadataTableTreeNode { public ConstantTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Constant, metadataFile) { } - public override bool View(TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - ConstantEntry scrollTargetEntry = default; - - for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.Constant); row++) + for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.Constant); row++) { - ConstantEntry entry = new ConstantEntry(metadataFile, MetadataTokens.ConstantHandle(row)); - if (scrollTarget == row) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new ConstantEntry(metadataFile, MetadataTokens.ConstantHandle(row))); } - - view.ItemsSource = list; - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct ConstantEntry + internal struct ConstantEntry { readonly MetadataFile metadataFile; readonly EntityHandle handle; diff --git a/ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs b/ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs index 370532d14..d8a61f859 100644 --- a/ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class CustomAttributeTableTreeNode : MetadataTableTreeNode + class CustomAttributeTableTreeNode : MetadataTableTreeNode { public CustomAttributeTableTreeNode(MetadataFile metadataFile) : base(TableIndex.CustomAttribute, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - CustomAttributeEntry scrollTargetEntry = default; - - foreach (var row in metadata.CustomAttributes) - { - CustomAttributeEntry entry = new CustomAttributeEntry(metadataFile, row); - if (scrollTarget == MetadataTokens.GetRowNumber(row)) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.CustomAttributes) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new CustomAttributeEntry(metadataFile, row)); } - - return true; + return list; } - struct CustomAttributeEntry + internal struct CustomAttributeEntry { readonly MetadataFile metadataFile; readonly CustomAttributeHandle handle; diff --git a/ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs b/ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs index f37bdb87d..6e96ecaa3 100644 --- a/ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs @@ -25,47 +25,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class DeclSecurityTableTreeNode : MetadataTableTreeNode + class DeclSecurityTableTreeNode : MetadataTableTreeNode { public DeclSecurityTableTreeNode(MetadataFile metadataFile) : base(TableIndex.DeclSecurity, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - DeclSecurityEntry scrollTargetEntry = default; - - foreach (var row in metadata.DeclarativeSecurityAttributes) - { - var entry = new DeclSecurityEntry(metadataFile, row); - if (scrollTarget == MetadataTokens.GetRowNumber(row)) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.DeclarativeSecurityAttributes) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new DeclSecurityEntry(metadataFile, row)); } - - return true; + return list; } - struct DeclSecurityEntry + internal struct DeclSecurityEntry { readonly MetadataFile metadataFile; readonly DeclarativeSecurityAttributeHandle handle; diff --git a/ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs b/ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs index 3018d8970..f905237fd 100644 --- a/ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs @@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class EventMapTableTreeNode : MetadataTableTreeNode + class EventMapTableTreeNode : MetadataTableTreeNode { public EventMapTableTreeNode(MetadataFile metadataFile) : base(TableIndex.EventMap, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - EventMapEntry scrollTargetEntry = default; + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.EventMap); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); + int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; + int eventDefSize = metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - EventMapEntry entry = new EventMapEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new EventMapEntry(metadataFile, ptr, rid, typeDefSize, eventDefSize)); } - - return true; + return list; } readonly struct EventMap @@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct EventMapEntry + internal struct EventMapEntry { readonly MetadataFile metadataFile; readonly EventMap eventMap; public int RID { get; } - public int Token => 0x12000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] @@ -112,15 +91,13 @@ namespace ICSharpCode.ILSpy.Metadata string eventListTooltip; public string EventListTooltip => GenerateTooltip(ref eventListTooltip, metadataFile, eventMap.EventList); - public EventMapEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row) + public EventMapEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row, int typeDefSize, int eventDefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.EventMap) + metadataFile.Metadata.GetTableRowSize(TableIndex.EventMap) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; - int eventDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4; this.eventMap = new EventMap(ptr.Slice(rowOffset), typeDefSize, eventDefSize); this.parentTooltip = null; this.eventListTooltip = null; diff --git a/ILSpy/Metadata/CorTables/EventTableTreeNode.cs b/ILSpy/Metadata/CorTables/EventTableTreeNode.cs index d63ab0ef3..566a09fba 100644 --- a/ILSpy/Metadata/CorTables/EventTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/EventTableTreeNode.cs @@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes; namespace ICSharpCode.ILSpy.Metadata { - internal class EventTableTreeNode : MetadataTableTreeNode + internal class EventTableTreeNode : MetadataTableTreeNode { public EventTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Event, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - EventDefEntry scrollTargetEntry = default; - - foreach (var row in metadata.EventDefinitions) - { - EventDefEntry entry = new EventDefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.EventDefinitions) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new EventDefEntry(metadataFile, row)); } - - return true; + return list; } - struct EventDefEntry : IMemberTreeNode + internal struct EventDefEntry : IMemberTreeNode { readonly MetadataFile metadataFile; readonly EventDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs b/ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs index f1075c16b..4b66b9274 100644 --- a/ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs @@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class ExportedTypeTableTreeNode : MetadataTableTreeNode + internal class ExportedTypeTableTreeNode : MetadataTableTreeNode { public ExportedTypeTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ExportedType, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; var list = new List(); - ExportedTypeEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; foreach (var row in metadata.ExportedTypes) { - ExportedTypeEntry entry = new ExportedTypeEntry(metadataFile, row, metadataFile.Metadata.GetExportedType(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new ExportedTypeEntry(metadataFile, row, metadata.GetExportedType(row))); } - - return true; + return list; } - struct ExportedTypeEntry + internal struct ExportedTypeEntry { readonly MetadataFile metadataFile; readonly ExportedTypeHandle handle; diff --git a/ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs b/ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs index 6fe92c597..ee4e42b16 100644 --- a/ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs @@ -26,46 +26,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class FieldLayoutTableTreeNode : MetadataTableTreeNode + internal class FieldLayoutTableTreeNode : MetadataTableTreeNode { public FieldLayoutTableTreeNode(MetadataFile metadataFile) : base(TableIndex.FieldLayout, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - FieldLayoutEntry scrollTargetEntry = default; + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.FieldLayout); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); + int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - FieldLayoutEntry entry = new FieldLayoutEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new FieldLayoutEntry(metadataFile, ptr, rid, fieldDefSize)); } - - return true; + return list; } readonly struct FieldLayout @@ -80,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct FieldLayoutEntry + internal struct FieldLayoutEntry { readonly MetadataFile metadataFile; readonly FieldLayout fieldLayout; public int RID { get; } - public int Token => 0x10000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] @@ -105,14 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata [ColumnInfo("X8", Kind = ColumnKind.Other)] public int FieldOffset => fieldLayout.Offset; - public FieldLayoutEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row) + public FieldLayoutEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row, int fieldDefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldLayout) + metadataFile.Metadata.GetTableRowSize(TableIndex.FieldLayout) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4; this.fieldLayout = new FieldLayout(ptr.Slice(rowOffset), fieldDefSize); this.fieldTooltip = null; } diff --git a/ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs b/ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs index befd90a8c..ef31142d7 100644 --- a/ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs @@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class FieldMarshalTableTreeNode : MetadataTableTreeNode + internal class FieldMarshalTableTreeNode : MetadataTableTreeNode { public FieldMarshalTableTreeNode(MetadataFile metadataFile) : base(TableIndex.FieldMarshal, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - FieldMarshalEntry scrollTargetEntry = default; + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.FieldMarshal); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); + int hasFieldMarshalRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param); + int blobHeapSize = metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - FieldMarshalEntry entry = new FieldMarshalEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new FieldMarshalEntry(metadataFile, ptr, rid, blobHeapSize, hasFieldMarshalRefSize)); } - - return true; + return list; } readonly struct FieldMarshal @@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct FieldMarshalEntry + internal struct FieldMarshalEntry { readonly MetadataFile metadataFile; readonly FieldMarshal fieldMarshal; public int RID { get; } - public int Token => 0x0D000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] @@ -104,15 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata [ColumnInfo("X8", Kind = ColumnKind.HeapOffset)] public int NativeType => MetadataTokens.GetHeapOffset(fieldMarshal.NativeType); - public FieldMarshalEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row) + public FieldMarshalEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row, int blobHeapSize, int hasFieldMarshalRefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldMarshal) + metadataFile.Metadata.GetTableRowSize(TableIndex.FieldMarshal) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int hasFieldMarshalRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param); - int blobHeapSize = metadataFile.Metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4; this.fieldMarshal = new FieldMarshal(ptr.Slice(rowOffset), blobHeapSize, hasFieldMarshalRefSize); this.parentTooltip = null; } diff --git a/ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs b/ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs index 959225bdb..b954bf2eb 100644 --- a/ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs @@ -26,7 +26,7 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class FieldRVATableTreeNode : MetadataTableTreeNode + internal class FieldRVATableTreeNode : MetadataTableTreeNode { public FieldRVATableTreeNode(MetadataFile metadataFile) : base(TableIndex.FieldRva, metadataFile) @@ -35,40 +35,20 @@ namespace ICSharpCode.ILSpy.Metadata public override object Text => $"1D FieldRVA ({metadataFile.Metadata.GetTableRowCount(TableIndex.FieldRva)})"; - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - FieldRVAEntry scrollTargetEntry = default; + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.FieldRva); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); int metadataOffset = metadataFile.MetadataOffset; + int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - FieldRVAEntry entry = new FieldRVAEntry(metadataFile, metadataOffset, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new FieldRVAEntry(metadataFile, metadataOffset, ptr, rid, fieldDefSize)); } - - return true; + return list; } readonly struct FieldRVA @@ -83,15 +63,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct FieldRVAEntry + internal struct FieldRVAEntry { readonly MetadataFile metadataFile; readonly FieldRVA fieldRVA; public int RID { get; } - public int Token => 0x1D000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] @@ -108,14 +86,13 @@ namespace ICSharpCode.ILSpy.Metadata [ColumnInfo("X8", Kind = ColumnKind.Other)] public int FieldOffset => fieldRVA.Offset; - public FieldRVAEntry(MetadataFile metadataFile, int metadataOffset, ReadOnlySpan ptr, int row) + public FieldRVAEntry(MetadataFile metadataFile, int metadataOffset, ReadOnlySpan ptr, int row, int fieldDefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldRva) + metadataFile.Metadata.GetTableRowSize(TableIndex.FieldRva) * (row - 1); this.Offset = metadataOffset + rowOffset; - int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4; this.fieldRVA = new FieldRVA(ptr.Slice(rowOffset), fieldDefSize); this.fieldTooltip = null; } diff --git a/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs b/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs index 345600d7c..857573c7b 100644 --- a/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs @@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes; namespace ICSharpCode.ILSpy.Metadata { - internal class FieldTableTreeNode : MetadataTableTreeNode + internal class FieldTableTreeNode : MetadataTableTreeNode { public FieldTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Field, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - - FieldDefEntry scrollTargetEntry = default; - - foreach (var row in metadata.FieldDefinitions) + foreach (var row in metadataFile.Metadata.FieldDefinitions) { - var entry = new FieldDefEntry(metadataFile, row); - if (scrollTarget == entry.RID) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new FieldDefEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct FieldDefEntry : IMemberTreeNode + internal struct FieldDefEntry : IMemberTreeNode { readonly MetadataFile metadataFile; readonly FieldDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/FileTableTreeNode.cs b/ILSpy/Metadata/CorTables/FileTableTreeNode.cs index f48edcb39..7257e6c5f 100644 --- a/ILSpy/Metadata/CorTables/FileTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FileTableTreeNode.cs @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class FileTableTreeNode : MetadataTableTreeNode + class FileTableTreeNode : MetadataTableTreeNode { public FileTableTreeNode(MetadataFile metadataFile) : base(TableIndex.File, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - FileEntry scrollTargetEntry = default; - - foreach (var row in metadata.AssemblyFiles) + foreach (var row in metadataFile.Metadata.AssemblyFiles) { - FileEntry entry = new FileEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new FileEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct FileEntry + internal struct FileEntry { readonly MetadataFile metadataFile; readonly AssemblyFileHandle handle; @@ -106,6 +83,5 @@ namespace ICSharpCode.ILSpy.Metadata this.assemblyFile = metadataFile.Metadata.GetAssemblyFile(handle); } } - } } diff --git a/ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs b/ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs index 0e2180210..35595c17e 100644 --- a/ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs @@ -26,46 +26,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class GenericParamConstraintTableTreeNode : MetadataTableTreeNode + internal class GenericParamConstraintTableTreeNode : MetadataTableTreeNode { public GenericParamConstraintTableTreeNode(MetadataFile metadataFile) : base(TableIndex.GenericParamConstraint, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - GenericParamConstraintEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.GenericParamConstraint); row++) { - GenericParamConstraintEntry entry = new GenericParamConstraintEntry(metadataFile, MetadataTokens.GenericParameterConstraintHandle(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new GenericParamConstraintEntry(metadataFile, MetadataTokens.GenericParameterConstraintHandle(row))); } - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct GenericParamConstraintEntry + internal struct GenericParamConstraintEntry { readonly MetadataFile metadataFile; readonly GenericParameterConstraintHandle handle; diff --git a/ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs b/ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs index 744bb2d19..7bf3285de 100644 --- a/ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs @@ -25,45 +25,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class GenericParamTableTreeNode : MetadataTableTreeNode + internal class GenericParamTableTreeNode : MetadataTableTreeNode { public GenericParamTableTreeNode(MetadataFile metadataFile) : base(TableIndex.GenericParam, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); - GenericParamEntry scrollTargetEntry = default; - for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.GenericParam); row++) { - GenericParamEntry entry = new GenericParamEntry(metadataFile, MetadataTokens.GenericParameterHandle(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new GenericParamEntry(metadataFile, MetadataTokens.GenericParameterHandle(row))); } - - return true; + return list; } - struct GenericParamEntry + internal struct GenericParamEntry { readonly MetadataFile metadataFile; readonly GenericParameterHandle handle; diff --git a/ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs b/ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs index efe6e6fa1..bffc7a74d 100644 --- a/ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs @@ -28,46 +28,27 @@ using Mono.Cecil; namespace ICSharpCode.ILSpy.Metadata { - class ImplMapTableTreeNode : MetadataTableTreeNode + class ImplMapTableTreeNode : MetadataTableTreeNode { public ImplMapTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ImplMap, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - ImplMapEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.ImplMap); var span = metadata.AsReadOnlySpan(); + int moduleRefSize = metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4; + int memberForwardedTagRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field); + int stringHandleSize = metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - ImplMapEntry entry = new ImplMapEntry(metadataFile, span, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new ImplMapEntry(metadataFile, span, rid, moduleRefSize, memberForwardedTagRefSize, stringHandleSize)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } readonly struct ImplMap @@ -86,15 +67,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct ImplMapEntry + internal struct ImplMapEntry { readonly MetadataFile metadataFile; readonly ImplMap implMap; public int RID { get; } - public int Token => 0x1C000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Other)] @@ -134,16 +113,13 @@ namespace ICSharpCode.ILSpy.Metadata public string ImportNameTooltip => $"{MetadataTokens.GetHeapOffset(implMap.ImportName):X} \"{ImportName}\""; - public ImplMapEntry(MetadataFile metadataFile, ReadOnlySpan span, int row) + public ImplMapEntry(MetadataFile metadataFile, ReadOnlySpan span, int row, int moduleRefSize, int memberForwardedTagRefSize, int stringHandleSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ImplMap) + metadataFile.Metadata.GetTableRowSize(TableIndex.ImplMap) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int moduleRefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4; - int memberForwardedTagRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field); - int stringHandleSize = metadataFile.Metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4; this.implMap = new ImplMap(span.Slice(rowOffset), moduleRefSize, memberForwardedTagRefSize, stringHandleSize); this.importScopeTooltip = null; this.memberForwardedTooltip = null; diff --git a/ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs b/ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs index 04b87015d..82c7617eb 100644 --- a/ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs @@ -25,47 +25,23 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class InterfaceImplTableTreeNode : MetadataTableTreeNode + internal class InterfaceImplTableTreeNode : MetadataTableTreeNode { public InterfaceImplTableTreeNode(MetadataFile metadataFile) : base(TableIndex.InterfaceImpl, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - InterfaceImplEntry scrollTargetEntry = default; - - var length = metadata.GetTableRowCount(TableIndex.InterfaceImpl); - ReadOnlySpan ptr = metadata.AsReadOnlySpan(); - int metadataOffset = metadataFile.MetadataOffset; + var length = metadataFile.Metadata.GetTableRowCount(TableIndex.InterfaceImpl); + ReadOnlySpan ptr = metadataFile.Metadata.AsReadOnlySpan(); for (int rid = 1; rid <= length; rid++) { - InterfaceImplEntry entry = new InterfaceImplEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new InterfaceImplEntry(metadataFile, ptr, rid)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } readonly struct InterfaceImpl @@ -80,7 +56,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct InterfaceImplEntry + internal struct InterfaceImplEntry { readonly MetadataFile metadataFile; readonly InterfaceImpl interfaceImpl; diff --git a/ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs b/ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs index 5bd75eb91..72faaa712 100644 --- a/ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs @@ -25,47 +25,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class ManifestResourceTableTreeNode : MetadataTableTreeNode + class ManifestResourceTableTreeNode : MetadataTableTreeNode { public ManifestResourceTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ManifestResource, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - ManifestResourceEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; foreach (var row in metadata.ManifestResources) { - ManifestResourceEntry entry = new ManifestResourceEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new ManifestResourceEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct ManifestResourceEntry + internal struct ManifestResourceEntry { readonly MetadataFile metadataFile; readonly ManifestResourceHandle handle; diff --git a/ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs b/ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs index 9f858434d..9beef094d 100644 --- a/ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class MemberRefTableTreeNode : MetadataTableTreeNode + internal class MemberRefTableTreeNode : MetadataTableTreeNode { public MemberRefTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MemberRef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - MemberRefEntry scrollTargetEntry = default; - - foreach (var row in metadata.MemberReferences) + foreach (var row in metadataFile.Metadata.MemberReferences) { - MemberRefEntry entry = new MemberRefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new MemberRefEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct MemberRefEntry + internal struct MemberRefEntry { readonly MetadataFile metadataFile; readonly MemberReferenceHandle handle; diff --git a/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs index 2344f6ff1..fe39eb76f 100644 --- a/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs @@ -24,46 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class MethodImplTableTreeNode : MetadataTableTreeNode + internal class MethodImplTableTreeNode : MetadataTableTreeNode { public MethodImplTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MethodImpl, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); - MethodImplEntry scrollTargetEntry = default; - for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.MethodImpl); row++) { - MethodImplEntry entry = new MethodImplEntry(metadataFile, MetadataTokens.MethodImplementationHandle(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new MethodImplEntry(metadataFile, MetadataTokens.MethodImplementationHandle(row))); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct MethodImplEntry + internal struct MethodImplEntry { readonly MetadataFile metadataFile; readonly MethodImplementationHandle handle; diff --git a/ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs index 49cb863f0..b22262841 100644 --- a/ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs @@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class MethodSemanticsTableTreeNode : MetadataTableTreeNode + internal class MethodSemanticsTableTreeNode : MetadataTableTreeNode { public MethodSemanticsTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MethodSemantics, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); - MethodSemanticsEntry scrollTargetEntry = default; - foreach (var row in metadataFile.Metadata.GetMethodSemantics()) { - MethodSemanticsEntry entry = new MethodSemanticsEntry(metadataFile, row.Handle, row.Semantics, row.Method, row.Association); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new MethodSemanticsEntry(metadataFile, row.Handle, row.Semantics, row.Method, row.Association)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct MethodSemanticsEntry + internal struct MethodSemanticsEntry { readonly MetadataFile metadataFile; readonly Handle handle; diff --git a/ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs index d25a71dd3..d5cd7a4e1 100644 --- a/ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs @@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class MethodSpecTableTreeNode : MetadataTableTreeNode + internal class MethodSpecTableTreeNode : MetadataTableTreeNode { public MethodSpecTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MethodSpec, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - MethodSpecEntry scrollTargetEntry = default; - - foreach (var row in metadata.GetMethodSpecifications()) - { - MethodSpecEntry entry = new MethodSpecEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.GetMethodSpecifications()) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new MethodSpecEntry(metadataFile, row)); } - - return true; + return list; } - struct MethodSpecEntry + internal struct MethodSpecEntry { readonly MetadataFile metadataFile; readonly MethodSpecificationHandle handle; diff --git a/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs index 4f2d7b712..bbe0dcf1f 100644 --- a/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs @@ -28,46 +28,24 @@ using ICSharpCode.ILSpy.TreeNodes; namespace ICSharpCode.ILSpy.Metadata { - internal class MethodTableTreeNode : MetadataTableTreeNode + internal class MethodTableTreeNode : MetadataTableTreeNode { public MethodTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MethodDef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; var list = new List(); - MethodDefEntry scrollTargetEntry = default; - - foreach (var row in metadata.MethodDefinitions) + foreach (var row in metadataFile.Metadata.MethodDefinitions) { - MethodDefEntry entry = new MethodDefEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new MethodDefEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct MethodDefEntry : IMemberTreeNode + internal struct MethodDefEntry : IMemberTreeNode { readonly MetadataFile metadataFile; readonly MethodDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs b/ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs index 46ed75734..129457abc 100644 --- a/ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class ModuleRefTableTreeNode : MetadataTableTreeNode + internal class ModuleRefTableTreeNode : MetadataTableTreeNode { public ModuleRefTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ModuleRef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - ModuleRefEntry scrollTargetEntry = default; - - foreach (var row in metadata.GetModuleReferences()) + foreach (var row in metadataFile.Metadata.GetModuleReferences()) { - ModuleRefEntry entry = new ModuleRefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new ModuleRefEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct ModuleRefEntry + internal struct ModuleRefEntry { readonly MetadataFile metadataFile; readonly ModuleReferenceHandle handle; diff --git a/ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs b/ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs index 490d0ed5c..e526a98ad 100644 --- a/ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs @@ -24,38 +24,19 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class ModuleTableTreeNode : MetadataTableTreeNode + internal class ModuleTableTreeNode : MetadataTableTreeNode { public ModuleTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Module, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - - var list = new List(); - ModuleEntry scrollTargetEntry = default; - - list.Add(new ModuleEntry(metadataFile, EntityHandle.ModuleDefinition)); - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return [new ModuleEntry(metadataFile, EntityHandle.ModuleDefinition)]; } - struct ModuleEntry + internal struct ModuleEntry { readonly MetadataFile metadataFile; readonly ModuleDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs b/ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs index e95619be7..242e19f0a 100644 --- a/ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs @@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class NestedClassTableTreeNode : MetadataTableTreeNode + class NestedClassTableTreeNode : MetadataTableTreeNode { public NestedClassTableTreeNode(MetadataFile metadataFile) : base(TableIndex.NestedClass, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - NestedClassEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.NestedClass); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); + int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - NestedClassEntry entry = new NestedClassEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new NestedClassEntry(metadataFile, ptr, rid, typeDefSize)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } readonly struct NestedClass @@ -79,47 +58,40 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct NestedClassEntry + internal struct NestedClassEntry { readonly MetadataFile metadataFile; readonly NestedClass nestedClass; public int RID { get; } - public int Token => 0x29000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] public int NestedClass => MetadataTokens.GetToken(nestedClass.Nested); - public void OnNestedClassClick() { MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(metadataFile, nestedClass.Nested, protocol: "metadata"))); } - string nestedClassTooltip; public string NestedClassTooltip => GenerateTooltip(ref nestedClassTooltip, metadataFile, nestedClass.Nested); [ColumnInfo("X8", Kind = ColumnKind.Token)] public int EnclosingClass => MetadataTokens.GetToken(nestedClass.Enclosing); - public void OnEnclosingClassClick() { MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(metadataFile, nestedClass.Enclosing, protocol: "metadata"))); } - string enclosingClassTooltip; public string EnclosingClassTooltip => GenerateTooltip(ref enclosingClassTooltip, metadataFile, nestedClass.Enclosing); - public NestedClassEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row) + public NestedClassEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row, int typeDefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.NestedClass) + metadataFile.Metadata.GetTableRowSize(TableIndex.NestedClass) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; this.nestedClass = new NestedClass(ptr.Slice(rowOffset), typeDefSize); this.nestedClassTooltip = null; this.enclosingClassTooltip = null; diff --git a/ILSpy/Metadata/CorTables/ParamTableTreeNode.cs b/ILSpy/Metadata/CorTables/ParamTableTreeNode.cs index 905159883..d37c6a5d5 100644 --- a/ILSpy/Metadata/CorTables/ParamTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/ParamTableTreeNode.cs @@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class ParamTableTreeNode : MetadataTableTreeNode + internal class ParamTableTreeNode : MetadataTableTreeNode { public ParamTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Param, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); - ParamEntry scrollTargetEntry = default; - for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.Param); row++) { - ParamEntry entry = new ParamEntry(metadataFile, MetadataTokens.ParameterHandle(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new ParamEntry(metadataFile, MetadataTokens.ParameterHandle(row))); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct ParamEntry + internal struct ParamEntry { readonly MetadataFile metadataFile; readonly ParameterHandle handle; diff --git a/ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs b/ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs index 6071961f3..40ae2111e 100644 --- a/ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs @@ -25,46 +25,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class PropertyMapTableTreeNode : MetadataTableTreeNode + class PropertyMapTableTreeNode : MetadataTableTreeNode { public PropertyMapTableTreeNode(MetadataFile metadataFile) : base(TableIndex.PropertyMap, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - PropertyMapEntry scrollTargetEntry = default; - + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(TableIndex.PropertyMap); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); + int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; + int propertyDefSize = metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4; for (int rid = 1; rid <= length; rid++) { - PropertyMapEntry entry = new PropertyMapEntry(metadataFile, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new PropertyMapEntry(metadataFile, ptr, rid, typeDefSize, propertyDefSize)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } readonly struct PropertyMap @@ -79,15 +59,13 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct PropertyMapEntry + internal struct PropertyMapEntry { readonly MetadataFile metadataFile; readonly PropertyMap propertyMap; public int RID { get; } - public int Token => 0x15000000 | RID; - public int Offset { get; } [ColumnInfo("X8", Kind = ColumnKind.Token)] @@ -112,15 +90,13 @@ namespace ICSharpCode.ILSpy.Metadata string propertyListTooltip; public string PropertyListTooltip => GenerateTooltip(ref propertyListTooltip, metadataFile, propertyMap.PropertyList); - public PropertyMapEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row) + public PropertyMapEntry(MetadataFile metadataFile, ReadOnlySpan ptr, int row, int typeDefSize, int propertyDefSize) { this.metadataFile = metadataFile; this.RID = row; var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.PropertyMap) + metadataFile.Metadata.GetTableRowSize(TableIndex.PropertyMap) * (row - 1); this.Offset = metadataFile.MetadataOffset + rowOffset; - int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4; - int propertyDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4; this.propertyMap = new PropertyMap(ptr.Slice(rowOffset), typeDefSize, propertyDefSize); this.propertyListTooltip = null; this.parentTooltip = null; diff --git a/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs b/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs index 87d187d28..6afbcb49f 100644 --- a/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs @@ -27,47 +27,25 @@ using ICSharpCode.ILSpy.TreeNodes; namespace ICSharpCode.ILSpy.Metadata { - internal class PropertyTableTreeNode : MetadataTableTreeNode + internal class PropertyTableTreeNode : MetadataTableTreeNode { public PropertyTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Property, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - PropertyDefEntry scrollTargetEntry = default; - - foreach (var row in metadata.PropertyDefinitions) - { - PropertyDefEntry entry = new PropertyDefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.PropertyDefinitions) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new PropertyDefEntry(metadataFile, row)); } - - return true; + return list; } - struct PropertyDefEntry : IMemberTreeNode + internal struct PropertyDefEntry : IMemberTreeNode { readonly MetadataFile metadataFile; readonly PropertyDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/PtrTableTreeNode.cs b/ILSpy/Metadata/CorTables/PtrTableTreeNode.cs index cf196ef03..4ce90e6af 100644 --- a/ILSpy/Metadata/CorTables/PtrTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/PtrTableTreeNode.cs @@ -25,7 +25,7 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class PtrTableTreeNode : MetadataTableTreeNode + class PtrTableTreeNode : MetadataTableTreeNode { readonly TableIndex referencedTableKind; @@ -47,17 +47,11 @@ namespace ICSharpCode.ILSpy.Metadata }; } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - PtrEntry scrollTargetEntry = default; + var metadata = metadataFile.Metadata; var length = metadata.GetTableRowCount(Kind); ReadOnlySpan ptr = metadata.AsReadOnlySpan(); @@ -65,24 +59,9 @@ namespace ICSharpCode.ILSpy.Metadata for (int rid = 1; rid <= length; rid++) { - var entry = new PtrEntry(metadataFile, Kind, referencedTableKind, handleDefSize, ptr, rid); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new PtrEntry(metadataFile, Kind, referencedTableKind, handleDefSize, ptr, rid)); } - - return true; + return list; } readonly struct HandlePtr @@ -95,7 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - struct PtrEntry + internal struct PtrEntry { readonly MetadataFile metadataFile; readonly HandlePtr handlePtr; diff --git a/ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs b/ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs index 24c5cf163..0da6a7407 100644 --- a/ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs @@ -24,46 +24,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - class StandAloneSigTableTreeNode : MetadataTableTreeNode + class StandAloneSigTableTreeNode : MetadataTableTreeNode { public StandAloneSigTableTreeNode(MetadataFile metadataFile) : base(TableIndex.StandAloneSig, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var list = new List(); - StandAloneSigEntry scrollTargetEntry = default; - for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.StandAloneSig); row++) { - StandAloneSigEntry entry = new StandAloneSigEntry(metadataFile, MetadataTokens.StandaloneSignatureHandle(row)); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new StandAloneSigEntry(metadataFile, MetadataTokens.StandaloneSignatureHandle(row))); } - return true; + return list; } - struct StandAloneSigEntry + internal struct StandAloneSigEntry { readonly MetadataFile metadataFile; readonly StandaloneSignatureHandle handle; diff --git a/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs b/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs index d5f51939d..baee1b2dc 100644 --- a/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs @@ -30,47 +30,24 @@ using ICSharpCode.ILSpy.TreeNodes; namespace ICSharpCode.ILSpy.Metadata { - internal class TypeDefTableTreeNode : MetadataTableTreeNode + internal class TypeDefTableTreeNode : MetadataTableTreeNode { public TypeDefTableTreeNode(MetadataFile metadataFile) : base(TableIndex.TypeDef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - TypeDefEntry scrollTargetEntry = default; - - foreach (var row in metadata.TypeDefinitions) - { - TypeDefEntry entry = new TypeDefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.TypeDefinitions) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new TypeDefEntry(metadataFile, row)); } - - return true; + return list; } - struct TypeDefEntry : IMemberTreeNode + internal struct TypeDefEntry : IMemberTreeNode { readonly MetadataFile metadataFile; readonly TypeDefinitionHandle handle; diff --git a/ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs b/ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs index 6b086fea1..32ef8adf0 100644 --- a/ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class TypeRefTableTreeNode : MetadataTableTreeNode + internal class TypeRefTableTreeNode : MetadataTableTreeNode { public TypeRefTableTreeNode(MetadataFile metadataFile) : base(TableIndex.TypeRef, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - TypeRefEntry scrollTargetEntry = default; - - foreach (var row in metadata.TypeReferences) + foreach (var row in metadataFile.Metadata.TypeReferences) { - TypeRefEntry entry = new TypeRefEntry(metadataFile, row); - if (entry.RID == this.scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); + list.Add(new TypeRefEntry(metadataFile, row)); } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); - } - - return true; + return list; } - struct TypeRefEntry + internal struct TypeRefEntry { readonly MetadataFile metadataFile; readonly TypeReferenceHandle handle; diff --git a/ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs b/ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs index e1d796f2b..8fc53af22 100644 --- a/ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs @@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class TypeSpecTableTreeNode : MetadataTableTreeNode + internal class TypeSpecTableTreeNode : MetadataTableTreeNode { public TypeSpecTableTreeNode(MetadataFile metadataFile) : base(TableIndex.TypeSpec, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - var metadata = metadataFile.Metadata; - var list = new List(); - TypeSpecEntry scrollTargetEntry = default; - - foreach (var row in metadata.GetTypeSpecifications()) - { - TypeSpecEntry entry = new TypeSpecEntry(metadataFile, row); - if (scrollTarget.Equals(row)) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) + foreach (var row in metadataFile.Metadata.GetTypeSpecifications()) { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new TypeSpecEntry(metadataFile, row)); } - - return true; + return list; } - struct TypeSpecEntry + internal struct TypeSpecEntry { readonly int metadataOffset; readonly MetadataFile module; diff --git a/ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs b/ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs index b020f5a97..28731afd4 100644 --- a/ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs @@ -29,46 +29,27 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class CustomDebugInformationTableTreeNode : DebugMetadataTableTreeNode + internal class CustomDebugInformationTableTreeNode : DebugMetadataTableTreeNode { public CustomDebugInformationTableTreeNode(MetadataFile metadataFile) : base(TableIndex.CustomDebugInformation, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); - - view.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected; - view.RowDetailsTemplateSelector = new CustomDebugInformationDetailsTemplateSelector(); - var list = new List(); - CustomDebugInformationEntry scrollTargetEntry = default; - foreach (var row in metadataFile.Metadata.CustomDebugInformation) { - CustomDebugInformationEntry entry = new CustomDebugInformationEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry?.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new CustomDebugInformationEntry(metadataFile, row)); } + return list; + } - return true; + protected override void ConfigureDataGrid(DataGrid view) + { + view.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected; + view.RowDetailsTemplateSelector = new CustomDebugInformationDetailsTemplateSelector(); } class CustomDebugInformationDetailsTemplateSelector : DataTemplateSelector @@ -89,7 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - class CustomDebugInformationEntry + internal struct CustomDebugInformationEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs b/ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs index 320fdffff..70af24dae 100644 --- a/ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs @@ -26,45 +26,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class DocumentTableTreeNode : DebugMetadataTableTreeNode + internal class DocumentTableTreeNode : DebugMetadataTableTreeNode { public DocumentTableTreeNode(MetadataFile metadataFile) : base(TableIndex.Document, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - DocumentEntry scrollTargetEntry = default; - foreach (var row in metadataFile.Metadata.Documents) { - DocumentEntry entry = new DocumentEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new DocumentEntry(metadataFile, row)); } - return true; + return list; } - readonly struct DocumentEntry + internal readonly struct DocumentEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs b/ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs index 65639ad1f..5faf0f8fa 100644 --- a/ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs @@ -24,45 +24,24 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class ImportScopeTableTreeNode : DebugMetadataTableTreeNode + internal class ImportScopeTableTreeNode : DebugMetadataTableTreeNode { public ImportScopeTableTreeNode(MetadataFile metadataFile) : base(TableIndex.ImportScope, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - ImportScopeEntry scrollTargetEntry = default; - foreach (var row in metadataFile.Metadata.ImportScopes) { - ImportScopeEntry entry = new ImportScopeEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new ImportScopeEntry(metadataFile, row)); } - - return true; + return list; } - readonly struct ImportScopeEntry + internal readonly struct ImportScopeEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs b/ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs index d5ab73d5b..de5d38896 100644 --- a/ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs @@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class LocalConstantTableTreeNode : DebugMetadataTableTreeNode + internal class LocalConstantTableTreeNode : DebugMetadataTableTreeNode { public LocalConstantTableTreeNode(MetadataFile metadataFile) : base(TableIndex.LocalConstant, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - LocalConstantEntry scrollTargetEntry = default; foreach (var row in metadataFile.Metadata.LocalConstants) { - LocalConstantEntry entry = new LocalConstantEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new LocalConstantEntry(metadataFile, row)); } - return true; + return list; } - struct LocalConstantEntry + internal readonly struct LocalConstantEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs b/ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs index f25412f98..b40ac5029 100644 --- a/ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs @@ -25,45 +25,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class LocalScopeTableTreeNode : DebugMetadataTableTreeNode + internal class LocalScopeTableTreeNode : DebugMetadataTableTreeNode { public LocalScopeTableTreeNode(MetadataFile metadataFile) : base(TableIndex.LocalScope, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - LocalScopeEntry scrollTargetEntry = default; foreach (var row in metadataFile.Metadata.LocalScopes) { - LocalScopeEntry entry = new LocalScopeEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new LocalScopeEntry(metadataFile, row)); } - return true; + return list; } - struct LocalScopeEntry + internal struct LocalScopeEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs b/ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs index 1add2eae6..1ccfeb640 100644 --- a/ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs @@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class LocalVariableTableTreeNode : DebugMetadataTableTreeNode + internal class LocalVariableTableTreeNode : DebugMetadataTableTreeNode { public LocalVariableTableTreeNode(MetadataFile metadataFile) : base(TableIndex.LocalVariable, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - LocalVariableEntry scrollTargetEntry = default; foreach (var row in metadataFile.Metadata.LocalVariables) { - LocalVariableEntry entry = new LocalVariableEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new LocalVariableEntry(metadataFile, row)); } - return true; + return list; } - struct LocalVariableEntry + internal struct LocalVariableEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs b/ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs index 5453ce6f7..35bd6b638 100644 --- a/ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs @@ -27,45 +27,25 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class MethodDebugInformationTableTreeNode : DebugMetadataTableTreeNode + internal class MethodDebugInformationTableTreeNode : DebugMetadataTableTreeNode { public MethodDebugInformationTableTreeNode(MetadataFile metadataFile) : base(TableIndex.MethodDebugInformation, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - MethodDebugInformationEntry scrollTargetEntry = default; foreach (var row in metadataFile.Metadata.MethodDebugInformation) { - MethodDebugInformationEntry entry = new MethodDebugInformationEntry(metadataFile, row); - if (entry.RID == scrollTarget) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new MethodDebugInformationEntry(metadataFile, row)); } - - return true; + return list; } - struct MethodDebugInformationEntry + internal struct MethodDebugInformationEntry { readonly int? offset; readonly MetadataFile metadataFile; diff --git a/ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs b/ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs index d4f778ed2..9948f165b 100644 --- a/ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs +++ b/ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs @@ -24,48 +24,28 @@ using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.Metadata { - internal class StateMachineMethodTableTreeNode : DebugMetadataTableTreeNode + internal class StateMachineMethodTableTreeNode : DebugMetadataTableTreeNode { public StateMachineMethodTableTreeNode(MetadataFile metadataFile) : base(TableIndex.StateMachineMethod, metadataFile) { } - public override bool View(ViewModels.TabPageModel tabPage) + protected override IReadOnlyList LoadTable() { - tabPage.Title = Text.ToString(); - tabPage.SupportsLanguageSwitching = false; - - var view = Helpers.PrepareDataGrid(tabPage, this); var list = new List(); - StateMachineMethodEntry scrollTargetEntry = default; var length = metadataFile.Metadata.GetTableRowCount(TableIndex.StateMachineMethod); var reader = metadataFile.Metadata.AsBlobReader(); reader.Offset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod); for (int rid = 1; rid <= length; rid++) { - StateMachineMethodEntry entry = new StateMachineMethodEntry(metadataFile, ref reader, rid); - if (scrollTarget == rid) - { - scrollTargetEntry = entry; - } - list.Add(entry); - } - - view.ItemsSource = list; - - tabPage.Content = view; - - if (scrollTargetEntry.RID > 0) - { - ScrollItemIntoView(view, scrollTargetEntry); + list.Add(new StateMachineMethodEntry(metadataFile, ref reader, rid)); } - - return true; + return list; } - struct StateMachineMethodEntry + internal struct StateMachineMethodEntry { readonly int? offset; readonly MetadataFile metadataFile; @@ -114,7 +94,6 @@ namespace ICSharpCode.ILSpy.Metadata this.kickoffMethodTooltip = null; this.moveNextMethodTooltip = null; } - } } } \ No newline at end of file diff --git a/ILSpy/Metadata/MetadataTableTreeNode.cs b/ILSpy/Metadata/MetadataTableTreeNode.cs index 2df51f1c6..4283b22ec 100644 --- a/ILSpy/Metadata/MetadataTableTreeNode.cs +++ b/ILSpy/Metadata/MetadataTableTreeNode.cs @@ -16,7 +16,7 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; +using System.Collections.Generic; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Windows.Controls; @@ -26,6 +26,7 @@ using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.IL; using ICSharpCode.Decompiler.Metadata; using ICSharpCode.ILSpy.TreeNodes; +using ICSharpCode.ILSpy.ViewModels; namespace ICSharpCode.ILSpy.Metadata { @@ -51,10 +52,18 @@ namespace ICSharpCode.ILSpy.Metadata this.scrollTarget = metadataFile.Metadata.GetRowNumber((EntityHandle)handle); } - protected void ScrollItemIntoView(DataGrid view, object item) + protected void ScrollRowIntoView(DataGrid view, int row) { - view.Loaded += View_Loaded; - view.Dispatcher.BeginInvoke((Action)(() => view.SelectItem(item)), DispatcherPriority.Background); + if (!view.IsLoaded) + { + view.Loaded += View_Loaded; + } + else + { + View_Loaded(view, new System.Windows.RoutedEventArgs()); + } + if (view.Items.Count > row && row >= 0) + view.Dispatcher.BeginInvoke(() => view.SelectItem(view.Items[row]), DispatcherPriority.Background); } private void View_Loaded(object sender, System.Windows.RoutedEventArgs e) @@ -138,7 +147,39 @@ namespace ICSharpCode.ILSpy.Metadata } } - internal abstract class DebugMetadataTableTreeNode : MetadataTableTreeNode + internal abstract class MetadataTableTreeNode : MetadataTableTreeNode + where TEntry : struct + { + public MetadataTableTreeNode(TableIndex kind, MetadataFile metadataFile) + : base(kind, metadataFile) + { + } + + protected abstract IReadOnlyList LoadTable(); + + protected virtual void ConfigureDataGrid(DataGrid view) + { + } + + public override bool View(TabPageModel tabPage) + { + tabPage.Title = Text.ToString(); + tabPage.SupportsLanguageSwitching = false; + + var view = Helpers.PrepareDataGrid(tabPage, this); + ConfigureDataGrid(view); + + view.ItemsSource = LoadTable(); + tabPage.Content = view; + + ScrollRowIntoView(view, scrollTarget); + + return true; + } + } + + internal abstract class DebugMetadataTableTreeNode : MetadataTableTreeNode + where TEntry : struct { public DebugMetadataTableTreeNode(TableIndex kind, MetadataFile metadataFile) : base(kind, metadataFile)