<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GWT Brasil &#187; gwt</title>
	<atom:link href="http://www.gwt.com.br/tag/gwt/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gwt.com.br</link>
	<description>Grupo de usuários do GWT no Brasil</description>
	<lastBuildDate>Sat, 10 Oct 2009 03:37:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Novidades do GWT 2.0</title>
		<link>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/</link>
		<comments>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 14:58:04 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[curtas]]></category>
		<category><![CDATA[google-io]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oophm]]></category>
		<category><![CDATA[runasync]]></category>
		<category><![CDATA[webtoolkit]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/?p=94</guid>
		<description><![CDATA[Olá pessoas, após um longo perí­odo sem atualizações estou aqui novamente escrevendo sobre GWT 
Hoje vou falar um pouco sobre uma palestra do Bruce Johnson no Google-IO que vi a alguns dias atrás&#8230; sobre o que está por vir na nova versão do framework. Confesso que fiquei bastante empolgado, funcionalidades a muito esperadas estarão presentes [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoas, após um longo perí­odo sem atualizações estou aqui novamente escrevendo sobre GWT <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Hoje vou falar um pouco sobre uma palestra do Bruce Johnson no Google-IO que vi a alguns dias atrás&#8230; sobre o que está por vir na nova versão do framework. Confesso que fiquei bastante empolgado, funcionalidades a muito esperadas estarão presentes e outras que pelo menos eu, não esperava, me surpreenderam bastante. Vamos aos principais pontos:</p>
<ul>
<li><strong>OOPHM</strong>: Out Of Proccess Hosted Mode </li>
<li><strong>RunAsync</strong>: Quebre o tamanho do arquivo javascript gerado</li>
<li><strong>SOYC</strong>:Story Of Yout Compile</li>
<li><strong>Novos Paineis</strong> <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> aineis mais rápidos</li>
<li><strong>ClientBundle</strong>:Já pensou num <a href="http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/">ImageBundle</a> melhorado? pois é&#8230; conseguiram.. <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Em breve pretendo escrever posts sobre cada uma das funcionalidades acima.</p>
<p>Você encontra o link para o download da apresentação do Bruce Johnson <a href="http://dl.google.com/io/2009/pres/W_1115_GWTCanDoWhat.pdf">aqui</a> e o video da apresentação logo após o break <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-94"></span></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/e9A4FqholOY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/e9A4FqholOY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comunicação Cliente-Servidor utilizando o RPC</title>
		<link>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/</link>
		<comments>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 11:57:34 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/?p=69</guid>
		<description><![CDATA[Este post descreve como funciona o mecanismo de comunicaÃ§Ã£o rpc do gwt.]]></description>
			<content:encoded><![CDATA[<p>É comum para alguém que esteja começando a programar com o GWT ter um pouco de dificuldade com a comunicação entre cliente e servidor através do mecanismo padrão do GWT, o RPC. Após receber alguns emails sobre como fazer isso resolvi escrever este post mostrando de uma forma simplificada e rápida os passos necessários para a execução dessa tarefa simples e extremamente comum em aplicações ajax.<br />
<span id="more-69"></span><br />
Para começar é interessante saber como funciona esse mecanismo. De forma resumida o que acontece é o seguinte: Ao receber o seu objeto java, o compilador gwt vai transformá-lo em uma String então a serializa e em seguida envia ao servidor por meio de uma conexão HTTP normal. Ao receber esse objeto serializado o servidor(Servlet gwt) então deserializa o objeto executando o caminho inverso, transformando a String em um objeto java e então este segue o seu ciclo de vida normal. Da mesma maneira, o inverso também é verdade. Assim, a comunicação pode ser efetuada em ambos os sentidos. Para conseguir executar toda essa tarefa é necessário que o objeto a ser enviado obedeça a algumas regras, a seguir:</p>
<ol>
<li>Ser de um tipo básico/primitivo (String, Integer/int, Double/double, Long/long, Boolean/boolean ).</li>
<li>Implementar a interface Serializable ou IsSerializable(gwt < 1.4). </li>
</li>
<li>Todos os campos do objeto devem obedecer à(s) regra(s) 1 e/ou 2.</li>
</ol>
<p>O uso de coleções e mapas é permitido desde que se use generics e os tipos que elas encapsulem obedeçam às regras citadas anteriormente. Assim é possí­vel se ter por exemplo uma List&lt;String&gt; trafegando entre o cliente e o servidor.</p>
<p>Abaixo você encontra o diagrama de implementação de um serviço rpc do gwt.<br />
<div class="wp-caption aligncenter" style="width: 510px"><img alt="Diagrama de Implementação de um Serviço RPC" src="http://google-web-toolkit-doc-1-5.googlecode.com/svn/wiki/AnatomyOfServices.gif" title="Diagrama de Implementação de um Serviço RPC" width="500" height="433" /><p class="wp-caption-text">Diagrama de Implementação de um Serviço RPC</p></div></p>
<p>O que essa coisa toda realmente significa é bastante simples:</p>
<ul>
<li>2 interfaces</li>
<li>1 servlet</li>
</ul>
<p>As duas interfaces servem para a definir o que o serviço irá realizar, por exemplo: Verificar se um usuário possui acesso a um determinado recurso, efetuar login no sistema&#8230; etc. Uma dessas interfaces é chamada de síncrona e a outra de assí­ncrona. O servlet define o como esse serviço será implementado e por isso ele deve implementar a interface sí­ncrona do serviço. </p>
<p>Utilizando a versão 1.5 do gwt temos o seguinte:</p>
<p>Interface Sí­ncrona:<br />
[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>@RemoteServiceRelativePath(&#8221;/servico&#8221;)<br />
public interface Servico extends Service{<br />
      public Boolean autoriza(String loginToken, String recurso);<br />
      public String login(String login, String senha) throws Exception;<br />
      public void logout(String loginToken);<br />
}<br />
[/java]</p>
<p>Interface Assí­ncrona:</p>
<p>[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>public interface ServicoAsync {<br />
    public void autoriza(String loginToken, String recurso, AsyncCallback&gt;Boolean&lt; callback);<br />
    public void login(String login, String senha, AsyncCallback&gt;String&lt; callback);<br />
    public void logout(String loginToken, AsyncCallback&gt;Void&lt; callback);<br />
}<br />
[/java]</p>
<p>Reparem que na interface Assí­ncrona os métodos não retornam objetos e os parâmetros dos métodos são os mesmos da interface sí­ncrona com o acréscimo de um AsyncCallback. Entrarei em detalhes logo abaixo.</p>
<p>Agora, restam somente dois passos para a criação do serviço. Implementar o servlet e registrá-lo no arquivo do módulo. </p>
<p>[java]<br />
package br.com.gwt.rpc.server.servico;<br />
public class ServicoImpl extends RemoteServiceServlet implements Servico {<br />
      public Boolean autoriza(String loginToken, String recurso) {<br />
            &#8230;<br />
            /*implementação da autorização;*/<br />
            &#8230;<br />
      }<br />
      public String login(String login, String senha) throws Exception {<br />
            &#8230;<br />
            /*implementação do login*/<br />
            &#8230;<br />
      }<br />
      public void logout(String loginToken) {<br />
            &#8230;<br />
            /*implementação do logout*/<br />
            &#8230;<br />
      }<br />
}<br />
[/java]</p>
<p>Abaixo o arquivo de configuração do módulo gwt.</p>
<p>[xml]<br />
<module><br />
        &#8230;<br />
	<servlet path="/servico" class="br.com.gwt.rpc.client.servico.ServicoImpl"/><br />
        &#8230;<br />
</module><br />
[/xml]</p>
<p>A partir daí­ o serviço está pronto para ser usado. Repare que o path no módulo de configuração é o mesmo definido logo no iní­cio da interface sí­ncrona. Feito isso enquanto estiver utilizando em hosted mode, não é necessário nenhuma outra configuração adicional. Para a utilização em web mode é necessária uma última configuração. Registrar o servlet no web.xml. Esta última tarefa não será coberta neste post por se tratar de uma atividade comum em uma aplicação JEE. </p>
<p>Para fazer uma chamada ao serviço o compilador do gwt deve ser invocado através da seguinte chamada:</p>
<p>[java]<br />
    ServicoAsync servico = GWT.create(Servico.class);<br />
[/java]</p>
<p>As chamadas são sempre assí­ncronas, isso significa que é criada uma conexção HTTP com o servidor, essa chamada é executada e em algum momento ela irá retornar e então executará o código que faz parte do AsyncCallback que criamos. A seguir um exemplo de chamada ao método de login:</p>
<p>[java]<br />
   &#8230;<br />
   servico.login(&#8221;login&#8221;, &#8220;1234&#8243;, new AsyncCallback<string> callback{<br />
     public void onSuccess(String result) {<br />
           loginToken = result;<br />
           Window.alert(&#8221;Login efetuado com sucesso!&#8221;);<br />
     }</p>
<p>     public void onFailure(Throwable cause){<br />
           Window.alert(&#8221;Ocorreu uma falha no processo de login. Causa: \n&#8221;+cause.getMessage());<br />
     }<br />
   });<br />
[/java]</p>
<p>Abraços e até o próximo post <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </string></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>API&#8217;s Google para o GWT</title>
		<link>http://www.gwt.com.br/2008/09/26/apis-google-para-o-gwt/</link>
		<comments>http://www.gwt.com.br/2008/09/26/apis-google-para-o-gwt/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 13:31:21 +0000</pubDate>
		<dc:creator>carlos</dc:creator>
				<category><![CDATA[curtas]]></category>
		<category><![CDATA[gears]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/09/26/apis-google-para-o-gwt/</guid>
		<description><![CDATA[O Google lançou recentemente o projeto Google API Libraries for Google Web Toolkit. O projeto ainda é RC (Realese Candidate). Agora os desenvolvedores GWT poderão usar as APIs do Google dentro das suas aplicações. Por enquanto estão disponí­veis as Apis do Google Gears, Google Gadgets, Google Search e Google Maps.
O interessante no Google Maps é [...]]]></description>
			<content:encoded><![CDATA[<p>O Google lançou recentemente o projeto <a href="http://code.google.com/p/gwt-google-apis/">Google API Libraries for Google Web Toolkit</a>. O projeto ainda é RC (Realese Candidate). Agora os desenvolvedores GWT poderão usar as APIs do Google dentro das suas aplicações. Por enquanto estão disponí­veis as Apis do <a href="http://code.google.com/apis/gears/">Google Gears</a>, <a href="http://code.google.com/apis/gadgets/">Google Gadgets</a>, <a href="http://code.google.com/apis/ajaxsearch/">Google Search</a> e <a href="http://code.google.com/apis/maps/">Google Maps</a>.<br />
O interessante no Google Maps é que além do desenvolvedor poder disponibilizar mapas dentro das suas aplicações, também pode colocar widgets do GWT dentros desses mapas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/09/26/apis-google-para-o-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Concurso &#8220;The Biggest Ever GWT Giveaway Contest!&#8221;</title>
		<link>http://www.gwt.com.br/2008/09/10/concurso-the-biggest-ever-gwt-giveaway-contest/</link>
		<comments>http://www.gwt.com.br/2008/09/10/concurso-the-biggest-ever-gwt-giveaway-contest/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 10:55:44 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[concurso]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[prêmio]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/09/10/concurso-the-biggest-ever-gwt-giveaway-contest/</guid>
		<description><![CDATA[O GWT Site está fazendo um concurso de aplicações, opiniões e projetos sobre gwt. O site é em inglês, bem como serão as participaçõees no concurso.  As premiaçõees são um caso a parte. 
* 5 Licensas do Ext GWT Developer
* 3 Licencas de 1 ano do GWT Designer
* 2 Cópias do livro Google Web [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.gwtsite.com">GWT Site</a> está fazendo um concurso de aplicações, opiniões e projetos sobre gwt. O site é em inglês, bem como serão as participaçõees no concurso.  As premiaçõees são um caso a parte. </p>
<p>* 5 Licensas do Ext GWT Developer<br />
* 3 Licencas de 1 ano do GWT Designer<br />
* 2 Cópias do livro Google Web Toolkit Applications escrito por Ryan Dewsbury<br />
* 3 Cópias do livro GWT in Practice escrito por Robert Cooper e Charlie Collins<br />
* 3 Cópias do livro Pro Web 2.0 Development With GWT escrito por Jeff Dwyer</p>
<p>Para participar existem 4 opções:<br />
<span id="more-65"></span></p>
<ol>
<li>Se inscrever no RSS do GWT Site via email, corresponde a 1 cupom.</li>
<p>Escrever um comentário no post correspondente do blog deles com alguma das opções abaixo. Todas valem 4 cupons.</p>
<li> Para os novatos em GWT, efetuar o download da release 1.5 e brincar um pouco com ela. Após algum tempo, escrever para eles dando a sua opinião, comparando o framework com as tecnologias que você usa atualmente e comentando se você pretende continuar usando gwt ou não e por que.</li>
<li>Enviar um projeto em GWT que você esteja desenvolvendo, open source ou como hobby. Enviar um link para o projeto.
</li>
<li>Escrever uma review da sua biblioteca e/ou ferramenta e/ou livro favoritos bem como uma aplicação baseada em GWT.</li>
</ol>
<p>O concurso no total oferece 16 prêmios e o número máximo de cupons por participante é de 5. Então corra e participe!</p>
<p>Link para o Concurso: <a href="http://www.gwtsite.com/the-biggest-ever-gwt-giveaway-contest/">http://www.gwtsite.com/the-biggest-ever-gwt-giveaway-contest/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/09/10/concurso-the-biggest-ever-gwt-giveaway-contest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando um ImageBundle</title>
		<link>http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/</link>
		<comments>http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 00:28:35 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[deferred binding]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[image bundle]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/</guid>
		<description><![CDATA[Se algum dia você já se deparou com a seguinte situação: criar uma aplicação em web que possua diversas imagens estáticas (por exemplo í­cones) e você utilizou css para selecionar e carregar as imagens&#8230; você já deve ter percebido que para cada imagem da aplicação uma nova conexão é aberta só para buscar essa imagem&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Se algum dia você já se deparou com a seguinte situação: criar uma aplicação em web que possua diversas imagens estáticas (por exemplo í­cones) e você utilizou css para selecionar e carregar as imagens&#8230; você já deve ter percebido que para cada imagem da aplicação uma nova conexão é aberta só para buscar essa imagem&#8230; e as demais só serão carregadas uma após a outra&#8230; pois é&#8230; para essa situação nada melhor que um ImageBundle! Para aqueles que ainda não conhecem essa funcionalidade vou dar uma pequena e rápida introdução. Confiram após o break <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-61"></span></p>
<p>Um ImageBundle é um objeto que automaticamente pega todos os í­cones mensionados anteriormente e os une em uma única imagem fazendo com que n requests ao servidor sejam condensadas em UMA ÚNICA!!! Além disso as imagens são &#8220;recortadas&#8221; depois tornando transparente ao usuário que se trata de uma mesma imagem. O procedimento de &#8220;recortar&#8221; novamente a figura depois de carregada é conhecido como &#8220;clipping&#8221; e é implementado através de CSS. </p>
<p>Parece complicado não é? Pois é&#8230; pode até parecer&#8230; mas utilizando GWT isso fica fácil fácil&#8230; e com algumas linhas de código tudo isso é rapidamente desenvolvido sem dores de cabeça e de maneira transparente ao programador!!!!! Isso é possí­vel graças ao mecanismo batizado de Deferred Binding do GWT que fornece pontos de extensção ao framework. Em um próximo tópico explicarei como o Deferred Binding funciona e o que você pode fazer com essa funcionalidade. </p>
<p>Voltando ao ImageBundle&#8230;.</p>
<p>Tudo que vocÃª precisarÃ¡ para a utlizaÃ§Ã£o de um ImageBundle Ã© implementar uma interface que extende ImageBundle e criar mÃ©todos que retornam um object <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/AbstractImagePrototype.html">AbstractImagePrototype</a> esse mÃ©todo deve conter anotaÃ§Ãµes especificando quais recursos (leia-se imagens) devem ser carregados pelo compilador. O objeto AbstractImagePrototype possui um mÃ©todo muito Ãºtil que Ã© o createImage() que retorna nada mais nada menos que a imagem que precisamos! Dito isso chega de conversa fiada e vamos ao cÃ³digo <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Para exemplificar a tÃ©cnica vamos construir um componente bastante usado em aplicaÃ§Ãµes desktop, uma ToolBar. Como se sabe em uma ToolBar Ã© muito comum o uso de Ã­cones representando ferramentas ou funcionalidades do software. Ã‰ nesse momento que o ImageBundle entra em cena. Para a criaÃ§Ã£o do exemplo vou ilustrar uma ToolBar com e sem ImageBundle. Para verificar o nÃºmero de conexÃµes geradas para buscar a imagem utilizaremos o firebug, extensÃ£o do firefox que facilita e muito a vida dos desenvolvedores web. </p>
<p>As imagens utilizadas no exemplo bem como o cÃ³digo fonte estÃ£o disponÃ­veis no final do post em arquivos zip.</p>
<p>Inicialmente a classe que representa o componente ToolBar:</p>
<p>[java]<br />
package br.com.gwt.client.toolbar;</p>
<p>import com.google.gwt.user.client.ui.Composite;<br />
import com.google.gwt.user.client.ui.FlexTable;<br />
import com.google.gwt.user.client.ui.ButtonBase;<br />
import com.google.gwt.user.client.ui.SimplePanel;</p>
<p>/**<br />
 * Uma ToolBar nada mais Ã© senÃ£o um painel com botÃµes que representam aÃ§Ãµes ou<br />
 * funcionalidades de um sistema. Geralmente os botÃµes da toolbar utilizam Ã­cones<br />
 * em vez de textos, entretanto esse detalhe nÃ£o serÃ¡ tratado nessa classe.<br />
 *<br />
 * @author Marcelo Emanoel<br />
 */<br />
public class ToolBar extends Composite {<br />
	private FlexTable toolbarTable;<br />
	private int buttonCount;</p>
<p>	public ToolBar(){<br />
		init();<br />
		setupStyles();<br />
	}</p>
<p>	/**<br />
	 * InicializaÃ§Ãµes<br />
	 */<br />
	private void init() {<br />
		toolbarTable = new FlexTable();<br />
		buttonCount = 0;</p>
<p>		SimplePanel panel = new SimplePanel();<br />
		panel.add(toolbarTable);</p>
<p>		initWidget(panel);<br />
	}</p>
<p>	/**<br />
	 * Adiciona um botÃ£o Ã  ToolBar.<br />
	 * @param button<br />
	 */<br />
	public void addButton(ButtonBase button){<br />
		toolbarTable.setWidget(0, buttonCount++, button);<br />
	}</p>
<p>	/**<br />
	 * Seta os estilos dos componentes internos e da ToolBar.<br />
	 */<br />
	private void setupStyles() {<br />
		setStylePrimaryName(&#8221;br_com_gwt_ToolBar&#8221;);<br />
		toolbarTable.setStylePrimaryName(&#8221;br_com_gwt_ToolBar&#8221;);<br />
	}<br />
	/**<br />
	 * Retorna o nÃºmero de botÃµes existentes na ToolBar.<br />
	 * @return<br />
	 */<br />
	public int getButtonCount() {<br />
		return buttonCount;<br />
	}<br />
}<br />
[/java]</p>
<p>AtÃ© aqui acredito que nÃ£o temos muitas surpresas. A ToolBar Ã© composta por uma FlexTable e botÃµes adicionados a ela. AlÃ©m disso Ã© possÃ­vel contar quantos botÃµes foram inseridos. </p>
<p>Agora vamos verificar como foi feito o ImageBundle.</p>
<p>[java]/**<br />
 *<br />
 */<br />
package br.com.gwt.client.toolbar.imagebundle;</p>
<p>import com.google.gwt.user.client.ui.AbstractImagePrototype;<br />
import com.google.gwt.user.client.ui.ImageBundle;</p>
<p>/**<br />
 * BlogBundle contÃ©m imagens relacionadas Ã  atividades de um blog. Adicionar,<br />
 * remover, inserir videos bem como configurar alguma coisa no blog.<br />
 *<br />
 * As imagens foram retiradas do <a href="http://www.iconspedia.com/">IconsPedia</a>. Todos os direitos reservados.<br />
 * @author Marcelo Emanoel<br />
 */<br />
public interface BlogBundle extends ImageBundle {</p>
<p>	/**<br />
	 * Imagem de adicÃ£o.<br />
	 * @return<br />
	 */<br />
	@Resource(&#8221;br/com/gwt/resources/add.png&#8221;)<br />
	public AbstractImagePrototype add();</p>
<p>	/**<br />
	 * Imagem de remoÃ§Ã£o.<br />
	 * @return<br />
	 */<br />
	@Resource(&#8221;br/com/gwt/resources/remove.png&#8221;)<br />
	public AbstractImagePrototype remove();</p>
<p>	/**<br />
	 * Imagem de video.<br />
	 * @return<br />
	 */<br />
	@Resource(&#8221;br/com/gwt/resources/video.png&#8221;)<br />
	public AbstractImagePrototype video();</p>
<p>	/**<br />
	 * Imagem de configuraÃ§Ã£o.<br />
	 * @return<br />
	 */<br />
	@Resource(&#8221;br/com/gwt/resources/settings.png&#8221;)<br />
	public AbstractImagePrototype settings();</p>
<p>	/**<br />
	 * Imagem de ok.<br />
	 * @return<br />
	 */<br />
	@Resource(&#8221;br/com/gwt/resources/check.png&#8221;)<br />
	public AbstractImagePrototype check();<br />
}[/java]</p>
<p>Finalmente como utilizar o ImageBundle e a ToolBar juntos.</p>
<p>[java]package br.com.gwt.client;</p>
<p>import br.com.gwt.client.toolbar.ToolBar;<br />
import br.com.gwt.client.toolbar.imagebundle.BlogBundle;</p>
<p>import com.google.gwt.core.client.EntryPoint;<br />
import com.google.gwt.core.client.GWT;<br />
import com.google.gwt.user.client.Window;<br />
import com.google.gwt.user.client.ui.Button;<br />
import com.google.gwt.user.client.ui.ClickListener;<br />
import com.google.gwt.user.client.ui.DockPanel;<br />
import com.google.gwt.user.client.ui.HTML;<br />
import com.google.gwt.user.client.ui.Image;<br />
import com.google.gwt.user.client.ui.PushButton;<br />
import com.google.gwt.user.client.ui.RootPanel;<br />
import com.google.gwt.user.client.ui.Widget;</p>
<p>/**<br />
 * Entry point classes define <code>onModuleLoad()</code>.<br />
 */<br />
public class ImageBundleTest implements EntryPoint {</p>
<p>	/**<br />
	 * This is the entry point method.<br />
	 * Instancia duas ToolBars uma com as imagens adquiridas via ImageBundle e a<br />
	 * outra criada com imagens extraÃ­das por css.<br />
	 *<br />
	 *  O intuito Ã© verificar o nÃºmero de conexÃµes extras causadas pela ausÃªncia<br />
	 *  do ImageBundle.<br />
	 */<br />
	public void onModuleLoad() {<br />
		/**<br />
		 * Instancia-se o ImageBundle via Deferred Binding.<br />
		 */<br />
		BlogBundle blogBundle = GWT.create(BlogBundle.class);</p>
<p>		ToolBar blogTools = new ToolBar();<br />
		ToolBar dbTools = new ToolBar();</p>
<p>		DockPanel dock = new DockPanel();<br />
		RootPanel.get().add(dock);</p>
<p>		dock.setStylePrimaryName(&#8221;dock&#8221;);</p>
<p>		HTML center = new HTML();<br />
		dock.add(center, DockPanel.CENTER);<br />
		dock.setCellHeight(center, &#8220;100%&#8221;);</p>
<p>		/*<br />
		 * Instancia todas as imagens do ToolBar que usa ImageBundle.<br />
		 */<br />
		Image addImg = blogBundle.add().createImage();<br />
		Image removeImg = blogBundle.remove().createImage();<br />
		Image checkImg = blogBundle.check().createImage();<br />
		Image settingsImg = blogBundle.settings().createImage();</p>
<p>		blogTools.addButton(createButton(addImg, blogTools.getButtonCount()));<br />
		blogTools.addButton(createButton(removeImg, blogTools.getButtonCount()));<br />
		blogTools.addButton(createButton(checkImg, blogTools.getButtonCount()));<br />
		blogTools.addButton(createButton(settingsImg, blogTools.getButtonCount()));</p>
<p>		dbTools.addButton(createEmptyButton(dbTools.getButtonCount(),&#8221;feather&#8221;));<br />
		dbTools.addButton(createEmptyButton(dbTools.getButtonCount(), &#8220;db&#8221;));</p>
<p>		dock.add(blogTools, DockPanel.NORTH);<br />
		dock.add(dbTools, DockPanel.SOUTH);<br />
	}</p>
<p>	/**<br />
	 * MÃ©todo de fÃ¡brica. Cria botÃµes a partir de uma posiÃ§Ã£o e o nome do estilo<br />
	 * que deverÃ¡ ser atribuÃ­do ao botÃ£o.<br />
	 * @param pos<br />
	 * @param id<br />
	 * @return<br />
	 */<br />
	public Button createEmptyButton(int pos, String id){<br />
		Button simpleButton = new Button();<br />
		simpleButton.setTitle(pos+&#8221;");<br />
		simpleButton.setStylePrimaryName(id);<br />
		simpleButton.addClickListener(new ClickListener() {<br />
			public void onClick(Widget sender) {<br />
				Window.alert(sender.getTitle());<br />
			}<br />
		});<br />
		return simpleButton;<br />
	}</p>
<p>	/**<br />
	 * MÃ©todo de fÃ¡brica. Cria botÃµes a partir de uma imagem e uma posiÃ§Ã£o.<br />
	 * @param icon<br />
	 * @param pos<br />
	 * @return<br />
	 */<br />
	public PushButton createButton(Image icon, int pos){<br />
		PushButton pushButton = new PushButton(icon);<br />
		pushButton.setTitle(pos+&#8221;");<br />
		pushButton.addClickListener(new ClickListener() {<br />
			public void onClick(Widget sender) {<br />
				Window.alert(sender.getTitle());<br />
			}<br />
		});<br />
		return pushButton;<br />
	}<br />
}<br />
[/java]</p>
<p>Agora vejamos o que o firebug nos diz a respeito das toolbars criadas e suas imagens via css e imageBundle.</p>
<div style="text-align: center;">
<div class="imageframe imgaligncenter" style="width:200px;"><a href="http://www.gwt.com.br/wp-content/uploads/2008/09/imagebundle.jpg" rel="lightbox[pics61]" title="ComparaÃ§Ã£o ImageBundle"><img src="http://www.gwt.com.br/wp-content/uploads/2008/09/imagebundle.thumbnail.jpg" width="200" height="46" alt="ComparaÃ§Ã£o ImageBundle" /></a>
<div class="imagecaption">ComparaÃ§Ã£o ImageBundle</div>
</div>
</div>
<p>Como pode se observar com uma Ãºnica requisiÃ§Ã£o feita atravÃ©s do imageBundle, quatro imagens foram trazidas atÃ© o cliente, e podem ser colocadas em cache tranquilamente (O nome &#8220;maluco&#8221; do arquivo Ã© um nÃºmero hash). Enquanto isso, para cada imagem setada atravÃ©s de css Ã© feita uma nova requisiÃ§Ã£o ao servidor, consumindo tempo e banda do usuÃ¡rio. </p>
<p>As vantagens do uso de ImageBundle sÃ£o claras em relaÃ§Ã£o ao carregamento de imagens via CSS. AlÃ©m disso, uma outra utilidade dos ImageBundle&#8217;s que nÃ£o foi citada no texto Ã© o uso de internacionalizaÃ§Ã£o de imagens. Mas esse Ã© assunto para um prÃ³ximo post. Espero que tenham gostado. A seguir um arquivo zip com o projeto desenvolvido.</p>
<p><a href="http://w13.easy-share.com/1701504890.html" title="imagebundletest.zip">imagebundletest.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSNI &#8211; Java Script Native Interface</title>
		<link>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</link>
		<comments>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:09:42 +0000</pubDate>
		<dc:creator>bruno.catao</dc:creator>
				<category><![CDATA[Avançado]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jni]]></category>
		<category><![CDATA[jnsi]]></category>
		<category><![CDATA[native]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</guid>
		<description><![CDATA[Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.
PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma [...]]]></description>
			<content:encoded><![CDATA[<p>Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.</p>
<p>PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma aplicaÃ§Ã£o mais robusta do que um Hello World nos deparamos com alguns problemas um pouco mais complicados.</p>
<p>Vou tentar escrever alguns posts falando de algumas experiÃªncias que eu tive com GWT, os problemas que surgiram e como eu resolvi estes problemas.</p>
<p>O primeiro problema que eu tive foi quando tentei utilizar uma biblioteca javascript prÃ©-existente, ou quando eu tentei utilizar alguma funcionalidade que hÃ¡ nos objetos providos pelos browser via javascript (window, document, etc) mas estÃ¡ implementada nos mesmos objetos no nÃ­vel GWT.</p>
<p>A forma que encontrei para resolver este (e mais um monte de problemas) foi utilizar JSNI &#8211; Java Script Native Interface. JSNI estÃ¡ para GWT assim como JNI (Java Native Interface) estÃ¡ para Java. Com JSNI Ã© possÃ­vel implementar o corpo de mÃ©todos GWT utilizando Java Script.</p>
<p>Vejamos um exemplo. Vamos supor que, por alguma razÃ£o esquisita, eu queira escrever um mÃ©todo que faÃ§a o mesmo que o <strong>Window.alert</strong>. Vamos chamar este mÃ©todo de meuAlert:</p>
<p>[java]<br />
public native void meuAlert(String mensagem) /*-{<br />
alert(mensagem);<br />
}-*/;<br />
[/java]<br />
<span id="more-43"></span><br />
Apesar de este nÃ£o ser um exemplo muito funcional (na realidade ele nÃ£o Ã© funcional de jeito nenhum) dÃ¡ pra entender a &#8220;mecÃ¢nica da coisa&#8221;. Todo mÃ©todo JSNI deve ser declarado como native (assim como mÃ©todos cuja implementaÃ§Ã£o serÃ¡ feita em JNI, utilizando Java convencional). A implementaÃ§Ã£o do mÃ©todo deve vir em um bloco comentado localizado entre o fim da lista de parÃ¢metros do mÃ©todo e o seu ponto-e-vÃ­rgula. O bloco de cÃ³digo JSNI Ã© delimitado por &#8220;-{&#8221; e &#8220;}-&#8221;, desta forma o tradutor Java/Java Script do GWT irÃ¡ saber que este bloco de comentÃ¡rios trata-se na realidade de instruÃ§Ãµes Java Script.</p>
<p>Vimos como fazer chamadas do lado Java para Java Script, vamos ver agora como fazer o caminho contrÃ¡rio, chamar mÃ©todos Java de dentro de cÃ³digo JSNI.</p>
<p>Para isto, basta chamar o mÃ©todo de qualquer classe seguindo a convenÃ§Ã£o:</p>
<p><code>[instÃ¢ncia.]@nomeDaClasseCompleto::nomeDoMetodo(assinaturaDosParametros)(argumentos)</code></p>
<p>Onde:</p>
<ul>
<li>instÃ¢ncia (atributo opcional) &#8211; Referente a instÃ¢ncia da qual o mÃ©todo serÃ¡ chamado, caso nÃ£o seja informada uma instÃ¢ncia, serÃ¡ assumido que a chamada serÃ¡ feita de forma estÃ¡tica;</li>
<li>nomeDaClasseCompleto &#8211; &#8220;full qualified class name&#8221;, ou seja, o nome da classe completo (toda a Ã¡rvore de pacotes seguido do nome da classe);</li>
<li>nomeDoMetodo &#8211; Nome do mÃ©todo que serÃ¡ chamado;</li>
<li>assinaturaDosParametros &#8211; Assinatura dos parÃ¢metros no formato <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html#wp16432" target="_blank" title="Assinatura dos ParÃ¢metros JNI">JNI</a>;</li>
<li>argumentos &#8211; Lista de valores passados como parÃ¢metros para o mÃ©todo.</li>
</ul>
<p>Vamos fazer outro exemplo simples:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>public class TesteJSNI  {<br />
public void exibeMensagem(String nome, int idade)  {<br />
Window.alert(&#8221;nome: &#8221; + nome + &#8221; &#8211; idade: &#8221; + idade);<br />
}</p>
<p>public native void callJavaMethod(TesteJSNI teste, String nome, int idade) /*- {<br />
teste@br.com.gwt.client.TesteJSNI::exibeMensagem(Ljava/lang/String;I)(nome, idade);<br />
}-*/;<br />
}<br />
[/java]</p>
<p>Por fim, JSNI define dois objetos implÃ­citos $wnd e $doc, que nos permitem, respectivamente acessar os contextos da janela e do documento principais. Estes objetos sÃ£o importantes pois, como o cÃ³digo GWT Ã© executado em um iframe oculto, se vocÃª tentar utilizar window e document diretamente, vocÃª nÃ£o irÃ¡ acessar a janela e o documento principais, mas sim do iframe oculto do GWT. Outro motivo, Ã© que estes objetos devem ser utilizados quando se quiser criar funÃ§Ãµes nomeadas que o programador queira chamar posteriormente em um outro ponto do cÃ³digo. A razÃ£o para isto Ã© que o cÃ³digo gerado pelo GWT Ã© ofuscado, entÃ£o, qualquer nome de funÃ§Ã£o atribuÃ­do diretamente via JSNI serÃ¡ ofuscado, tornando impossÃ­vel de &#8220;adivinhar&#8221; qual serÃ¡ esse nome em tempo de compilaÃ§Ã£o.</p>
<p>Vamos a alguns exemplos:</p>
<p><strong>DefiniÃ§Ã£o de uma funÃ§Ã£o:</strong></p>
<p>[java]<br />
public native void criaFuncao() /*{-<br />
$wnd[meuAlert] = function() {<br />
$wnd.alert(&#8217;Teste&#8217;);<br />
}-}*/;</p>
<p>public native void chamaFuncao() /*-{<br />
$wnd[meuAlert]();<br />
}-*/;<br />
[/java]</p>
<p><strong>Adicionando um listener ao documento:</strong></p>
<p>[java]<br />
public void trackMousePosition() /*-{<br />
$doc.addMouseMoveListener(function(evt) {<br />
$wnd.title = &#8216;x: &#8216; + evt.x + &#8216; &#8211; y: &#8216; + evt.y;<br />
});<br />
}-*/;<br />
[/java]</p>
<p>Por enquanto Ã© sÃ³. No prÃ³ximo post eu vou mostrar como se faz uma invocaÃ§Ã£o JSONP utilizando os conceitos mostrados aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O que é o GWT?</title>
		<link>http://www.gwt.com.br/2007/03/27/o-que-e-o-gwt/</link>
		<comments>http://www.gwt.com.br/2007/03/27/o-que-e-o-gwt/#comments</comments>
		<pubDate>Tue, 27 Mar 2007 23:04:02 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[gwt]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/blog/?p=7</guid>
		<description><![CDATA[O GWT é o framework AJAX do Google. Pra quem não conhece, AJAX é uma sigla que significa Asynchronous Javascript And XML.  Na prática  AJAX  proporciona aos usuários  uma experiência  mais rica, semelhante à interatividade atingida nos sistemas desktop. Um bom exemplo de aplicação AJAX é o google maps.
Para aqueles [...]]]></description>
			<content:encoded><![CDATA[<p>O GWT é o framework AJAX do <a href="http://www.google.com" target="_blank">Google</a>. Pra quem não conhece, AJAX é uma sigla que significa <a href="http://pt.wikipedia.org/wiki/AJAX_(programa%C3%A7%C3%A3o)" target="_blank">Asynchronous Javascript And XML</a>.  Na prática  AJAX  proporciona aos usuários  uma experiência  mais rica, semelhante à interatividade atingida nos sistemas desktop. Um bom exemplo de aplicação AJAX é o <a href="http://maps.google.com/" target="_blank">google maps</a>.</p>
<p>Para aqueles que pretendem se aventurar na <a href="http://pt.wikipedia.org/wiki/Web_2.0" target="_blank">web 2.0</a> o GWT é um ótimo começo! Através dele uma aplicação pode ser completamente desenvolvida em uma única página html! <span id="more-7"></span>Com acesso a banco de dados e efeitos visuais bastante interessantes. O melhor de tudo isso é que através do framework, não será necessário escrever uma única linha sequer de javascript! Tudo é feito através do compilador fornecido, que traduz o código Java para Javascript. Obviamente nem tudo são flores, não é fácil nem tampouco acho que seja possí­vel traduzir a imensa API Java para javascript. Além disso as novidades introduzidas na API 5.0 de Java não estão funcionando ainda. Por exemplo o novo for, as enums e os tipos genéricos além das annotations. Apesar de todas essas limitações a API do GWT é bastante completa possibilitando ainda diversas oportunidades de extensões.</p>
<p>Uma aplicação escrita em GWT é basicamente dividida em duas partes:</p>
<ol>
<li>Cliente</li>
<li>Servidor</li>
</ol>
<p>Na parte do cliente é onde &#8220;a mágica acontece&#8221; é o local onde o compilador traduz o código Java para Javascript. Nesse  local ocorrem as maiores limitações. Dispõe-se apenas de algumas classes da API java como por exemplo os tipos básicos da linguagem, seus respectivos wrappers. Algumas classes do Collections Framework. A maior parte do código escrito no lado do cliente é derivada dos componentes, Widgets, fornecidos pela api. As classes disponibilizadas no pacote<br />
<a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.client.ui.html" target="_blank"> com.google.gwt.user.client.ui</a> este pacote contém os componentes gráficos.</p>
<p>Na parte do servidor a liberdade é total, inclusive para usar as novas funcionalidades da api 5.0 de java.  Toda a estrutura de acesso a banco de dados e qualquer outra tecnologia deve permanecer no servidor.</p>
<p>A princí­pio, é isso aí­. Nós aqui do GWT Brasil pretendemos discutir sobre o assunto e servir de meio de comunicação entre os usuários brasileiros como forma de tirar dúvidas, criar tutoriais básicos e avançados ajudando a disseminar o uso do framework. Aguardem os próximos posts com aplicações de exemplo, temas para discussão e notí­cias sobre o desenvolvimento da API que dentro de em breve estará na versão 1.4 com muitas novidades!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2007/03/27/o-que-e-o-gwt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
