Este documento fornece um resumo de três frases ou menos:
O documento apresenta tutoriais para criar extensões para o BrOffice.org usando Java e NetBeans, incluindo exemplos de como desenvolver componentes que estendem as capacidades do BrOffice.org Writer e Calc, como um revisor de texto e uma função que calcula a resposta à questão da vida, do universo e tudo mais.
1. Criando extensões para
o BrOffice.org
usando Java e NetBeans
16 de setembro de 2009
William D. Colen M. Silva
Engenharia da Computação – Poli USP 2002 - 2006
Mestrando Ciência da Computação – IME USP 2009 -
Desenvolvedor corretor gramatical CoGrOO 2004 -
2. Agenda
● Introdução
● Requisitos e preparação do ambiente
● Tutoriais
● Components
– Revisor de textos (BrOffice.org Writer)
● Add-ons
– BrOffice.org Calc
● Nova função que responderá a pergunta fundamental da Vida,
do Universo e Tudo Mais
– BrOffice.org Write
● Tradutor
● Client application
– Não será abordado nesse material
William Colen - http://broffice.org 2
3. Onde procurar e para onde enviar extensões?
William Colen - http://broffice.org 3
4. Estendendo o BrOffice.org
BrOffice.org
App Extensão
Externo .OXT
Client App Components
Implementam
interfaces para
estender
- Template de novo documento funcionalidades
- Extrair dados de uma planilha
Add-ons Add-ins
- CoGrOO
Implementam - Nova fórmula no Calc
novas
funcionalidades
William Colen - http://broffice.org 4
5. UNO - Universal Network Objects
● É a tecnologia de componentes básica do OpenOffice.org,
com ela é possível escrever programas que abstraem
diferentes linguagens, tecnologias, plataformas e
arquiteturas de rede.
● UNO está disponível em Linux, Solaris, Windows, Power
PC, FreeBSD e Mac OS X
● Linguagens suportadas são Java, C++, OpenOffice.org
Basic, Python e ainda MS Com, .NET CLI e linguagens
script como Javascript, Beanshell e Jython
● Com ele é possível criar aplicativos que se conectam a
uma instância local ou remota e manipular os diversos
documentos suportados pelo OpenOffice.org.
William Colen - http://broffice.org 5
6. Service Managers
● São “fábricas” de serviços – objetos que conhecem sobre
algumas tarefas específicas. Exemplos:
● com.sun.star.frame.Desktop – pode abrir documentos e gerencia os
documentos já abertos
● com.sun.star.sdb.DatabaseContext – gerencia os bancos de dados
carregados pela aplicação
● com.sun.star.text.GlobalSettings – gerencia visualização e impressão
William Colen - http://broffice.org 6
7. Extensões para BrOffice.org
● Pacote .OXT
● description.xml
● Identificador
● Versão
● Atualizações
William Colen - http://broffice.org 7
8. Preparando o ambiente
● Requisitos
● BrOffice.org - http://broffice.org
● JDK da Sun - http://java.sun.com - ou OpenJDK - http://openjdk.java.net
● OpenOffice.org Software Development Kit (SDK) -
http://download.openoffice.org/sdk
● Java IDE – sugestão: NetBeans 3.5.x com plug-in
OpenOffice.org API for NetBeans
William Colen - http://broffice.org 8
9. Configurando Java no BrOffice.org
● No BrOffice.org, acessar Ferramentas >> Opções...
● No painel esquerdo acessar BrOffice.org >> Java
● Siga as instruções para adicionar uma JRE
William Colen - http://broffice.org 9
10. Instalando o OOo API Plug-in no NetBeans
● Até setembro de 2009 a versão disponível, a 2.0.4, só funcionava no
NetBeans 3.5.1.
● Para instalar, no NetBeans siga por Tools >> Plugins e selecione o
OpenOffice.org API Plugin na aba Available Plugins. Pressione Install
William Colen - http://broffice.org 10
11. Configurando o OOo API Plug-in no NetBeans
● As únicas configurações necessárias são os caminhos
para o OpenOffice.org e OpenOffice.org SDK. Siga por
Tools >> Options >> Miscellaneous >> OOo API plugin
William Colen - http://broffice.org 11
12. Exemplo de componente: revisor de textos
● Estende as capacidades de revisão do BrOffice.org
● Pode ser um revisor ortográfico (verifica a grafia) ou
gramatical (verifica a sintaxe)
● Deve implementar a API Linguistic. Para verificadores que
dependem da sintaxe usar a interface
com.sun.star.linguistic2.XProofreader
● Requer um arquivo de configuração Linguistic.xcu
● Exemplo: criar um revisor que marca a frase “BrOffice.org
é bom” como errada e sugere usar “BrOffice.org é o
melhor”.
Nota: revisores ortográficos em geral são implementados usando dicionários.
Veja como aqui: http://wiki.services.openoffice.org/wiki/Extension_Dictionaries
William Colen - http://broffice.org 12
13. Exemplo de componente: revisor de textos
Crie um novo projeto OpenOffice.org >> OpenOffice.org component
usando o Wizard do NetBeans
William Colen - http://broffice.org 13
14. Exemplo de componente: revisor de textos
Crie um novo projeto OpenOffice.org >> OpenOffice.org component
usando o Wizard do NetBeans
William Colen - http://broffice.org 14
15. Exemplo de componente: revisor de textos
Defina o serviço com.sun.star.linguistic2.Proofreader clicando em Add
Service/Interface. Clique em Finish.
William Colen - http://broffice.org 15
16. Exemplo de componente: revisor de textos
O novo projeto será criado. Vamos agora alterar o template de acordo
com nossas necessidades.
William Colen - http://broffice.org 16
17. Exemplo de componente: revisor de textos
Primeiro configuramos as propriedades da extensão. Vamos criar os
arquivos necessários para a descrição. Os nomes dos arquivos não
são importantes:
● Description_enUS.txt – 'Sample proofreader that search for
“BrOffice.org é bom” and suggest to use “BrOffice.org é o
melhor”.'
● Description_ptBR.txt – 'Exemplo de revisor que busca
“BrOffice.org é bom” e sugere usar “BrOffice.org é o melhor”.'
● License.txt - “BSD”
● broffice.png (42x42)
Sugestão: crie estes arquivos em qualquer pasta fora do projeto e
deixe o Wizard colocar eles nos locais apropriados
William Colen - http://broffice.org 17
18. Exemplo de componente: revisor de textos
Clique com o direito no projeto e depois em Properties >>
OpenOffice.org >> Display e escolha Current Locale “en”. Preencha os
campos do Description.
William Colen - http://broffice.org 18
19. Exemplo de componente: revisor de textos
Em seguida configure para pt-BR
William Colen - http://broffice.org 19
20. Exemplo de componente: revisor de textos
Arquivos necessários para a descrição da extensão são copiados para
o projeto.
William Colen - http://broffice.org 20
21. Exemplo de componente: revisor de textos
Em Version configure também o identificador (que deve ser único por
toda a vida da extensão) e ainda configure eventuais dependências e o
site de update.
Nota: saiba mais sobre updates aqui:
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Extensions/Online_Update_of_Extensions
William Colen - http://broffice.org 21
22. Exemplo de componente: revisor de textos
Com isto temos o description.xml já configurado
William Colen - http://broffice.org 22
23. Exemplo de componente: revisor de textos
Alterações no template: adicionar o Linguistic.xcu para que o OOo
conheça a nova implementação
William Colen - http://broffice.org 23
24. Exemplo de componente: revisor de textos
Configure o arquivo UNO manifest para que ele conheça a nova
extensão Linguistic.xcu
William Colen - http://broffice.org 24
25. Exemplo de componente: revisor de textos
● Alguns componentes podem ser instanciados apenas uma vez, é o
caso do nosso revisor
● Para facilitar vamos introduzir a classe SingletonFactory que
instância o revisor apenas uma vez e mantém a referência para este
objeto
● Ocasionalmente temos que trocar o contexto de execução do revisor,
por isso vamos alterar a classe MeuExemploDeRevisor, tirando o
final da variável m_xContext e introduzindo o método
changeContext(XComponentContext xCompContext) para trocar o
seu valor.
William Colen - http://broffice.org 25
26. Exemplo de componente: revisor de textos
Adicione a classe SingletonFactory
William Colen - http://broffice.org 26
27. Exemplo de componente: revisor de textos
Modifique a classe MeuExemploDeRevisor para usar SingletonFactory
William Colen - http://broffice.org 27
28. Exemplo de componente: revisor de textos
● Agora podemos implementar nosso revisor propriamente dito.
Primeiro implementamos os métodos da interface
XSupportedLocales:
● public com.sun.star.lang.Locale[] getLocales()
– Retorna os Locales suportados. Vamos retornar apenas pt-BR
● public boolean hasLocale(com.sun.star.lang.Locale aLocale)
– Deveria validar o locale, mas vamos retornar sempre true.
William Colen - http://broffice.org 28
29. Exemplo de componente: revisor de textos
Implemente os métodos da interface XSupportedLocales
William Colen - http://broffice.org 29
30. Exemplo de componente: revisor de textos
E finalmente os métodos da interface XProofreader:
● public boolean isSpellChecker()
– Vamos fazer do nosso um gramatical, vamos retornar false
● public void ignoreRule(String aRuleIdentifier,
com.sun.star.lang.Locale aLocale)
throws com.sun.star.lang.IllegalArgumentException
– Efetiva ignorar regra. Nós não vamos implementar porque não
usaremos sistema de regras
● public void resetIgnoreRules()
– Limpar lista de regras ignoradas.
William Colen - http://broffice.org 30
31. Exemplo de componente: revisor de textos
Continuação da interface XProofreader:
● public com.sun.star.linguistic2.ProofreadingResult doProofreading(
String aDocumentIdentifier, // usado se guardar dados do doc
String aText, // texto para ser verificado
com.sun.star.lang.Locale aLocale, // locale do texto
int nStartOfSentencePosition, // onde começar a verif. no text
int nSuggestedBehindEndOfSentencePosition, // *
com.sun.star.beans.PropertyValue[] aProperties //detalhes locale
)
throws com.sun.star.lang.IllegalArgumentException
– Método deve verificar o texto. aDocumentIdentifier pode ser
usado para guardar numa estrutura de dados o contexto de um
dado documento
(*) O BrOffice.org sugere onde uma sentença termina, mas
muitas vezes o verificador é melhor nessa delimitação do que o
BrOffice.org, por isso que ele manda sempre texto extra.
William Colen - http://broffice.org 31
32. Exemplo de componente: revisor de textos
Implementação do método doProofReading
● Primeiro criamos um objeto ProofreadingResult e inicializamos ele com
os dados passados como argumentos de doProofReading
● Caso o texto seja nulo ou vazio, já retornamos
● Caso exista texto, nós aceitamos como fim da sentença o tamanho do
texto dado pela API
● Em seguida criamos um verificador bem ingênuo, que busca usando
uma expressão regular o texto “BrOffice.org é bom”. Para cada região
com esta ocorrência ele cria um objeto SingleProofreadingError e
finalmente coloca estes na lista de erros no ProofreadingResult
William Colen - http://broffice.org 32
33. Exemplo de componente: revisor de textos
Implementação do método doProofReading
William Colen - http://broffice.org 33
34. Exemplo de componente: revisor de textos
Debugando o componente: inserindo um Breakpoint
William Colen - http://broffice.org 34
35. Exemplo de componente: revisor de textos
Debugando o componente: inicializando
William Colen - http://broffice.org 35
36. Exemplo de componente: revisor de textos
Debugando o componente: wizard instala no BrOffice.org
William Colen - http://broffice.org 36
37. Exemplo de componente: revisor de textos
Debugando o componente: Digite o texto no BrOffice.org Writer
William Colen - http://broffice.org 37
38. Exemplo de componente: revisor de textos
Debugando o componente: o BrOffice.org chama o método doProofReading
William Colen - http://broffice.org 38
39. Exemplo de componente: revisor de textos
Debugando o componente: o BrOffice.org sublinha o texto
William Colen - http://broffice.org 39
40. Exemplo de componente: revisor de textos
Debugando o componente: e ainda fornece um menu de contexto
William Colen - http://broffice.org 40
41. Exemplo de componente: revisor de textos
Debugando o componente: e finalmente corrige o texto
William Colen - http://broffice.org 41
42. Exemplo de componente: revisor de textos
Gerando o instalador
William Colen - http://broffice.org 42
43. Exemplo de componente: revisor de textos
Gerando o instalador
William Colen - http://broffice.org 43
44. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
● Ainda mais fácil que um revisor de texto é criar um Add-in
para o Calc
● Não são necessários menus, configurações etc. A nova
função estará disponível para uso da mesma forma que as
funções nativas.
● Este exemplo envolve um cálculo complexo que responde
a questão da Vida, Do Universo e Tudo Mais, conforme
descrito na série O Guia do Mochileiro das Galáxias, de
Douglas Adams.
William Colen - http://broffice.org 44
45. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Crie um novo projeto usando OpenOffice.org >> OpenOffice.org Calc
Add-in
William Colen - http://broffice.org 45
46. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Configure os parâmetros do novo projeto
William Colen - http://broffice.org 46
47. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Configure o nome e tipo da função, descrição e argumentos
William Colen - http://broffice.org 47
48. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Configure o componente clicando com o direito no projeto e depois em
Properties >> OpenOffice.org >> Display, como feito no exemplo
anterior.
William Colen - http://broffice.org 48
49. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
● Criar um Add-in para o Calc é muito simples. Só é
necessário alterar o método que implementa o cálculo da
função
● No nosso caso basta então implementar na classe
ResolvedorDaVidaUniversoETudoMaisImpl o método
public int answerToLifeTheUniverseAndEverything(int magicalNumber)
William Colen - http://broffice.org 49
50. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Implementação do método answerToLifeTheUniverseAndEverything
William Colen - http://broffice.org 50
51. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Estamos prontos para executar
William Colen - http://broffice.org 51
52. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
Como especificado, a função está na categoria Suplementos
William Colen - http://broffice.org 52
53. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
William Colen - http://broffice.org 53
54. Exemplo de Calc Add-in: Responde a questão da Vida,
Do Universo e Tudo Mais
A função está pronta para uso em planilhas.
William Colen - http://broffice.org 54
55. Exemplo de Add-on: Tradutor
● Adiciona uma nova característica ao BrOffice.org
● Vamos trabalhar apenas com documentos de texto
(Writer) simples
● Usuário seleciona um texto e executa o comando de
traduzir. Uma janela é aberta e o usuário seleciona o
idioma de origem e o de destino. O texto selecionado é
substituído pela versão traduzida.
● Para traduzir vamos usar o Google Translate, através da
API fornecida pelo projeto Google-API-Translate-Java –
distribuído sob licença LGPL e disponível no site
http://code.google.com/p/google-api-translate-java
William Colen - http://broffice.org 55
56. Exemplo de Add-on: Tradutor
Crie um novo projeto usando OpenOffice.org >> OpenOffice.org Add-on
William Colen - http://broffice.org 56
57. Exemplo de Add-on: Tradutor
Configure os parâmetros do novo projeto
William Colen - http://broffice.org 57
58. Exemplo de Add-on: Tradutor
Configure as funções suportadas pelo Add-On. Coloque a função
principal e eventuais chamadas para configurações.
William Colen - http://broffice.org 58
59. Exemplo de Add-on: Tradutor
Configure o menu, dando um nome padrão e localizações desejadas.
Configure o menu para aparecer apenas no BrOo Writer.
William Colen - http://broffice.org 59
60. Exemplo de Add-on: Tradutor
Configure também a barra de botões. Configure a barra para aparecer
apenas no BrOo Writer. Aperte Finish.
William Colen - http://broffice.org 60
61. Exemplo de Add-on: Tradutor
Configure o componente clicando com o direito no projeto e depois em
Properties >> OpenOffice.org >> Display como feito no exemplo anterior.
William Colen - http://broffice.org 61
62. Exemplo de Add-on: Tradutor
O Wizard já criou o Addons.xcu
William Colen - http://broffice.org 62
63. Exemplo de Add-on: Tradutor
e o ProtocolHandler.xcu
William Colen - http://broffice.org 63
64. Exemplo de Add-on: Tradutor
● Addons.xcu
● Configura os menus e as barras de botões do Add-on.
● ProtocolHandler.xcu
● Direciona todos os comandos com namespace
“org.broffice.addons.meutradutorusandogoogletranslate.meutradu
torusandogoogletranslate:*” para o Add-on
William Colen - http://broffice.org 64
65. Exemplo de Add-on: Tradutor
Vamos adicionar a biblioteca do google-api-translate-java-0.8 ao projeto
William Colen - http://broffice.org 65
66. Exemplo de Add-on: Tradutor
● Agora criamos as seguintes classes para acessar a API do
Google Translate
● GoogleTranslate – Singleton para gerenciar o acesso
– String Traduzir(String texto, String origem, String destino)
– public String[] getIdiomas()
– public short getOrigemPadrao()
– public short getDestinoPadrao()
● TradutorDeTexto – Classe que conhece o documento e o GoogleTranslate
– private XTextRange getRegiaoSelecionada()
– private String getTextoSelecionado(XTextRange regiaoSelecionada)
– private void setTextoSelecionado(XTextRange regiaoSelecionada, String
texto)
– public void traduzTextoSelecionado(String origem, String destino)
William Colen - http://broffice.org 66
67. Exemplo de Add-on: Tradutor
GoogleTranslate – Singleton para gerenciar o acesso
William Colen - http://broffice.org 67
68. Exemplo de Add-on: Tradutor
TradutorDeTexto – Classe que conhece o documento e o
GoogleTranslate
William Colen - http://broffice.org 68
69. Exemplo de Add-on: Tradutor
● Vamos agora criar uma caixa de dialogo para pedir ao usuário
que ele escolha o idioma de origem e o de destino
● Interfaces gráficas são feitas usando UNO e uma
implementação do AWT próprio do BrOo. O código é um pouco
diferente já que não podemos criar objetos UNO como criamos
objetos no Java. Devemos usar o método
XmultiServiceFactory.createInstance para criar os
componentes.
● DialogoIdioma
– public DialogoIdioma(XComponentContext xCompContext) – construtor que
recebe o contexto de execução, exibe a janela
– public String getOrigem() - retorna o idioma de origem selecionado
– public String getDestino() - retorna o idioma de origem selecionado
● I18nLabelsLoader – classe auxiliar para facilitar a internacionalização da caixa
de diálogo.
William Colen - http://broffice.org 69
70. Exemplo de Add-on: Tradutor
DialogoIdioma - pede para o usuário o idioma de origem e de destino
William Colen - http://broffice.org 70
71. Exemplo de Add-on: Tradutor
I18nLabelsLoader – classe auxiliar para facilitar a internacionalização
da caixa de diálogo.
William Colen - http://broffice.org 71
72. Exemplo de Add-on: Tradutor
● Vamos finalmente integrar tudo na classe
MeuTradutorUsandoGoogleTranslate.
● Esta classe aparenta ser bem complexa, mas grande parte
dela serve apenas para o sistemas de Add-ons funcionar.
Alguns métodos podem ser alterados para personalizar algum
comportamento do Add-on, mas não é o nosso caso neste
exemplo.
● O único método que precisamos alterar é o dispatch
● Todos os eventos são direcionados para o dispatch. O que
temos que fazer é tratar quando for o evento Translate.
William Colen - http://broffice.org 72
73. Exemplo de Add-on: Tradutor
Método dispatch cria uma nova thread para tratar o evento
William Colen - http://broffice.org 73
74. Exemplo de Add-on: Tradutor
A thread chama DialogoIdioma para pegar as opções e em seguida
chama TradutorDeTexto para efetivar a tradução
William Colen - http://broffice.org 74
75. Exemplo de Add-on: Tradutor
Estamos prontos para executar! Digite o texto, selecione e chame
Translate
William Colen - http://broffice.org 75
76. Exemplo de Add-on: Tradutor
O texto foi traduzido. Você pode ainda chamar novamente trocando o
idioma:
William Colen - http://broffice.org 76
77. Exemplo de Add-on: Tradutor
E o texto foi traduzido novamente.
William Colen - http://broffice.org 77