80
William D. Colen M. Silva Criando extensões para o BrOffice.org usando Java e NetBeans 16 de setembro de 2009 Engenharia da Computação – Poli USP 2002 - 2006 Mestrando Ciência da Computação – IME USP 2009 - Desenvolvedor corretor gramatical CoGrOO 2004 -

Criando extensões para o BrOffice - Instituto de ...colen/presentations/JustJava2009_William_Colen... · William D. Colen M. Silva Criando extensões para o BrOffice.org usando Java

Embed Size (px)

Citation preview

William D. Colen M. Silva

Criando extensões para o BrOffice.org

usando Java e NetBeans

16 de setembro de 2009

Engenharia da Computação – Poli USP 2002 - 2006

Mestrando Ciência da Computação – IME USP 2009 -

Desenvolvedor corretor gramatical CoGrOO 2004 -

William Colen - http://broffice.org 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 3

Onde procurar e para onde enviar extensões?

William Colen - http://broffice.org 4

Estendendo o BrOffice.org

BrOffice.org

Client App Components

Extensão.OXT

AppExterno

Add-ons Add-ins

- Template de novo documento- Extrair dados de uma planilha

Implementam interfaces para estender funcionalidades

Implementamnovas

funcionalidades

- CoGrOO- Nova fórmula no Calc

William Colen - http://broffice.org 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 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 7

Extensões para BrOffice.org

● Pacote .OXT

● description.xml

● Identificador

● Versão

● Atualizações

William Colen - http://broffice.org 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 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 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 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 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 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 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 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 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 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 18

Exemplo de componente: revisor de textosClique 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 19

Exemplo de componente: revisor de textos

Em seguida configure para pt-BR

William Colen - http://broffice.org 20

Exemplo de componente: revisor de textosArquivos necessários para a descrição da extensão são copiados para

o projeto.

William Colen - http://broffice.org 21

Exemplo de componente: revisor de textosEm 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 22

Exemplo de componente: revisor de textos

Com isto temos o description.xml já configurado

William Colen - http://broffice.org 23

Exemplo de componente: revisor de textosAlterações no template: adicionar o Linguistic.xcu para que o OOo

conheça a nova implementação

William Colen - http://broffice.org 24

Exemplo de componente: revisor de textosConfigure o arquivo UNO manifest para que ele conheça a nova

extensão Linguistic.xcu

William Colen - http://broffice.org 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 26

Exemplo de componente: revisor de textosAdicione a classe SingletonFactory

William Colen - http://broffice.org 27

Exemplo de componente: revisor de textosModifique a classe MeuExemploDeRevisor para usar SingletonFactory

William Colen - http://broffice.org 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 29

Exemplo de componente: revisor de textosImplemente os métodos da interface XSupportedLocales

William Colen - http://broffice.org 30

Exemplo de componente: revisor de textosE 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 31

Exemplo de componente: revisor de textosContinuação da interface XProofreader:

● public com.sun.star.linguistic2.ProofreadingResult doProofreading(String aDocumentIdentifier, // usado se guardar dados do docString aText, // texto para ser verificado com.sun.star.lang.Locale aLocale, // locale do textoint nStartOfSentencePosition, // onde começar a verif. no textint 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 32

Exemplo de componente: revisor de textosImplementaçã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 33

Exemplo de componente: revisor de textosImplementação do método doProofReading

William Colen - http://broffice.org 34

Exemplo de componente: revisor de textosDebugando o componente: inserindo um Breakpoint

William Colen - http://broffice.org 35

Exemplo de componente: revisor de textosDebugando o componente: inicializando

William Colen - http://broffice.org 36

Exemplo de componente: revisor de textosDebugando o componente: wizard instala no BrOffice.org

William Colen - http://broffice.org 37

Exemplo de componente: revisor de textosDebugando o componente: Digite o texto no BrOffice.org Writer

William Colen - http://broffice.org 38

Exemplo de componente: revisor de textosDebugando o componente: o BrOffice.org chama o método doProofReading

William Colen - http://broffice.org 39

Exemplo de componente: revisor de textosDebugando o componente: o BrOffice.org sublinha o texto

William Colen - http://broffice.org 40

Exemplo de componente: revisor de textosDebugando o componente: e ainda fornece um menu de contexto

William Colen - http://broffice.org 41

Exemplo de componente: revisor de textosDebugando o componente: e finalmente corrige o texto

William Colen - http://broffice.org 42

Exemplo de componente: revisor de textosGerando o instalador

William Colen - http://broffice.org 43

Exemplo de componente: revisor de textosGerando o instalador

William Colen - http://broffice.org 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 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 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 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 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 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 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 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 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 53

Exemplo de Calc Add-in: Responde a questão da Vida, Do Universo e Tudo Mais

William Colen - http://broffice.org 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 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 56

Exemplo de Add-on: Tradutor

Crie um novo projeto usando OpenOffice.org >> OpenOffice.org Add-on

William Colen - http://broffice.org 57

Exemplo de Add-on: Tradutor

Configure os parâmetros do novo projeto

William Colen - http://broffice.org 58

Exemplo de Add-on: TradutorConfigure as funções suportadas pelo Add-On. Coloque a função

principal e eventuais chamadas para configurações.

William Colen - http://broffice.org 59

Exemplo de Add-on: TradutorConfigure 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 60

Exemplo de Add-on: TradutorConfigure também a barra de botões. Configure a barra para aparecer

apenas no BrOo Writer. Aperte Finish.

William Colen - http://broffice.org 61

Exemplo de Add-on: TradutorConfigure 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 62

Exemplo de Add-on: Tradutor

O Wizard já criou o Addons.xcu

William Colen - http://broffice.org 63

Exemplo de Add-on: Tradutor

e o ProtocolHandler.xcu

William Colen - http://broffice.org 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.meutradutorusandogoogletranslate:*” para o Add-on

William Colen - http://broffice.org 65

Exemplo de Add-on: TradutorVamos adicionar a biblioteca do google-api-translate-java-0.8 ao projeto

William Colen - http://broffice.org 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 67

Exemplo de Add-on: TradutorGoogleTranslate – Singleton para gerenciar o acesso

William Colen - http://broffice.org 68

Exemplo de Add-on: TradutorTradutorDeTexto – Classe que conhece o documento e o

GoogleTranslate

William Colen - http://broffice.org 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 70

Exemplo de Add-on: TradutorDialogoIdioma - pede para o usuário o idioma de origem e de destino

William Colen - http://broffice.org 71

Exemplo de Add-on: TradutorI18nLabelsLoader – classe auxiliar para facilitar a internacionalização

da caixa de diálogo.

William Colen - http://broffice.org 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 73

Exemplo de Add-on: TradutorMétodo dispatch cria uma nova thread para tratar o evento

William Colen - http://broffice.org 74

Exemplo de Add-on: TradutorA thread chama DialogoIdioma para pegar as opções e em seguida

chama TradutorDeTexto para efetivar a tradução

William Colen - http://broffice.org 75

Exemplo de Add-on: TradutorEstamos prontos para executar! Digite o texto, selecione e chame

Translate

William Colen - http://broffice.org 76

Exemplo de Add-on: TradutorO texto foi traduzido. Você pode ainda chamar novamente trocando o

idioma:

William Colen - http://broffice.org 77

Exemplo de Add-on: TradutorE o texto foi traduzido novamente.

William Colen - http://broffice.org 78

Referências

OpenOffice.org Developer's Guide -http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

Extensions -http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Extensions/Extensions

OpenOffice.org API -http://api.openoffice.org

Integração NetBeans -http://wiki.services.openoffice.org/wiki/OpenOffice_NetBeans_Integration

William Colen - http://broffice.org 79

Encontro Nacional BrOffice.org

William Colen - http://broffice.org 80

Obrigado pela oportunidade e pela atenção!

http://cogroo.sourceforge.net