ClubePalm 2003
Por: Guilherme C. Hazan
Atualizado em 21/07/2003 para o SuperWaba 4.0

Na última matéria, foi descrita a história do SuperWaba. Falaremos agora sobre a potencialidade e facilidade do uso da ferramenta para o desenvolvimento de projetos em PDAs.

O SuperWaba é constituído de duas partes: as classes Java, que compõem a biblioteca com a qual são construídas as aplicações; e a máquina virtual, que interpreta o código Java quando rodando no PDA.

Caso você não tenha ainda abaixado o SuperWaba SDK, sugiro-o que o faça agora. Inscreva-se no site www.superwaba.com.br, abaixe o SDK e o descompacte a partir da raiz, de forma que fique c:\SuperwabaSDK\... (ou para qualquer outro drive). Dessa forma ficará mais fácil acompanhar este artigo.

A biblioteca de classes Java está localizada no diretório SuperwabaSDK/src. Abaixo deste diretório, encontram-se os pacotes:

java.lang
waba.applet
waba.fx
waba.io
waba.sys
waba.ui
waba.util
superwaba.ext.*

Mas por que waba... ? Porque o SuperWaba mantém total compatibilidade com o Waba original, e assim sendo, mantém o nome waba como caminho dos pacotes Java. O pacote superwaba.ext contém bibliotecas de extensão, com diversas funcionalidades extras, mas que devem ser instaladas à parte no PDA.

No java.lang, temos as classes Object, String e StringBuffer, Math, Class, e as classes derivadas de Exception. Estas classes são implicitamente importadas quando se faz um programa Java e, portanto, não podem ser trocadas de pacote. Note que o SuperWaba implementa apenas um subconjunto das classes originais, e, dentro dessas classes, apenas um subconjunto dos métodos.

No waba.fx temos classes auxiliares, como Color, Coord, Font, Image, Rect, Sound e, a mais importante, Graphics. A classe Graphics engloba todos os métodos para desenho.

Em waba.io, temos as classes de entrada/saída, como Catalog (que representa o banco de dados nativo do PalmOS - banco, este, que foi portado para o Windows CE/Pocket PC e, portanto, funciona em todas as plataformas), File (permite gravar no sistema de arquivos do Windows CE e tambem em cartoes de memória do PalmOS), Socket, SerialPort, e algumas classes auxiliares, como ByteArrayStream, DataStream (para ler/gravar tipos primitivos e Strings) e ResizeStream.

Em waba.sys, temos classes que interfaceiam com o sistema operacional, como Vm, Thread, Settings (com configurações do PDA), Convert (com todos os métodos para conversão entre tipos primitivos e Strings), CharacterConverter (para conversão de Strings para bytes - usados em codepages).

No waba.ui, temos todos os controles para interface com o usuário, como Button, Check, ComboBox, Edit, Label, ListBox, MenuBar, PopupMenu, PushButtonGroup (para criar diversos botões dispostos em matriz), Radio, ScrollBar, TabPanel e MainWindow (classe que define a janela principal da aplicação). Existem também classes que criam janelas popup arrastáveis, como a Window, Calculator, Calendar, Keyboard, MessageBox, InputDialog. O recurso de arrastar a janela popup não faz parte do PalmOS padrão (as janelas são fixas); este recurso é exclusivo do SuperWaba. Temos ainda as classes de evento, como Event, ControlEvent, PenEvent e KeyEvent, além da classe Timer, utilizada para gerar eventos temporizados. O modelo de eventos do SuperWaba funciona como no Java versão 1.0.

No pacote waba.util temos algumas classes utilitárias, como Date, Hashtable, IntHashtable (ótima para usar em conjunto com o banco de dados), IntVector, Vector, Random.

Todos os pacotes acima descritos compõem a biblioteca Java que os programadores utilizam para criar os programas que serão interpretados pela máquina virtual no PDA.

O pacote waba.applet é utilizado para emular totalmente o PDA, de forma que se possa testar totalmente a aplicação antes de fazer o upload para o PDA, além de possibilitar a execução do programa no browser.

Este é um dos principais atrativos do SuperWaba: poder depurar a sua aplicação sem a necessidade do PDA, e utilizando qualquer depurador Java existente no mercado. Pode-se utilizar, por exemplo, o Eclipse, JBuilder, NetBeans, ou qualquer outro depurador. Isto diminui DRASTICAMENTE o tempo de desenvolvimento de programas.

Como funciona? Voce executa o waba.applet.Applet passando como parametro o nome da sua classe que extende MainWindow, e deixa o resto com as classes de suporte. Pode-se emular tudo, desde o uso do Catalog, fontes customizáveis, até os diversos modos de escala de cinza/cores/alta resolução suportados. E os pdbs gerados no desktop podem ser importados para o seu PDA!

Conforme já dito, pode-se também executar o programa no browser. Um exemplo disso é o meu programa financeiro, que está rodando em http://www.guich.com//vpfin.htm. Isso torna possivel seus clientes irem testando o software durante a fase de desenvolvimento, dentre inúmeras outras vantagens. Note que o programa que é executado no browser é o MESMO, sem alteração alguma, que será executado no PDA. A partir da versao 4.0, é possível também executar o SuperWaba como um aplicativo Windows (Windows 98 ou superior), sem a necessidade de se instalar o JDK.

Agora que falamos das classes, falemos um pouquinho sobre o interpretador Java. Ele encontra-se no diretório SuperWabaSDK/vm. O interpretador é feito em C padrão com várias rotinas em assembler 68000 (PalmOS). Pode-se recompila-lo com a ajuda do CodeWarrior para PalmOS, que custa uns 500 dólares nos EUA. Ou, caso voce esteja mirando a plataforma Windows CE/PocketPC, pode abaixar o MicroSoft eMbedded Visual C++ 3.0 gratuitamente. Para que voce precisa saber disso? Para nada, a não ser que queira se aventurar um pouco. Usuários normais não precisam se preocupar com isso.

Mas como fazer para executar um programa Java no PDA? É muito simples. O PalmOS reconhece apenas dois tipos de programas: os ".prc" e os ".pdb". Entenda o prc como um arquivo executável, análogo ao .exe do Windows. Já o .pdb (Palm DataBase), é o banco de dados do PalmOS. Nele são armazenados registros sequenciais, com cada registro podendo ser de tamanho diferente.

O truque que o SuperWaba usa é empacotar todas as suas classes em um arquivo pdb. Dessa forma, pode-se instalar o arquivo (por exemplo, SeuPrograma.pdb) no Palm. O SuperWaba também cria um prc (SeuPrograma.prc), de forma que o seu produto possa ter um ícone e ser chamado através dele.

Para executar o SuperWaba no Windows CE ou no Pocket PC, usa-se o mesmo MeuPrograma.pdb, porém cria-se um MeuPrograma.exe. Como a plataforma MS possui diversas configurações de versão do sistema operacional e de processador, será necessário criar 10 versões de MeuPrograma.exe!

A máquina virtual que é instalada no PDA depende da plataforma alvo:

O arquivo SuperWaba.prc contém o interpretador em si, o SWNatives.prc é uma shared-library que contém todas as implementações de métodos nativos da biblioteca Java, e o SuperWaba.pdb contém todas as classes Java que compõem a biblioteca (java.lang, waba.fx, waba.io, waba.sys, waba.ui, waba.util), cada classe em um registro. O SuperWaba.exe contém o mesmo que o SuperWaba.prc+SWNatives.prc. O 5sw.pdb e o msw.pdb contém as fontes padrão do SuperWaba.

O seuprograma.prc/exe simplesmente aciona o SuperWaba.prc, passando como parâmetro o nome de sua classe que extende waba.ui.MainWindow (provavelmente, SeuPrograma.class).

E agora, mãos à obra! A seguir, temos um pequeno programa SuperWaba, que insere Nome/Telefone/Sexo no banco de dados e exibe os registros inseridos. O programa está todo comentado, de forma a facilitar o entendimento e torna-lo auto-explicativo.

/** Copyright 2002-2003 SuperWaba.
* NoTeSe: Nome, Telefone e Sexo.
* Exemplo para o artigo do ClubePalm.
*/

// Todo programa SuperWaba deve ter uma e somente uma classe extendendo o waba.ui.MainWindow
// Nota: para fins puramente didaticos, o nome completo do pacote precede cada classe.

public class NoTeSe extends waba.ui.MainWindow
{
   // Interface com o usuario
   waba.ui.Edit edNome, edTel;
   waba.ui.Radio radMasc, radFem;
   waba.ui.PushButtonGroup pbgAcoes;
   waba.ui.Button btnOk;
   waba.ui.ListBox lbListagem;

   // Banco de dados
   waba.io.Catalog cat;
   waba.io.ResizeStream rs;
   waba.io.DataStream ds;

   public NoTeSe()
   {
      // Criamos a janela principal com o titulo abaixo
      // e com uma aba apenas (sem moldura)
      super("Nome, Telefone e Sexo", TAB_ONLY_BORDER);

      // **** waba.sys.Settings.setPalmOSStyle(true);
   }

   // chamado logo apos o construtor. Usado para
   // inicializar a interface
   public void onStart()
   {
      // O SuperWaba permite posicionar os controles de forma
      // relativa em relacao ao anterior. O tamanho de cada um
      // depende do titulo e da fonte utilizada. A vantagem e'
      // que mudando-se de PDA com diferentes fontes, o programa
      // se auto-adapta (como e' o caso dos modelos Sony, e
      // PalmOS 5, com 320x320, além do Windows CE com 640x200 e
      // do Pocket PC com 240x320). Pode-se, alem da constante de
      // posicionamento, utilizar um deslocamento para ajustar
      // melhor o controle. O posicionamento e' sempre em relacao
      // ao ultimo controle adicionado, a menos que se explicite
      // outro (ver posicionamento do pbgAcoes).

      // cria um label e o posiciona `a esquerda, e 5 pixels abaixo
      // do topo da tela (descontado o titulo)
      add(new waba.ui.Label("Nome:"), LEFT,TOP+5);

      // posiciona o edit do nome 10 pixels depois do label e na
      // mesma linha
      add(edNome = new waba.ui.Edit("@@@@@@@@@@"), AFTER+10,SAME);

      // cria outro label e o posiciona `a esquerda, 3 pixels depois
      // dos controles anteriores
      add(new waba.ui.Label("Telefone:"), LEFT, AFTER+3);

      // posiciona o edit do telefone 10 pixels depois do label e
      // na mesma linha
      add(edTel = new waba.ui.Edit("99 9999-9999"), AFTER+10, SAME);
      add(new waba.ui.Label("Sexo:"), LEFT, AFTER+3);

      // Cria um RadioGroup, que desmarcara' o masculino quando se
      // clicar no feminino, e vice-versa.
      waba.ui.RadioGroup rg = new waba.ui.RadioGroup();
      add(radMasc = new waba.ui.Radio("Masculino",rg), AFTER+10, SAME);
      add(radFem  = new waba.ui.Radio("Feminino",rg), AFTER+5, SAME);

      // Faz com que o masculino seja previamente selecionado
      radMasc.setChecked(true);

      // Cria uma matriz de botoes que selecionara' a acao a ser
      // executada quando se pressionar o botao 'Ok'
      add(pbgAcoes = new waba.ui.PushButtonGroup(
             new String[]{"Adiciona","Limpa","Listagem"},
             false, 0, 1, 6, 1, true, waba.ui.PushButtonGroup.NORMAL),
             LEFT, AFTER+3);

      // Executa a acao selecionada no PushButtonGroup acima. Posiciona
      // o botao na mesma linha e 5 pixels apos o ultimo controle
      add(btnOk = new waba.ui.Button("Sim"), AFTER+5,SAME);

      // Cria um listbox e o adiciona `a janela principal.
      add(lbListagem = new waba.ui.ListBox());

      // Redimensiona o controle de forma que ele ocupe o resto da tela.
      lbListagem.setRect(LEFT,AFTER+3,FILL,FILL, pbgAcoes);

      // Banco de dados - Cuidado para nao usar o mesmo nome que o
      // programa! Catalog representa o banco de dados do Palm. No caso,
      // criamos um com o nome NoTeSeDB.
      cat = new waba.io.Catalog("NoTeSeDB."+waba.sys.Settings.appCreatorId
                                 +".DATA", waba.io.Catalog.CREATE);

      // usado para criar registros de tamanho variável, acoplado
      // ao Catalogo
      rs = new waba.io.ResizeStream(cat,128);

      // usado para gravar e ler tipos primitivos e Strings, acoplado
      // ao ResizeStream
      ds = new waba.io.DataStream(rs);
   }

   // Chamado pela VM quando o programa e' finalizado
   public void onExit()
   {
      // fechamos o arquivo
      cat.close();
   }

   // Eventos no SuperWaba ocorrem como no Java 1.0.
   public void onEvent(waba.ui.Event event)
   {
      // E' sempre bom usar um switch ao inves de varios if/else.
      switch (event.type)
      {
         // Algum controle foi pressionado?
         case waba.ui.ControlEvent.PRESSED:
            // E' o botao de 'Ok'?
            if (event.target == btnOk)
               // descobre qual dos botoes de acao esta' selecionado
               switch (pbgAcoes.getSelected())
               {
                   case 0: adicionar(); break;
                   case 1: limpar(); break;
                   case 2: listar(); break;
               }
            break;
      }
   }

   // Adiciona os dados em um novo registro
   private void adicionar()
   {
      // ResizeRecord: crie um novo registro ao final do Catalogo atual
      rs.startRecord();
      // DataStream: grave os seguintes dados, sequencialmente
      ds.writeString(edNome.getText());
      ds.writeString(edTel.getText());
      ds.writeBoolean(radMasc.getChecked()); // true se e' masculino
      // ResizeRecord: o registro esta' pronto; redimensione-o para
      // que ocupe apenas o que nele foi gravado.
      rs.endRecord();
      // Por fim, limpamos a tela para prepara-la para uma nova insercao
      limpar();
   }

   // Limpa todos os controles
   private void limpar()
   {
      edNome.setText("");
      edTel.setText("");
      radMasc.setChecked(true);
      radFem.setChecked(false);
      pbgAcoes.setSelected(0);
   }

   // Vasculha o banco de dados atual e adiciona todos os registros ao
   // listbox de listagem
   private void listar()
   {
      // remove todos os items atualmente listados
      lbListagem.removeAll();
      // obtem o numero de registros no catalogo
      int n = cat.getRecordCount();
      for (int i =0; i < n; i++)
         // Posicione o cursor do banco no registro 'i'. Caso bem sucedido...
         if (cat.setRecordPos(i))
         {
            // ... leia o nome, o telefone e o sexo
            String nome = ds.readString();
            String tel  = ds.readString();
            boolean masc = ds.readBoolean();
            // e adicione `a listagem
            lbListagem.add(nome+","+tel+","+(masc?"M":"F"));
         }
      // vamos ordenar a listagem para ficar mais bonitinho (case sensitive)
      lbListagem.qsort();
   }
}
Para compilar o programa (tendo instalado o JDK 1.2.2 e o SuperWabaSDK na raiz), digitamos:
\jdk1.2.2\bin\javac -classpath
   /SuperWabaSDK/lib/superwaba.jar;. NoTeSe.java
Para executá-lo como applet, de forma que possamos depurá-lo, digitamos:
\jdk1.2.2\bin\java -classpath
   /SuperWabaSDK/lib/superwaba.jar;. waba.applet.Applet NoTeSe
A execução do programa com a linha **** comentada (e, portanto, usando os controles com cara de Windows CE, em 3d), encontra-se na figura abaixo.

Dessa forma foi feito todo o programa, sem a necessidade do PDA. Depois de ter completado o programa, podemos gerar os arquivos que serão inseridos no Palm. Para isso, utilizaremos dois utilitários do diretorio SuperWabaSDK/utils, o Warp e o Exegen. O Warp (Waba Resource Packager) obtém, a partir da classe principal, todas as classes e imagens que são utilizadas por ela e se encontram no classpath e os armazena no .pdb. O Exegen gera o prc (ou os exes), que guardara' o icone e algumas outras informacoes, como proteção contra cópia e versão do seu produto. Ambos são codificados em Java, e portanto, requerem o JDK para serem executados.
\jdk1.2.2\bin\java -classpath
   \jdk1.2.2\lib\rt.jar;.;/SuperWabaSDK/lib/superwaba.jar;/SuperWabaSDK/utils
   Exegen /L /P NoTeSe "Nome Tel Sexo" NoTeSe "Nome Tel Sexo"

\jdk1.2.2\bin\java -classpath
   \jdk1.2.2\lib\rt.jar;.;/SuperWabaSDK/lib/superwaba.jar;/SuperWabaSDK/utils
   Warp c "Nome Tel Sexo" NoTeSe.class
Teremos então os arquivos "Nome Tel Sexo.prc", "Nome Tel Sexo.pdb" e "Nome Tel Sexo.lnk" criados e prontos para serem sincronizados para o Palm (dois primeiros) ou para o Windows CE / Pocket PC (dois últimos - o .lnk substitui os 10 exes que seriam criados com a opção /E do Exegen, mas em contrapartida não permite a definição de um ícone próprio para a aplicação. O "Nome Tel Sexo.pdb" deverá ser copiado para o diretorio "/SuperWaba/NoTeSe" no Windows CE / Pocket PC).

A figura abaixo exibe o emulador do PalmVx com os ícones dos programas instalados, dentre eles o "Nome Tel Sexo" e o ícone do interpretador (SuperWaba).

A figura abaixo exibe o programa sendo executado, mas recompilado sem o comentário na linha ****, e, portanto, com a interface gráfica padrão PalmOS. Note que, utilizando a técnica de dispor os controles de relativamente em relação aos demais, pode-se trocar de um tipo de interface para a outra sem bagunça-los pela tela.

Por fim, note que o programa ocupa 6 kb do sistema operacional! Fora, obviamente, os 298 kb da máquina virtual. Mas à medida em que mais e mais programas forem sendo feitos para o SuperWaba, vai valer a pena ter instalada a máquina virtual. Fora que, em uso comercial geralmente o Palm é totalmente dedicado à aplicação e portanto isto não chega a ser um problema.

Obs: pode-se ver o programa funcionando no browser em http://www.guich.com//clubepalm (ignore Exceptions que apareçam no console java; elas são normais).

Você deve ter notado, lendo este artigo, que o SuperWaba é uma ferramenta muito poderosa. Não é a toa que mais e mais usuários insatisfeitos com os produtos dos concorrentes Sun e IBM o adotam e não o largam mais.

Como a equipe do SuperWaba pode ajudar a sua empresa? No site do SuperWaba pode-se comprar diversos tutoriais: um de interface com o usuário, que explica em detalhes e com muitos exemplos todos os controles; outro que ensina como criar bibliotecas em Java e em C (como o JNI) para serem usados no SuperWaba; mais um que explica como usar as classes do pacote waba.io; e um último que ensina diversos truques de otimização, melhorando o desempenho de seu programa. No site também estão à venda planos de suporte, de forma que você não perca seu tempo e receba rapidamente respostas sobre dúvidas relacionadas ao SuperWaba.

Treinamos seus funcionários, experientes ou não em Java, tornando-os aptos a fazerem aplicações para PalmOS e Windows CE / Pocket PC utilizando a plataforma SuperWaba. Isto é uma grande vantagem para a sua empresa, pois é mais fácil encontrar no mercado programadores Java do que programadores para PDA.

Para você, programador, adicione mais este know-how ao seu curriculum, pois o mercado já está se direcionando para adotar ferramentas de software livre, e o SuperWaba veio para ficar.

Contatos:
Guilherme Campos Hazan
http://www.superwaba.com.br