Litebase 1.3 e SuperWaba – Parte 04

Wellington Pinto de Oliveira

 

Dica 5- Dica de desempenho

wm-29-06-2008.JPG 

Figura 4 - Layout do Container FrmListPessoa

Como a classe FrmListPessoa não foi implementada crie esta classe e implemente o código segundo a Listagem 10. O layout final é semelhante ao exibido na Figura 4;

 

package samples;

 

import waba.ui.Button;

import waba.ui.Grid;

import waba.ui.Event;

import waba.ui.ControlEvent;

import waba.ui.MessageBox;

public class FrmListPessoa extends waba.ui.Container {

 

  Grid grid;

  Button btAlterar, btInsert,btDelete;

 

  public FrmListPessoa() {

  }

 

  public void onStart() {

         //Embora o MainWindow seja branco temos que preencher o container

         //com a mesma cor, senão teremos um quadrado cinza ou azul

         this.setBackColor(waba.fx.Color.WHITE);

 

         //Comece inserindo os objetos na base do formulário

         add(btDelete = new Button("Excluir"), RIGHT - 2, BOTTOM);

         add(btAlterar = new Button("Alterar"), BEFORE - 2, SAME);

         add(btInsert = new Button("Inserir"), BEFORE - 2, SAME);

 

         //Para construir um grid é preciso de um array de titulos,

         //um de tamanhos e outro de alinhamento

         String[] nomes = new String[] { "RG", "Nome" };

         int[] tamanhos = new int[] { 0, 320 };

         int[] alinhamento = new int[] { Grid.LEFT, Grid.LEFT };

        

         //Apenas adicione o gride ao container

         add(grid = new Grid(nomes, tamanhos, alinhamento, false));

         //Este gride deve estar ancorado a parte superior da tela

         //a Esquerda do formulário, com o Fill estou preenchedo toda a

         //tela na horizontal e utilizamos o FIT par preencher do top

         //da tela até o primeiro objeto encontrado analisando de cima para baixo.

         grid.setRect(LEFT + 2, TOP + 2, FILL, FIT);

 

         //Executo o método que carrega os dados

         onAdd();

  }

 

  public void onAdd() {

         // Gerando os dados

         String sql = "SELECT COD_RG,NOME FROM PESSOAS ORDER BY NOME";

        

         //O grid recebe um Array de duas dimensões

         String[][] dados = Pessoas.getData(sql);

        

         //Não podemos jogar algo nulo no Grid, se a consulta não retornar

         //valor o litebase retorna null

         if (dados != null)

                   grid.setItems(dados);

         else

                   grid.clear();

  }

 

  public void onEvent(Event event) {

         //Podemos ter vários eventos em uma tela, todo evento possui

         //um tipo diferente, est tipo é um número único, então por motivos

         //de desenpenho já iniciamos com um Switch

         switch (event.type) {

        

         //Todo botão levant um evento do tipo PRESSED

         case ControlEvent.PRESSED:

                   //Agora basta saber qual objeto levantou o evento, para isso

                   //basta comparar o objeto target com os objetos criados

                   if (event.target == this.btInsert)

                   {

                            this.parentWindow.swap(new FrmEditPessoa());

                            //execute a ação e saia com um return;

                            return;

                   }

                   if (event.target == this.btAlterar) {

                            FrmEditPessoa frm = new FrmEditPessoa();

                            Pessoas buffer = new Pessoas();

 

                            //Se o usuário não selecionou nada no grid exiba a mensagem e saia da execução

                            if (grid.getSelectedRow() < 0) {

                                      new waba.ui.MessageBox("Mensagem", "Selecione um item do Grid").popupBlockingModal();

                                      return;

                            }

                            //Um grid armazena um array de duas dimenções, como armazenamos

                            //a chave cod_rg na coluna 0 então podemos facimente resgatar este

                            //valor e carregar um variável buffer

                            if (buffer.loadByRG(grid.getSelectedItem()[0])) {

                                      //Se a pessoa for carregada então passo este valor para o formulário seguinte

                                      //e exibo tal container, lembre-se a pessoa já está carregada, não é preciso

                                      //carregar novamete no outro formulário

                                      frm.pessoa = buffer;

                                      this.parentWindow.swap(frm);

                            }

                            else

                                      new waba.ui.MessageBox("Mensagem", "Problemas ao carregar dados").popupBlockingModal();

                            return;

                   }

                   if (event.target == this.btDelete) {

                            Pessoas buffer = new Pessoas();

 

                            if (grid.getSelectedRow() < 0) {

                                      new waba.ui.MessageBox("Mensagem","Selecione um item do Grid").popupBlockingModal();

                                      return;

                            }

                            //Sempre que for apagar uma informação pergunte ao usário se ele

                            //está certo da ação que pretende tomar

                            MessageBox msg = new MessageBox("Mensagem", "Deseja realmente exluir| estas informações?",new String[] {"Sim","Não"});

                            msg.popupBlockingModal();

                            if(msg.getPressedButtonIndex() == 1)

                                      return;

                            //similar ao exemplo do botão anterior, porem neste caso nenhum container será

                            //chamado, apenas execute o método delete da Pessoa e recarregue o Grid

                            if (buffer.loadByRG(grid.getSelectedItem()[0]))

                                      if(buffer.delete())

                                               onAdd();

                                      else

                                               new waba.ui.MessageBox("Mensagem", "Problemas ao excluir dados").popupBlockingModal();

                            else

                                      new waba.ui.MessageBox("Mensagem", "Problemas ao carregar dados").popupBlockingModal();

                            return;

                   }

                   break;//FIM DO CASE PRESSED

         }//FIM DO SWITCH

  }

}

Listagem 10 - FrmListPessoa

Este formulário é bem simples, chamo a atenção apenas para o uso do FIT, procure mais informações nos materiais recomendados, pois este atributo se for usado de forma errada pode gerar exception.

Para terminar o pequeno exemplo precisamos apenas implementar o container FrmEditPessoa, o layout desta tela é semelhante ao exibido na Figura 5.

 

wm-29-06-2008pic02.JPG 

Figura 5 - Layout do Container FrmEditPessoa

 

Para isso crie a classe FrmEditPessoa e digite o código exibido na Listagem 11.

 

package samples;

 

import waba.ui.*;

 

public class FrmEditPessoa extends Container {

  //Como este formulário tem a função de alterar valores da entidade

  //Pessoa então devemos criar uma variável para armazenar tal entidade

  public Pessoas pessoa = new Pessoas();

 

  //Objetos de interface

  public Edit edNome, edRg, edData;

  public Button btSalvar, btVoltar, btCalendario;

  public Calendar calendario = new Calendar();

 

  public void onStart() {

         //Embora o MainWindow seja branco temos que preencher o container

         //com a mesma cor, senão teremos um quadrado cinza ou azul

         this.setBackColor(waba.fx.Color.WHITE);

 

         add(new Label("RG:"), LEFT + 2, TOP + 3);

         add(edRg = new Edit(""), AFTER + 2, SAME);

         edRg.setMode(Edit.CURRENCY);

 

         add(new Label("Nome:"), LEFT + 2, AFTER + 2);

         add(edNome = new Edit(""), AFTER + 2, SAME);

 

         Label lbBuffer;

         add(lbBuffer = new Label("Data Nascimento:"), LEFT + 2, AFTER + 2);

         add(btCalendario = new Button("..."), RIGHT - 2, AFTER + 2);

         add(edData = new Edit());

         //Novamente utilizamos o FIT, este atributo se for usado de forma incorreta

         //gera exception, procure mais informações sobre FIT e FILL

         edData.setRect(LEFT + 2, AFTER + 2, FIT, PREFERRED, lbBuffer);

         //O Edit edData será usado apenas para exibir uma data

         edData.setEnabled(false);

        

         add(this.btVoltar = new Button("Voltar"),LEFT + 2,BOTTOM);

         add(this.btSalvar = new Button("Salvar"),AFTER + 2,SAME);

         onAdd();

  }

 

  public void onAdd()

  {

         this.calendario.setSelectedDate(this.pessoa.datNascimento);

         this.edData.setText(this.pessoa.datNascimento.toString());

         this.edNome.setText(this.pessoa.nome);

         this.edRg.setText(this.pessoa.codRg);

  }

 

  public void onEvent(Event event) {

         switch (event.type) {

         case ControlEvent.PRESSED:

                   if (event.target == this.btCalendario) {

                            //Abre o calendário e espera ser fechado para conginuar o

                            //processamento

                            this.calendario.popupBlockingModal();

                            return;

                   }

                   if (event.target == this.btSalvar) {

                            //Com a classe Pessoa implementada fica fácil alterar informações

                            if(this.pessoa.save())

                                      new MessageBox("Mensagem","Salvo com sucesso").popupBlockingModal();

                            else

                                      new MessageBox("Mensagem","Problemas ao salvar").popupBlockingModal();

                            return;

                   }

                   if (event.target == this.btVoltar) {

                            //O Container não possui o método swap(), logo ele precisa

                            //acessar o ParentWindow que o contem para invocar o swap()

                            this.parentWindow.swap(new FrmListPessoa());

                            return;

                   }

                   break;

         //Evento que ocorre quando uma janela é fechada

         case ControlEvent.WINDOW_CLOSED:

                   if (event.target == this.calendario){

                            //Se ele não selecionar data e clicar em cancel

                            //o valor será nulo, então sempre valide a informação

                            if(this.calendario.getSelectedDate() != null){

                                      this.edData.setText(this.calendario.getSelectedDate().toString());

                                      this.pessoa.datNascimento = this.calendario.getSelectedDate();

                            }

                            return;

                   }

                   break;

         //Evento que ocorre quando uma key é pressionada

         case KeyEvent.KEY_PRESS:

                   if(event.target == this.edNome){

                            this.pessoa.nome = edNome.getText();

                            return;

                   }

                   if(event.target == this.edRg){

                            this.pessoa.codRg = edRg.getText();

                            return;

                   }

                   break;

         }

  }

}

Listagem 11 - Código do container FrmEditPessoa