32 lines
4.8 KiB
Markdown
32 lines
4.8 KiB
Markdown
# 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. **Discover / Validate Repeat** reports structural and [target-side compatibility checks](repeat-compatibility.md) for the current source. Validation does not apply pending form values.
|
|
|
|
The [collection/Component discovery slice](repeat-compatibility.md) now adds choices and declared-type validation in both hosts. Unknown metadata remains a warning; actual values, Component construction and injection remain runtime checks. Generated metadata, Table/Column authoring, structural reference refactoring and complete IDE Problems integration 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](../README.md). 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.
|