Migration de l'extensibilité de l'éditeur de test

Des modifications ont été apportées au package de la structure de base de l'éditeur de test des performances dans cette version pour prendre en charge des moyens plus standard de traiter les attributs des éléments de modèle.

Contenu et présentation de la zone Détails (prise en charge de la zone des attributs)

Vous pouvez désormais gérer la présentation et le contenu de la zone Détails de l'éditeur de test (éditeurs de planning et de test) que les développeurs devaient gérer dans les versions antérieures. Dans cette version, vous pouvez manipuler le contenu à l'aide de l'abstraction AttributeField. Cette construction masque une grande partie du comportement requis des développeurs et permet une extensibilité considérable. Les mises à jour de AttributeField peuvent coexister avec les interfaces graphiques des extensions de protocole ou des éditeurs existants, à condition d'effectuer quelques légers ajustements. Les classes provenant d'AttributeField doivent être utilisées chaque fois qu'un attribut d'un élément de modèle est affiché. N'utilisez pas AttributeField pour toute autre information présentée à l'utilisateur dans la zone Détails. Utilisez à la place des widgets Eclipse standard.

Comportement

Les API et les classes getXXXvalue(), setXXXValue() et getFieldName() permettent d'associer les données de modèle à leur représentation dans l'interface graphique, tout en masquant les tâches de maintenance de niveau inférieur du développeur.

Ces classes sont abstraites. Lorsqu'un développeur en choisit une pour afficher les données de son modèle, seules une petite partie des méthodes doivent être implémentées pour définir le comportement par défaut de la zone des attributs. Si un comportement plus personnalisé est nécessaire, d'autres méthodes sont disponibles pour remplacer celles implémentées. Pour plus d'informations, reportez-vous à la documentation HTML Javadoc.

Voici le plus petit ensemble de méthodes qu'un développeur doit implémenter :
  • getXXXValue() : extrait une valeur d'un élément de modèle et la renvoie. XXX représente un type d'un attribut. Par exemple, lors de l'extension d'IntegerAttributeField, le nom de la méthode est getIntegerValue().
  • setXXXValue() : envoie une valeur de l'interface graphique à l'élément de modèle. La signification de XXX est la même que ci-dessus.
  • getFieldName() : renvoie le nom de la zone. Les noms rendent une zone adressable pour la navigation.
    Remarque : Avant la version 7.0, les noms de zone étaient facultatifs ; dans cette version, ils sont obligatoires.

Classes

Le tableau ci-après représente une hiérarchie des classes relatives à AttributeField disponibles pour les développeurs d'éditeurs et de protocoles. Cette liste inclut des descriptions permettant de déterminer les classes à utiliser dans des cas précis.
Remarque : Les fonctionnalités de ces classes sont limitées car elles doivent prendre en charge les classes et les API des versions antérieures à la version 7.0.
Classe AttributeField Description
OptionsComboField Cette classe permet d'afficher un ensemble d'options à un utilisateur. Les options sont présentées dans une boîte de dialogue mixte. Lors de l'extension de cette classe, vous devez fournir un index de l'option actuellement sélectionnée dans l'élément de modèle. Lorsqu'un utilisateur choisit une autre valeur dans la boîte de dialogue mixte, le nouvel index est transmis à la classe dérivée pour mettre à jour le modèle. Le développeur de la classe doit comprendre la signification de l'index dans le contexte du modèle.
OptionsRadioField La condition applicable à OptionsComboField s'applique également à OptionsRadioField. Il existe toutefois une exception : les options sont affichées comme ensemble de boutons d'option dans un groupe. Un utilisateur doit sélectionner l'un des boutons d'option pour indiquer l'index de l'option sélectionnée.
BooleanAttributeField Cette classe est utilisée lorsque l'attribut de l'élément de modèle correspond à une valeur booléenne. Cette valeur est affichée sous forme de case à cocher. Le développeur doit fournir une valeur booléenne d'un élément de modèle et accepter une nouvelle valeur booléenne de l'interface graphique pour mettre à jour l'élément de modèle.
IntegerAttributeField Cette classe est utilisée lorsque l'attribut de l'élément de modèle contient un entier. La zone peut représenter un entier de différentes manières. Les types de contrôle suivants peuvent être représentés :
  • StyledText
  • Spinner
  • Slider
  • Scale
Remarque : Cette classe risque d'être modifiée ultérieurement.
TextAttributeField Utilisez cette zone lorsque l'élément de modèle contient des données de texte.
FilteredTextAttibuteField Cette classe étend le comportement de la classe TextAttributeField en activant la vérification des conditions et en affichant un texte secondaire (message) pour l'utilisateur. Par exemple, le développeur peut souhaiter filtrer les données binaires ou un texte trop long pour être affiché correctement.
DataCorrelatingTextAttrField Utilisez cette classe lorsque les données de texte peuvent être placées dans des pools de données, corrélées et/ou utilisées comme référence.

Code de portage de layoutProvider

Vous trouverez ci-après un petit guide permettant de porter le code existant, qui se trouve généralement dans la classe layoutProvider, à la nouvelle fonction.

Implémentation précédente :
class MyLayoutProvider extends ExtlayoutProvider
{
	layoutControls( CBActionElement element )
	{
			super.layoutControls( element ); // appelez d'abord super.
			createWidgets(); // créez l'interface graphique à afficher
			refreshWidgets(); // appelez refreshLayout pour alimenter l'interface graphique
			return true; // renvoie true en cas de succès.
	}

	createWidgets()
	{
			new StyledText();
			new Button();
	}

	refreshControls( CBActionElement element )
	{
			super.refreshControls( element ); // appelez d'abord super
			// extrayez les données de l'élément de modèle et appliquez-les aux widgets de l'interface graphique
			applyModelDataToWidgets();
			return true; // renvoie true en cas de succès.
	}

	/* comme ExtLayoutProvider correspond à SelectionListener, 
	cette méthode est appelée lorsque des boutons, des zones de liste modifiables et
autres éléments de ce type sont modifiés. */
	widgetSelected( SelectionEvent event )
	{
			// recherchez le widget, collectez sa valeur et appliquez-la au modèle 
			applyUiDataToModelElement();
			// appelez super pour mettre à jour l'éditeur.
			super.widgetSelected();
	}

	/* comme ExtLayoutProvider correspond à ModifyListener, 
	cette méthode est appelée lorsque StyledText est modifié. */
	modifyText( ModifyEvent event )
	{
			// recherchez le paramètre StyledText approprié et appliquez 
			// sa valeur à l'élément de modèle.
			applyTextUiDataToModelElement();
			super.modifyText();
			}

}
Implémentation actuelle :
class MyLayoutProvider extends ExtlayoutProvider
{
			// classe déclarée comme interne.
			class MyTextField extends TextFieldAttribute
			{
					String getTextValue(){
							return ((MyModelElement)getSelection()).getTextAttr();
					}
					setTextValue( String newVal ){
							((MyModelElement)getSelection()).setTextAttr( newVal );
					}
					String getFieldName(){
							return MY_FIELD_NAME; // définie ailleurs
					}
			};
	
			MyTextField m_fldText;
			MyDataCorrelationField m_DcField; // déclarée en dehors de cette classe.

			layoutControls( CBActionElement element )
			{
					createWidgetsAndFields(); // créez l'interface graphique à afficher
					updateNonFieldWidgets(); // mettez à jour les widgets n'appartenant pas au modèle 
					// appelez toujours super à la fin.
					return super.layoutControls( element ); 
			}

			createWidgetsAndFields()
			{
					// créez les widgets de l'interface graphique pour afficher les informations n'appartenant pas au modèle
					…
					// crée les zones
					m_fldText = new MyTextField( this );
					m_fldText.createLabel( … );
					m_fldText.createControl( …. );

					// créez des widgets d'interface graphique supplémentaires pour afficher les informations n'appartenant pas au modèle

					m_DcField = new MyDataCorrelationField( this );
					m_DcField.createLabel( … );
					m_DcField.createControl( …. );

			}

			refreshControls( CBActionElement element )
			{
					// ne mettez à jour que les widgets n'appartenant pas à l'interface graphique.
					applyModelDataToWidgets();
					// appelez toujours super à la fin.
					return super.refreshControls( element ); 
}

			/* Cette méthode n'est pas obligatoire à moins que vous souhaitiez 
			mettre à jour des données/widgets n'appartenant pas au modèle. */
			widgetSelected( SelectionEvent event )
			{
					// recherchez le widget et faites ce que vous avez à faire, mais 
					// ne mettez pas à jour le modèle. 
					applyUiDataTo_NON_ModelElement();
					// N'APPELEZ PAS super pour mettre à jour l'éditeur.
			}

			/* Cette méthode n'est pas obligatoire à moins que vous souhaitiez 
			mettre à jour des données/widgets n'appartenant pas au modèle. */
			modifyText( ModifyEvent event )
			{
					// recherchez le widget et faites ce que vous avez à faire, mais 
					// mettez à jour le modèle. 
					applyTextUiDataToModelElement();
					// N'APPELEZ PAS super pour mettre à jour l'éditeur.

			}

}

Commentaires