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