BISWindow

De BIS Wiki
Ir para navegação Ir para pesquisar

A BISWindow é a classe pai de todas as janelas do BIS. Sua principal finalidade é oferecer uma classe "pai" principal comum a todas as janelas do sistema. Filha de "Window" o Vaadin, contém todas as características da classe pai, que podem ser consultadas neste link.

Abaixo estão descritas as funcionalidades de BISWindow, seus conceitos e suas vantagens.

Destacar Conteúdo

Apesar de ser herdeira da Window do Vaadin, a BISWindow permite que seu conteúdo seja redirecionado para outro componente. Que é exatamente o que o SystemFrame faz. Ao anexar uma nova Window na interface (por exemplo usando a BISUI) o SystemFrame ao invés de exibir a nova janela, ele extraí o conteúdo da janela e o exibe dentro de um TabPanel que age como uma "barra de tarefas" do windows, exibindo todas as janelas abertas.

A intenção por trás disso era obviamente manter o código de cada janela em classes diferentes e ao mesmo tempo permitir que o SystemFrame permita que a janela possa ser destacada de dentro do TabPanel para outro lugar. Como por exemplo, uma janela popup, uma janela externa do navegador ou mesmo em algum tipo de visualização "dividida" da tela.

Registro dos Componentes

Ao invés de declarar todos os componentes da janela em atributos locais à classe, a BISWindow oferece os métodos abaixo para registrar o componente na instância da BISWindow. Esse registro nada mais é do que atribuir um ID para o componente de maneira que ele possa ser obtido em qualquer parte da instância, bastando requisita-lo pelo ID. Além de evitar um monte de declarações de classe, se os IDs utilizados forem padronizados é possível utilizar métodos genéricos para realizar algumas funções comuns, como validação dos campos.

Registro

Os métodos para registro dos componentes é:

registerComponent(String, Component)

Sendo que a String é o ID a ser passado e o Componente é o componente de tela criado. Além do método acima temos outros dois similares:

registerBISDefaultContainer(String, BISDefaultContainer<?,?>)

Utilizado para registrar container de componentes que precisam ser atualizados, e:

registerTab(String, Tab)

Que tem a função de registrar as abas criadas para serem colocadas em TabPanel.


Padrão dos IDs
Embora sem uma regra exata, é recomendado que os IDs definidos sigam alguns padrões para facilitar tarefas, como a de validação. Por exemplo, ao registrar os componentes utilizados no painel de um campo de busca podemos usar o prefixo 'searchpanel.*'. Desta forma, se temos dois campos de busca: "Código" e "Nome", teríamos os campos registrados como 'searchpanel.code' e 'searchpanel.name' respectivamente.

No caso dos campos da tela de cadastro do objeto, podemos usar o prefixo com o nome do VO, por exemplo 'personvo.cpf' e 'personvo.name'.

Os nomes utilizados vão depender de cada tela, suas funcionalidades e objetivos. Mas pense sempre na utilização de prefixos diferentes para grupos distintos de componentes. Lêr abaixo a funções que utilizam os prefixos dos IDs de registros ajudam a entender quando usar prefixos diferentes.

Outro padrão sugerido são para os campos de coleções. Por exemplo, PersonVO tem uma coleção de PersonAddressVO. Cada PerssonAddressVO tem seu próprio atributo 'streetname'. Cada campo registrado pode ser o nome 'personvo.personaddressvo[k].streetname', sendo k' o índice do personaddressvo na lista do personvo.


Obter Componente

Uma vez que os componentes foram registrados, eles podem ser obtidos novamente através do método genérico:

getRegisteredComponent(String)

Onde String é o ID definido no ato do registro do componente.

Para a maioria dos componentes utilizados existe um método específico que já faz o Cast para a classe correta. Os métodos estão disponíveis no JavaDOC ou na própria classe, todos seguem o padrão 'getRegistered<Nome do Componente>(String)'.


Validação Generalizada

Os componentes do Vaadin podem ser configurados para realizar algumas validações de formato (com ajuda dos BISDataHandler) e de obrigatoriedade de forma bem simples. Uma vez que as definições de validação foram definidas em cada campo, é possível fazer com que todos os campos sejam validades de uma única vez utilizando-se do prefixo dos IDs dos campos com o método:

validateRegisteredFieldStartingWith(String)

onde String é o prefixo do ID dos campos que se deseja validar. Por exemplo, se ao registrar os componentes da "tela de edição" de PersonVO todos começam com 'personvo.', basta passar este prefixo como parâmetro no método para todos os campos que se encaixam no critério sejam validados e fiquem em vermelho.

Este método retorna um boolean para indicar se todos os campos passaram com sucesso ou não. Basta 1 ter problema para que retorne false. Assim, antes de enviar o VO para o CRUD podemos fazer uma validação preliminar nos valores dos campos da tela com uma única linha.

Desregistrando o Componente

Em alguns momentos é necessário desregistrar os componentes criados e registrados, como por exemplo no caso de objetos criados dinamicamente devido a uma associação em lista. Ao sair da tela de cadastro precisamos que os campos sejam desregistrados por dois motivos:

  • Primeiro porque enquanto o objeto continuar registrado o Garbage Colector não o remove da memória pois continuará a existir uma referência para ele (na hash de indexação da BISWindow);
  • Segundo porque ao editar um componente que tenha uma lista de outros objetos e consequentemente objetos registrados com índices, podemos acabar deixando objetos em memória que atrapalharão a validação. Por exemplo, editamos um objeto com 5 item na sua lista. Deixamos os valores nos campos inválidos e cancelamos a alteração. Em seguida entramos para alterar outro item que só tem 2 itens na sua lista. Os campos desses dois filhos vão acabar sobrepondo os anteriores na Hash de índices, no entanto os outros 3 não fazem parte desse objeto e continuam registrados na BISWindow (mesmo que não associados ao layout) e o método de validação mencionado acima vai continuar chamando-os para as validações preliminares.

Para desregistrar um componente utilize o seguinte método:

unregisterField(String)

onde a String é o ID utilizado no registro do item. Para desregistrar vários componentes de uma única vez utilize:

unregisterFieldStartingWith(String)

onde a String é o prefixo do ID utilizado nos campos que desejamos desregistrar da memória.