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.
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.
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:
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. |
A seguir, é apresentado um guia breve para código existente de porta, geralmente localizado na classe layoutProvider, para a nova função.
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(); } }
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. } }