Migrando a Capacidade de Extensão do Editor de Teste

As alterações no pacote de estrutura base do editor de teste de desempenho são fornecidas neste release para suportar maneiras mais padronizadas de manipular atributos de elemento de modelo.

Conteúdo e Layout da Área de Detalhes (Suporte do Campo de Atributo)

Agora é possível gerenciar o layout e o conteúdo da área de Detalhes no editor de teste (editores de planejamento e de teste) que os desenvolvedores precisavam gerenciar em versões anteriores. Nesta versão, você pode manipular o conteúdo utilizando a abstração chamada AttributeField. Esta construção oculta grande parte do comportamento obrigatório dos desenvolvedores e possibilita bastante a capacidade de extensão. Atualizações para AttributeField podem coexistir com as interfaces com o usuário de editores ou extensões de protocolo existentes, contanto que alguns ajustes menores sejam feitos. As classes derivadas de AttributeField devem ser utilizadas sempre que um atributo de um elemento de modelo é exibido. Não utilize o AttributeField para nenhuma outra informação apresentada ao usuário na área de Detalhes. Em vez disso, utilize widgets comuns do Eclipse.

Comportamento

As classes e APIs getXXXvalue(), setXXXValue() e getFieldName() fornecem uma maneira para vincular dados de modelo com suas representações de interface com o usuário e, ao mesmo tempo, ocultam o trabalho de manutenção de baixo nível relacionado do desenvolvedor.

Essas classes são abstratas. Quando um desenvolvedor escolhe uma das classes para exibir seus dados de modelo, apenas um pequeno número de métodos precisa ser implementado para definir o comportamento padrão do campo de atributo. Se for necessário um comportamento mais customizado, outros métodos estarão disponíveis para substituição. Consulte a documentação HTML do Javadoc para obter mais informações.

O menor conjunto de métodos que um desenvolvedor deve implementar é o seguinte:
  • getXXXValue(): Recupera e retorna um valor do elemento de modelo. XXX significa um tipo de atributo. Por exemplo, ao estender IntegerAttributeField, o nome do método é getIntegerValue().
  • setXXXValue(): Envia um valor obtido da UI para o elemento de modelo. O significado de XXX é o mesmo que o mencionado anteriormente.
  • getFieldName(): Retorna o nome do campo. Os nomes tornam um campo endereçável para navegação.
    Nota: Antes da versão 7.0, os nomes de campo eram opcionais; nesta versão, eles são obrigatórios.

Classes

A tabela a seguir é uma hierarquia das classes relacionadas do AttributeField que estão disponíveis para desenvolvedores de editor e protocolo. A lista inclui descrições sobre quais classes utilizar em situações específicas.
Nota: Essas classes têm funcionalidade limitada, pois elas devem suportar classes e APIs de versões anteriores a 7.0.
Classe AttributeField Descrição
OptionsComboField Essa classe é utilizada para exibir um conjunto de opções para um usuário. As opções são apresentadas em uma caixa de combinação. Ao estender essa classe, você deve fornecer um índice da opção atualmente selecionada no elemento de modelo. Quando um usuário escolhe um valor diferente da caixa de combinação, o novo índice é transmitido para a classe derivada, para atualizar o modelo. O desenvolvedor da classe precisa compreender o significado do índice no contexto do modelo.
OptionsRadioField A mesma provisão que se aplica a OptionsComboField aplica-se a OptionsRadioField. A exceção a seguir, no entanto, aplica-se a: opções são exibidas como um conjunto de botões de opção em um grupo. Um usuário deve selecionar um dos botões de opção para indicar o índice da opção selecionada.
BooleanAttributeField Essa classe é utilizada quando o atributo de elemento de modelo é um valor Booleano. O valor é exibido como uma caixa de opções. O desenvolvedor deve fornecer um valor Booleano de um elemento de modelo e aceitar um novo valor Booleano da interface com o usuário para atualizar o elemento de modelo.
IntegerAttributeField Essa classe é utilizada quando o atributo de elemento de modelo contém um valor inteiro. O campo pode representar um valor inteiro de várias maneiras. Os seguintes tipos de controle estão disponíveis para representação:
  • StyledText
  • Spinner
  • Slider
  • Scale
Nota: Essa classe está sujeita a alteração no futuro.
TextAttributeField Utilize esse campo quando houver dados de texto no elemento de modelo.
FilteredTextAttibuteField Essa classe estende o comportamento de TextAttributeField ativando a verificação de condições e exibindo texto alternativo (mensagem) para o usuário. Por exemplo, o desenvolvedor pode desejar filtrar dados binários ou texto de filtro muito longo para exibição conveniente.
DataCorrelatingTextAttrField Utilize essa classe quando os dados do texto puderem ser colocados no datapool, correlacionados, utilizados como uma referência ou configurados em qualquer combinação desses dados.

Código de Portas de layoutProvider

A seguir, é apresentado um guia breve para código existente de porta, geralmente localizado na classe layoutProvider, para a nova função.

Implementação anterior:
class MyLayoutProvider extends ExtlayoutProvider
{
	layoutControls( CBActionElement element )
	{
			super.layoutControls( element ); // chamar super primeiro.
			createWidgets(); // criar todas as UIs para exibição
			refreshWidgets(); // chamar refreshLayout para preencher a UI
			return true; // return true é bem-sucedido.
	}

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

	refreshControls( CBActionElement element )
	{
			super.refreshControls( element ); // chamar super primeiro
			// captura dados do elemento de modelo e aplica-os aos widgets de UI
			applyModelDataToWidgets();
			return true; // return true se bem-sucedido.
	}

	/* porque o ExtLayoutProvider é SelectionListener, 
	este método é chamado quando Botões, Caixas de Combinação e outros 
	itens semelhantes são modificados. */
	widgetSelected( SelectionEvent event )
	{
			// localize o widget, obtenha seu valor e aplique-o ao modelo 
			applyUiDataToModelElement();
			// chamar super para atualizar o editor.
			super.widgetSelected();
	}

	/* porque o ExtLayoutProvider é ModifyListener, 
	este método é chamado quando StyledText é modificado */
	modifyText( ModifyEvent event )
	{
			// localize o controle StyledText relevante e aplique seu 
			// valor ao elemento de modelo.
			applyTextUiDataToModelElement();
			super.modifyText();
			}

}
Implementação atual:
class MyLayoutProvider extends ExtlayoutProvider
{
			// classe declarada como 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 em qualquer lugar
					}
			};
	
			MyTextField m_fldText;
			MyDataCorrelationField m_DcField; // declarado externamente.

			layoutControls( CBActionElement element )
			{
					createWidgetsAndFields(); // criar todas as UIs para exibição
					updateNonFieldWidgets(); // atualizar widgets sem modelo 
					// sempre chamar super no final.
					return super.layoutControls( element ); 
			}

			createWidgetsAndFields()
			{
					// criar widgets de UIs para exibição de informações sem modelo
					…
					// criar Campos
					m_fldText = new MyTextField( this );
					m_fldText.createLabel( … );
					m_fldText.createControl( …. );

					// criar mais widgets de UIs para exibição de informações sem modelo

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

			}

			refreshControls( CBActionElement element )
			{
					// atualizar widgets SEM UIs apenas.
					applyModelDataToWidgets();
					// sempre chamar super no final.
					return super.refreshControls( element ); 
}

			/*Você não precisa ter este método, a menos que deseje 
			atualizar widgets/dados sem modelos. */
			widgetSelected( SelectionEvent event )
			{
					// localize o widget e faça o que você precisar, mas 
					// não atualize o modelo. 
					applyUiDataTo_NON_ModelElement();
					// NÃO chame super para atualizar o editor.
			}

			/*Você não precisa ter este método, a menos que deseje 
			atualizar widgets/dados sem modelos. */
			modifyText( ModifyEvent event )
			{
					// localize o widget e faça o que você precisar, mas 
					// não atualize o modelo. 
					applyTextUiDataToModelElement();
					// NÃO chame super para atualizar o editor.

			}

}

Feedback