Testeditorerweiterbarkeit migrieren

Dieses Release enthält Änderungen am Basisframework für Leistungstesteditoren. Damit soll eine weitgehend standardisierte Umgehensweise mit Modellelementattributen sichergestellt werden.

Inhalt und Layout des Bereichs "Details" (Attributfeldunterstützung)

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.

Verhalten

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.

Folgende Methoden müssen mindestens vom Entwickler implementiert werden:
  • getXXXValue(): Über diese Methode werden Werte aus Modellelementen abgerufen und zurückgemeldet. Mit XXX wird der Attributtyp bezeichnet. Wenn Sie beispielsweise IntegerAttributeField erweitern möchten, lautet der Name der zu verwendenden Methode getIntegerValue().
  • setXXXValue(): Über diese Methode werden Werte, die über eine Benutzeroberfläche empfangen wurden, an das betreffende Modellelement übertragen. Auch hier wird mit XXX der Attributtyp bezeichnet.
  • getFieldName(): Über diese Methode wird der Name des Felds zurückgemeldet. Über Namen werden Felder zwecks Navigation adressierbar gemacht.
    Anmerkung: In den Versionen vor Version 7.0 waren Feldnamen optional. In der vorliegenden Version sind sie obligatorisch.

Klassen

Die folgende Tabelle enthält in hierarchischer Form alle zu AttributeField gehörenden Klassen, die den mit Editoren und Protokollen betrauten Entwicklern für ihre Arbeit zur Verfügung stehen. In dieser Liste wird auch beschrieben, in welchen Situationen welche Klassen zu verwenden sind.
Anmerkung: Die Klassen sind funktional nur eingeschränkt verwendbar, da sie gleichzeitig Klassen und Anwendungsprogrammierschnittstellen der Versionen vor Version 7.0 unterstützen müssen.
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:
  • StyledText
  • Spinner
  • Slider
  • Scale
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.

Code aus layoutProvider portieren

Es folgt eine kurze Anleitung zum Portieren bereits vorhandenen Codes (gewöhnlich in der Klasse layoutProvider zu finden) in die neue Funktion.

Vorhergehende Implementierung:
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();
			}

}
Aktuelle Implementierung:
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.

			}

}

Feedback