sábado, 7 de abril de 2012

GWT Applications

GWT ou Google Web Toolkits é uma tecnologia interessante para construção de aplicações RIA para web. E como toda tecnologia possui vantagens e desvantagens. Uma das grandes desvantagens que vejo é a dificuldade de utilização dos widgets nos pacotes de Cells (CellList, CellTable, ...). Caso eu queria adicionar um widget do tipo PushButton, não é possível, pois a construção das cells em tempo de compilação são feitas com SafeHtml, e este por sua vez não permite nenhuma chamada dinâmica, ou seja, não posso criar uma classe de extensão de AbstractCell<C> e implementar o método render com o conteúdo abaixo, pois as imagens não serão renderizadas:

//ImageBundle is ClientBundle instacied in "instance" variable.
Image upImage = new Image(ImageBundle.instance.commandBlock30x30());
Image downImage = new Image(ImageBundle.instance.commandBlockDown30x30());
//create push button
PushButton pb = new PushButton(upImage, downImage);
//
SafeHtmlBuilder sfb = new SafeHtmlBuilder();
sfb.appendHTMLConstant(.pb.toString());

O resultado deste comando é a implementação parcial das tags necessárias para a construção do PushButton. Em outras palavras, você não verá imagem nenhum ali! A curiosidade bateu e fui pesquisa porque isto acontece e o fato mais interessante vem no próprio SafeHtml (via java doc):


The method that appends constant strings (appendHtmlConstant(String)) requires a convention of use to be adhered to in order for this class to adhere to the contract required by SafeHtml: The argument expression must be fully determined and known to be safe at compile time, and the value of the argument must not contain incomplete HTML tags

Ou seja: qualquer elemento que eu colocar ali que precisa de alguma renderização, como é o caso do PushButton, que necessita da renderização posterior das imagens, não irá funcionar. Então como construir? Construa o pushbutton assim:

//...
PushButton pb = new PushButton();
pb.getUpFace().setHTML("<img src='" + ImageBundle.instance.commandBlock30x30().getURL() + "' >");
pb.getDownFace().setHTML("<img src='" + ImageBundle.instance.commandBlockDown30x30().getURL() + "' >");
//...

Parece uma "gambirra" (como chamamos aqui a famosa gambiarra), mas se ler a documentação é uma proteção contra ataque, o que me deixa muito tranquilo para transmitir esta solução.


Até a próxima.

Nenhum comentário:

Postar um comentário

Pesquise aqui!