Skip to content

WpfHexEditor IDE 0.6.5.8

Latest

Choose a tag to compare

@abbaye abbaye released this 12 May 20:55
· 243 commits to master since this release
Immutable release. Only release title and notes can be modified.

WpfHexEditor IDE v0.6.5.8 — Release Notes

Cumulative release since v0.6.4.75 · 2026-05-12

This release rolls up everything shipped between v0.6.4.75 and the prior 0.6.5.225 build, then resets the IDE build number to a small monotonic counter inside the 0.6.5.* revision slot — no functional change versus 0.6.5.225.


🆕 Major Features

📊 Code Analysis Report

A full code-quality report panel wired into the IDE, with three scopes (Solution / Project / File), an 11-tab layout, and an end-to-end fix flow.

  • Scope-aware SplitButton re-run — left part re-runs the last scope; dropdown offers Re-run (same scope), Run Solution, Run Project…, Run File…; the scope label (Solution: WpfHexEditorControl, Project: WpfHexEditor.App, File: Foo.cs) is displayed in italic between buttons and filters when a report is loaded; _lastScope / _lastPath persisted in CodeAnalysisModule so switching tabs does not reset the scope
  • Treemap context menu — right-click any tile: Open File, Copy Path, Copy Metrics, Run Analysis on File, Filter to This Project, Highlight Top 10 Hotspots (toggle dims non-hotspot tiles)
  • Inline Code Actions (Ctrl+.)CodeActionRegistry + 3 mechanical fixers (WH0032, WH0062, WH0070) + Suppress here, plugged into the LSP code-action pipeline (ADR-019)
  • Suppressions UX — 4-mode pyramidSource / File / Baseline / Disable in the Issues context menu, with automatic re-run after apply (ADR-017)
  • Roslyn fixers v2IRoslynFixer + AsyncVoidToTask / UnusedLocalRemove / UnusedPrivateRemove plug into the existing CodeActionRegistry alongside the regex v1 fixers (ADR-025)
  • Historical Trending — per-run HistoryEntry snapshots + sparkline on Overview; honours SnapshotRetentionDays (ADR-020)
  • Duplication tab redesign — master/detail layout, side-by-side code preview with whitespace-only diff, severity chips, virtualized DataGrid, 8-item context menu, Markdown export (ADR-023)
  • Categories + SARIF 2.1.0RuleCategory enum + RuleMetadata table; SARIF export with enriched rule descriptors; radial chord CyclicDepGraph on the Coupling tab (ADR-024)
  • 15 new localization keys translated across all 28 satellite languages

📝 DocumentEditor — Glyph-Accurate Engine, Rulers, Forensic Trio

The rich-text editor switches its caret, hit-testing, and ruler pipeline to glyph-run geometry, gains interactive page rulers, and adds a three-feature forensic toolkit.

  • Glyph-accurate hit-test & caret — new GetCharOffsetFromGlyphLines and GetCaretXYFromGlyphLines helpers route all hit-testing and caret positioning through PlacedSegment.AdvanceWidths and InlineVisualLine.CharStart/CharEnd (same pipeline as DrawVisualLines); eliminates the caret/insert misalignment on wrapped lines caused by FormattedText vs GlyphTypeface wrap-width divergence
  • Synchronous RebuildLayout in all edit paths (InsertTextAtCaret, SplitBlockAtCaret, DeleteAtCaret) — no more one-frame stale layout between typed character and caret beam
  • Interactive page rulers — horizontal + vertical, drag-to-resize top/bottom margins, drag-to-move Word/VS-style selection; LayoutTransform-based zoom with snap-to-pixel in GlyphRunRenderer; ruler graduation anchored to PageCanvasPadding × zoom − scrollOffset × zoom; horizontal ruler indent markers update on every caret movement (mouse + keyboard)
  • PageCanvasPadding public accessor — exposed on DocumentCanvasRenderer so dependent controls (vertical ruler, minimap) can compute scroll-relative geometry without internal coupling
  • SetVerticalOffset fires PageGeometryChanged — vertical scroll now notifies rulers and minimap viewport in addition to the existing PageChanged event
  • Forensic trio (ADR-024) — P1 rich Copy/Paste (HTML + RTF), P2 Anonymize (savers honour Extra["anonymized"]), P3 Embedded Objects pane (extract + open-in-hex); 532 satellite entries
  • DOCX / RTF / ODT style cascadeDocxStyleTable + 5-stage docDefaults → pStyle → pPr → rStyle → rPr resolution (ADR-013); RtfStyleTable (font/color/style + basedOn flatten); ODT parent-style-name flattening + para→run cascade + fo:color (ADR-016)
  • DOCX family + Flat ODTDocxDocumentLoader extended to .docm/.dotx/.dotm; new FlatOdtDocumentLoader; 9 formats total, plugin v1.1.0 (ADR-018)
  • Waves B–G features — headers/footers, page breaks, table insert/edit dialog, hyperlink insert dialog, auto-list (bullet & numbered), page settings dialog (margins/paper/orientation), rich context menu

🔀 HexEditor Split View (#229)

HexEditorSplitHost wraps two HexEditor instances sharing the same ByteProvider.

  • Inline split toggle at the top of the scrollbar; independent scroll, selection, caret per pane
  • ByteProvider.DataChanged propagates modify / insert / delete to the peer pane (previously only modify events were forwarded)
  • Synced across panes: breadcrumb bar, format detection blocks, undo/redo, custom background overlays
  • Focus borders in split mode only; status bar hidden on secondary pane
  • Standalone-safeHexEditorSplitHost used in Sample.HexEditor
  • IDocumentEditor undo/redo always delegated to the primary pane (shared UndoEngine)
  • Options toggle ShowSplitToggleButton; layout persistence
  • HexEditor 3.3.1 ships this host plus an auto-generated HexEditorSettings panel, parsed fields, and a unified xmlns:hex namespace

📐 Class Diagram — Round-Trip + UML 2.5 + DSL Importers

Round-trip code↔diagram editing for C# and VB.NET, with live sync and rich import/export.

  • Live Sync code → diagram (ADR-021) — FileSystemWatcher + Roslyn workspace events, 300 ms debounce, cycle-prevention via per-file suppression window
  • Round-trip diagram → code (ADR-022) — Roslyn DocumentEditor patches .cs/.vb on diagram edit; SourceFileBackupUndoEntry double-layer undo; preview-diff dialog
  • Round-trip wiring (ADR-034) — editor mutations (rename type/member, add/delete member, delete type, duplicate, change visibility) wired via RoundTripScope helper; in-memory-only nodes skip silently; 8 integration tests
  • VB.NET parity (ADR-037) — VisualBasicRoundTripEditor mirrors C# (11 MemberEdit cases via VB SyntaxFactory + Formatter); 13 VB tests
  • UML 2.5 model enrichments (ADR-030) — generics with constraints, user-defined stereotypes, multiplicities
  • Industrial undo + alignment (ADR-031) — undo depth 200 → 2000; DiagramAlignmentService (6 align + 2 distribute + equalize-size)
  • DSL importers (ADR-032) — IDiagramImporter + Registry + MermaidImporter + PlantUmlImporter; round-trip with existing exporters
  • Target file resolver (ADR-035) — DiagramTargetFileResolver infers .cs target for Add Class/Interface/Enum/Struct
  • ClassDiagram SDK surface (ADR-033) — WpfHexEditor.Editor.ClassDiagram.Core re-exported via WpfHexEditor.SDK; third-party plugins get RoundTrip / Import / CodeGen / Layout / Model contracts transitively
  • ClassDiagram code-gen pipeline (ADR-014) — IR + ILanguageGenerator + Roslyn SyntaxFactory; C# + VB generators; ExportCodeDialog with live preview + JSON settings; 65/65 tests pass

🌍 Full IDE Localization — 28 Languages

Per-assembly LocalizedResourceDictionary localization across all panels, menus, context menus, dialogs, and toolbar buttons — 77.9 % DynamicResource coverage; remaining literals are intentionally English (proper nouns, technical identifiers, icon glyphs).

ar-SA · cs-CZ · da-DK · de-DE · el-GR · es-419 · es-ES · fi-FI · fr-CA · fr-FR · hi-IN · hu-HU · id-ID · it-IT · ja-JP · ko-KR · nl-NL · pl-PL · pt-BR · pt-PT · ro-RO · ru-RU · sv-SE · th-TH · tr-TR · uk-UA · vi-VN · zh-CN

Includes 4 new OptionsResources keys (CodeEditor_Tab_Formatting, CodeEditor_HighlightCurrentLine, TextEditor_WordWrap, TextEditor_HighlightCurrentLine) × 29 locales, fully DynamicResource on CodeEditorFormattingPage and TextEditorOptionsPage, plus a new ErrorPanelOptionsPage.

🐞 Core Module Integrations

Two former plugins promoted to first-class core IDE modules — extension points preserved.

  • DebugModuleWpfHexEditor.Plugins.Debugger merged into WpfHexEditor.App/Debug; nine debug panels (Locals, Autos, Watch, Call Stack, Threads, Tasks, Registers, Memory, Disassembly) pre-register shells at startup for immediate docking restore
  • VS-style Call Stack toolbar — search field, navigate backward/forward (← / →), Show All Threads, Show External Code toggles
  • IDebugAdapterRegistry + IDebugVisualizerRegistry SDK extension points preserved
  • AssemblyExplorer — merged into WpfHexEditor.App/AssemblyExplorer; NuGet diamond resolved via Scripting.Common 4.14 pin

📦 NuGet Release Wave — 13 Standalone Packages

Coordinated NuGet publish across the standalone package portfolio, with full satellite-assembly isolation and bundled guides.

Package Version
WPFHexaEditor 3.3.1
WpfCodeEditor 0.9.9.0
WpfDocking 0.9.8.0
WpfTerminal 0.9.7.1
WpfColorPicker 2.0.2
WpfHexEditor.Core.ByteProvider 1.1.1
WpfHexEditor.Core.BinaryAnalysis 1.0.1
whfmt.FileFormatCatalog 1.3.2
whfmt.Analysis 1.1.1
whfmt.CodeGen 1.1.2
whfmt.Fuzz 1.1.1
whfmt.Validate 1.0.0
WpfHexEditor.SDK 2.0.0 (frozen)

Satellite-assembly contamination fix (_BundledProjectDll direct-path pattern + single _AllSatellites glob with per-filename Condition) resolves NU5118 collisions; GeneratePackageOnBuild=false on all non-release projects; full guide docs bundled in each package.

🔬 .whfmt v3 + 799 Format Definitions

  • +109 definitions since v0.6.4.75 (690+ → 799+); Groups C–J complete
  • Schema v3 canonical — camelCase, 15 block types, 2 variable schemas; 0 deletions during migration (ADR-038)
  • Expression engine + function registry
  • FormatSchemaValidator wired at load time (schema v2.3/v3 validation on open, violations reported via FormatLoadFailure)
  • whfmt.FileFormatCatalog v1.1 utility layerFormatMatcher, FormatFileAnalyzer, CatalogQuery, FormatMetadataExtensions, FormatSummaryBuilder; GetAll() / GetCategories() return IReadOnlySet<T> backed by FrozenSet<T>; LazyInitializer.EnsureInitialized replaces manual double-checked lock
  • Whfmt load-failure guard (ADR-004) — dual-pipeline guard (IDE = OutputLogger red/yellow, standalone = StatusText red) + EmbeddedWhfmt_Tests build gate (6 tests, 427+ formats)

✨ Other Additions

Editors & Code Intelligence

  • WpfCodeEditor 0.9.9.0 — inline code actions, Refactor ▶ menu with preview dialog (rename, extract method, inline variable, change signature), dynamic snippets with variable expansion + user store (~/.wpfcodeeditor/snippets/*.json), Debugger integration (Data Tips, Autos, edit-in-place, Run to Cursor, Exception Settings, Attach to Process), IDebugValueProvider SDK contract + DebugValueHintsLayer overlay, LSP semantic token colorisation, zoom snap-to-pixel
  • Roslyn semantic inline hints upgradeIReferenceCountProvider SDK contract decouples reference counting from the Roslyn implementation; exposed via IDEHostContext; whfmt-driven CanProvide opt-in per language
  • Ctrl+Click Links & EmailsClickableLinksEnabled / ClickableEmailsEnabled DPs in CodeEditor and TextEditor; opens URLs in default browser and emails in default mail client
  • Goto Position dialog — jump directly to a byte offset in the hex view
  • LSP semantic highlighting — semantic token colorisation wired in Code Editor

UI, Docking & Window Management

  • Window menu — new top-level _Window menu — Close / Close All But This / Close All Documents / Next / Previous Document (Ctrl+Tab), F11 fullscreen via Win32 MonitorFromWindow / GetMonitorInfo (covers full monitor including taskbar, restores exact position)
  • Docking 0.9.8.0 — horizontal reorder for docked tool-panel tabs (drag left/right within the same edge); tab-switch triple-fire eliminated (layout passes 3 → 1); StaticResource toolbar labels resolved on first display; full localization wired
  • Docking overlay polish — VS-like overlay border with active-tab gap, placement-aware tab styles (top → top CornerRadius, bottom → bottom CornerRadius), SelectionBorder matrix (TopBar/FullBorder/Glow × Top/Bottom)
  • Docking layout auto-reset — corrupt or oversized saved layouts auto-reset on startup instead of crashing; layout persistence save/restore on close/load wired in MainWindow
  • Context menu polish — drop shadow + accent band on all context menus; MDL2 icons; Light theme ContextMenu aligned with Dark theme style

HexEditor Engine

  • Shared UndoEngineIUndoAwareEditor contract + HexByteUndoEntry; DocumentBuffer undo wiring via ByteProvider; Ctrl+Z/Y history shared across editor types
  • ByteProvider extraction — promoted to standalone WpfHexEditor.Core.ByteProvider library and published as a standalone NuGet package; regression test suite added
  • HexEditor drag-selection auto-scroll — window-level mouse capture for both HexEditor and TextEditor; scroll continues while the cursor is outside the control boundary
  • Column highlight defaultsShowColumnHighlight and ShowAsciiColumnHighlight default to false to reduce visual noise out of the box

Build & NuGet Infrastructure

  • NuGet CI pipeline — generic publish workflow covering all 23 packages
  • NuGet satellite isolation_BundledProjectDll direct-path pattern; single _AllSatellites glob + per-filename Condition; ResxEditor, Debugger, and other unrelated satellites no longer appear inside standalone packages
  • GeneratePackageOnBuild=false on all non-release projects to prevent auto-pack during solution builds

🐛 Notable Fixes

  • Caret / insert position mismatch on wrapped linesGetCharOffsetAtPoint used FormattedText geometry (different wrap width from GlyphRun); fixed by routing all hit-testing through GetCharOffsetFromGlyphLines
  • Vertical ruler not tracking document scrollSetVerticalOffset did not fire PageGeometryChanged; both the firing and the subscription path are fixed
  • Ruler indent markers frozen on paragraph clickOnMouseDown and edit-path operations did not call caret-moved notifications; horizontal ruler indent markers only updated when CommitCaret was reached via keyboard
  • Document opens dirtyUndoEngine.MarkSaved() and model.IsDirty = false now called in BindModel
  • GetCaretX ArgumentOutOfRangeException — guard added when _caretOffset exceeds the current block's text length after a deletion
  • Minimap viewport rect disproportionate — viewport rectangle in DocumentMiniMapControl was computed using pre-zoom metrics; fixed to use the same scaled content height as the renderer
  • AssemblyExplorer blank panel on restore — dual-cache bug where DockControl._displayContent kept serving a stale placeholder after _contentCache was cleared; both caches now invalidated together
  • Module panel restore dual-cache — clearing only _contentCache left _displayContent serving the stale placeholder on next activation; both caches now cleared on EagerContentKey miss
  • Code Analysis empty column headersDataGridTextColumn.Header, ComboBoxItem.Content, and button labels were rendering as empty because DynamicResource CodeAnalysis_* keys require the dictionary to be in the local UserControl scope; fixed by including AppLocalizedDictionary in UserControl.Resources.MergedDictionaries
  • Code Analysis Re-run always ran on solution_reRunCallback was wired to GetSolutionPath() unconditionally; now uses _lastScope / _lastPath
  • HexEditor ByteProvider.DataChanged — now propagates all mutation types (modify / insert / delete) to the peer pane in split view
  • BreadcrumbBar freeze + phantom row — Render-priority dispatcher guard prevents mouse re-dispatch loop during visual tree rebuild; visual tree locked during navigation; XAML/code-behind duplication resolved; double-rebuild-per-click eliminated
  • Bookmark chip re-render — stopped rebuilding chips on every navigation tick; rebuild only on actual bookmark set changes
  • Minimap scroll — scroll position in MinimapControl now tracks viewport changes correctly
  • Plugin panel loading overlay — suppressed after the first initialization; no longer flashes on subsequent panel activations
  • ClassDiagram layout loop — removed ArrangeOverride 100 k extent that caused an infinite WPF layout loop
  • Satellite contamination in nupkgs — unrelated assembly satellites no longer appear inside standalone packages
  • NU5118 collision — multiple TfmSpecificPackageFile items with overlapping culture folders resolved by single-glob + condition pattern
  • WpfDocking toolbar StaticResource — localized labels now resolve correctly on first display (pre-register output queue)
  • DocEditor ruler zoom alignment — ruler horizontal origin computed via TranslatePoint from renderer canvas to ruler control; handles margin, padding, and container offsets correctly at all zoom levels

🔧 This Release (0.6.5.8)

  • WpfHexEditor.App Version / AssemblyVersion / FileVersion reset from 0.6.5.225 to 0.6.5.8 — new small monotonic build counter inside the 0.6.5.* revision slot. No functional change versus 0.6.5.225.
  • docs/CHANGELOG.md — new [0.6.5.8] HEAD entry with a per-component version table
  • docs/ROADMAP.mdLast revised: 2026-05-12; current-build banner; "Recently Shipped" row prepended
  • README.md — IDE badge → v0.6.5.8, NuGet badge realigned to 13 packages, revised date
  • Guide headers tagged with their package version for consistency: WpfTerminal v0.9.7.1, WpfDocking v0.9.8.0, WpfCodeEditor v0.9.9.0

⬇️ Download

WpfHexEditor-IDE-0.6.5.8-win-x64.zip — self-contained Windows x64 build (.NET 8 runtime embedded). Unzip and run WpfHexEditor.App.exe. No .NET SDK required on the target machine.


📚 Documentation

  • Full changelog: docs/CHANGELOG.md
  • Roadmap: docs/ROADMAP.md
  • Per-package guides bundled inside each NuGet (WPFHexaEditor-guide.md, WpfCodeEditor-guide.md, WpfDocking-guide.md, WpfTerminal-guide.md, WpfColorPicker-guide.md, whfmt-FileFormatCatalog-guide.md)