Phase 5: Projekt- und Dokumentmodell implementieren und archivieren

This commit is contained in:
2026-09-06 15:47:40 +02:00
parent 747ec34c6a
commit 687fc230ec
23 changed files with 2261 additions and 211 deletions

View File

@@ -135,6 +135,74 @@ akzeptiert zusätzlich Kommentarzeilen mit `'`. `tbc check`, `build` und
DOS-Großschreibung auf; Formularobjekte aller `.FRM`-Einträge stehen dem
gemeinsamen Modulverbund zur Verfügung.
Optional speichert das Projekt eine ausdrücklich gewählte Startdatei in
einem Metakommentar (Terminal-Basic-Erweiterung):
```mak
' Beispielprojekt
' $STARTUP: "main.bas"
main.bas
lib.bas
form.frm
```
Der Wert muss genau ein vorhandenes BAS-/FRM-Mitglied bezeichnen. Doppelte,
leere, fehlerhafte oder auf Nichtmitglieder gerichtete Angaben werden mit
Dateipfad diagnostiziert. Ohne Metakommentar bleiben die bisherige
Modulreihenfolge und Startformularwahl erhalten. Der gemeinsame Lader
erhält die Auswahl als `ProjectSources.manifest.startup`; ihre zusätzliche
Ausführungswirkung gehört zum Phase-5-Change 04. Ältere Leser ignorieren
diese Kommentarzeile. Mitgliedsreihenfolge, Leerzeilen und gewöhnliche
Kommentare bleiben beim Speichern erhalten; der Startup-Kommentar wird
kanonisch vorangestellt.
### Bearbeitete Dokumente und Speichern
`tb_vm::project_io::SourceLoader` ist der gemeinsame BAS-/FRM-/MAK- und
Include-Lader von CLI und IDE-Modell. Bearbeitete Dokumente überlagern ihren
Plattenstand; Includes behalten ihre physische Datei, Zeile und den
jeweiligen Modulkontext. Relative Includes gewinnen vor optionalen
Include-Suchverzeichnissen. Dateialiasse werden für die Dokumentverwaltung
auf eine gemeinsame absolute Identität aufgelöst; noch ungespeicherte
Dokumente haben ebenfalls einen stabilen Quellpfad, aber keinen Speicherpfad.
`tb_ide::documents::Project` stellt Projekt-, Datei-, Textimport-/Export-,
Undo- und Schließaktionen als direkt testbare API bereit. Ansichten haben
eigene Cursor-/Scrollpositionen und teilen den Dokumentinhalt. Ein
Formulardokument enthält den vorhandenen `FormFile` einschließlich Code;
Importwarnungen bleiben über `Document::import_warnings` abrufbar. Die
Terminaldialoge werden in Change 02 daran angebunden.
Save File und Save As schreiben zunächst eine temporäre Datei im
Zielverzeichnis und ersetzen das Ziel erst nach erfolgreichem Schreiben.
Externe Änderungen und bestehende neue Ziele erfordern eine ausdrückliche
Überschreibentscheidung für die jeweilige Datei. Schreibschutz und binäre
FRM-Originale bleiben geschützt. Binärimporte benötigen für Save File ein
anderes, ausdrücklich gewähltes FRM-Textziel. Ein Dateiexport verändert
weder Projektmitgliedschaft noch Dokumentpfad.
Save Project speichert geänderte Mitglieder und geöffnete geänderte
Include-/Textdokumente vor der MAK-Datei. Es gibt keine atomare Transaktion
über mehrere Dateien: Bei einem Teilfehler bleiben bereits erfolgreich
gespeicherte Dokumente gespeichert, die übrigen geändert und offen. Ein
Schließ-/Projektwechsel wird dann nicht als erfolgreich gemeldet. Die
Konfliktprüfung wird unmittelbar vor dem Ersetzen wiederholt; sie ist ein
optimistischer Abgleich und keine Sperre für fremde Editoren.
Projekt-Save-As berechnet die Mitgliedsverweise relativ zum neuen
Projektverzeichnis. Save As eines Moduls oder Formulars in ein anderes
Verzeichnis passt dessen relative Includes so an, dass sie dieselben
Dateien erreichen; unveränderte Originaldateien bleiben erhalten. Die
aktive Datei-/Projektidentität wechselt erst nach erfolgreicher Ausgabe.
Remove File entfernt nur die Mitgliedschaft; Dateien, geöffnete Ansichten
und ungespeicherter Code bleiben erhalten. Für die aktuelle Startdatei
muss ausdrücklich Ersatz, Standard oder Abbrechen gewählt werden.
Load Text fügt UTF-8-Text am Cursor als eine rückgängig machbare Aktion ein.
Save Text exportiert Auswahl oder gesamten Code. Zum Überschreiben eines
geöffneten Dokuments wird Save File verwendet, damit Dokumentstand und
Formularstruktur nicht durch einen reinen Textexport auseinanderlaufen.
## Record-Dateien (`GET`/`PUT`, `OPEN … FOR RANDOM`)
Feste Strings (`STRING * n`) in Records werden als **UTF-32LE** gespeichert