major
#28694
Beschreibung von Modellteilen als formatierter Text (Rich Text)
Attribute (und ebenso Typen und Module) können im Modell-Editor mit einer Beschreibung versehen werden. Diese Beschreibung wird als Tooltip angezeigt — im Modell-Editor, als Tooltip des Feld-Labels in Formularen von Instanzen und als Tooltip einer Tabellen-Spaltenüberschrift.
Tooltips sind HTML. Die Beschreibung war jedoch ein reines Mehrzeilen-Textfeld und wurde unverändert in das Tooltip-HTML eingesetzt. Enthielt sie XML-Sonderzeichen (z. B. <`, `>, &):
so entstand ungültiges HTML und der Tooltip konnte überhaupt nicht mehr angezeigt werden:
Lösung
Die Beschreibung eines Modellteils ist jetzt formatierter Text und wird mit dem WYSIWYG-HTML-Editor bearbeitet. Sie wird damit bereits beim Speichern in eine gültige, sichere Form gebracht, statt bei jeder Anzeige aufbereitet werden zu müssen:
- InternationalizedDescription, Internationalized und ScriptParameter liefern die Beschreibung als HtmlResKey. Für diesen Wert-Typ ist der bestehende HtmlResKeyEditor registriert — dieselbe Mechanik, die auch ScriptConfiguration verwendet. Die Bearbeitung erfolgt damit ohne zusätzliche Annotation und ohne Abhängigkeit auf das WYSIWYG-Modul.
- Der Editor erzeugt gültiges HTML und prüft es beim Speichern mit SafeHTML. Als Text eingegebene Sonderzeichen werden dabei maskiert.
- Alle Anzeigestellen setzen den gespeicherten HTML-Text unverändert ein. Damit ist auch der Tooltip der Tabellen-Spaltenüberschrift (Column) korrekt, ohne dass dort eigener Code nötig ist.
Zusätzlich wurde die sprachweise Ablage von Bezeichnung und Beschreibung eines Modellteils (TLMetaModelUtil) vereinheitlicht:
- Jede Sprache wird ohne Fallback gelesen und gespeichert. Ein nur in einer Sprache eingegebener Wert wird nicht mehr in die übrigen Sprachen kopiert — wo er nicht von einer echten Übersetzung zu unterscheiden war —, sondern erst bei der Anzeige über den Ressourcen-Fallback aufgelöst.
- Leere Übersetzungen werden gelöscht: Ein in allen Sprachen leerer Wert wird entfernt, als wäre er nie gesetzt worden.
- Fehlende Sprachen werden nur bei aktivierter automatischer Übersetzung gefüllt, und zwar durch tatsächliches Übersetzen eines eingegebenen Wertes statt durch Kopieren.
Migration
Anwendungscode: Beschreibung ist ein `HtmlResKey`
InternationalizedDescription.getDescription() und setDescription() arbeiten mit HtmlResKey statt mit ResKey. Das gilt ebenso für die überschreibenden Deklarationen in Internationalized und ScriptParameter. Anwendungscode, der die Beschreibung eines Modellteils programmatisch setzt oder liest, muss angepasst werden:
{{{#!java // Setzen: ResKey in einen HtmlResKey verpacken. config.setDescription(new DefaultHtmlResKey(descriptionKey));
// Lesen des zugrunde liegenden ResKey. HtmlResKey description = config.getDescription(); ResKey descriptionKey = description == null ? null : ((DefaultHtmlResKey) description).content();
// Anzeige als HTML. HTMLFragment tooltip = description.getHtml(); }}}
Der Inhalt einer so gesetzten Beschreibung muss gültiges HTML sein. Reiner Text mit Sonderzeichen (<`, `>, &`) ist vorher zu maskieren (`TagUtil.encodeXML) — anders als bei der Eingabe über den Editor übernimmt das für programmatisch gesetzte Werte niemand.
Daten: keine Datenmigration erforderlich
Die Konfigurations-Bindung von HtmlResKey (DefaultHtmlResKey.ValueBinding) delegiert an ResKey.ValueBinding und verwendet damit dasselbe Speicherformat. Bereits gespeicherte Beschreibungen — auch die von ScriptParameter — werden unverändert geladen.
Bestehende Beschreibungen mit Sonderzeichen
Altbestände werden nicht automatisch umgestellt: Eine als reiner Text gespeicherte Beschreibung, die <`, `> oder & enthält, bleibt ungültiges HTML und ihr Tooltip bleibt fehlerhaft, bis sie erneut bearbeitet wird. Solche Beschreibungen sind im Modell-Editor einmal zu öffnen und neu zu speichern; der Editor überführt sie dabei in die sichere Form. Der bisherige Workaround — die Sonderzeichen in der Beschreibung manuell zu maskieren — bleibt gültig, ist aber nicht mehr nötig.
Scripted Tests
Scripted Tests, die das Beschreibungsfeld eines Modellteils befüllen oder prüfen, adressieren jetzt den strukturierten HTML-Editor statt eines einfachen Textfelds (siehe die Anpassungen an TestAttributeI18N und TestResourceAttribute).