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.
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.
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:
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. |
A continuación, se facilita una guía breve para portar código, habitualmente en la clase layoutProvider, a la nueva función.
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();
}
}
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.
}
}