Ab sofort können Sie Inhalt und Layout des Bereichs "Details" im Testeditor (Zeitplan- und Testeditoren) selbst verwalten. In früheren Versionen war das den Entwicklern vorbehalten. Ab dieser Version können Sie Inhalte mithilfe einer Abstraktion des Typs AttributeField bearbeiten. Über dieses Konstrukt wird den Entwicklern ein großer Teil der erforderlichen Aktivitäten abgenommen und damit weitreichende Erweiterbarkeit erzielt. Aktualisierungen zu Abstraktionen des Typs AttributeField können (solange lediglich untergeordnete Anpassungen vorgenommen werden) parallel zu den Benutzeroberflächen vorhandener Editor- oder Protokollerweiterungen existieren. Klassen, die aus Abstraktionen des Typs AttributeField abgeleitet sind, müssen grundsätzlich verwendet werden, wenn ein Attribut aus einem Modellelement angezeigt wird. Verwenden Sie AttributeField nicht für andere Informationen, die dem Benutzer im Bereich "Details" angezeigt werden. Verwenden Sie stattdessen reguläre Eclipse-Fensterobjekte.
Mit den Klassen und Anwendungsprogrammierschnittstellen des Typs "getXXXvalue()", "setXXXValue()" und "getFieldName()" können Sie Modelldaten mit den entsprechenden Darstellungen auf der Benutzeroberfläche verknüpfen und gleichzeitig die dazugehörigen untergeordneten Arbeiten für die Entwickler ausblenden.
Diese Klassen sind abtrakt. Wenn ein Entwickler eine dieser Klassen zur Anzeige von Modelldaten auswählt, müssen zum Definieren des Standardverhaltens für das Attributfeld nur einige wenige Methoden implementiert werden. Wird dagegen ein eher benutzerdefiniertes Verhalten gewünscht, stehen zur Korrektur entsprechende andere Methoden zur Verfügung. Weitere Informationen finden Sie in der Javadoc-HTML-Dokumentation.
AttributeField-Klasse | Beschreibung |
---|---|
OptionsComboField | Diese Klasse dient zur Anzeige von Optionen für einen Benutzer. Die Optionen werden in einem Kombinationsfeld angezeigt. Wenn Sie diese Klasse erweitern möchten, müssen Sie für die aktuell im Modellelement ausgewählte Option einen Index bereitstellen. Wenn dann ein Benutzer einen anderen Wert aus dem Kombinationsfeld auswählt, wird zum Aktualisieren des Modells der neue Index an die abgeleitete Klasse weitergeleitet. Dem für die Klasse zuständigen Entwickler muss die Bedeutung des Index im Kontext des Modells klar sein. |
OptionsRadioField | Die für OptionsComboField genannte Regelung gilt grundsätzlich auch für OptionsRadioField. Einzige Ausnahme: Die Optionen werden als Gruppe von Optionsfeldern dargestellt. Möchte sich ein Benutzer den Index der ausgewählten Option anzeigen lassen, muss er das entsprechende Optionsfeld aus der Gruppe auswählen. |
BooleanAttributeField | Diese Klasse wird verwendet, wenn das Modellelementattribut ein Boolescher Wert ist. Der Wert wird als Markierungsfeld dargestellt. Zur Aktualisierung des Modellelements muss der Entwickler einen Booleschen Wert aus einem Modellelement bereitstellen und einen neuen Booleschen Wert aus der Benutzeroberfläche übernehmen. |
IntegerAttributeField | Diese Klasse wird verwendet, wenn das Modellelementattribut einen ganzzahligen Wert enthält. Die Darstellung des ganzzahligen Werts in dem Feld kann auf verschiedene Weise erfolgen. Die folgenden Steuerungstypen stehen für die Darstellung zur Verfügung:
Anmerkung: Für diese Klasse sind künftig Änderungen geplant.
|
TextAttributeField | Dieses Feld wird verwendet, wenn das Modellelement Textdaten enthält. |
FilteredTextAttibuteField | Diese Klasse dient zur Erweiterung des Felds TextAttributeField. Dabei wird die Funktion zur Überprüfung von Bedingungen aktiviert und dem Benutzer wird ein alternativer Text (Nachricht) angezeigt. Beispielsweise wäre es vorstellbar, dass ein Entwickler binäre Daten filtern oder eine Filterung von Text vornehmen möchte, der zu lang für eine gängige Anzeige ist. |
DataCorrelatingTextAttrField | Diese Klasse wird verwendet, wenn es sich um Text in Datenpools, Text mit Datenkorrelation, Text als Referenz oder Text in einer Kombination aus den genannten drei Sorten handelt. |
Es folgt eine kurze Anleitung zum Portieren bereits vorhandenen Codes (gewöhnlich in der Klasse layoutProvider zu finden) in die neue Funktion.
class MyLayoutProvider extends ExtlayoutProvider { layoutControls( CBActionElement element ) { super.layoutControls( element ); // call super first. createWidgets(); // create all the UI for display refreshWidgets(); // call refreshLayout to populate UI return true; // return true is success. } createWidgets() { new StyledText(); new Button(); } refreshControls( CBActionElement element ) { super.refreshControls( element ); // call super first // grab data from model element and apply it to UI widgets applyModelDataToWidgets(); return true; // return true if success. } /* because the ExtLayoutProvider is SelectionListener, this method is called when Buttons, ComboBoxes and such are modified. */ widgetSelected( SelectionEvent event ) { // find the widget, get its value and apply it to model applyUiDataToModelElement(); // call super to update the editor. super.widgetSelected(); } /* because the ExtLayoutProvider is ModifyListener, this method is called when StyledText is modified. */ modifyText( ModifyEvent event ) { // find relevant StyledText control and apply // its value to the model element. applyTextUiDataToModelElement(); super.modifyText(); } }
class MyLayoutProvider extends ExtlayoutProvider { // class declared as internal. class MyTextField extends TextFieldAttribute { String getTextValue(){ return ((MyModelElement)getSelection()).getTextAttr(); } setTextValue( String newVal ){ ((MyModelElement)getSelection()).setTextAttr( newVal ); } String getFieldName(){ return MY_FIELD_NAME; // defined elsewhere } }; MyTextField m_fldText; MyDataCorrelationField m_DcField; // declared outside. layoutControls( CBActionElement element ) { createWidgetsAndFields(); // create all the UI for display updateNonFieldWidgets(); // update non-model widgets // always call super at the end. return super.layoutControls( element ); } createWidgetsAndFields() { // create UI widgets for displaying non-model info … // create Fields m_fldText = new MyTextField( this ); m_fldText.createLabel( … ); m_fldText.createControl( …. ); // create more UI widgets for displaying non-model info m_DcField = new MyDataCorrelationField( this ); m_DcField.createLabel( … ); m_DcField.createControl( …. ); } refreshControls( CBActionElement element ) { // update NON-UI widgets only. applyModelDataToWidgets(); //always call super at the end. return super.refreshControls( element ); } /*You do not have to have this method unless you want to update NON-model widgets/data. */ widgetSelected( SelectionEvent event ) { // find the widget and do whatever you need, but // do not update the model. applyUiDataTo_NON_ModelElement(); // DO NOT call super to update the editor. } /* You do not need to have this method unless you want to update non-model widgets/data. */ modifyText( ModifyEvent event ) { // find the widget and do whatever you need, but do not // update the model. applyTextUiDataToModelElement(); // DO NOT call super to update the editor. } }