↓ Arquivo ↓

Categoria → internet

WTF? Quake II em GWT?

Veja isso…

Um desenvolvedor do Google, nos 20% de tempo que são fornecidos para projeto próprio, resolveu portar o Quake II utilizando os novos recursos do HTML5. E para isso também utilizou o GWT. Não é impressionante? Agora acredito que o Flash possa “morrer”. Vou baixar o código-fonte do projeto e dar uma fuçada…

Utilizando Javascript no GWT/Google Web Toolkit com JSNI (Parte 1)

Muitas vezes os desenvolvedores precisam de um novo componente para sua aplicação, e esse componente a maioria das vezes é desenvolvido em Javascript. Quem conhece o GWT, sabe que a framework permite desenvolver aplicações RIA sem saber Javascript, mas sim desenvolvendo em Java de uma forma muita parecida como a que se desenvolve em Swing ou SWT. Você não tem contato direto com o Javascript, pois ele é gerado na compilação. Mas como então se faz para utilizar um componente Javascript no GWT?
O GWT tem uma funcionalidade que se chama JSNI(Javascript Native Interface). Ela é baseada no JNI(Java Native Interface), que permite aos desenvolvedores Java utilizarem recursos específicos do sistema operacional. No JNI são métodos na classe Java escritos em C. No JSNI são métodos na classe Java que utilizam Javascript. Mas a forma em que eles são escritos é muito parecida, tanto que é possível utilizar parte da documentação do JNI como referência para o JSNI.
Vamos primeiramente criar o já conhecido “Hello World!”, para que começar a se familizar com o JSNI:

public class JSNI implements EntryPoint {
    public void onModuleLoad() {
        Button btn = new Button("Clique aqui");
        btn.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                alert("Hello World!");
            }
        });
        RootPanel.get().add(btn);
    }

    //Dê uma atenção especial a este método
    public native void alert(String txt) /*-{
        $wnd.alert(txt);
    }-*/
;
}

Quando esse código for executado, dará para ver um botão, que você clica e mostra um alert com o “Hello World!”. Mas este alert é feito utilizando Javascript, como dá para ver. È criado um método nativo(“public native void alert”) que recebe uma String. O bloco de código é delimitado por “/*-{” e “}-*/” em vez de um simples par de chaves. E dentro do bloco de código é executado um “$wnd.alert(txt);”, que seria o correspondente a “window.alert(txt)” ou a apenas “alert(txt)”. O GWT precisa que tudo que seja referente a janela(window) seja chamado com o “$wnd” no início, pois internamente ele utiliza alguns iframes e algumas coisas que não vem ao caso, e ele precisa disso para não se perder na compilação. Da mesma forma, quando você precisar utilizar um “document.“, você utilizará “$doc.“. Resumindo:

document = $doc
window = $wnd

Vamos fazer um exemplo utilizando o “$doc” agora.

public class JSNI implements EntryPoint {
    public void onModuleLoad() {
        TextBox txt = new TextBox();
        txt.setName("campoTexto");
        RootPanel.get().add(txt);
        Button btn = new Button("Clique aqui");
        btn.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                mostraTextoTextBox();
            }
        });
        RootPanel.get().add(btn);
    }

    public native void mostraTextoTextBox() /*-{
        var txt = $doc.getElementById("campoTexto");
        $wnd.alert(txt.value);
    }-*/
;
}

Neste exemplo, é criado um campo TextBox e um botão. Quando se clica no botão, é mostrado em um alert o texto do TextBox. Mas é utilizado Javascript para isso. È utilizado um “$doc.getElementById” para pegar a instância do TextBox(que no fundo no fundo é um “input text” HTML), e retornar o valor. Pode ver que é feita a mesma coisa que seria feita com um campo de texto HTML. A diferença é que se utiliza o $doc ao invés do “document” no getElementById.
A partir disso dá para ver que dá para fazer muita coisa com o JSNI. Esse é o básico do básico do que a ferramenta pode fazer. No próximo artigo irei explicar como utilizar objetos Java no Javascript e fazer com que métodos Java sejam visíveis para Javascript’s externos. Qualquer dúvida, tire nos comentários. :)

Escrevendo uma extensão de Twitter para o Google Chrome utilizando o Google Web Toolkit(GWT)

Estava olhando os exemplos de como criar extensões para o Chrome, e vi que assim como o no Firefox, as extensões não são nada mais que Javascript(mas no caso do Firefox tem os XUL envolvidos e etc…). Então pensei eu: “GWT gera Javascript, então ele deve funcionar para criar extensões”. Fiz uns testes básico e conclui. Funcionou. E aqui escrevo um tutorial dizendo como fiz para fazer isso funcionar. O objetivo desse tutorial não é ensinar GWT, é somente mostrar como configurar um projeto do GWT para rodar como uma extensão do Chrome.
Antes de tudo, vou dar um aviso que vai lhe poupar de alguns problemas: Salve todos os arquivos do exemplo com codificação UTF-8.
Como exemplo, criei uma aplicação para twitter bem simples, que só lê as últimas mensagens de um usuário qualquer.
Primeiramente criei uma aplicação no Eclipse chamada “ExtensaoChrome” com o pacote base chamado “com.serathiuk.chrome.extension.teste.client”.

Depois disso, alterei o arquivo ‘ExtensaoChrome.html’ da pasta war, deixando apenas com o seguinte HTML:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<link type=”text/css” rel=”stylesheet” href=”ExtensaoChrome.css”>

<div id=”intro_panel”></div>

<script type=”text/javascript” language=”javascript” src=”extensaochrome/extensaochrome.nocache.js”></script>

Na pasta war, coloquei o arquivo icon.png(o mesmo do exemplo oficial, link no final) e o arquivo manifest.json, que tem o seguinte conteúdo:

{
"name": "Leitor de Twitter",
"version": "1.0",
"description": "Exemplo de extensão para Chrome utilizando GWT do site serathiuk.com.",
"browser_action": {
"default_title": "Leitor de Twitter",
"default_icon": "icon.png",
"popup": "ExtensaoChrome.html"
},
"permissions": [
"http://www.twitter.com/"
]
}

Depois disso, apaguei aqueles arquivos que são criados pelo exemplo, deixando apenas o “ExtensaoChrome.java”, que é o Entry Point da aplicação. E no EntryPoint, apaguei todas aquelas informações do exemplo, e colocando o código para fazer a aplicação funcionar:

public class ExtensaoChrome implements EntryPoint {

private TextBox txtLogin;
private FlexTable tableTwitter;

public void onModuleLoad() {
HorizontalPanel h = new HorizontalPanel();
txtLogin = new TextBox();
h.add(txtLogin);
Button btn = new Button("Carregar");
btn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
carregarTwitts();
}
});
h.add(btn);

ScrollPanel align = new ScrollPanel();
align.setWidth("100%");
align.setHeight("320");

tableTwitter = new FlexTable();
tableTwitter.setCellPadding(1);
tableTwitter.setCellSpacing(1);
tableTwitter.setBorderWidth(1);
align.add(tableTwitter);

VerticalPanel v = new VerticalPanel();
v.add(h);
v.add(align);
RootPanel.get("intro_panel").add(v);
}

protected void carregarTwitts() {
String url = "http://twitter.com/statuses/user_timeline/"+txtLogin.getValue()+".json";
RequestBuilder req = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try {
req.sendRequest(null,
new RequestCallback() {
public void onResponseReceived(Request request, Response response) {
preencheValores(response.getText());
}

public void onError(Request request, Throwable exception) {
showError(exception);
}
}
);
} catch(RequestException e) {
showError(e);
}
}

protected void preencheValores(String jsonText) {
tableTwitter.removeAllRows();

JSONArray json = (JSONArray) JSONParser.parse(jsonText);
for(int i = 0; i &lt; json.size(); i++) {
JSONObject obj = (JSONObject) json.get(i);
if(obj != null) {
JSONString str = (JSONString) obj.get("text");
tableTwitter.setText(i+1, 0, str.stringValue());
}
}
}

protected void showError(Throwable e) {
Window.alert(e.getMessage());
}
}

Agora é só compilar o projeto e adicionar a extensão ao Chrome. Para fazer isso, digite o endereço “chrome://extensions/”, clicar em “Load Unpacked Extension” e selecionar o diretório war da aplicação(ou o diretório onde está o manifest.json). Com isso a extensão estará rodando, é só clicar no ícone dela ao lado da barra de endereços.

Exemplo Oficial: http://code.google.com/chrome/extensions/getstarted.html

Código-Fonte deste exemplo: http://gwtchrome.googlecode.com/files/ExtensaoChrome.7z

Estava olhando os exemplos de como criar extensões para o Chrome, e vi que assim como o no Firefox, as extensões não são nada mais que Javascript(mas no caso do Firefox tem os XUL envolvidos e etc…). Então pensei eu: “GWT gera Javascript, então ele deve funcionar para criar extensões”. Fiz uns testes básico e conclui. Funcionou. E aqui escrevo um tutorial dizendo como fiz para fazer isso funcionar. O objetivo desse tutorial não é ensinar GWT, é somente mostrar como configurar um projeto do GWT para rodar como uma extensão do Chrome.
Antes de tudo, vou dar um aviso que vai lhe poupar de alguns problemas: Salve todos os arquivos do exemplo com codificação UTF-8.
Como exemplo, criei uma aplicação para twitter bem simples, que só lê as últimas mensagens de um usuário qualquer.
Primeiramente criei uma aplicação no Eclipse chamada “ExtensaoChrome” com o pacote base chamado “com.serathiuk.chrome.extension.teste.client”.

Depois disso, alterei o arquivo ‘ExtensaoChrome.html’ da pasta war, deixando apenas com o seguinte HTML:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<link type=”text/css” rel=”stylesheet” href=”ExtensaoChrome.css”>
<div id=”intro_panel”></div>
<script type=”text/javascript” language=”javascript” src=”extensaochrome/extensaochrome.nocache.js”></script>

Na pasta war, coloquei o arquivo icon.png(o mesmo do exemplo oficial, link no final) e o arquivo manifest.json, que tem o seguinte conteúdo:

{
“name”: “Leitor de Twitter”,
“version”: “1.0″,
“description”: “Exemplo de extensão para Chrome utilizando GWT do site serathiuk.com.”,
“browser_action”: {
“default_title”: “Leitor de Twitter”,
“default_icon”: “icon.png”,
“popup”: “ExtensaoChrome.html”
},
“permissions”: [
"http://www.twitter.com/"
]
}

Depois disso, apaguei aqueles arquivos que são criados pelo exemplo, deixando apenas o “ExtensaoChrome.java”, que é o Entry Point da aplicação. E no EntryPoint, apaguei todas aquelas informações do exemplo, e colocando o código para fazer a aplicação funcionar:
public class ExtensaoChrome implements EntryPoint {

private TextBox txtLogin;
private FlexTable tableTwitter;

public void onModuleLoad() {
HorizontalPanel h = new HorizontalPanel();
txtLogin = new TextBox();
h.add(txtLogin);
Button btn = new Button(“Carregar”);
btn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
carregarTwitts();
}
});
h.add(btn);

ScrollPanel align = new ScrollPanel();
align.setWidth(“100%”);
align.setHeight(“320″);

tableTwitter = new FlexTable();
tableTwitter.setCellPadding(1);
tableTwitter.setCellSpacing(1);
tableTwitter.setBorderWidth(1);
align.add(tableTwitter);

VerticalPanel v = new VerticalPanel();
v.add(h);
v.add(align);
RootPanel.get(“intro_panel”).add(v);
}

protected void carregarTwitts() {
String url = “http://twitter.com/statuses/user_timeline/”+txtLogin.getValue()+”.json”;
RequestBuilder req = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try {
req.sendRequest(null,
new RequestCallback() {
public void onResponseReceived(Request request, Response response) {
preencheValores(response.getText());
}

public void onError(Request request, Throwable exception) {
showError(exception);
}
}
);
} catch(RequestException e) {
showError(e);
}
}

protected void preencheValores(String jsonText) {
tableTwitter.removeAllRows();

JSONArray json = (JSONArray) JSONParser.parse(jsonText);
for(int i = 0; i < json.size(); i++) {
JSONObject obj = (JSONObject) json.get(i);
if(obj != null) {
JSONString str = (JSONString) obj.get(“text”);
tableTwitter.setText(i+1, 0, str.stringValue());
}
}
}

protected void showError(Throwable e) {
Window.alert(e.getMessage());
}
}

Agora é só compilar o projeto e adicionar a extensão ao Chrome. Para fazer isso, digite o endereço “chrome://extensions/”, clicar em “Load Unpacked Extension” e selecionar o diretório war da aplicação(ou o diretório onde está o manifest.json). Com isso a extensão estará rodando, é só clicar no ícone dela ao lado da barra de endereços.

Lançado o Google Web Toolkit(GWT) 1.7

Foi lançada a versão 1.7 da Framework GWT. As únicas novidadades é a compatibilidade ao Firefox 3.5, IE 8 e Safari 4. Também um grande número de bugs corrigidos.

Segundo o pessoal do Google, essa versão não foi chamada de 1.6.5 apenas por causa da possíveis quebras de compatibilidade com os Deferred Bindings.

O Google Eclipse Plugin também foi atualizado. A atualização pode ser feita pelo próprio gerenciador do Eclipse.

Mais informações: http://code.google.com/intl/pt-BR/webtoolkit/releases/release-notes-1.7.0.html

Download: http://code.google.com/intl/pt-BR/webtoolkit/download.html

Utilizando Google Web Toolkit(GWT) 1.6 com o Eclipse Ganymede

Como prometido em janeiro, começo a série de tutorias sobre GWT. Faz tempo que tinha postado que iria começar a postar sobre, mas resolvi esperar sair a versão 1.6 do GWT. Demorou mais que eu esperei essa versão, mas saiu e com algumas novidades bacanas e coisas que eu nem esperava. Eu já tinha um esboço pronto deste primeiro tutorial. Mas tinha escrito ele para utilizar GWT 1.5 com Cypal Studio. Mas o Google lançou um plugin próprio para utilizar GWT no Eclipse. Então resolvi reescrever o tutorial. Tentei deixar o mais simples e objetivo possível. Acredito eu que consegui atingir isso. Estou levando em conta que você já possui o Eclipse Ganymede(3.4) em sua máquina. Caso não possua, vá em http://www.eclipse.org/downloads e baixe o  ‘Eclipse IDE for Java EE Developers’.

Instalando o Google Plugin

  1. Com o Eclipse aberto, vá em Help/Software Updates
  2. Entre na aba ‘Avaliable Software’
  3. Clique em ‘Add Site’
  4. Coloque o endereço http://dl.google.com/eclipse/plugin/3.4 e clique em OK

    Tela Cadastro Plugin Eclipse

    Tela Cadastro Plugin Eclipse

  5. Marque todos os item como na imagem e clique no botão Install.

    Tela Seleção Modulos Plugin GWT

    Tela Seleção Modulos Plugin GWT

  6. Espere ele verificar e baixar os requisitos e pendências (esta parte pode demorar)

    Tela Procurando Pendencias GWT

    Tela Procurando Pendencias GWT

  7. Depois disso é só dar um Next, aceitar os termos(faça de conta que você leu) e clique em Finish.
  8. Depois disso ele vai instalar o plugin e acabou aí. Reinicie o Eclipse e o plugin já vai estar disponível para uso.

Criando e testando um projeto GWT

  1. Com o Eclipse aberto, vá em File / New / Other
  2. No item Google, selecione ‘Web Application Project’ e clique em Next.

    Seleção Tipo Projeto GWT

    Seleção Tipo Projeto GWT

  3. Em Project Name coloque o nome do projeto(utilizei ProjetoTeste) e em Package preencha o pacote da Aplicação(utilizei com.serathiuk.teste.projetoteste). Deixe tudo marcado como está e clique em Finish.

    Tela Configuração Projeto GWT

    Tela Configuração Projeto GWT

  4. Pronto.  O projeto está criado. Vamos testa-lo.
  5. Para testa-lo, vá em Run / Run Configuration
  6. Selecione o item com o nome do projeto em Web Application.

    Tela Rodar Aplicação GWT

    Tela Rodar Aplicação GWT

  7. Clique em Run.
  8. Se funcionar tudo ok, irá aparecer uma janela como a da imagem.

    Tela Hosted Mode GWT

    Tela Hosted Mode GWT

Considerações finais

Este artigo tinha como intuito dar o primeiro pontapé no GWT. Não foi feito nada demais, só rodamos um exemplo já existente. Mas no próximo pretendo escrever como fazer um formulário simples acessando dados do servidor. Mas é isso. Espero que tenham gostado e critiquem a vontade nos comentários.

Da série: Coisas geniais, mas inúteis

Isso é uma coisa legal que com certeza não irá mudar o mundo. Mas mesmo assim não deixa de ser legal.

Isso está na lista de “coisas que quero tentar fazer antes de morrer”.

Battlestar Galactica – The Face Of The Enemy – Webisódio 1

Saiu sexta-feira o primeiro webisódio de “The Face Of The Enemy”. Para quem não assistiu até o 4×10 é bom não ler o resto. Está “mini-série” irá contar eventos que ocorreram 9 dias depois da chegada da frota colonial na terra e a história dentro de um raptor centrada em “Felix Gayeta Gaeta” e assasinatos que ocorrem dentro desta nave durante esse tempo. A bordo na tripulação temos 2 “Number 8″, o piloto, o co-piloto e o próprio Gaeta. No mais o vídeo do primeiro webisodio:

Lançada a versão final do GWT 1.5

Depois quase 5 meses depois do lançamento do primeiro Milestone do GWT 1.5, é lançada a versão final do mesmo. Não cheguei a trabalhar muito com a versão 1.4, pois quando comecei a utlizar esta framework, já comecei na versão 1.5 Milestone 1. Mas a evolução de lá para cá foi bem visível. Suporte a LinkedHashMap, LinkedList, a Java 5(Annotation, Enums, Generics e afins), entre muitas melhorias. O Javascript gerado também ficou melhor e com uma performance melhor. Mais informações podem ser encontradas no blog oficial do projeto.

E para quem ainda não conhece a framework, pode conhecer mais sobre ela e fazer download da mesmaem site oficial.