4.9 KiB
Shared Repeat-binding inspector
Both hosts provide Bindings → Repeat bindings. Select a declaration or choose New Repeat binding, enter Pane (fx:id), Component class and Collection path, then Apply Repeat binding. Remove Repeat binding deletes the selected declaration. Selecting an entry selects its pane on the canvas; canvas selection also locates the corresponding declaration.
The fields map directly to NeitzelLib Repeat.pane, Repeat.component and Repeat.collection. The runtime creates one fresh Component per collection item and assigns the item as its Model. Use a dedicated pane for these children. This inspector does not change NeitzelLib's list-change behavior or generate Component classes.
Source and history
The inspector shares the lexical document editor and form lifecycle with Direct and Computed bindings. Creation adds a fully qualified Repeat declaration, plus required BindingList/FXML containers when absent. Editing changes only the three requested attributes. Existing quoting, imports, Model declarations, comments, unknown attributes and unrelated bindings remain intact. Alternate FXML prefixes, self-closing containers and explicit BindingList elements wrappers are supported.
Each create, change, remove or explicit replacement is one revision-checked host document command. Normal Undo/Redo restores the exact previous/new text. The active form is invalidated when source changes, and read-only documents cannot be edited. Nested-property declarations remain visible and removable but require Source for changes; unfamiliar syntax is not flattened.
A second Repeat targeting the same pane requires Replace conflicting bindings. Replacement removes the conflicting Repeat declarations atomically with the requested edit. A Direct/Computed binding on a property of that pane remains independent and is preserved.
Validation boundary
Structural diagnostics cover missing/ambiguous pane identifiers, duplicate Repeat panes, and missing/malformed Component class or collection names. Known structural errors block new previews; invalid drafts remain saveable and undoable. Validate Repeat bindings reports these checks and existing target-side binding diagnostics for the current source. Validation does not apply pending form values.
This slice accepts typed field values. A collection/Component chooser and complete preflight compatibility discovery are later work. The pane's actual Java type, collection existence and ObservableList value, element/Component Model compatibility, Component loading and injection still require target-runtime loading. The inspector explicitly distinguishes structural validation from those remaining runtime checks. Generated metadata, Table/Column authoring, structural reference refactoring and complete IDE Problems integration also remain open.
Automated qualification
Lexical tests cover container creation, escaping, all three field changes, exact source preservation, paired-element removal, duplicate-pane replacement, independence from Direct bindings, nested syntax and import identity. The same live shared-UI scenario runs in native standalone and registered IntelliJ against classpath and module-path fixtures. It removes an existing declaration, creates one, changes its pane and Component, saves and renders it, replaces a conflict explicitly, saves a malformed collection path while preview is blocked, and checks exact single-command Undo/Redo throughout. Existing Direct/Computed and lifecycle checks remain enabled.
Run scripts/check-bootstrap.py and scripts/check-ide-host.py with the pinned SDKs described in the README. No manual testing is required; previously skipped human checks remain skipped.
Final qualification on 2026-11-13 passed on the pinned macOS baseline: 99 unit/adapter tests (92 Maven, 7 IntelliJ), 36 target processes / 484 fixture assertions, 48 worker lifecycle cycles, both native standalone modes and both registered IntelliJ modes. The registered IDE checks also verified exclusive JavaFX 26 natives and worker shutdown. No manual testing was used.
The initial full run timed out once in the existing module-path viewmodels fixture at its 30-second process limit, before the new inspector checks. Three fresh-process retries passed unchanged, followed by a successful full bootstrap rerun. The timeout's cause was not established; no timeout was relaxed and no runtime change was made to hide it.
Local evidence: /tmp/repeat-bootstrap.log, /tmp/repeat-registered-ide.log, /tmp/repeat-bootstrap-initial-timeout.log, /tmp/repeat-fixture-retry-{0,1,2}.log, target/connected-workflow/ and target/ide-workflow/{classpath,modulepath}.json. Final live logs contain the Repeat inspector pass markers and no uncaught application exceptions; native-crash and shutdown checks passed. Malformed-XML diagnostics are intentional recovery-test inputs. These results qualify the pinned baseline, not additional platforms or IDE versions.