The generic MetadataTableTreeNode<TEntry> base now overrides
CreateTab() to return a MetadataTablePageModel populated from
LoadTable() + reflected columns. Every typed CorTable / DebugTable
inherits the grid behaviour for free; the per-table text dump is gone.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Tree-node selection now updates the inner Content of one persistent
ContentTabPage instead of swapping the dockable in the dock. The
wrapper view (ContentTabPageView) keeps both inner views — the
decompiler text editor and the metadata grid — pre-realised in the
visual tree from construction time and toggles which is visible based
on Content's runtime type.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Tree-node selections always operate on whatever document tab is
currently active. If the active tab is the wrong concrete type for the
new selection (e.g. a decompiler tab is up and the user picks a
metadata node, or vice-versa), the active dockable is replaced in
place — close the old, add the new, no sibling tab left behind.
Previously the host added a sibling tab and switched focus, which
piled up dockables and made "back to entity from metadata" feel
broken because the user could see two tabs competing for the slot.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Picking DOS Header → COFF Header → DOS Header was opening three
dockables because ShowCustomTab unconditionally added a fresh tab. The
docking host now searches for an open tab of the same concrete type,
copies the new node's tab state onto it, and re-activates it — same
shape as how the single decompiler tab gets reused across tree-node
selections.
Assisted-by: Claude:claude-opus-4-7:Claude Code
The grid view's row-virtualisation handles the full heap (CoreLib's
truncation-footer wording are gone. Existing heap tests are rewritten
to assert against MetadataTablePageModel; the obsolete
MetadataHeapTreeNode.PreviewLimit constant follows the cap into the
deleted set.
Assisted-by: Claude:claude-opus-4-7:Claude Code
DOS / COFF / Optional / DataDirectories / DebugDirectory now expose
their entries through CreateTab() instead of writing a fixed-width text
table from Decompile. The grid view shows each entry's columns
reflected directly off the row shape — Phase 1's text table was a
stand-in until this view shipped. The existing PE-header tests are
rewritten to assert against MetadataTablePageModel.Items / Columns;
adds a Waiters.WaitForMetadataTabAsync helper used by every grid-tab
test.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Lays the rails for Phase 2 without flipping any existing nodes onto the
new path: MetadataTablePageModel + MetadataTablePage view +
MetadataColumnBuilder (cached per row type), an ILSpyTreeNode.CreateTab()
hook the docking host now consults before falling through to the
decompiler tab, and an App.axaml DataTemplate routing the model to the
view. PE-header / heap / table nodes still decompile as text — they get
flipped to CreateTab() one batch at a time in subsequent commits.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Replaces the universal placeholder for Field, MethodDef, Param,
MemberRef, CustomAttribute, and Assembly with their own typed leaves.
Each carries the columns the WPF view shows (RID / Token / Offset / row
data) — the analogous tooltips and click handlers stay deferred to the
Phase-3 navigation work since Phase 1 only renders text. The remaining
25 CorTables continue to land as placeholders until the next pass.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Adds the generic MetadataTableTreeNode<TEntry> base — caches LoadTable's
result and runs it through MetadataTextWriter for the Phase 1 text dump.
Ports Module / TypeRef / TypeDef / AssemblyRef as the first concrete
leaves; the remaining 31 CorTables and 8 DebugTables continue to land
through the universal placeholder until subsequent commits replace
them. Also fixes MetadataTextWriter to convert enum values to their
underlying integer before applying digit-bearing format strings, since
Enum.ToString rejects "X8".
Assisted-by: Claude:claude-opus-4-7:Claude Code
Adds the synthetic "Tables" folder that lazy-loads one leaf per
non-empty CLI metadata table, sitting between the PE headers and the
heaps to match WPF tree shape. The leaves are universal placeholders for
now — typed per-table viewers (35 CorTables + 8 DebugTables) replace
them in the next commit.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Adds the four CLI heap views (#Strings, #US, #GUID, #Blob) under each
assembly's Metadata folder. Phase 1 caps each heap's text dump at 200
preview rows with a truncation footer; the full set arrives with the
DataGrid view in Phase 2. Heap rows are materialised lazily on first
demand so opening the Metadata folder doesn't pay for heaps the user
never visits.
Assisted-by: Claude:claude-opus-4-7:Claude Code
Adds the five PE-format leaves (DOS / COFF / Optional / DataDirectories
/ DebugDirectory) under each assembly's Metadata folder. Phase 1 renders
them as fixed-width text tables via Decompile; Phase 2 will swap to a
DataGrid tab. Introduces Entry / BitEntry / ColumnInfoAttribute and a
MetadataTextWriter helper that the heap and table nodes reuse.
Assisted-by: Claude:claude-opus-4-7:Claude Code
First slice of the Metadata Explorer port (Task 31). Adds a synthetic
MetadataTreeNode child to every loaded PE assembly, slotted before the
References folder to mirror WPF's AssemblyTreeNode ordering. The container
itself decompiles to the same metadata-summary text WPF's DumpMetadataInfo
emits — kind, version, debug header (if any), per-table row counts.
Assisted-by: Claude:claude-opus-4-7:Claude Code