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.javaPara executá-lo como applet, de forma que possamos depurá-lo, digitamos:
\jdk1.2.2\bin\java -classpath /SuperWabaSDK/lib/superwaba.jar;. waba.applet.Applet NoTeSeA 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.

\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.classTeremos 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).


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.