quarta-feira, 29 de dezembro de 2010

Criando um CssResource a partir de um arquivo CSS

Eu sei, preciso escrever mais aqui. Um dia eu prometo que vou ter tempo para fazer um post por semana, mas enquanto isso vamos nesse ritmo de um por ano mesmo. Só espero que seja útil para alguém.

Hoje eu recebi do designer um arquivo CSS para o redesign do Anuncie Lá. Precisava criar um CssResource com os nomes das mais de 100 classes de estilo. Puxei do fundo da memória e me lembrei de um utilitário que já vem no GWT, pouco documentado, que faz exatamente isso. Aí vai:

java -cp /opt/gwt/gwt-dev.jar:/opt/gwt/gwt-user.jar com.google.gwt.resources.css.InterfaceGenerator

resultado: 

InterfaceGenerator [-standalone] -typeName some.package.MyCssResource -css file
Create a CssResource interface based on a CSS file

where 
  -standalone  Add package and import statements to generated interface
  -typeName    The name of the generated CssResource subtype
  -css         The input CSS file to process

E agora executando com os parâmetros completos:

java -cp /opt/gwt/gwt-dev.jar:/opt/gwt/gwt-user.jar com.google.gwt.resources.css.InterfaceGenerator -standalone -typeName some.package.MyCssResource -css main.css


E essa linha de código me poupou a diversão de perder uma hora fazendo um incompreensível script Perl. Oh, damn it! :-)

segunda-feira, 19 de outubro de 2009

Corrigindo o DatePicker para horário de verão




UPDATE (18/Dez/2009): Esse bug não acontece mais no GWT 2.0, mas a solução abaixo possivelmente ainda é válida para sobrepor qualquer trecho de código final da biblioteca GWT.


Semana passada eu me deparei com um bug bem incômodo no componente DatePicker. No modo compilado, ao selecionar qualquer data após 17 de outubro - apenas no mês de outubro de 2009 - um erro de IllegalStateException era lançado e a data não era selecionada. Além disso, o dia 17 aparecia duas vezes: no sábado, corretamente, e no domingo, no lugar do dia 18 (veja na imagem ao lado).

Suspeitei que devia ser culpa do horário de verão. Procurei um pouco e achei mais pessoas reclamando. Inclusive, o bug possui uma correção proposta há seis meses no grupo gwt-contrib, mas curiosamente não achei nenhuma issue cadastrada no site oficial do GWT - cadastrei uma e espero que no próximo release o patch já tenha sido incorporado.

Até lá, tive que achar uma solucão. Revisei o patch proposto pelo usuário jlabanca lá no gwt-contrib e parecia ok. Então, tinha que incorporar essas mudanças no meu projeto, mas não queria gerar um novo gwt-user.jar e ter que fazer tudo de novo quando saísse um novo release do GWT. A solução que eu tive foi copiar os fontes do datepicker para o meu projeto, e depois aplicar o patch. Assim, quando surgir uma nova versão do GWT, o código antigo só causará problemas se a interface do DatePicker mudar e for referenciada internamente por outros pacotes (o que não é o caso).

Comece extraindo as classes relevantes do gwt-user.jar:
jar xvf gwt-user.jar com/google/gwt/user/datepicker

Agora apague as classes já compiladas:
rm com/google/gwt/user/datepicker/client/*.class

Pode apagar também a definição do módulo DatePicker (com/google/gwt/user/datepicker/client/DatePicker.gwt.xml). Opcionalmente, você poderia mantê-lo como um módulo à parte, e importá-lo no seu aplicativo principal - mas no meu caso optei pela solução mais simples.

Agora copie esse diretório com/google/gwt/user/datepicker/client para o seu projeto (diretório src ou equivalente). Mantenha a estrutura de diretórios completa: /src/com/google/gwt/user/datepicker/client

Baixe o patch revisado aqui (clique no botão "Download raw patch set" e salve o conteúdo em um arquivo local).

Pelo Eclipse, abra o seu projeto e clique com o botão direito em Team->Apply Patch. Escolha o arquivo salvo no passo anterior, e selecione a opção "Apply the patch to the selected folder", escolhendo a raiz do seu projeto.

Na tela seguinte, escolha "1" para "Ignore leading path name segments", conforme a imagem abaixo:




Ignore os erros nas classes de teste, e clique em Next.

Pronto! Pode compilar seu projeto que o erro do DatePicker não vai mais acontecer.

Obs: as instruções acima foram feitas com base na seguinte configuração:
- Eclipse Galileo
- GWT 1.7.0 para Linux
- Java 1.6.0_16 em Linux

No caso do Eclipse Ganymede (3.4) a forma de aplicação do patch pode ser ligeiramente diferente, e no GWT anterior ao 1.7 é provável que o patch não funcione. Se for o caso, poste nos comentários.