Migración de la ampliación del editor de pruebas

Los cambios en el paquete de la infraestructura básica del editor de pruebas de rendimiento se proporcionan en este release para dar soporte a formas más estandarizadas de manejar los atributos de los elementos modelo.

Contenido y diseño del área de detalles (soporte del campo de atributos)

Ahora puede gestionar el diseño y el contenido del área Detalles del editor de pruebas (editores de planificación y pruebas) que tenían que utilizar los desarrolladores en versiones anteriores. En esta versión, puede manipular el contenido mediante el uso de la abstracción llamada AttributeField. Esta construcción esconde una gran parte del comportamiento requerido de los desarrolladores y permite conseguir un porcentaje de ampliación elevado. Las actualizaciones a AttributeField pueden coexistir con las interfaces de usuario de los editores o de las ampliaciones del protocolo, siempre y cuando se realicen algunos ajustes leves. Las clases que derivan de AttributeField se deben utilizar siempre que se visualice un atributo de un elemento de modelo. No utilice AttributeField para ninguna otra información presentada al usuario en el área Detalles. En lugar de eso, utilice widgets de Eclipse normales.

Comportamiento

Las clases y API getXXXvalue(), setXXXValue() y getFieldName() proporcionan una forma de enlazar los datos de modelo con su representación de la interfaz de usuario y, al mismo tiempo, ocultan al desarrollador el trabajo de mantenimiento relacionado de nivel bajo.

Estas clases son abstractas. Cuando un desarrollador elige una de ellas para visualizar sus datos de modelo, sólo se tienen que implementar unos pocos métodos para definir el comportamiento predeterminado del campo de atributos. Si es necesario un comportamiento más personalizado, hay otros métodos disponibles para realizar una alteración temporal. Consulte la documentación HTML de Javadoc para obtener más información.

A continuación, se especifica el pequeño conjunto de métodos que debe implementar el desarrollador:
  • getXXXValue(): Recupera y devuelve un valor del elemento de modelo. XXX representa el tipo de un atributo. Por ejemplo, cuando se amplía IntegerAttributeField, el nombre del método es getIntegerValue().
  • setXXXValue(): Envía un valor obtenido de la UI al elemento de modelo. XXX representa lo mismo que se ha indicado anteriormente.
  • getFieldName(): Devuelve el nombre del campo. Los nombres permiten navegar hasta un campo.
    Nota: Antes de la versión 7.0, nos nombres de campo eran opcionales; en esta versión, son obligatorios.

Clases

En la tabla siguiente se muestra una jerarquía de las clases relacionadas AttributeField que están disponibles para el editor y los desarrolladores de protocolos. En la lista se incluyen descripciones sobre qué clases se deben utilizar en determinadas situaciones.
Nota: Estas clases tienen una funcionalidad limitada porque deben dar soporte a las clases y las API de versiones anteriores a la 7.0.
Clase AttributeField Descripción
OptionsComboField Esta clase se utiliza para que el usuario visualice un conjunto de opciones. Las opciones se presentan en un recuadro combinado. Cuando vaya a ampliar esta clase, deberá proporcionar un índice de la opción seleccionada en ese momento en el elemento de modelo. Cuando un usuario elige un valor diferente del recuadro combinado, el nuevo índice pasa a la clase derivada para actualizar el modelo. El desarrollador de clases tiene que entender el significado del índice en el contexto del modelo.
OptionsRadioField Lo mismo que se aplica a la clase OptionsComboField se aplica a la clase OptionsRadioField. Sin embargo, se aplica la siguiente excepción: Las opciones se visualizan como un conjunto de botones de selección en un grupo. Un usuario debe seleccionar uno de los botones de selección para indicar el índice de la opción seleccionada.
BooleanAttributeField Esta clase se utiliza cuando el atributo del elemento de modelo es un valor booleano. El valor se visualiza como un recuadro de selección. El desarrollador debe proporcionar un valor booleano de un elemento de modelo y aceptar un nuevo valor booleano de la interfaz de usuario para actualizar el elemento de modelo.
IntegerAttributeField Esta clase se utiliza cuando el atributo del elemento de modelo mantiene un valor entero. El campo puede representar un valor entero de varias formas. Los siguientes tipos de control se pueden representar:
  • StyledText
  • Spinner
  • Slider
  • Scale
Nota: Esta clase está sujeta a cambio en el futuro.
TextAttributeField Utilice este campo cuando haya datos de texto en el elemento de modelo.
FilteredTextAttibuteField Esta clase amplía el comportamiento de TextAttributeField mediante la habilitación de la condición de comprobación y visualización de texto alternativo (mensaje) para el usuario. Por ejemplo, es posible que el desarrollador desee filtrar datos binarios o texto que sea demasiado largo para una visualización cómoda.
DataCorrelatingTextAttrField Utilice esta clase cuando los datos de texto se puedan agrupar, correlacionar, utilizar como referencia o configurar en cualquiera de estas combinaciones.

Migración de código desde layoutProvider

A continuación, se facilita una guía breve para portar código, habitualmente en la clase layoutProvider, a la nueva función.

Implementación previa:
class MyLayoutProvider extends ExtlayoutProvider
{
	layoutControls( CBActionElement element )
	{
			super.layoutControls( element ); // llamar primero a super.
			createWidgets(); // crear todas las interfaces de usuario que se vayan a visualizar
			refreshWidgets(); // llamar a refreshLayout para llenar la interfaz de usuario
			return true; // si devuelve "true", es correcta.
	}

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

	refreshControls( CBActionElement element )
	{
			super.refreshControls( element ); // llamar primero a super
			// aplicar los datos del elemento de modelo a los widgets de la interfaz de usuario
			applyModelDataToWidgets();
			return true; // si devuelve "true" es correcta.
	}

	/* puesto que ExtLayoutProvider es SelectionListener, 
	se llama a este método cuando los botones, los recuadros de menús desplegables y 
	elementos de este tipo se modifican. */
	widgetSelected( SelectionEvent event )
	{
			// encontrar el widget, obtener su valor y aplicarlo al modelo 
			applyUiDataToModelElement();
			// llamar a super para actualizar el editor.
			super.widgetSelected();
	}

	/* puesto que ExtLayoutProvider es ModifyListener, 
	se llama a este método cuando se modifica StyledText. */
	modifyText( ModifyEvent event )
	{
			// encontrar el control relevante StyledText y aplicarlo 
			// su valor para el elemento de modelo.
			applyTextUiDataToModelElement();
			super.modifyText();
			}

}
Implementación actual:
class MyLayoutProvider extends ExtlayoutProvider
{
			// clase declarada interna.
			class MyTextField extends TextFieldAttribute
			{
					String getTextValue(){
							return ((MyModelElement)getSelection()).getTextAttr();
					}
					setTextValue( String newVal ){
							((MyModelElement)getSelection()).setTextAttr( newVal );
					}
					String getFieldName(){
							return MY_FIELD_NAME; // definido en algún otro sitio
					}
			};
	
			MyTextField m_fldText;
			MyDataCorrelationField m_DcField; // declarado fuera.

			layoutControls( CBActionElement element )
			{
					createWidgetsAndFields(); // crear todas las interfaces de usuario que se vayan a visualizar
					updateNonFieldWidgets(); // actualizar widgets de no modelo 
					// llamar siempre a super al final.
					return super.layoutControls( element ); 
			}

			createWidgetsAndFields()
			{
					// crear widgets de la interfaz de usuario para visualizar información de no modelo
					…
					// crear Campos
					m_fldText = new MyTextField( this );
					m_fldText.createLabel( … );
					m_fldText.createControl( …. );

					// crear más widgets de la interfaz de usuario para visualizar información de no modelo

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

			}

			trefreshControls( CBActionElement element )
			{
					// actualizar sólo widgets que no sean de la interfaz de usuario.
					applyModelDataToWidgets();
					//llamar siempre a super al final.
					return super.refreshControls( element ); 
}

			/*No tiene que disponer de este método a no ser que desee 
			actualizar widgets/datos que NO sean modelos. */
			widgetSelected( SelectionEvent event )
			{
					// encontrar el widget y hacer lo que sea necesario, pero 
					// no actualice el modelo. 
					applyUiDataTo_NON_ModelElement();
					// NO llamar a super para actualizar el editor.
			}

			/* No tiene que disponer de este método a no ser que 
			desee actualizar widgets/datos que no sean modelos. */
			modifyText( ModifyEvent event )
			{
					// encontrar el widget y hacer lo que sea necesario, pero no 
					// actualizar el modelo. 
					applyTextUiDataToModelElement();
					// NO llamar a super para actualizar el editor.

			}

}

Comentarios