Escolar Documentos
Profissional Documentos
Cultura Documentos
org Basic
por Noelson Alves Duarte
Verso 1
ndice
1 Macros OpenOffice.org Basic........................................................................................................... 4 1.1 Introduo.................................................................................................................................. 4 1.2 Criando a Primeira Macro..........................................................................................................4 1.3 Executando a Primeira Macro....................................................................................................6 1.4 Compartilhando uma Macro...................................................................................................... 8 2 Dilogos Personalizados..................................................................................................................10 2.1 Introduo................................................................................................................................ 10 2.2 Criando um Dilogo ................................................................................................................10 2.3 Manipulando Eventos do Dilogo........................................................................................... 13 3 Pilotos Automticos.........................................................................................................................16 3.1 Introduo................................................................................................................................ 16 3.2 Criando um Piloto Automtico................................................................................................ 16 3.3 Manipulando Eventos do Piloto Automtico...........................................................................18 4 Introduo a API do OpenOffice.org...............................................................................................20 4.1 Introduo................................................................................................................................ 20 4.2 Criando um novo documento...................................................................................................22 5 Trabalhando com Documentos........................................................................................................ 24 5.1 Carregando Documentos..........................................................................................................24 5.2 Salvando Documentos............................................................................................................. 25 5.3 Imprimindo Documentos......................................................................................................... 27 5.4 Fechando Documentos.............................................................................................................29 5.5 Identificando os Documentos Abertos.....................................................................................30 6 Documentos do Writer.....................................................................................................................31 6.1 Introduo................................................................................................................................ 31 6.2 Editando texto.......................................................................................................................... 31 6.3 Movendo-se pelo texto.............................................................................................................32 6.4 Formatando texto..................................................................................................................... 36 6.5 Formatando com estilo ............................................................................................................38 6.6 Obtendo o objeto selecionado..................................................................................................41 6.7 Localizando objetos................................................................................................................. 43 6.8 Busca e Substituio................................................................................................................ 45 6.9 Inserindo objetos......................................................................................................................47 6.10 Tabelas................................................................................................................................... 48 7 Documentos do Calc........................................................................................................................54 7.1 Introduo................................................................................................................................ 54 7.2 Planilhas...................................................................................................................................54 7.3 Editando................................................................................................................................... 56 7.4 Navegando pelas Clulas......................................................................................................... 58 7.5 Selecionando pela Interface Grfica........................................................................................ 60 7.6 Formatando.............................................................................................................................. 61 7.7 Busca e Substituio................................................................................................................ 66 7.8 Ordenando................................................................................................................................67 7.9 Filtrando dados........................................................................................................................ 69 7.10 Inserindo Subtotais.................................................................................................................70 7.11 Grficos..................................................................................................................................72 8 Mais informaes............................................................................................................................ 76
Introduo ao OpenOffice.org Basic 1
Verso 1
8.1 Na rede..................................................................................................................................... 76 8.2 Com o autor............................................................................................................................. 76 9 Crditos, Agradecimentos, Licena................................................................................................. 77 9.1 Crditos....................................................................................................................................77 9.2 Agradecimentos ..................................................................................................................... 77 9.3 Licena..................................................................................................................................... 77
Verso 1
Apresentao
Este documento o resultado do meu esforo para aprender o OpenOffice.org Basic. Ele est focado, principalmente, nas extenses do OpenOffice.org ao Basic, isto , na API do OpenOffice.org. Assim sendo, as caractersticas bsicas da linguagem de programao Basic no so abordadas. Se voc j programou ou conhece algum dos sabores Basic e deseja escrever macros para o OpenOffice.org este um bom local para comear. Seno, recomendo procurar algum curso na rede, e se familiarizar com o Basic, antes de se aventurar no OOo Basic. muito importante dominar os fundamentos de uma linguagem de programao. Todos os exemplos de cdigo fonte foram testados com o OpenOffice.org, verso 1.0.1, exceto os pequenos blocos de cdigo fora das sub-rotinas. Para utilizar este texto, o OpenOffice.org deve estar instalado em seu computador. Aps o Captulo 3, recomendo que voc instale, tambm, o Manual de Referncia da API do OpenOffice.org (consulte o captulo Mais Informaes). O Manual de Referncia sofre atualizaes peridicas e sua verso atualizada est disponvel, tambm, para consultas on-line. Espero ter tempo para continuar aprendendo e acrescentando informaes teis aos programadores que, como eu, no dominam a lngua inglesa. Portanto, periodicamente, procure por novas verses deste documento. Como resultado de uma aprendizagem, esta Introduo, seguramente, contm muitos erros e inconsistncias, espero contar com a sua ajuda para corrig-los. Em 20 de junho de 2003 O Autor
Verso 1
1.1 Introduo
Uma macro um programa escrito na linguagem OpenOffice.org Basic com a finalidade de automatizar tarefas do OpenOffice.org. A linguagem OpenOffice.org Basic mantm as principais caractersticas das verses atuais do BASIC, no que diz respeito sintaxe, tipos de dados, operadores, comandos, funes internas e organizao geral do programa. Alm disto, o OpenOffice.org Basic permite o acesso a uma grande quantidade de objetos, com seus mtodos e propriedades, especficos do OpenOffice. O OpenOffice.org tem um IDE (Integrated Development Environment - Ambiente de Desenvolvimento Integrado) completo, inclundo: edio de cdigo fonte, verificao de erros, criao de dilogos e gerenciamento de bibliotecas.
Verso 1
Observe a rvore Macro de, no centro do dilogo, temos duas entradas principais soffice e Primeira_Macro.sxw, elas so recipientes (containers) para bibliotecas. Um nvel abaixo, nas duas entradas, temos a biblioteca Standard. Dentro de soffice - Standard temos o mdulo Module1. O recipiente soffice sempre ser carregado com o OpenOffice.org, ele tem bibliotecas globais, usadas em todos os documentos do OpenOffice.org. Observe que alguns mdulos de soffice esto desativados. Cada documento aberto tem seu prprio container com uma biblioteca Standard. Na figura acima, o nico documento aberto Primeira_Macro.sxw. A lista, esquerda do dilogo, exibe os nomes dos procedimentos (Sub-rotinas e funes) do mdulo selecionado. O campo Nome da macro exibe o nome do procedimento selecionado. Ao selecionar o nome de um procedimento, os botes Executar, Atribuir e Editar so ativados. Vamos continuar com a criao da nossa primeira macro: a) Selecione a biblioteca Standard de Primeira_Macro.sxw. b) Clique sobre o boto Novo para criar um novo mdulo. c) Aparece a caixa de entrada Novo Modulo, sugerindo o nome Module1. d) Clique no boto OK para criar o novo mdulo. O IDE Basic carregado.
Verso 1
Figura 2: IDE Basic e) Observe, no editor Basic, a definio de uma sub-rotina Sub Main ... End Sub. Note tambm que a aba Module1 est ativa. f) Digite (ou copie e cole) o cdigo fonte abaixo entre as linhas Sub Main e End Sub.
Dim Dim Dim Dim Dim oDocumento as Object oTexto as Object oCursorVista as Object oCursor as Object sInserir as String
' solicita o texto sInserir = InputBox("Digite o texto:", "Inserir Texto", "") ' testa se algo foi digitado if sInserir = "" then exit sub endif ' obtm o modelo do documento oDocumento = ThisComponent ' obtm o servio Text do documento oTexto = oDocumento.getText() ' obtm a posio do cursor na GUI e cria um cursor de texto oCursorVista = oDocumento.getCurrentController().getViewCursor() oCursor = oTexto.createTextCursorByRange(oCursorVista.getStart()) ' insere o texto na posio corrente do cursor oTexto.insertString(oCursor, sInserir, FALSE)
Pronto, terminamos a nossa primeira macro. Lembre-se que ela est embutida no documento Primeira_Macro.sxw.
Verso 1
a) No editor Basic, posicione o cursor de texto na linha sInserir = InputBox( ... ). Clique no cone Ponto de interrupo. Surge uma marca vermelha esquerda da linha. b) No campo Observador, digite sInserir e tecle Enter, para inspecionar o valor da varivel durante a execuo da macro. Note que o cone Remover observador, direita do campo, ativado. c) Clique sobre o cone Executar. A execuo da macro iniciada e, no Ponto de interrupo, ela pra note a seta amarela, direita. d) Clicando no cone Passo a passo, acompanhe a execuo da macro. Quando a caixa de entrada for exibida, digite o seu nome e clique sobre o boto OK. Continue a execuo at o final, quando o cone Parar for desativado. Alterne para a janela do documento PrimeiraMacro.sxw, e veja se o seu nome foi inserido na posio do cursor, como desejado. Se ocorreu algum erro, revise o cdigo fonte. Caso uma macro seja utilizada com freqncia, podemos configurar o OpenOffice.org para execut-la de modo mais fcil. Na opo de menu Ferramentas Configurar, temos entradas para Menus Teclado - Barra de ferramentas e Eventos, onde possvel associar macros a opes de menus, a cones na barra de ferramentas, a uma combinao de teclas e a um evento do OpenOffice.org. Antes de encerrar esta seo, retorne janela do IDE Basic, para simularmos um erro no cdigo fonte: a) Na penltima linha de cdigo oTexto.InsertString(...) - altere o nome da varivel oCursor para oCurso. b) Execute a macro. Surge uma caixa com uma mensagem de erro e um boto OK. Note que a seta de acompanhamento da execuo torna-se vermelha na linha onde ocorre o erro. Aps clicar em OK a execuo da macro finalizada e a linha com o erro permanece selecionada.
Figura 3: Erro de execuo c) Corrija o nome da varivel de oCurso para oCursor. Feche o IDE Basic. Salve o documento Primeira_Macro.sxw. No prximo passo, veremos como disponibilizar uma macro para todos os documentos do OpenOffice.org.
Verso 1
Figura 4: Dilogo Gerenciar c) Selecione, na caixa de listagem Aplicao / Documento, a entrada soffice e pressione o boto Adicionar. d) Um dilogo Abrir Arquivo ser exibido. Localize e selecione o arquivo que contm a macro a ser compartilhada e clique sobre o boto Abrir. e) O dilogo Inserir Bibliotecas ser exibido. Note que as bibliotecas existentes no arquivo esto marcadas para compartilhamento. Desmarque aquelas que no sero compartilhadas e clique sobre o boto Ok.
Verso 1
Figura 5: Inserir Bibliotecas Pronto, agora a sua macro faz parte do repositrio soffice e est disponvel para execuo no OpenOffice.org.
Dilogos Personalizados
Verso 1
2 Dilogos Personalizados
2.1 Introduo
O OpenOffice.org Basic permite a criao de Dilogos Personalizados, atravs de um editor de Dilogos intuitivo e poderoso. Dilogos so uma excelente soluo para interao com o usurio, permitindo que o programador desenhe uma interface grfica consistente para obter ou passar informaes ao operador.
10
Verso 1
Dilogos Personalizados
Figura 6: Editor de Dilogos Vejamos a finalidade de alguns cones existentes no quadro de Controles. Etiqueta usado para colocar etiquetas no dilogo. Boto usado para colocar botes no dilogo. Caixa de texto permite inserir uma caixa de texto num dilogo. Propriedades exibe a janela de propriedades do controle selecionado. Ser ativado quando algum controle for selecionado. Alm da edio das propriedades, permite associar procedimentos (cdigo) a eventos ocorridos no controle. Ativar modo de teste exibe o dilogo como se estivesse em execuo. Inserir Controles num Dilogo uma operao em trs passos: 1) ativar o cone do controle no quadro de controles; 2) definir a rea do dilogo onde o controle ser posicionado. Para isto pressione o boto esquerdo do mouse e arraste formando um retngulo, em seguida, libere o boto do mouse; 3) definir as propriedades do controle. Quando um controle adicionado ao dilogo, o OpenOffice.org Basic automaticamente define um valor padro para cada propriedade. Para exibir as propriedades de um controle selecionado, clique sobre o cone Propriedades ou clique duas vezes sobre o controle. Note, tambm, que a janela Propriedades possui o boto Subir Descer.
Introduo ao OpenOffice.org Basic 11
Dilogos Personalizados
Verso 1
Figura 7: Janela Propriedades Vamos trabalhar em nosso dilogo: a) Selecione o dilogo vazio, clicando na sua borda externa. Note que aparecem marcas em torno do mesmo. Podemos usar estas marcas para redimensionar o nosso dilogo. b) Clique no cone Propriedades para exibir a sua janela, como na figura acima. No campo Ttulo aba Geral digite Inserir Frase e tecle Enter. Clique no cone Subir de Propriedades e observe o ttulo do dilogo. c) Adicione um controle Etiqueta ao dilogo. Para isto, clique no cone Etiqueta, em seguida defina um retngulo na parte superior do dilogo. Defina a sua propriedade ttulo para Digite o texto. d) Coloque uma Caixa de Texto no dilogo, logo abaixo da etiqueta. Observe a sua propriedade Nome: TextField1. No cdigo fonte, nos referimos a um controle pela sua propriedade Nome, da a sua importncia. Note, tambm, que este controle no tem a propriedade Ttulo. e) Vamos colocar dois botes, lado a lado, na parte inferior do dilogo, abaixo da caixa de texto. Defina os seus ttulos para OK e Cancelar. f) Ajuste o dilogo e seus controles de modo que fiquem com a aparncia da figura abaixo. Figura 8: Dilogo Inserir Frase
12
Verso 1
Dilogos Personalizados
Bem, terminamos o nosso dilogo. Vamos verificar a sua aparncia quando em execuo. Clique sobre o cone Ativar modo de teste no quadro de controles e, aps observar o dilogo, clique em seu cone Fechar para retornar ao editor. Na prxima seo, daremos funcionalidade ao nosso Dilogo.
Private oDialogo as Variant Sub dlgExecutaDialogo oDialogo = createUnoDialog(DialogLibraries.Standard.Dialog1) oDialogo.execute() End Sub Sub dlgCancelaDialogo oDialogo.endExecute() End Sub Sub dlgInserirFrase Dim oDocumento as Object Dim oTexto as Object Dim oCursorVista as Object Dim oCursor as Object Dim sFrase as String
13
Dilogos Personalizados
Verso 1
oDialogo.endExecute() ' note a referencia ao controle TextField1 do dialogo sFrase = oDialogo.Model.TextField1.Text if sFrase = "" then exit sub endif ' obtm o modelo do documento oDocumento = ThisComponent ' obtm o servio Text do documento oTexto = oDocumento.getText() ' obtm a posio do cursor na GUI e cria um cursor de texto oCursorVista = oDocumento.getCurrentController().getViewCursor() oCursor = oTexto.createTextCursorByRange(oCursorVista.getStart()) ' insere o texto na posio corrente do cursor oTexto.insertString(oCursor, sFrase, FALSE) End Sub
No cdigo acima, declaramos a varivel oDialogo (Private oDialogo as Variant) fora dos procedimentos, o que a torna visvel em todo o mdulo Module1. Antes de exibir o dilogo, criamos um objeto oDialogo com createUnoDialog() e, para execut-lo, chamamos o seu mtodo execute. Para fechar o dilogo chamamos o seu mtodo endExecute ( chamado em dois procedimentos). Objetos UNO (criados com createUno) devem ser declarados com o tipo Variant e no Object. A seguir, vamos associar os procedimentos aos eventos do dilogo. Selecione a pgina Dialog1 para ativar o editor de dilogos. Em nosso dilogo, selecione o boto OK e clique no cone Propriedades. Surge a janela Propriedades, clique na aba Eventos e, em seguida, clique no boto direita do campo do evento Ao Iniciar. Surge a janela Atribuir macros com o evento Ao Iniciar selecionado. Na rvore Macros, expanda as entradas Primeira_Macro.sxw e Standard, clique sobre Module1. Surge a relao de procedimentos do mdulo, selecione o procedimento dlgInserirFrase e clique sobre o boto Atribuir. Para fechar a janela, clique no boto OK.
14
Verso 1
Dilogos Personalizados
Figura 9: Dilogo Atribuir macro Agora, repita os passos acima para atribuir o procedimento dlgCancelaDialogo ao evento Ao Iniciar, do boto Cancelar do nosso dilogo. Para o OpenOffice.org Basic, o primeiro procedimento no mdulo o ponto de entrada da macro. Logo, a Sub dlgExecutaDialogo ser automaticamente executada toda vez que executarmos a nossa macro. Teste a macro e o dilogo personalizado, clicando sobre o cone Executar, na barra de ferramentas do IDE Basic. Digite uma frase qualquer na caixa de texto do dilogo e clique sobre o boto Ok. Aps a execuo da macro, verifique se a frase foi adicionada corretamente ao documento. No prximo captulo, vamos transformar o nosso dilogo simples num Piloto Automtico.
15
Dilogos Personalizados
Verso 1
3 Pilotos Automticos
3.1 Introduo
Um Piloto Automtico um Dilogo exibido em vrios passos. uma forma eficiente de guiar o usurio na execuo de uma tarefa. O OpenOffice.org traz, em sua instalao padro, vrios Pilotos Automticos. Verifique o funcionamento de um deles, selecionando Arquivo Piloto Automtico Carta.
Verso 1
Pilotos Automticos
Clique no cone Boto, no quadro de controles e adicione dois novos botes no dilogo, lado a lado e esquerda do boto Ok. Selecione o boto CommandButton3, clique no cone Propriedades e defina a propriedade Titulo para << Voltar, altere o valor da propriedade Ativado de Sim para No. Selecione o boto CommandButton4 e defina a sua propriedade Titulo para Prximo >>. Selecione o boto Ok e altere o seu Ttulo para Concluir. Selecione o dilogo (clique na sua borda externa) e defina a sua propriedade Pgina (Step) para 1 (um). Selecione o controle Etiqueta e defina a sua propriedade Pgina para 1 (um). Selecione o controle Caixa de Texto e defina a sua propriedade Pgina para 1 (um). Agora, retoque a primeira pgina do Piloto Automtico, tornando-a semelhante figura abaixo.
Figura 10: Primeira Pgina do Dilogo do Piloto Automtico Bem, vamos prosseguir em nosso projeto, desenhando a Pgina 2 do Piloto Automtico. Selecione o dilogo e altere a propriedade Pgina para 2 (dois). Note que os controles Etiqueta e Caixa de Texto desaparecem, pois eles pertencem Pgina 1. Os botes, que tm a pgina igual a 0 (zero), continuam visveis. Adicione uma Etiqueta na parte superior esquerda do dilogo e defina o seu Ttulo para Selecione a posio. Observe que a propriedade pgina igual a 2 (dois), o mesmo valor do dilogo. Clique sobre o cone Boto de Opo, no quadro de controles, e ponha trs botes de opo, na parte superior direita do dilogo, um abaixo do outro. Defina o Ttulo do primeiro boto de opo para no Cursor e a sua propriedade Estado para Selecionado. Defina o Ttulo do segundo boto de opo para no Incio. Defina o Ttulo do terceiro boto de opo para no Final. Agora, ajuste os controles da segunda pgina do Piloto Automtico, tornando-a semelhante figura abaixo. Note que o boto de opo no Cursor o padro. A ativao e desativao dos botes Voltar e Prximo ser feita em tempo de execuo (pelo cdigo fonte).
17
Pilotos Automticos
Verso 1
Figura 11: Segunda Pgina do Dilogo do Piloto Automtico. Para finalizar o desenho do Piloto Automtico, selecione o dilogo e retorne para a Pgina 1 (um), pois o OpenOffice.org, como padro, exibe a ltima pgina acessada no Editor de Di logos. Na prxima seo, veremos o cdigo fonte necessrio para dar funcionalidade ao Piloto Automtico.
Sub dlgProximoDialogo oDialogo.Model.Step = 2 oDialogo.Model.CommandButton3.Enabled = true oDialogo.Model.CommandButton4.Enabled = false End Sub Sub dlgVoltarDialogo oDialogo.Model.Step = 1 oDialogo.Model.CommandButton3.Enabled = false oDialogo.Model.CommandButton4.Enabled = true End Sub
Antes de inserir a frase, precisamos verificar a posio, selecionada no segundo passo (botes de opo) e tratar essa escolha adequadamente. Digite o cdigo abaixo na Sub dlgInserirFrase, aps a linha oCursor = oTexto.CreateTextCursorByRange(...) e antes da linha oTexto.insertString(...).
' a posio da frase no incio ou no final if oDialogo.Model.OptionButton2.State = 1 then oCursor.gotoStart(FALSE) elseif oDialogo.Model.OptionButton3.State = 1 then
18
Verso 1
Pilotos Automticos
oCursor.gotoEnd(FALSE) endif
Agora, vamos ligar os procedimentos aos eventos que nos interessam. Alterne para o editor de dilogos. Selecione o boto Voltar e clique no cone Propriedades. Surge a janela Propriedades, clique na aba Eventos e, em seguida, clique no boto direita do campo do evento Ao Iniciar. Surge a janela Atribuir macros com o evento Ao Iniciar selecionado. Na rvore Macros, expanda as entradas Primeira_Macro.sxw e Standard, clique sobre Module1. Surge a relao de procedimentos do mdulo, selecione o procedimento dlgVoltarDialogo e clique sobre o boto Atribuir. Para fechar a janela, clique no boto OK. Seguindo os passos acima, atribua o procedimento dlgProximoDialogo ao evento Ao Iniciar do boto Prximo. Execute a macro e verifique se tudo ocorreu como o esperado. Agora, voc pode se aventurar escrevendo suas prprias macros. Como um ponto de partida, consulte o prximo captulo em busca de informaes complementares.
19
Pilotos Automticos
Verso 1
4.1 Introduo
A chave para a criao de programas que usam a API do OpenOffice.org so os servios. Um servio uma especificao de um objeto, que engloba um conjunto de interfaces e propriedades. Uma interface uma coleo de mtodos. Uma propriedade um valor que determina uma caracterstica de um servio e formada por um nome e um valor. Para criar um servio, usamos a funo Basic createUnoService(), que retorna um objeto com suporte ao servio ou Null, se no for possvel a criao. Por exemplo, para obter o servio Desktop usamos a chamada:
oDesktop = createUnoService( com.sun.star.frame.Desktop )
O parmetro da funo a especificao completa para o servio. Todos os servios iniciam com com.sun.star, em seguida vem o nome do mdulo, neste caso, frame e, por fim, o nome do servio Desktop. Note tambm que a especificao passada como uma cadeia com. sun.star.frame.Desktop. Aps a chamada, podemos verificar se o servio foi criado com:
If isNull( oDesktop ) Then ' Erro na criao do servio End If
Existem servios que so dependentes de um contexto. Por exemplo, voc no pode criar uma clula fora de uma planilha. Outros servios no precisam de um ambiente para operar. Existem, ainda, servios que no oferecem nenhuma interface, servindo unicamente para obter e definir propriedades. O Basic oferece duas propriedades que facilitam o acesso a servios, so elas: StarDesktop equivalente ao objeto retornado por uma chamada funo createUnoService( com.sun.star.frame.Desktop ). Digite o cdigo abaixo numa nova sub-rotina, execute e observe o resultado:
MsgBox StarDesktop.Dbg_SupportedInterfaces ' ' o mesmo que: ' Dim oDesktop oDesktop = CreateUnoService( "com.sun.star.frame.Desktop" ) MsgBox oDesktop.Dbg_SupportedInterfaces
20
Verso 1
ThisComponent retorna o objeto documento que contm o cdigo Basic, existe apenas em documentos do Writer, Calc, Impress ou Draw. Algumas de suas interfaces dependem do tipo de documento.
Dim oDocumento As Object oDocumento = ThisComponent
O OOo Basic tem trs propriedades muito teis para a inspeo de objetos, so elas: Dbg_SupportedInterfaces retorna as interfaces suportadas pelo objeto Dbg_Properties retorna as propriedades do objeto Dbg_Methods retorna os mtodos suportados pelo objeto Para obter estas propriedades, use a forma Objeto.Propriedade. Por exemplo, verifique as interfaces suportadas pelo modelo de documento, executando o cdigo abaixo:
Sub Main MsgBox ThisComponent.Dbg_SupportedInterfaces End Sub
A interface com.sun.star.lang.XServiceInfo possui os mtodos abaixo, teis para inspeo de servios: getImplementationName ( ) As String retorna o nome de implementao do servio supportsService (sNome As String ) As Boolean retorna True se o servio sNome for suportado supportedServiceNames ( ) As String () retorna um conjunto de cadeias com os nomes dos servios suportados, inclusive os indiretos Para obter ou definir valores de propriedades, temos dois casos: a) se o nmero de propriedades for fixo, ento usamos atribuies simples do Basic, como:
Dim nCorAntiga As Long nCorAntiga = oRectangleShape.FillColor oRectangleShape.FillColor = RGB(255,0,0)
21
Verso 1
A sequncia com.sun.star.beans.PropertyValue implementa o servio MediaDescriptor, que descreve de onde (ou aonde) e como um recurso deve ser carregado ou gravado. Observe que as propriedades so definidas por um par Name e Value. A seguir, vamos analisar um exemplo de cdigo que usa alguns destes conceitos.
As linhas iniciadas pelo comando Dim declaram todas as variveis usadas pela sub-rotina. Para carregar um arquivo, usamos o mtodo loadComponentFromURL(), que definido por uma interface do servio Desktop. Ento, precisamos de um objeto UNO Desktop, declarado na linha Dim oDesktop As Variant. Aqui, o tipo Variant segue uma recomendao do Developers Guide para a declarao de objetos UNO. A varivel sUrl (tipo String) recebe a especificao completa do caminho para o arquivo. Ser passada como parmetro do mtodo loadComponentFromURL(). O mtodo loadComponentFromURL() retorna um objeto Document. A linha Dim oDocumento As Object reserva memria para este objeto. O mtodo loadComponentFromURL(), recebe uma sequncia de propriedades como parmetro. A linha Dim mPropArquivo declara e define um vetor para esta sequncia. A definio
22
Verso 1
do objeto feita com o operador New seguido do tipo de objeto (As New com.sun.star.beans. PropertyValue). A linha oDesktop = createUnoService(...) se encarrega da criao do objeto Desktop. A linha oDocumento = oDesktop.loadComponentFromURL(...) carrega o documento de acordo com os parmetros e retorna um objeto do tipo Document. Note que a sequncia mPropArquivo passada como argumento seguida de (). O parmetro _blank significa que um novo quadro ser criado para o documento. Pronto, agora digite (ou copie e cole) a Sub criaNovoDocumento, alterando a varivel sUrl para conter um caminho completo do seu sistema, e execute a macro para ver seu resultado. No prximo captulo, aprenderemos mais sobre programao com documentos do OpenOffice.org.
23
Verso 1
b) Definir a URL Voc deve fornecer uma cadeia de caracteres com a especificao completa do caminho do documento, caso esteja abrindo um documento existente, na forma: file:///caminho_completo_do_arquivo Para novos documentos, criados a partir do modelo padro, existem URLs pr-definidas, que devem ser usadas de acordo com o tipo de documento: URL private:factory/swriter private:factory/scalc private:factory/sdraw private:factory/simpress Descrio Cria um novo documento do Writer Cria um novo documento do Calc Cria um novo documento do Draw Cria um novo documento do Impress
c) Definir as propriedades do descritor de mdia O descritor de mdia um servio (com.sun.star.document.MediaDescriptor) que define como um recurso deve ser carregado. As propriedades do descritor so definidas numa sequncia com.sun.star.beans.PropertyValue. Declare um vetor para a sequncia, de acordo com o nmero de propriedades a alterar, como abaixo:
' declara um vetor vazio, para efeito de passagem como parmetro Dim mPadrao() ' define um vetor para 1 propriedade (ndice 0) Dim mPropriedades(0) As New com.sun.star.beans.PropertyValue mPropArquivo(0).Name = "AsTemplate" mPropArquivo(0).Value = True ' define um vetor para 2 propriedades (ndices 0 e 1) Dim mPropriedades(1) As New com.sun.star.beans.PropertyValue
24
Verso 1
Propriedade AsTemplate
Tipo boolean
Descrio Se True cria um novo documento, a partir do documento carregado, mesmo que ele no seja um modelo. Se for um modelo e AsTemplate for False o documento ser carregado para edio. Define um filtro a ser usado para carregar ou salvar o documento. Aps a carga, salta para uma posio (clula, bookmark, etc). Sobrescreve um documento ao salvar. Padro True. Se o documento deve ser somente leitura ou leitura / gravao. Na gravao o documento no ser compactado (zip). Senha para gravar ou carregar o documento.
d) Definir o quadro de destino o frame onde o documento ser carregado / criado, se j existir um quadro com o nome especificado, ele ser usado, seno um novo ser criado. Os nomes pr-definidos, a seguir, nunca devem ser usados como nome de quadros: _blank; _default; _self; _parent; _top e _beamer. Use _blank para criar um novo quadro. e) Definir o flag de busca uma constante que define o tipo de algoritmo usado para encontrar o quadro de destino. Use um valor 0 para desconsiderar. f) Chamar o mtodo loadComponentFromURL() Este mtodo, do objeto Desktop, carrega o componente definido pela URL, dentro do quadro de destino. Vejamos seus detalhes: loadComponentFromURL( URL As String, FrameDestino As String, FlagBusca As Long, Propriedades As <com.sun.star.beans.PropertyValue> ) O valor de retorno um objeto XComponent ou Null em caso de erro. Eis um exemplo de chamada:
oDocumento = oDesktop.loadComponentFromURL(sUrl, "_blank", _ 0, mPropArquivo())
Verso 1
a) Criar um objeto Document Nomalmente, por uma chamada a loadComponentFromURL() ou ThisComponent. b) Definir a URL Trata-se do caminho completo do recurso. c) Definir as propriedades So as propriedades do descritor de mdia. d) Chamar o mtodo adequado Os documentos do OpenOffice.org suportam os mtodos abaixo para salvar componentes: store ( ) storeAsURL ( sURL As String, Propriedades As <com.sun.star.beans.PropertyValue> ) storeToURL ( sURL As String, Propriedades As <com.sun.star.beans.PropertyValue> ) O mtodo store ( ) simplesmente sobrescreve um arquivo e no deve ser usado num novo documento sem nome. O mtodo storeAsURL ( ) recebe dois parmetros e funciona como o comando Salvar Como do OpenOffice.org. O mtodo storeToURL ( ) recebe dois parmetros, salva o contedo do documento em sURL e no altera o arquivo original. til para exportar arquivos. Exemplos de chamadas:
' salva um documento que j existe ThisComponent.store ( ) ' ou, supondo que oDocumento foi definido oDocumento.store ( )
Documentos abertos com loadComponentFromURL ( ), devem usar os mtodos storeAsURL ou storeToURL. Como exemplo, digite (ou copie e cole) o cdigo fonte abaixo, aps a linha ' INSERIR CDIGO PARA SALVAR AQUI da Sub criaNovoDocumento ( ), edite a varivel sUrl conforme o seu sistema, execute a macro e verifique que um novo arquivo foi gravado em sURL..
' -------------------' Grava o novo arquivo ' -------------------' Define a URL do novo arquivo (ALTERE para seu sistema) sUrl = "file:///D:/nad/openoffice/novo_texto.sxw" ' define a propriedade Overwrite para False mPropArquivo(0).Name = "Overwrite" mPropArquivo(0).Value = FALSE ' grava o novo documento oDocumento.storeAsURL(sUrl, mPropArquivo())
Temos, ainda, os mtodos abaixo, relacionados com a tarefa de salvar arquivos: isModified() As Boolean
26 Introduo ao OpenOffice.org Basic
Verso 1
Retorna True se o recurso foi modificado, seno retorna False. hasLocation ( ) As Boolean Retorna True se o arquivo j existe (foi gravado), seno retorna False. GetLocation ( ) As String Retorna uma String com a URL do recurso. isReadonly ( ) As Boolean Retorna True se for somente leitura, em caso contrrio retorna False A seguir, temos um fragmento de cdigo mais elaborado para salvar arquivos:
If (oDocumento.isModified) Then If (oDocumento.hasLocation And (Not oDocumento.isReadOnly)) Then oDocumento.store() Else oDocumento.storeAsURL(sURL, mPropArquivo()) End If End If
CanSetPaperSize True se a impressora permite mudar o tamanho do papel As quatro ltimas propriedades so somente leitura.
Introduo ao OpenOffice.org Basic 27
Verso 1
O cdigo acima chama o mtodo getPrinter ( ) para obter as propriedades da impressora corrente. Em seguida, no lao For ... Next, extrai os nomes de cada propriedade. E, mais abaixo, obtm e altera o formato da pgina, se possvel. setPrinter ( aImpressora As Variant < com::sun::star::beans::PropertyValue >) Atribui uma nova impressora ao documento. Pode implicar numa reformatao. As propriedades da impressora so as mesmas da tabela acima. print ( xOpcoes As Variant < com::sun::star::beans::PropertyValue >) Imprime o documento de acordo com as opes de impresso (PrintOptions) em xOpcoes. Estas opes so descritas na tabela a seguir: Opo CopyCount FileName Collate Pages Descrio ( Int ) Especifica o nmero de cpias a imprimir Cadeia com o nome de um arquivo para a impresso Se True todo o documento ser impresso antes da prxima cpia, seno imprime todas as cpias pgina a pgina Uma cadeia com as pginas a serem impressas, por exemplo: 1;3;5-8;12
Introduo ao OpenOffice.org Basic
28
Verso 1
Para imprimir numa impressora que no a padro, voc precisa alterar a propriedade Name da impressora e chamar setPrinter definindo uma nova impressora, como abaixo:
Dim mImpressora(0) As New com.sun.star.beans.PropertyValue Dim aOpcoes() ' somente para passar o parmetro ' mImpressora(0).Name="Name" mImpressora(0).value="Segunda_Impressora" ' define a nova impressora para o objeto, ' pode ocorrer uma formatao do documento oDocumento.setPrinter = mImpressora() ' imprime com as opcoes padro oDocumento.print( aOpcoes() )
Acrescente a linha acima aps a ltima linha da Sub criaNovoDocumento(), execute a macro e observe o resultado. b) Aberto pela interface do OpenOffice.org Se o documento foi carregado com o comando Arquivo Abrir do OpenOffice.org e no houve a definio de um objeto Document, use a propriedade ThisComponent, como abaixo:
ThisComponent.dispose()
29
Verso 1
Cuidado, o mtodo dispose() descarta todas as alteraes efetuadas no documento. Portanto, antes de cham-lo, certifique-se de grav-las. Ou, ainda, use isModified() para alertar o usurio. Existem maneiras mais seguras para controlar o fechamento de componentes, porm esto alm do escopo desta Introduo.
Analise atentamente o cdigo fonte acima, ele demonstra aspectos importantes da programao da API do OpenOffice.org. Note como se d a criao de uma enumerao e como visitamos os seus elementos. Aps a identificao de um documento, voc pode, por exemplo, comandar a sua impresso ou o seu fechamento, alm, claro, de poder manipular o seu contedo, aplicando as tcnicas que sero vistas nos prximos captulos.
30
Verso 1
Documentos do Writer
6 Documentos do Writer
6.1 Introduo
Neste captulo, veremos como efetuar tarefas simples de processamento de texto, como: edio, formatao, busca e substituio. Vamos abordar o assunto atravs de exemplos prticos, com uma breve explicao dos aspectos mais importantes. Um documento do Writer contm principalmente texto, organizado em pargrafos e tabelas. Alm destes elementos bsicos, ele suporta molduras, objetos embutidos, campos, grficos, marcadores, ndices e muitos outros objetos. Estes dados compreendem um modelo de documento. Atravs do modelo, podemos manipular os dados independentemente da sua representao visual. Para lidar com o aspecto visual do documento, o modelo dispe de um objeto controlador. Alguns elementos de um documento (grficos, molduras, etc) so nomeados e esto ancorados num pargrafo, caractere ou pgina. Os pargrafos no recebem um nome e nem um ndice, de modo que seu acesso deve ser sequncial.
31
Documentos do Writer
Verso 1
End Sub
Neste exemplo, usamos a interface XTextRange para editar texto. Eis os seus mtodos: getText() As Text retorna um objeto Text getString() As String retorna a String contida no objeto setString( sStr As String) define a String como o contedo do objeto getStart() As Object <TextRange > retorna um objeto TextRange apontando para o incio do objeto chamador getEnd() As Object <TextRange> retorna um objeto TextRange apontando para o final do objeto chamador Inicialmente, chamamos o mtodo getText ( ), que retorna um objeto Text, este passo corres ponde ao item b) acima. Em seguida, na linha oTxt.setString(sStr), definimos uma cadeia de caracteres para o nosso objeto Text, isto significa que todo o contedo do documento objeto oTxt - ser substitudo pela cadeia sStr de setString. Antes de inserir mais texto, precisamos obter o final do contedo de oTxt com a chamada ao mtodo getEnd( ) e usar este novo objeto TextRange para inserir mais texto. Atravs do mtodo getStart, poderamos inserir texto no incio. Note, ainda, que as variveis dos servios Text e TextRange so declaradas como Object. Ateno, oTxt tambm um TextRange, assim podemos substituir a varivel oTxtRange pelo encadeamento de mtodos abaixo: oTxt.getEnd ().setString ( sStr ) Este processo de edio muito limitado. Podemos apenas substituir todo o contedo do texto e inserir texto no incio ou no final do documento.
Verso 1
Documentos do Writer
A interface XSimpleText, derivada de XTextRange, usada na criao do cursor de texto, na insero de cadeias e de caracteres de controle, ela possui os seguintes mtodos: createTextCursor ( ) As Object <TextCursor> Retorna um objeto cursor de texto ( no incio do contedo ) createTextCursorByRange (aPos As TextRange) As Object <TextCursor> Cria um objeto cursor de texto na posio especificada no parmetro insertString(aPos As TextRange, sStr As String, bFlag As Boolean) Insere a cadeia na posio. Se bFlag for True o contedo de aPos ser substitudo por sStr, seno sStr ser acrescentada no final de aPos. insertControlCharacter( aPos As TextRange, iChar As Integer, bFlag As Boolean ) Insere um caractere de controle na posio aPos. O servio TextCursor, atravs da interface XTextCursor, prov mtodos para o controle do estado e movimentao do cursor. a) Mtodos para mover o cursor: goLeft (iNrChar As Integer, bExpande As Boolean) As Boolean move o cursor para a esquerda iNrChar caracteres goRight (iNrChar As Integer, bExpande As Boolean) As Boolean move o cursor para a direita iNrChar caracteres gotoStart (bExpande As Boolean) move o cursor para o incio do texto gotoEnd (bExpande As Boolean) move o cursor para o final do texto gotoRange (xRange As <TextRange>, bExpande As Boolean) move ou expande o cursor sobre o objeto TextRange Em todos os mtodos acima, se bExpande for True o alcance do cursor ser expandido. b) Mtodos para controlar o estado do cursor: collapseToStart ( ) move a posio do final do cursor para o seu incio collapseToEnd ( ) move a posio do incio do cursor para o seu final isCollapsed ( ) As Boolean retorna True se as posies inicial e final do cursor forem iguais As interfaces XWordCursor, XSentenceCursor e XparagraphCursor, todas derivadas de XTextCursor, tambm fornecem mtodos para controle e movimento do cursor. a) Mtodos de XWordCursor: gotoNextWord (bExpande As Boolean) As Boolean gotoPreviousWord (bExpande As Boolean) As Boolean gotoEndOfWord (bExpande As Boolean) As Boolean gotoStartOfWord (bExpande As Boolean) As Boolean isStartOfWord ( ) As Boolean
Introduo ao OpenOffice.org Basic 33
Documentos do Writer
Verso 1
isEndOfWord ( ) As Boolean b) Mtodos de XSentenceCursor: gotoNextSentence (Expande As Boolean) As Boolean gotoPreviousSentence (bExpande As Boolean) As Boolean gotoStartOfSentence (bExpande As Boolean) As Boolean gotoEndOfSentence (bExpande As Boolean) As Boolean isStartOfSentence ( ) As Boolean isEndOfSentence ( ) As Boolean c) Mtodos de XParagraphCursor: gotoStartOfParagraph (bExpande As Boolean) As Boolean gotoEndOfParagraph (bExpande As Boolean) As Boolean gotoNextParagraph (bExpande As Boolean) As Boolean gotoPreviousParagraph (bExpande As Boolean) As Boolean isStartOfParagraph ( ) As Boolean isEndOfParagraph ( ) As Boolean Antes de apresentar um exemplo, vejamos os caracteres de controle que podem ser inseridos num documento do Writer. Na interface grfica, eles so chamados de caracteres no imprimveis e tm funes especiais na apresentao final do documento. Para facilitar o seu emprego, estes caracteres esto definidos como constantes, no grupo de constantes com.sun.star.text.ControlCharacter. Eles podem ser inseridos no texto com o mtodo insertControlCharacter () ou como parte do contedo de uma cadeia, neste caso, usando o seu cdigo Unicode. Eis uma relao dos caracteres de controle com os seus respectivos cdigos:
PARAGRAPH_BREAK LINE_BREAK HARD_HYPHEN SOFT_HYPHEN HARD_SPACE APPEND_PARAGRAP H Insere uma quebra de pargrafo Quebra de linha dentro de um pargrafo Caractere que aparece como um travesso. Hifenizao no remove. Marca uma posio preferida para hifenizao. Espao com tamanho fixo. Acrescenta um novo pargrafo 0x000D 0x000A 0x2011 0x00AD 0x00A0 No tem
Vamos encerrar esta seo com um exemplo demonstrando o emprego de alguns dos conceitos e mtodos apresentados. Ative o IDE Basic, digite (ou copie e cole) o cdigo fonte a seguir e execute a sub-rotina Sub processaTexto. Ela insere texto, caracteres de controle e uma quebra de pgina num novo documento sem nome. Depois, seleciona e substitui duas palavras por uma cadeia vazia.
Sub processaTexto Dim oDesktop As Variant Dim oDoc As Object Dim oCursor As Object
34
Verso 1
Documentos do Writer
Dim oTexto As Object Dim mPropArquivo() Dim sStr As String oDesktop = createUnoService("com.sun.star.frame.Desktop") oDoc = oDesktop.loadComponentFromURL("private:factory/swriter",_ "_blank", 0, mPropArquivo()) oTexto = oDoc.getText() oCursor = oTexto.createTextCursor() sStr = "Este o texto do primeiro pargrafo do documento" With oTexto ' insere o texto na posio corrente do cursor .insertString(oCursor, sStr, False) ' insere um pargrafo .insertControlCharacter(oCursor,_ com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) .insertString(oCursor, "Este o segundo pargrafo ", False) .insertControlCharacter(oCursor, _ com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) End With ' insere uma nova pgina oCursor.gotoStartOfParagraph(True) oCursor.breakType = com.sun.star.style.BreakType.PAGE_BEFORE oTexto.insertString(oCursor, "Estou numa nova pgina.", False) ' move o cursor sem expanso oCursor.gotoStart(False) oCursor.gotoNextWord(False) oCursor.gotoNextWord(False) oCursor.gotoNextWord(False) ' move o cursor expandindo, i., seleciona texto do oCursor.gotoNextWord(True) oCursor.gotoNextWord(True) ' substitui o texto entre o incio e o final do cursor oTexto.insertString(oCursor, "", True) End Sub
No cdigo acima, estude o emprego do parmetro bExpande (True ou False) ele muito importante. Outro aspecto a insero da quebra de pgina. No existe um caractere de controle para quebra de pgina ou coluna. Ela uma propriedade do pargrafo. Note que usamos oCursor para definir uma propriedade do pargrafo (oCursor.breakType). Isto possvel porque o objeto TextCursor herda caractersticas de TextRange. Os valores possveis para a propriedade breakType (quebra de pgina e coluna) esto enumerados em com.sun.star.style.BreakType, aqui usamos PAGE_BEFORE. Finalmente, observe, no novo documento, que o cursor da vista encontra-se no final do mesmo, apesar da ltima ao (seleo e substituio) ter ocorrido no primeiro pargrafo, o que demonstra a independncia entre o cursor de texto e a interface grfica. Lembre-se, ainda, que o acesso interface grfica se d atravs do controlador do modelo do documento. O cdigo fonte da sub-rotina dlgInserirFrase, do Captulo 3 (Piloto Automtico), mostra como acessar o controlador e criar um cursor da vista.
35
Documentos do Writer
Verso 1
Na tabela acima, as referncias ao mdulo com.sun.star.awt, contm possveis valores para as respectivas propriedades dos caracteres. O servio com.sun.star.style.ParagraphProperties define as propriedades dos pargrafos. A tabela abaixo apresenta algumas: Propriedade ParaAdjust ParaBackColor ParaLastLineAdjust ParaLeftMargin ParaRightMargin ParaTopMargin ParaBottomMargin ParaStyleName Descrio Define o tipo de ajuste (com.sun.star.style.ParagraphAdjust) Contm a cor de fundo, opcional Define o ajuste da ltima linha Define a margem esquerda em 1/100 mm ( As Long ) Define a margem direita em 1/100 mm ( As Long ) Define a margem superior do pargrafo em 1/100 mm (As Long) Define a margem inferior do pargrafo em 1/100 mm (As Long) Contm o nome do estilo de pargrafo corrente, opcional.
36
Verso 1
Documentos do Writer
Define a borda esquerda, opcional (com.sun.star.table.BorderLine ) Define a borda direita, opcional (com.sun.star.table.BorderLine ) Define a borda superior, opcional (com.sun.star.table.BorderLine ) Define a borda inferior, opcional (com.sun.star.table.BorderLine ) Valor com a distncia da borda ao objeto (As Long) Valor longo com a identao da primeira linha, opcional Define o alinhamento vertical (com.sun.star.text.ParagraphVertAlign)
Novamente, as referncias com.sun.star contm valores possveis para as respectivas propriedades, geralmente um valor de 0 a N para constantes. Veja a seguir algumas delas. Constantes de com.sun.star.style.ParagraphAdjust: LEFT, RIGHT, BLOCK, CENTER e STRETCH. Constantes d e com.sun.star.text.ParagraphVertAlign: AUTOMATIC, BASELINE, TOP, CENTER e BOTTOM. Existem muitas outras propriedades para caracteres e pargrafos, uma consulta ao Developers Guide e ao Reference Manual, ambos da Sun Microsystems Inc, indispensvel para aqueles que desejam programar para o OpenOffice.org. Vamos retomar o nosso ltimo exemplo a Sub processaTexto. Desejamos mudar a inclinao e cor da fonte da palavra segundo e, tambm, o estilo de um pargrafo de Padro para Ttulo. Digite o cdigo abaixo, aps a ltima linha da sub-rotina, execute-a e observe o resultado.
' ---------------------' cdigo para formatao ' ---------------------oCursor.gotoNextParagraph(FALSE) oCursor.gotoNextWord(False) oCursor.gotoNextWord(False) oCursor.gotoNextWord(False) oCursor.gotoNextWord(True) oCursor.CharPosture = com.sun.star.awt.FontSlant.REVERSE_ITALIC oCursor.CharColor = RGB(255,0,0) ' aplica estilo de pargrafo oCursor.gotoNextParagraph(FALSE) oCursor.paraStyleName = "Heading"
Note a atribuio da propriedade CharPosture a um valor enumerado REVERSE_ITALIC e, ainda, a alterao do estilo de pargrafo paraStyleName para Heading. Em se tratando de programao, os nomes permanecem em ingls, diferindo dos nomes apresentados pelo OpenOffice.org no Catlogo de Estilos.
37
Documentos do Writer
Verso 1
O servio com.sun.star.style.StyleFamilies contm as famlias de estilos de um documento, para obter esta coleo faa:
Dim oFamiliasEstilos As Object oFamiliasEstilos = ThisComponent.getStyleFamilies()
Num documento texto, uma chamada ao mtodo getElementNames () retorna um vetor com os nomes das seguintes famlias: CharacterStyles ParagraphStyles FrameStyles PageStyles NumberingStyles - estilos de caracteres - estilos de pargrafos - estilos de molduras - estilos de pginas - estilos de numerao
O servio com.sun.star.style.StyleFamily contm os estilos de uma mesma famlia, para obter esta coleo, use o acesso nomeado, isto , getByName (nomeDaFamlia):
oEstParagrafos = ThisComponent.StyleFamilies.getByName(ParagraphStyles)
O servio com.sun.star.style.Style define as caractersticas de um estilo, para obter um estilo acesse-o pelo seu ndice, por exemplo, se o objeto oEstParagrafos foi definido, como acima:
oEstilo = oEstParagrafos (1)
retorna o segundo estilo dentro da coleo de estilos de pargrafos. A API do OpenOffice.org prov interfaces para facilitar o acesso a elementos de uma dada coleo. Ao trabalhar com estilos precisamos conhecer os mtodos:
38 Introduo ao OpenOffice.org Basic
Verso 1
Documentos do Writer
con.sun.star.container.XNameAcess getByName (sNome As String ) As Variant getElementNames ( ) As aStrings ( ) hasByName ( sNome As String ) As Boolean con.sun.star.container.XIndexAcess getCount ( ) As Long getByIndex ( nIndice As Long ) As Variant con.sun.star.container.XNameContainer insertByName ( sNome As String, oElemento As Variant) removeByName ( sNome As String ) O servio com.sun.star.style.PageStyle define as propriedades mais comuns da pgina, abaixo temos algumas delas: Propriedade BackColor LeftMargin RightMargin TopMargin BottomMargin IsLandscape PageStyleLayout Size Width Height HeaderLeftMargin HeaderRightMargin HeaderIsOn FooterLeftMargin FooterRightMargin FooterIsOn Descrio Valor Long da cor de fundo da pgina Valor Long da margem esquerda em 1/100 mm Valor Long da margem direita em 1/100 mm Valor Long da margem superior em 1/100 mm Valor Long da margem inferior em 1/100 mm Determina se o formato da pgina paisagem (True / False) Determina o layout da pgina (com.sun.star.style.PageStyleLayout) Valores Long definindo o tamanho do papel (Size.Width e Size.Height) Valor Long definindo a largura da pgina em 1/100 mm Valor Long definindo a altura da pgina em 1/100 mm Valor Long definindo a margem esquerda do cabealho em 1/100 mm Valor Long definindo a margem direita do cabealho em 1/100 mm Determina se o cabealho est ativo na pgina (True / False) Valor Long definindo a margem esquerda do rodap em 1/100 mm Valor Long definindo a margem direita do rodap em 1/100 mm Determina se o rodap est ativo na pgina (True / False)
Vamos a um exemplo. Queremos exibir o nmero de estilos de pginas disponveis num documento, os seus nomes e a propriedade Size do estilo de pgina Padro (Standard). Os passos bsicos so: a) obter as familias de estilos do documento;
Introduo ao OpenOffice.org Basic 39
Documentos do Writer
Verso 1
b) obter os estilos de pginas; c) obter o vetor com os nomes dos estilos de pginas; d) usar um ndice para extrair cada um dos nomes; e) obter a pgina padro, usando o acesso nomeado. A sub-rotina Sub exibeEstilosPagina, a seguir, implementa o nosso exemplo:
Sub exibeEstilosPagina Dim oDoc As Object Dim oFamiliaEstilos As Object Dim oEstilosPagina As Object Dim oPaginaPadrao As Object Dim mNomesEstilosPagina As Variant Dim sEstilo As String Dim sMsg As String oDoc = ThisComponent ' obtm a Famlia de Estilos (note o uso de oDoc) oFamiliaEstilos = oDoc.StyleFamilies ' obtm os Estilos de Pgina oEstilosPagina = oFamiliaEstilos.getByName("PageStyles") ' exibe quantidade de estilos de pgina MsgBox oEstilosPagina.Count ' obtm e exibe os nomes dos estilos de pginas mNomesEstilosPagina = oEstilosPagina.getElementNames() For n = LBound(mNomesEstilosPagina) To UBound(mNomesEstilosPagina) sMsg=sMsg + mNomesEstilosPagina(n) + " " Next n MsgBox sMsg,0,"Estilos de Pginas" ' obtm o Estilo de pgina Padro (Standard) oPaginaPadrao = oEstilosPagina.getByName("Standard") ' testando o tamanho da pgina lLPag = oPaginaPadrao.Size.Width lAPag = oPaginaPadrao.Size.Height MsgBox Str$(lLPag) + " " + Str$(lAPag) End Sub
A destacar, o acesso pelo ndice dentro do lao For ... Next, o acesso nomeado ao estilo da pgina Standard e o acesso propriedade Size. Note, ainda, a chamada ao mtodo getStylesFamilies ( ): oFamiliaEstilos = oDoc.StylesFamilies no OpenOffice.org Basic voc pode omitir o get e o set ao programar propriedades. Este exemplo pode ser usado como modelo para diversas operaes com estilos. Durante a formatao de texto, comum a criao e aplicao de novos estilos. Esta uma tarefa simples de executar dentro de uma macro. Para isto devemos seguir os passos: a) Obter as famlias de estilos do documento; b) Obter a famlia do grupo aonde ser criado o novo estilo; c) Criar uma instncia do objeto do novo estilo; d) Acrescentar o novo estilo ao grupo;
40 Introduo ao OpenOffice.org Basic
Verso 1
Documentos do Writer
e) Definir as propriedades do novo estilo; f) Aplicar o novo estilo. Vamor retomar a sub-rotina Sub processaTexto e acrescentar cdigo fonte para criar e aplicar um novo estilo de pargrafo. Digite (ou copie e cole) o cdigo abaixo, aps a ltima linha da Sub processaTexto, execute a macro e observe as definies de estilo do primeiro pargrafo do documento.
' ----------------------' cdigo para novo estilo ' ----------------------Dim oFamiliasEstilos As Object Dim EstilosParagrafo As Object Dim oNovoEstilo As Object ' obtem as familias de Estilos oFamiliasEstilos = oDoc.StyleFamilies ' obtem os estilos de pargrafos EstilosParagrafo = oFamiliasEstilos.getByName("ParagraphStyles") ' cria um novo estilo de paragrafo oNovoEstilo = oDoc.createInstance("com.sun.star.style.ParagraphStyle") ' acrescenta o novo estilo com o nome "novo_estilo" EstilosParagrafo.insertByName("novo_estilo",oNovoEstilo) ' define as propriedades do estilo oNovoEstilo.Name = "novo_estilo" oNovoEstilo.CharFontName = "Arial" oNovoEstilo.CharHeight = 16 oNovoEstilo.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER oNovoEstilo.CharWeight = com.sun.star.awt.FontWeight.BOLD ' entao, aplica o novo estilo ao primeiro paragrafo oCursor.gotoStart(FALSE) oCursor.gotoEndOfParagraph(TRUE) oCursor.paraStyleName = "novo_estilo"
Acima, deve-se notar a criao de um novo objeto, no caso uma instncia de um estilo de pargrafo, com a chamada ao mtodo createInstance ( ... ). E, ainda, as definies das propriedades do novo estilo.
Documentos do Writer
Verso 1
Desenho
Para seleo de texto, o mtodo getCurrentSelection ( ) opera da seguinte forma,: a) se nada estiver selecionado, retorna um objeto TextRange com a posio do cursor da vista; b) numa seleo simples, retorna um objeto TextRange com a seleo; c) numa seleo mltipla, retorna objetos TextRange para o cursor da vista e para cada uma das selees. No exemplo abaixo, obtemos as cadeias selecionadas, uma ou mais se mltipla seleo, e mudamos a cor de cada uma para vermelha:
Sub processaSelecao Dim oDoc As Object Dim oSel As Object Dim oCurTxt As Object oDoc = ThisComponent oSel = oDoc.getCurrentSelection() For i = 0 To oSel.Count-1 oCurTxt = oSel(i) oCurTxt.CharColor = RGB(255,0,0) Next i MsgBox oSel.Count End Sub
Note o acesso aos objetos selecionados atravs de um ndice e a criao de um cursor de texto antes da mudana de cor. Para extrair a cadeia selecionada, chame o mtodo getString ( ), como abaixo:
sCadeia = oSel ( i ).getString ( )
O mtodo getString ( ) retorna uma cadeia vazia para o primeiro objeto nos casos a) e c) acima. Insira o cdigo abaixo no lao For ... Next de processaSelecao e observe a sada:
MsgBox Str$ ( i ) + : + oSel ( i ).getString ( )
Analise como se d a criao do cursor de texto. Em seguida, como exerccio, faa com que a Sub processaSeleo aplique a cor tambm na palavra sob o cursor da vista. A API do OpenOffice.org tem, ainda, a interface com.sun.star.view.XSelectionSupplier, que implementa o mtodo getSelection ( ) que retorna o contedo selecionado na interface grfica, para us-lo acesse o controlador do modelo (veja o cdigo abaixo). Existem, ainda, dois mtodos que podem ser teis para a identificao do contedo selecionado, so eles: getImplementationName ( ) As String
42 Introduo ao OpenOffice.org Basic
Verso 1
Documentos do Writer
retorna o nome da implementao do objeto getName ( ) As String retorna o nome do objeto, se o mesmo for nomeado, caso de grficos e tabelas.
Dim oControlador As Object oControlador = oDoc.getCurrentController() oSel = oControlador.getSelection() sNomeImpl = oSel.getImplementationName() sNome = oSel.getName()
Agora, altere a Sub processaSelecao, para alertar o usurio quando ele selecionar algo diferente de texto (dica, use getImplementationName).
Documentos do Writer
Verso 1
hasMoreElements ( ) As Boolean retorna True se ainda existem elementos no recipiente nextElement ( ) As Variant retorna o prximo elemento A localizao simples, basta chamar o mtodo apropriado e a seguir, usar o acesso nomeado ou indexado para obter o objeto. A sub-rotina Sub localizaGraficos, abaixo, exibe os nomes de todos os objetos grficos do documento:
Sub localizaGraficos Dim oGraficos As Object Dim oGrafico As Object Dim n As Integer oGraficos = ThisComponent.getGraphicObjects() For n = 0 To oGraficos.Count -1 oGrafico = oGraficos (n) MsgBox oGrafico.getName() Next n MsgBox "Grficos no documento: " + Str$(oGraficos.Count) End Sub
Para apagar um grfico do seu documento, voc pode usar o bloco de cdigo:
oGrafico = oGraficos.getByName (Grfico2) oGrafico.dispose ()
No exemplo a seguir, que demonstra a criao de uma enumerao, exibimos o comando de cada um dos campos de um documento:
Sub localizaCampos Dim oCampos As Object Dim oCampo As Object Dim n As Integer oCampos = ThisComponent.getTextFields().createEnumeration() n = 0 Do While (oCampos.hasMoreElements()) oCampo = oCampos.NextElement() MsgBox oCampo.getPresentation(True) n = n + 1 Loop MsgBox "Campos no documento: " + Str$(n) End Sub
Observe que a criao e o acesso aos elementos de uma enumerao sequncial e no indexado ou nomeado. O mtodo getPresentation() retorna o contedo do campo se o parmetro for False. Geralmente, para recuperar o objeto que nos interessa dentro da coleo retornada por um dos mtodos acima, precisamos conhecer o seu nome ou a sua posio dentro da coleo.
44 Introduo ao OpenOffice.org Basic
Verso 1
Documentos do Writer
No exemplo a seguir, vamos localizar, no documento, todas as ocorrncias da cadeia ( ) e trocar a cor da fonte para vermelha. Digite (ou copie e cole) o cdigo abaixo e execute a subrotina.
Sub buscaTodas Dim oDoc As Object Dim oDescBusca As Object oDoc = ThisComponent oDescBusca = oDoc.createSearchDescriptor() oDescBusca.SearchWords = True oDescBusca.setSearchString ("( )") oResultado = oDoc.findAll( oDescBusca )
45
Documentos do Writer
Verso 1
For n% = 0 To oResultado.Count - 1 oResultado(n%).CharColor = RGB(255,0,0) Next MsgBox "Ocorrncias de "+oDescBusca.getSearchString()+ _ + Str$(oResultado.Count) End Sub
A tarefa acima pode, tambm, ser executada com os mtodos findFirst e findNext:
oResultado = oDoc.findFirst( oDescBusca ) Do Until IsNull(oResultado) oResultado.CharColor = RGB(250,100,50) oResultado = oDoc.findNext(oResultado, oDescBusca ) Loop
A substituio de texto implementada pela interface XReplaceable, que herda as caractersticas de XSearchable. Ela prov os mtodos: createReplaceDescriptor ( ) As Object <com.sun.star.util.XReplaceDescriptor> retorna um descritor de substituio para as propriedades replaceAll ( xDescritor As Object <com.sun.star.util.XReplaceDescriptor>) As Long busca e substitui todas as ocorrncias, retorna o total de substituies O servio ReplaceDescriptor tem mtodos para as propriedades da cadeia: getReplaceString ( ) As String obtm a cadeia substituta setReplaceString ( sCadeia As String ) define a cadeia substituta Eis um exemplo simples de busca e substituio:
Sub substituiTodas Dim oDoc As Object Dim oDescritor As Object oDoc = ThisComponent oDescritor = oDoc.createReplaceDescriptor() oDescritor.setSearchString( "( )" ) oDescritor.setReplaceString( "()" ) n = oDoc.replaceAll(oDescritor) MsgBox n End Sub
Note que no temos um mtodo para substituio interativa. Porm, atravs da busca e edio, possvel implementar, com facilidade, este procedimento.
46
Verso 1
Documentos do Writer
Para inserir na posio do cursor da interface grfica, crie o cursor de texto a partir do cursor da vista. A insero de arquivos grficos um pouco mais complicada, para isso voc deve: a) criar um objeto grfico; b) definir as suas propriedades; c) inserir o objeto. Observe a sub-rotina Sub inserirGrafico a seguir:
Sub inserirGrafico Dim oTxt As Object Dim oCursorTxt As Object Dim oGrafico As Object Dim sURL As String oTxt = ThisComponent.getText() oCursorTxt = oTxt.createTextCursor() oGrafico = ThisComponent.createInstance("com.sun.star.text.GraphicObject") sURL = "file:///D:/NAD/OPENOFFICE/HOWTO/FIGURAS/DIALOGO.JPG" oGrafico.GraphicURL = sURL oGrafico.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH oTxt.insertTextContent(oCursorTxt.getStart(), oGrafico, False) End Sub
A chamada ao mtodo createInstance ( ) cria o objecto grfico, depois definimos as propriedades GraphicURL e AnchorType e, finalmente, inserimos o grfico chamando o mtodo insertTextContent ( ) com os parmetros adequados. A propriedade AnchorType pode assumir, ainda, os seguintes valores: AT_CHARACTER, AT_PAGE e AS_CHARACTER. O API do OpenOffice.org (verso 1.0.1) salva no documento apenas a URL do grfico. Logo, se voc remov-lo da sua localizao original, o Writer no ter como encontr-lo.
47
Documentos do Writer
Verso 1
6.10 Tabelas
Uma tabela um conjunto de clulas organizadas por linhas e colunas, onde cada clula tem um nome, normalmente indicado por letras e nmeros. As letras referem-se s colunas e os nmeros s linhas. Contudo, se existirem clulas mescladas ou divididas, o conceito de coluna poder desaparecer e o esquema de nomeao torna-se complicado. Uma clula pode conter texto simples (cadeias e nmeros), grficos, frmulas e campos com vrias caractersticas de formatao. Uma tabela recebe um nome nico no documento, podendo servir como origem para grficos, ter o seu contudo ordenado e ser automaticamente formatada. A API do OpenOffice.org tem diversos servios e interfaces para lidar com tabelas, vejamos as principais. A interface com.sun.star.text.XTextTable encarrega-se do gerenciamento de tabelas num documento e contm os mtodos abaixo: initialize ( nLinhas As Long, nColunas As Long) Inicializa uma tabela, recebe o nmero de linhas e colunas como parmetros. getCellNames ( ) As Object < Strings > Obtm os nomes das clulas, retorna um conjunto de cadeias getCellByName ( sNomeCelula As String ) As Object < com.sun.star.table.XCell > Obtm a clula nomeada no parmetro, retorna um objeto XCell getRows ( ) As Object < com.sun.star.table.XTableRows > Obtm as linhas da tabela, retorna um objeto para XTableRows. getColumns ( ) As Object < com.sun.star.table.XTableColumns > Obtm as colunas da tabela, retorna um objeto para XTableColumns. createCursorByCellName ( sNomeCelula As String ) As Object < XTextTableCursor > Cria um cursor de tabela posicionado na clula nomeada no parmetro O servio TextTable possui diversas propriedades, eis algumas delas: Propriedade LeftMargin RightMargin Split TableBorder TableColumnSeparators BackGraphicURL Descrio Contm a margem esquerda da tabela, valor Long Contm a margem direita da tabela, valor Long Um valor False impede a diviso da tabela em duas pginas Contm a descrio da borda da tabela Contm a descrio dos separadores de colunas da tabela Contm a URL do grfico de fundo da clula
As interfaces XTableRows e XtableColumns, retornadas pelos mtodos getRows () e getColumns (), acima, possuem os mtodos a seguir: insertByIndex ( nIndice As Long, nTotal As Long )
48 Introduo ao OpenOffice.org Basic
Verso 1
Documentos do Writer
removeByIndex ( nIndice As Long, nTotal As Long ) getElementType ( ) As Type hasElements ( ) As Boolean getByIndex ( ) As Variant getCount ( ) As Long A interface XTextTableCursor, retornada pelo mtodo createCursorByCellName, acima, prov os mtodos: getRangeName ( ) As String Retorna a extenso de clulas do cursor, isto , os nomes das clulas superior esquerda e inferior direita, por exemplo A2:D25 (note o separador : ). goLeft ( nQuant As Integer, bExpande As Boolean ) As Boolean goRight ( nQuant As Integer, bExpande As Boolean ) As Boolean goUp ( nQuant As Integer, bExpande As Boolean ) As Boolean goDown ( nQuant As Integer, bExpande As Boolean ) As Boolean gotoStart ( bExpande As Boolean ) gotoEnd ( bExpande As Boolean ) Mtodos para movimentao e seleo, nQuant a quantidade de clulas e, se bExpande for True, extende a seleo durante o deslocamento do cursor. gotoCellByName (sNome As String, bExpande As Boolean ) As Boolean Desloca o cursor para a clula nomeada no parmetro. mergeRange ( ) As Boolean splitRange ( nQuant As Integer, bHoriz As Boolean ) As Boolean Mtodos para fundir e dividir clulas. Atravs do servio TextTableCursor podemos efetuar a formatao das clulas, pois, ele inclui os servios CharacterProperties e ParagraphProperties. A interface com.sun.star.table.XCellRange define os mtodos abaixo para lidar com extenses de clulas: getCellByPosition ( nColuna As Long, nLinha As Long ) As Object < XCell > getCellRangeByPosition ( nEsq, nSup, nDir, nInf ) As Object < XCellRange > getCellRangeByName ( sRange As String ) As Object < XCellRange > O servio com.sun.star.table.CellRange inclui com.sun.star.table.CellProperties, que define as propriedades de uma ou mais clulas. Eis algumas: Propriedade CellBackColor HoriJustify VertJustify IsTextWrapped Orientation Descrio Valor Long com a cor de fundo da clula Alinhamento horizontal do contedo da clula (enum CellHoriJustify) Alinhamento vertical do contedo da clula (enum CellVertJustify) Se True, o texto muda de linha automaticamente Orientao do contedo da clula (enum CellOrientation)
49
Documentos do Writer
Verso 1
Define a rotao do contedo da clula (em 1/100 graus) Descreve a borda das clulas (struct TableBorde) Descreve a borda superior de cada clula (struct BorderLine) Descreve a borda inferior de cada clula (struct BorderLine) Descreve a borda esquerda de cada clula (struct BorderLine) Descreve a borda direita de cada clula (struct BorderLine) ndice do formato numrico usado nas clulas (servio NumberFormatter) Descreve a proteo da clula (servio CellProtection)
A interface com.sun.star.table.XCell oferece os mtodos abaixo para manipular o contedo de uma clula: getFormula ( ) As String setFormula ( sFormula As String ) mtodos para obter ou definir a frmula de uma clula getValue ( ) As Double setValue ( nValor As Double ) mtodos para obter ou definir o valor de uma clula getType ( ) As Long < com.sun.star.table.CellContentType > retorna o tipo do contedo de uma clula, como enumerado em CellContentType getError ( ) As Long retorna o erro de uma clula, til para rastrear erros em frmulas O nome de uma tabela pode ser obtido ou definido com os mtodos a seguir, da interface com. sun.star.container.XNamed: getName ( ) As String setName ( sNomeTabela As String ) O contedo de uma tabela pode ser ordenado com a interface com.sun.star.util.XSortable e seus mtodos: createSortDescriptor ( ) As Variant <com.sun.star.beans.PropertyValue> retorna um descritor para as propriedades da ordenao sort (xDescritor As Variant <com.sun.star.beans.PropertyValue> ) executa a ordenao conforme o descritor Seguem algumas das propriedades do descritor de ordenao (SortDescriptor): Propriedade IsCaseSensitive SortAscending SortColumns Descrio Se True, considera maisculas / minsculas Define a ordem da ordenao (??) Se True ordena as colunas, seno ordena as linhas.
50
Verso 1
Documentos do Writer
O servio com.sun.star.table.TableSortDescriptor inclui o servio SortDescriptor e possui as propriedades abaixo: Propriedade SortFields MaxFieldCount Orientation ContainsHeader Descrio Descreve os campos de ordenao <com.sun.star.util.SortField> Define o nmero mximo de campos, somente leitura Define a orientao da ordenao <com.sun.star.table.TableOrientation> Se True, no ordena a primeira linha ou coluna
hora de apresentar um exemplo. Inicialmente, vamos criar, inicializar e inserir uma tabela, com cinco linhas e trs colunas, no incio do documento corrente. Depois, vamos definir os ttulos das colunas. Digite o cdigo abaixo, execute e observe o resultado:
Sub criaTabela Dim oTxt As Object Dim oTab As Object ' ' cria, inicializa e insere a tabela no inicio do documento oTxt = ThisComponent.getText() oTab = ThisComponent.createInstance("com.sun.star.text.TextTable") oTab.initialize(5,3) oTxt.insertTextContent(oTxt.createTextCursor(), oTab, FALSE) ' ' preenche os ttulos das colunas (clulas A1, B1 e C1 ) Dim oCelula As Object oCelula = oTab.getCellByName("A1") oCelula.setString("Coluna A") oCelula = oTab.getCellByName("B1") oCelula.setString("Coluna B") oCelula = oTab.getCellByName("C1") oCelula.setString("Coluna C") End Sub
Primeiro criamos o objeto tabela com createInstance (), depois definimos as linhas e colunas com initialize (), inserimos a tabela no documento com uma chamada ao mtodo insertTextContent ( ) e, ento , obtemos cada uma das clulas do cabealho e definimos o seu contedo. O bloco de cdigo abaixo demonstra o emprego do cursor de tabela, navegao, formatao e mesclagem de clulas. Acrescente-o Sub criaTabela.
' ' cria um cursor de tabela na clula CellNames(0) = A1 Dim oCurTab As Object oCurTab = oTab.createCursorByCellName(oTab.CellNames(0)) ' seleciona as clulas A1, B1 e C1 oCurTab.gotoStart(FALSE) oCurTab.goRight(2, True) ' Aplica o estilo de pargrafo Ttulo na seleo oCurTab.paraStyleName = "Heading" ' exibe o nome da extenso selecionada (range) ' Note a forma de apresentao (invertida) MsgBox oCurTab.getRangeName() '
51
Documentos do Writer
Verso 1
' nomeia as celulas a partir da linha 2 e ' escreve nmero da linha na coluna C Dim sNomes() As Variant Dim sNomeCelula As String sNomes = Array("A","B","C") For i% = 1 To 4 For j% = 1 To 3 sNomeCelula = sNomes(j%-1)+ Str$(i%+1) oCelula = oTab.getCellByName(sNomeCelula) If (j% - 1 = 2) Then ' define um valor numrico para a clula oCelula.setValue(i% + 1) Else oCelula.setString(sNomeCelula) End If Next j% Next i% ' ' define uma frmula (soma de C2 at C4) para a clula C5 oCelula = oTab.getCellByName("C5") oCelula.setFormula("sum <C2:C4>") ' ' funde as clulas A5 e B5 e muda seu contedo oCurTab.gotoCellByName("A5", False) oCurTab.goRight(1, True) oCurTab.mergeRange() oCelula = oTab.getCellByName("A5") oCelula.setString("Total")
Note a criao do cursor da tabela com createCursorByCellNames (...), o uso do cursor para formatao, o uso dos mtodos setValue () e setFormula () e a seleo e mesclagem das clulas A5 e B5. No prximo bloco de cdigo, veremos a ordenao de uma extenso de clulas (A2:C4) da nossa tabela. Basta inserir o cdigo na Sub criaTabela e executar para ver o resultado.
' ' ordena de A2 at C4 Dim oCampoOrd(0) As New com.sun.star.util.SortField Dim oDescrOrd As Variant Dim oExtensao As Object ' ' define a extenso a ser ordenada oExtensao = oTab.getCellRangeByName("A2:C4") ' define o campo de ordenao e suas propriedades oCampoOrd(0).Field = 0 oCampoOrd(0).SortAscending = False oCampoOrd(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC ' cria o descritor de ordenao oDescrOrd = oTab.createSortDescriptor() ' define as propriedades do descritor oDescrOrd(0).Name = "SortFields" oDescrOrd(0).Value = oCampoOrd() oDescrOrd(1).Name = "ContainsHeader" oDescrOrd(1).Value = False oDescrOrd(2).Name = "SortColumns" oDescrOrd(2).Value = False ' ordena a extenso oExtensao.sort(oDescrOrd())
52
Verso 1
Documentos do Writer
Note que iniciamos com a declarao das variveis, criamos uma extenso de clulas com uma chamada ao mtodo getCellRangeByName (), definimos as propriedades do campo de ordenao, criamos o descritor e definimos as suas propriedades (o campo de ordenao uma propriedade do descritor) e, finalmente, invocamos o mtodo sort () para executar a sua tarefa. Antes de terminar esta seo, vejamos como se d o acesso s tabelas existentes num documento texto. O processo o mesmo j visto na seo Localizando Objetos. O mtodo getTextTables () da interface XTextTablesSupplier retorna uma coleo contendo as tabelas do documento. Ele percorre o documento do incio para o final. getTextTables () As Object <com.sun.star.container.XNameAccess> O exemplo abaixo demonstra a localizao das tabelas de um documento, depois obtm as colees de linhas e colunas da tabela com o nome Tabela3.
Sub localizaTabelas Dim oTabelas As Object Dim oTabela As Object Dim oLinhas As Object Dim oColunas As Object Dim n As Integer oTabelas = ThisComponent.getTextTables() For n = 0 To oTabelas.Count -1 oTabela = oTabelas.getByIndex(n) MsgBox oTabela.getName() Next n MsgBox "Tabelas no documento: " + Str$(oTabelas.Count) ' If (oTabelas.hasByName (Tabela3)) Then oTabela = oTabelas.getByName("Tabela3") oLinhas = oTabela.getRows() oColunas = oTabela.getColumns() MsgBox Str$(oLinhas.Count)+" - "+Str$(oColunas.Count) End If End Sub
Lembre-se que, para acessar uma tabela, voc deve conhecer o seu nome ou o seu ndice dentro da coleo e, em seguida, chamar o mtodo getByName () ou getByIndex (). Aps obter a tabela desejada, use as tcnicas j apresentadas para editar o seu contedo.
53
Documentos do Writer
Verso 1
7 Documentos do Calc
7.1 Introduo
Um documento do Calc contm uma ou mais folhas de planilhas. Cada planilha formada por clulas organizadas em linhas e colunas, de modo bem parecido com o de uma tabela do Writer. Estas clulas contm, basicamente, texto, que pode representar uma cadeia de caracteres, um valor numrico, um campo ou uma frmula. Cada um dos elementos acima (documento, planilha e clula), possui caractersticas prprias. Algumas podem ser alteradas, como por exemplo: estilo de pgina, formato numrico, pargrafo e fonte. Alm das tarefas comuns de edio, podemos aplicar, sobre o contedo de uma planilha operaes como: ordenao, filtragem, sub-totalizao, gerao de grficos, etc. Podemos, tambm, inserir, numa planilha, objetos como imagens, desenhos, dados de uma fonte externa e objetos OLE. Como voc j deve ter notado, dado a riqueza e o poder das operaes com documentos do Calc, a sua programao um assunto extenso. Nas prximas sees, tentarei apresentar o bsico.
7.2 Planilhas
As funes bsicas j abordadas no captulo Trabalhando com Documentos, podem ser usadas tambm com documentos do Calc. Assim, esta seo vai cobrir algumas operaes sobre as folhas das planilhas de um documento do Calc. O mdulo com.sun.star.sheet, da API do OpenOffice.org, contm os principais servios, interfaces e grupos de constantes relacionados com planilhas. O servio SpreadsheetDocument representa o modelo de um documento do Calc, contendo atributos e uma ou mais planilhas. A interface XSpreadsheetDocument prov o mtodo getSheets (), que retorna uma coleo com as planilhas do documento. getSheets ( ) As Object <com.sum.star.sheet.XSpreadsheets> Os objetos desta coleo podem ser acessados pelos seus nomes ou ndices. Podemos, ainda, criar uma enumerao e usar o acesso seqncial. A interface XSpreadsheets, retornada por getSheets (), define os mtodos abaixo: insertNewByName ( sNome As String, iPosicao As Integer ) moveByName ( sNome As String, iDestino As Integer ) copyByName ( sNomeOrigem As String, sNomeCopia As String, iPosicao As Integer )
54
Verso 1
Documentos do Calc
Para fixar os conceitos acima, no exemplo a seguir, vamos criar um documento e efetuar algumas operaes com planilhas.
Sub criaDocCalc Dim oDesk As Variant Dim oDoc As Object Dim mProp() As Variant Dim sURL As String ' cria documento do Calc oDesk = createUnoService("com.sun.star.frame.Desktop") sUrl = "private:factory/scalc" oDoc = oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp()) ' exibe a propriedade casas decimais padro do documento MsgBox oDoc.StandardDecimals ' ' navega pelas planilhas existentes no documento Dim oPlanilhas As Object Dim oPlanilha As Object Dim sMsg As String ' oPlanilhas = oDoc.getSheets() sMsg = "" For n=0 To oPlanilhas.Count - 1 oPlanilha = oPlanilhas.getByIndex(n) sMsg = sMsg + oPlanilha.getName() + Chr$(13) Next n MsgBox sMsg + Str$(oPlanilhas.Count) ' acesso nomeado If oPlanilhas.hasByName("Planilha2") Then oPlanilha = oPlanilhas.getByName("Planilha2") MsgBox oPlanilha.PageStyle End If ' insere uma folha no incio oPlanilhas.insertNewByName("Planilha4",0) MsgBox oPlanilhas.Count ' move para o final oPlanilhas.moveByName("Planilha4",4) End Sub
Note os parmetros para a criao do documento, o acesso aos objetos da coleo e o uso dos mtodos para inserir e mover uma folha de planilha. O servio SpreadsheetView fornece funcionalidades relacionadas vista corrente de um documento do Calc. Ele inclui o servio SpreadsheetViewSettings, que define algumas propriedades de cada uma das planilhas do documento e, a sua interface XspreadsheetView, traz os mtodos a seguir, para a definio da planilha ativa no documento: getActiveSheet ( ) As Object < XSpreadsheet > setActiveSheet ( oPlanilha As Object < XSpreadsheet >) Lembre-se que as operaes relacionadas com a interface grfica so gerenciadas pelo objeto controlador do documento. Digite o cdigo fonte abaixo no final da Sub criaDocCalc, execute e observe o resultado.
' ativa a Planilha4 na GUI If oPlanilhas.hasByName("Planilha4") Then
55
Documentos do Calc
Verso 1
Inicialmente, exibimos o nome da planilha ativa e, ento, selecionamos a planilha de nome Planilha4. Como j demonstrado no captulo Documentos do Writer, podemos alterar o contedo de um documento independente da interface grfica.
7.3 Editando
Para editar o contedo de uma ou mais clulas, devemos ter em mente o seguinte: a) obter a planilha onde se encontram as clulas a editar; b) obter uma extenso contendo as clulas a serem editadas, este passo opcional, pois uma planilha uma extenso de clulas; c) obter a clula a editar; d) definir o contedo da clula. O item a) deve ser solucionado com o uso do mtodo getSheets (), associado ao acesso nomeado, indexado ou enumerado, como demonstrado na seo sobre Planilhas. As ferramentas para solucionar os itens b), c) e d) tambm j foram apresentadas na seo sobre Tabelas e envolve os mtodos das interfaces XCellRange e XCell. Mtodos da interface com.sun.star.table.XCellRange: getCellByPosition ( nColuna As Long, nLinha As Long ) As Object < XCell > getCellRangeByPosition ( nEsq, nSup, nDir, nInf ) As Object < XCellRange > getCellRangeByName ( sRange As String ) As Object < XCellRange > Devemos lembrar que a posio de uma clula, dentro de uma extenso (range), relativa ao incio da extenso. Mtodos da interface com.sun.star.table.XCell: getFormula ( ) As String setFormula ( sFormula As String ) getValue ( ) As Double setValue ( nValor As Double ) getType ( ) As Long < com.sun.star.table.CellContentType > getError ( ) As Long Para relembrar, vejamos um exemplo de edio do contedo das clulas de uma planilha. Digite o cdigo abaixo, execute e observe o resultado.
Sub editaPlanilha Dim oDesk As Variant Dim oDoc As Object
56
Verso 1
Documentos do Calc
Dim mProp() As Variant Dim sURL As String ' ' cria documento do Calc oDesk = createUnoService("com.sun.star.frame.Desktop") sUrl = "private:factory/scalc" oDoc = oDesk.LoadComponentFromURL(sUrl, "_blank", 0, mProp()) ' ' edita clulas da planilha Dim oPlanilha As Object Dim oCelula As Object Dim sTitCol() As String ' escreve os titulos das colunas sTitCol = Array ("CDIGO","MATERIAL","QUANT","P. UNIT","P. TOTAL") oPlanilha = oDoc.getSheets().getByIndex(0) For i% = 0 To 4 oCelula = oPlanilha.getCellByPosition(i%, 0) oCelula.setString(sTitCol(i%)) Next i% ' ' preenche as clulas com texto, valor e formula For i% = 1 To 6 For j% = 0 To 4 oCelula = oPlanilha.getCellByPosition(j%, i%) If (j% = 0) Then If i% < 4 Then oCelula.setString("A" + Str$(i%)) Else oCelula.setString("A" + Str$(i%-3)) End If ElseIf (j% = 1) Then oCelula.setString("Material de construo " + Str$(i%)) ElseIf (j% = 2) Then oCelula.setValue(i% * j%) ElseIf (j% = 3) Then oCelula.setValue(100 * Rnd()) Else sLinha = Trim$(Str$(i%+1)) sFormula = "=C" + sLinha + " * " + "D" + sLinha oCelula.setFormula(sFormula) End If Next j% Next i% ' resumo oCelula = oPlanilha.getCellByPosition(0, 7) oCelula.setString("CUSTO TOTAL") ' sFormula = "=Sum(E1:E6)" oCelula = oPlanilha.getCellByPosition(4, 7) oCelula.setFormula(sFormula) ' End Sub
Note que, na segunda chamada do mtodo setFormula (), definimos a frmula usando o nome de uma funo em ingls. Para utilizar os nomes das funes exibidos pela interface grfica, use a propriedade FormulaLocal, do servio com.sun.star.sheet.SheetCell., por exemplo:
oCelula = oPlanilha.getCellByPosition(4, 7) sFormula = "=Soma(E1:E6)"
57
Documentos do Calc
Verso 1
oCelula.FormulaLocal = sFormula
O servio SheetCell define as seguintes propriedades: Propriedade Position Size FormulaLocal FormulaResultType ConditionalFormat ConditionalFormatLocal Validation ValidationLocal Descrio Somente leitura, posio da clula na planilha Somente leitura, tamanho da clula em 1/100 mm Cadeia com o nome local da frmula Somente leitura, tipo do resultado de uma frmula Definies de formatao condicional da clula Definies locais de formatao condicional da clula Definies de validao da clula Definies locais de validao da clula
Na prxima seo, trataremos da criao e emprego de um cursor, outra funcionalidade dos documentos do Calc.
Verso 1
Documentos do Calc
collapseToMergedArea () expandToEntireColumns () expandToEntireRows () collapseToSize ( nColunas As Long, nLinhas As Long ) Os mtodos abaixo, da interface XUsedAreaCursor, so teis quando desejamos operar sobre a rea utilizada de uma planilha. Por exemplo, identificar a ltima clula com dados numa planilha. gotoStartOfUsedArea ( bExpande As Boolean ) gotoEndOfUsedArea ( bExpande As Boolean ) A interface XCellCursor, do servio CellCursor, prov os seguintes mtodos, j explicados na seo Tabelas, do captulo Documentos do Writer: gotoStart ( ) gotoEnd ( ) gotoNext ( ) gotoPrevious ( ) gotoOffSet ( nDeslocColuna As Long, nDeslocLinha As Long ) Para demonstrar o uso de um cursor, digite o cdigo fonte abaixo e execute, observando o resultado.
Sub criaCursorCelulas Dim oDesk As Variant Dim oDoc As Object Dim mProp() As Variant Dim sURL As String ' ' cria documento do Calc oDesk = createUnoService("com.sun.star.frame.Desktop") sUrl = "private:factory/scalc" oDoc = oDesk.LoadComponentFromURL(sUrl, "_blank", 0, mProp()) ' ' trabalha com um cursor Dim oPlan As Object Dim oCursor As Object oPlan = oDoc.getSheets().getByIndex(0) oCursor = oPlan.createCursorByRange(oPlan.getCellByPosition(0,0)) ' suporta XSpreadSheet MsgBox oCursor.getSpreadsheet().getName() ' edita algumas clulas ' note que a posio da clula relativa oCursor.getCellByPosition(0,0).setFormula("Clula A1") oCursor.gotoNext() oCursor.getCellByPosition(0,0).setFormula("Clula B1") oCursor.gotoNext() oCursor.getCellByPosition(0,0).setFormula("Clula C1") ' move o cursor 5 celulas abaixo oCursor.gotoOffSet(0,5) oCursor.getCellByPosition(0,0).setFormula("Abaixo de C1") oCursor.CharHeight = 16
59
Documentos do Calc
Verso 1
' obtm toda a rea em uso oCursor.gotoStartOfUsedArea(False) oCursor.gotoEndOfUsedArea(True) ' obtem e exibe o endereo do cursor (ndices) oEnd = oCursor.getRangeAddress() MsgBox Str$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow) MsgBox Str$(oEnd.Sheet)+Str$(oEnd.EndColumn)+Str$(oEnd.EndRow) End Sub
Aqui, usamos o mtodo createCursorByRange ( ), mas poderamos ter usado createCursor ( ). Note que, para definir o contedo de uma clula, devemos obt-la chamando o mtodo getCellByPosition ( ), com a posio relativa ao incio da extenso de clulas do cursor. Observe, ainda, como se d a seleo e identificao da rea usada pela planilha.
O trecho de cdigo a seguir obtm uma extenso de clulas contnuas e exibe os ndices da planilha, coluna inicial e final, linha inicial e final.
' para oExt = oEnd = MsgBox MsgBox uma extenso: com.sun.star.sheet.CellRange oDoc.getCurrentSelection() oExt.getRangeAddress() Str$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow) Str$(oEnd.EndColumn)+Str$(oEnd.EndRow)
Podemos, ainda, selecionar extenses de clulas no contnuas, numa mesma planilha ou em planilhas diferentes, o bloco de cdigo fonte abaixo lida com esta situao. Num documento do Calc, selecione extenses no contnuas, crie a macro e execute para ver a sada.
Sub selecaoExtensoes Dim oDoc As Object Dim oExts As Object oDoc = ThisComponent ' oExts suporta com.sun.star.sheet.SheetCellRanges oExts = oDoc.getCurrentSelection() MsgBox oExts.getCount() oEnd = oExts.getRangeAddresses() For n=0 To UBound(oEnd) MsgBox Str$(oEnd(n).Sheet)+Str$(oEnd(n).StartColumn)+Str$(oEnd(n).StartRow) Next n MsgBox oExts.getRangeAddressesAsString()
60
Verso 1
Documentos do Calc
End Sub
A API do OpenOffice oferece outras funcionalidades como seleo de um ou mais objetos Shape e a seleo de uma extenso durante a execuo de uma macro. Porm, deixo por conta do leitor a explorao destas operaes.
7.6 Formatando
A apresentao final de um trabalho muito importante e o Calc oferece uma vasta gama de possibilidades para nos auxiliar na formatao dos nossos documentos.
O servio com.sun.star.table.TableColumn define as propriedades abaixo para formatao de colunas: Propriedade Width OptimalWidth IsVisible IsStartOfNewPage Descrio Define a largura da coluna em 1/100 mm Se True, ajusta automaticamente a largura da coluna Se True, a coluna ser exibida Se True, insere uma quebra horizontal de pgina nesta coluna
Outras propriedades para a formatao de clulas so cobertas pelos servios: com.sun.star.table.CellProperties com.sun.star.table.TableBorder com.sun.star.table.BorderLine
Introduo ao OpenOffice.org Basic 61
Documentos do Calc
Verso 1
O servio CellProperties contm diversas propriedades. As mais importantes foram apresentadas no captulo Documentos do Writer, na seo sobre Tabelas. Vamos aplicar alguma formatao ao exemplo criado pela Sub editaPlanilha. Adicione o cdigo fonte abaixo no final da sub-rotina, execute e observe a sada:
' Formatao Dim oExtensao As Object Dim oLinha As Object Dim oColuna As Object ' ' formata pargrafos e caracteres oExtensao = oPlanilha.getCellRangeByPosition(0, 0, 5, 0) oExtensao.CharHeight = 12 oExtensao.CharWeight = com.sun.star.awt.FontWeight.BOLD oExtensao.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER ' ajusta a altura da linha 1 oLinha = oPlanilha.getRows().getByIndex(0) oLinha.OptimalHeight = True ' ajusta a largura da coluna B oColuna = oPlanilha.getColumns().getByIndex(1) oColuna.OptimalWidth = True
Mesclando Clulas
Numa planilha, podemos mesclar clulas, a interface com.sun.star.util.XMergeable define os mtodos abaixo, com esta finalidade: merge ( bMerge As Boolean ) Se bMerge True mescla a rea do objeto, seno separa. getIsMerged ( ) As Boolean Retorna True se a rea do objeto estiver mesclada, seno retorna False
Inserindo Bordas
Outro aspecto importante na apresentao de uma planilha a colocao de bordas em torno das clulas. O servio CellProperties contm as seguintes propriedades, que definem o tipo de borda de uma clula ou extenso de clulas: Popriedade TableBorder TopBorder BottomBorder RightBorder LeftBorder Descrio Define a borda de uma clula ou extenso de clulas Define a borda superior de cada clula da extenso Define a borda inferior de cada clula da extenso Define a borda direita de cada clula da extenso Define a borda esquerda de cada clula da extenso
62
Verso 1
Documentos do Calc
O principal elemento de cada uma destas propriedades a estrutura BorderLine, contendo, dentre outros, os campos Color e OuterLineWidth para a cor e a espessura da linha. Para a propriedade TableBorder, podemos definir quatro linhas: TopLine, BottomLine, RightLine e LeftLine. Prosseguindo com o nosso exemplo, vamos mesclar algumas clulas e, depois, definir bordas para a nossa planilha. Acrescente o cdigo fonte a seguir na sub-rotina Sub editaPlanilha e observe o resultado da execuo:
' mescla clulas oExtensao = oPlanilha.getCellRangeByPosition(0, 7, 3, 7) oExtensao.merge(True) ' Define Borda Dim oBorda As New com.sun.star.table.TableBorder Dim oLinBorda As New com.sun.star.table.BorderLine ' oExtensao = oPlanilha.getCellRangeByPosition(0, 0, 4, 7) ' define a espessura e a cor da linha da borda oLinBorda.OuterLineWidth = 30 oLinBorda.Color = CLng( "&H000099" ) oExtensao.setPropertyValue("TopBorder", oLinBorda) oExtensao.setPropertyValue("RightBorder", oLinBorda) oExtensao.setPropertyValue("LeftBorder", oLinBorda) oExtensao.setPropertyValue("BottomBorder", oLinBorda) ' define e aplica uma TableBorder oLinBorda.OuterLineWidth = 100 oLinBorda.Color = CLng( "&HAABBCC" ) oBorda.TopLine = oLinBorda oBorda.BottomLine = oLinBorda oBorda.RightLine = oLinBorda oBorda.LeftLine = oLinBorda oBorda.IsTopLineValid = True oBorda.IsBottomLineValid = True oBorda.IsRightLineValid = True oBorda.IsLeftLineValid = True oExtensao.setPropertyValue("TableBorder", oBorda)
Inicialmente definimos as bordas de todas as clulas de oExtensao, depois aplicamos uma borda na extenso. Note os campos Is...Valid definidos como True.
Formatao Numrica
O OpenOffice possui diversas categorias de formatao numrica. Cada categoria possui vrios formatos pr-definidos. Atravs da interface com.sun.star.util.XNumberFormatsSupplier podemos ler, modificar e adicionar novos formatos aos nossos documentos. A interface XNumberFormatsSupplier contm os mtodos abaixo: getNumberFormats ( ) As Object < com.sun.star.util.XNumberFormats > getNumberFormatsSettings ( ) As Object < com.sun.star.beans.XPropertySet > Entre os mtodos da interface XNumberFormats, temos: getByKey (nChave As Long) As Object < XPropertySet > queryKeys (nCategoria As Long, nLocal As Long, bInserir As Boolean) As aVetor ( ) queryKey (sFormato As String, nLocal As Long, bProcura As Boolean) As Long
Introduo ao OpenOffice.org Basic 63
Documentos do Calc
Verso 1
addNew ( sFormato As String, nLocal As Long ) As Long A interface com.sun.star.util.XNumberFormatTypes contm mtodos para obter o ndice de alguns formatos pr-definidos. Aqui, usaremos o mtodo: getStandardFormat (nTipo AS Long, nLocal As Long) As Long O grupo de constantes com.sun.star.util.NumberFormat define valores para, dentre outras, as seguintes categorias: DATE, TIME, CURRENCY, NUMBER, DATETIME. O servio CellProperties contm a propriedade NumberFormat, que define o tipo formatao numrica de uma clula ou extenso de clulas. Vejamos um exemplo ilustrativo. Num documento do Calc, crie a macro abaixo, execute-a e observe o resultado.
Sub exibeFormatosNumericos Dim oDoc As Object Dim oFormatos As Object Dim mChaves As Variant Dim mProp As Variant oDoc = ThisComponent oFormatos = oDoc.getNumberFormats() oSettings = oDoc.getNumberFormatSettings() oInfo = oSettings.getPropertySetInfo() oProp = oInfo.getProperties() MsgBox UBound(oProp) For n = 0 To UBound(oProp) MsgBox oProp(n).Name Next n mChaves = oFormatos.queryKeys (0, oLocal, FALSE) MsgBox UBound(mChaves) mProp = oFormatos.getByKey(11).getPropertyValues() ' obtem os nomes das propriedades sMsg = "" For n=0 To UBound(mProp) sMsg = sMsg + mProp(n).Name + Chr$(13) Next n MsgBox sMsg ' exibe o valor de FormatString MsgBox mProp(0).Value End Sub
Agora, vamos retornar nossa sub-rotina Sub editaPlanilha para aplicar formatao numrica em algumas clulas. Adicione o cdigo abaixo, execute e observe a sada:
' Formatos Numricos Dim oFormatos As Object Dim aLocal() As New com.sun.star.lang.Locale ' obtem os formatos numericos do modelo oFormatos = oDoc.getNumberFormats() ' obtm o ndice do formato padro para MOEDA
n%=oFormatos.getStandardFormat(com.sun.star.util.NumberFormat.CURRENCY,aLocal())
64
Verso 1
Documentos do Calc
' obtem uma extenso de clulas oExtensao = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(3,1,4,6) ' altera o formato padro para MOEDA oExtensao.NumberFormat = n% ' obtm uma clula e altera para MOEDA oCelula = oPlanilha.getCellByPosition(4, 7) oCelula.NumberFormat = n%
Note a declarao dos objetos, o uso do mtodo getStandardFormat () e o uso da propriedade NumberFormat para alterar a formatao das clulas.
Formatao Condicional
O servio com.sun.star.sheet.SheetCellRange contm as seguintes propriedades para formatao condicional: conditionalFormat - define condies para formatao condicional conditionalFormatLocal - define condies locais para formatao condicional A interface XSheetConditionalEntries prov os mtodos a seguir para operaes com as condies de formatao: addNew ( mCond () As < com.sun.star.beans.PropertyValue > ) o parmetro mCond um vetor com as seguintes entradas: - Operator com os possveis valores, definidos em com.sun.star.sheet.ConditionOperator NONE, EQUAL, NOT_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL, BETWEEN, NOT_BETWEEN, FORMULA - Formula1 contendo uma cadeia com um valor ou frmula - Formula2 contendo um valor ou frmula, usada quando o operador for BETWEEN - StyleName contendo um nome de estilo de formatao de clula removeByIndex ( nIndice As Long ) remove a condio nIndice clear ( ) limpa as condies atuais de formatao Acrescente o cdigo abaixo no final da Sub editaPlanilha, execute e observe a sada:
' FORMATAO CONDICIONAL ' Dim mCond (2) As New com.sun.star.beans.PropertyValue Dim oEntradas As Variant ' obtem uma extenso de clulas oExtensao = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(4,1,4,6) ' obtm a formatao condicional corrente oEntradas = oExtensao.getPropertyValue("ConditionalFormat") ' define as propriedades de uma condio para formatao mCond(0).Name = "Operator" mCond(0).Value = com.sun.star.sheet.ConditionOperator.GREATER mCond(1).Name = "Formula1"
65
Documentos do Calc
Verso 1
mCond(1).Value = "500" mCond(2).Name = "StyleName" mCond(2).Value = "Result" ' limpa as condioes existentes oEntradas.clear() ' adiciona a nova condio oEntradas.addNew(mCond()) ' aplica a formatao condicional oExtensao.setPropertyValue("ConditionalFormat", oEntradas)
Neste cdigo, aplicamos o estilo Resultado se o valor da clula for maior que R$ 500,00. Podemos, tambm, aplicar estilos de formatao de clulas definidos pelos usurios.
Vejamos um exemplo de busca: crie um novo documento do Calc, preencha algumas clulas com o texto TOTAL e TOTAL GERAL, em seguida crie a macro abaixo e execute.
Sub buscaTexto Dim oDoc As Object Dim oDescBusca As Object Dim oPlanilha As Object oDoc = ThisComponent
66
Verso 1
Documentos do Calc
oPlanilha = oDoc.Sheets(0) oDescBusca = oPlanilha.createSearchDescriptor() oDescBusca.SearchWords = True oDescBusca.setSearchString ("TOTAL") oResultado = oPlanilha.findFirst( oDescBusca ) i = 0 Do Until IsNull(oResultado) oResultado.CharColor = RGB(250,100,50) oResultado = oPlanilha.findNext(oResultado, oDescBusca ) i = i + 1 Loop MsgBox "Ocorrncias de "+oDescBusca.getSearchString() + " " + Str$(i) End Sub
Agora, altere a propriedade SearchWords para False e execute novamente a macro observando o seu resultado. A substituio de texto implementada pela interface XReplaceable, que herda as caractersticas de XSearchable. Ela prov os mtodos: createReplaceDescriptor ( ) As Object <com.sun.star.util.XReplaceDescriptor> replaceAll ( xDescritor As Object <com.sun.star.util.XReplaceDescriptor>) As Long O servio ReplaceDescriptor tem mtodos para as propriedades da cadeia: getReplaceString ( ) As String setReplaceString ( sCadeia As String ) Eis uma busca e substituio simples, no mesmo documento do exemplo acima:
Sub substituiTexto Dim oDoc As Object Dim oDescritor As Object Dim oPlanilha As Object oDoc = ThisComponent oPlanilha = oDoc.Sheets(0) oDescritor = oPlanilha.createReplaceDescriptor() oDescritor.setSearchString( "TOTAL GERAL" ) oDescritor.setReplaceString( "Total" ) n = oPlanilha.replaceAll(oDescritor) sMsg = oDescritor.getSearchString()+ por +oDescritor.getReplaceString() MsgBox sMsg + = + Str$(n) End Sub
Note que devemos executar a busca e a substituio numa extenso de clulas. Nos exemplos, utilizamos toda a planilha.
7.8 Ordenando
Para a ordenao de uma extenso de clulas, devemos utilizar os mesmos conceitos e servios j apresentados na seo Tabelas, do captulo sobre Documentos do Writer. Seguem, abaixo, os principais mtodos e propriedades utilizados nesta tarefa.
Introduo ao OpenOffice.org Basic 67
Documentos do Calc
Verso 1
Mtodos da interface com.sun.star.util.XSortable: createSortDescriptor ( ) As Variant <com.sun.star.beans.PropertyValue> sort (xDescritor As Variant <com.sun.star.beans.PropertyValue> ) Algumas das propriedades do descritor de ordenao (SortDescriptor): Propriedade IsCaseSensitive SortAscending SortColumns Descrio Se True, considera maisculas / minsculas Define a ordem da ordenao Se True ordena as colunas, seno ordena as linhas.
O servio com.sun.star.table.TableSortDescriptor inclui o servio SortDescriptor e possui as propriedades abaixo: Propriedade SortFields MaxFieldCount Orientation ContainsHeader Descrio Descreve os campos de ordenao <com.sun.star.util.SortField> Define o nmero mximo de campos, somente leitura Define a orientao da ordenao <com.sun.star.table.TableOrientation> Se True, no ordena a primeira linha ou coluna
No prximo bloco de cdigo, veremos a ordenao de uma extenso de clulas (A2:E7), do documento criado pela Sub editaPlanilha. Digite o cdigo abaixo no final da macro, execute e observe a saida.
' ================================= ' ORDENANDO UMA EXTENSO DE CLULAS ' ================================= Dim oCampoOrd(0) As New com.sun.star.util.SortField Dim oDescrOrd As Variant ' ' define a extenso a ser ordenada (A2:E7) oExtensao = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(0,1,4,6) ' define o campo de ordenao e suas propriedades oCampoOrd(0).Field = 0 oCampoOrd(0).SortAscending = True oCampoOrd(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC ' cria o descritor de ordenao oDescrOrd = oExtensao.createSortDescriptor() ' define as propriedades do descritor oDescrOrd(0).Name = "SortFields" oDescrOrd(0).Value = oCampoOrd() oDescrOrd(1).Name = "ContainsHeader" oDescrOrd(1).Value = False oDescrOrd(2).Name = "SortColumns" oDescrOrd(2).Value = False ' ordena a extenso oExtensao.sort(oDescrOrd())
68
Verso 1
Documentos do Calc
Note que iniciamos com a declarao das variveis, criamos uma extenso de clulas com uma chamada ao mtodo getCellRangeByPosition (), definimos as propriedades do campo de ordenao, criamos o descritor e definimos as suas propriedades (o campo de ordenao uma propriedade do descritor) e, finalmente, invocamos o mtodo sort () para executar a sua tarefa.
A interface XSheetFilterDescriptor contm os mtodos abaixo para obter e definir os campos com os critrios do filtro: getFilterFields ( ) aCampos () As Object < TableFilterField > retorna os campos com os critrios do filtro setFilterFields ( aCampos () As Object < TableFilterField > ) define os campos com os critrios do filtro A estrutura com.sun.star.table.TableFilterField contm os elementos a seguir: Connection Field Operator IsNumeric NumericValue StringValue - como ser a conexo com a condio anterior ( Or / And ) - a coluna usada na condio - operador condicional ( FilterOperator ) - se True, o valor do campo (Field) numrico - valor do campo, usar se IsNumeric for True - cadeia de caracteres, usar se IsNumeric for False
Os passos necessrios para filtrar dados numa planilha so: a) obter a extenso de clulas a ser filtrada; b) definir a estrutura dos campos com os critrios do filtro;
69
Documentos do Calc
Verso 1
c) criar e definir os dados do descritor do filtro; d) aplicar o filtro. Vejamos um trecho de cdigo fonte que aplica um filtro simples numa extenso de clulas.
Sub aplicaFiltro Dim oDoc As Object Dim oPlan As Object Dim oExt As Object Dim oDescFiltro As Variant Dim oCamposFiltro(0) As New com.sun.star.sheet.TableFilterField oDoc = ThisComponent oPlan = oDoc.getSheets().getByIndex(0) oExt = oPlan.getCellRangeByPosition(0,1,4,6) ' define a estrutura TableFilterField oCamposFiltro(0).Field = 4 oCamposFiltro(0).IsNumeric = True oCamposFiltro(0).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL oCamposFiltro(0).NumericValue = 300 ' cria o descritor do filtro vazio (True) oDescFiltro = oExt.createFilterDescriptor (True) ' define o campo de filtro oDescFiltro.setFilterFields (oCamposFiltro()) ' aplica o filtro oExt.filter (oDescFiltro) ' MsgBox "OK para filtrar Caracteres" ' redefine a estrutura TableFilterField oCamposFiltro(0).Field = 0 oCamposFiltro(0).IsNumeric = False oCamposFiltro(0).Operator = com.sun.star.sheet.FilterOperator.GREATER oCamposFiltro(0).StringValue = "A 1" ' cria um descritor de filtro vazio (True) oDescFiltro = oExt.createFilterDescriptor (True) ' define o campo de filtro oDescFiltro.setFilterFields (oCamposFiltro()) ' aplica o filtro oExt.filter (oDescFiltro) End Sub
Se voc quiser experimentar este cdigo, crie uma macro no documento gerado pela Sub editaPlanilha e execute, observando a sada. Note que a estrutura TableFilterField pode ter mais de um campo com critrios de filtragem. Tente acrescentar cdigo para copiar o resultado do filtro na Planilha2 do documento.
Verso 1
Documentos do Calc
aplica o subtotal, se bSubstitui for True o resultado anterior ser substitudo removeSubTotals ( ) remove os subtotais do objeto O servio SubTotalDescriptor uma representao de como os subtotais sero criados. A seguir, algumas de suas propriedades: InsertPageBreaks IsCaseSensitive EnableUserSortList UserSortListIndex EnableSort SortAscending - insere quebra de pgina aps cada subtotal - considera letras maisculas / minsculas - se True permite a definio de uma lista para ordenao - a lista para ordenao, se EnableUserSortList for True - define se o contedo dos campos sero ordenados - se True ordenao crescente (depende de EnableSort )
Alm das propriedades acima, o descritor deve conter os campos de subtotais. A interface XSubTotalDescriptor prov mtodos para adicionar ou limpar campos: addNew ( aColunas() As < SubTotalColumn >, nColGrupo As Long) adiciona os campos ao descritor, nColGrupo especifica a coluna base para agrupamento clear ( ) remove todos os campos de subtotais do objeto A estrutura com.sun.star.sheet.SubTotalColumn contm os elementos: Column Function - ndice da coluna a subtotalizar - o tipo de subtotal, definido em com.sun.star.sheet.GeneralFunction
Os passos necessrios para adicionar linhas com subtotais numa extenso de clulas so: a) obter a extenso de clulas a ser subtotalizada; b) definir a estrutura dos campos de subtotal; c) criar e definir os dados do descritor de subtotal; d) aplicar a operao de subtotal. Vejamos um trecho de cdigo fonte que aplica um subtotal numa extenso de clulas.
Sub aplicaSubTotal Dim oDoc As Object Dim oPlan As Object Dim oExt As Object Dim oDescSubTotal As Variant Dim oCamposSubTotal(0) As New com.sun.star.sheet.SubTotalColumn oDoc = ThisComponent oPlan = oDoc.getSheets().getByIndex(0) oExt = oPlan.getCellRangeByPosition(0,1,4,6) ' define a estrutura SubTotalColumn oCamposSubTotal(0).Column = 4 oCamposSubTotal(0).Function = com.sun.star.sheet.GeneralFunction.SUM ' cria o descritor do subtotal oDescSubTotal = oExt.createSubTotalDescriptor (True) ' adiciona o campo subtotal e a coluna base oDescSubTotal.addNew (oCamposSubTotal(), 0) Introduo ao OpenOffice.org Basic 71
Documentos do Calc
Verso 1
Se voc quiser experimentar este cdigo, crie uma macro no documento gerado pela Sub editaPlanilha, execute e analise o resultado.
7.11 Grficos
Um grfico um documento embutido num outro documento do OpenOffice. A API do OpenOffice.org contm diversos servios e interfaces para a gerao de grficos, a partir dos dados contidos numa planilha. O servio com.sun.star.table.TableCharts suporta os mtodos das interfaces XTableCharts, XIndexAccess e XEnumerationAccess. Mtodos da interface com.sun.star.table.XTableCharts: addNewByName ( sNome As String, oArea As Object < com.sun.star.awt.Rectangle >, oExt ( ) As Object < com.sun.star.table.CellRangeAddress >, bTitCol As Boolean, bTitLin As Boolean ) Adiciona o grfico na coleo de grficos da planilha. Os seus parmetros so: sNome oArea oExt bTitCol bTitLin - o nome do grfico - a rea (retngulo) aonde o grfico ser plotado - a extenso de clulas com os dados - se True, os dados da linha superior sero usados na legenda do grfico - se True, os dados da primeira coluna sero usados como ttulos no eixo
removeByName ( sNome As String ) remove o grfico com o nome sNome da coleo. O servio com.sun.star.table.TableChart suporta a interface XTableChart com os mtodos: getHasColumnHeaders ( ) As Boolean setHasColumnHeaders ( bTituloColuna As Boolean ) getHasRowHeaders ( ) As Boolean setHasRowHeaders ( bTituloColuna As Boolean ) getRanges ( ) As sExtensoes ( ) < CellRangeAddress > setRanges ( sExtensoes ( ) As Object < CellRangeAddress > ) Um documento grfico contm uma referncia para uma fonte de dados, um diagrama e algumas propriedades como ttulo, sub-ttulo e legenda. O servio ChartDocument o modelo do documento grfico e suporta as interfaces XChartDocument, XPropertySet e XMultiServiceFactory . Ele possui as seguintes propriedades: HasMainTitle HasSubTitle HasLegend - Se True, exibe o ttulo principal - Se True, exibe o subttulo - Se True, exibe a legenda
72
Verso 1
Documentos do Calc
A interface com.sun.star.chart.XChartDocument prov os mtodos: getTitle ( ) As < com.sun.star.drawing.XShape > getSubTitle ( ) As < com.sun.star.drawing.XShape > getLegend ( ) As < com.sun.star.drawing.XShape > getArea ( ) As < com.sun.star.beans.XPropertySet > getDiagram ( ) As < com.sun.star.chart.XDiagram > setDiagram ( oDiagrama As < com.sun.star.chart.XDiagram >) getData ( ) As < com.sun.star.chart.XChartData > attachData ( oDadosExternos As < com.sun.star.chart.XChartData >) O diagrama o objeto que contm a forma do grfico, baseada no servio Diagram e suas interfaces XDiagram e XPropertySet. Diferentes tipos de diagramas podem ser criados com o mtodo createInstance (), da interface XMultiServiceFactory. Eis alguns servios para tipos de diagramas: com.sun.star.chart.BarDiagram com.sun.star.chart.LineDiagram com.sun.star.chart.PieDiagram com.sun.star.chart.AreaDiagram com.sun.star.chart.XYDiagram Podemos alterar a propriedade Diagram de um grfico com o cdigo a seguir:
oDiagrama = oGraf.createInstance("com.sun.star.chart.PieDiagram") oGrafico.setDiagram ( oDiagrama )
O servio com.sun.star.chart.Diagram tem as propriedades abaixo: DataRowSource DataCaption - define se a srie de dados por linhas ou colunas - define como a legenda dos dados ser exibida
Para criar um grfico devemos seguir os passos abaixo: a) definir os dados a serem exibidos no grfico; b) definir a rea retangular aonde o grfico ser desenhado; c) adicionar o grfico coleo; d) recuperar o objeto grfico embutido. e) definir as propriedades do grfico. Vejamos um exemplo simples. Digite a macro a seguir e execute para ver a sada:
Sub criaGrafico Dim oDesk As Variant Dim oDoc As Object Dim mProp() As Variant Dim sURL As String ' cria documento do Calc oDesk = createUnoService("com.sun.star.frame.Desktop") sUrl = "private:factory/scalc"
73
Documentos do Calc
Verso 1
oDoc = oDesk.LoadComponentFromURL(sUrl, "_blank", 0, mProp()) ' edita clulas da planilha Dim oPlanilha As Object Dim oCelula As Object Dim sTitCol() As String ' escreve os titulos das colunas sTitCol = Array ("Perodo","Computador","Perifrico","Servio","Total") oPlanilha = oDoc.getSheets().getByIndex(0) For i% = 0 To 4 oCelula = oPlanilha.getCellByPosition(i%, 0) oCelula.setString(sTitCol(i%)) Next i% ' preenche as clulas com texto, valor e formula For i% = 1 To 4 For j% = 0 To 4 oCelula = oPlanilha.getCellByPosition(j%, i%) If (j% = 0) Then oCelula.setString(Str$(i%) + " Trim") ElseIf (j% > 0 And j < 4) Then oCelula.setValue(1000 * Rnd()) Else sExt = "B" + Trim$(Str$(i%+1)) + ":" + "D" + Trim$(Str$(i%+1)) sFormula = "=Soma(" + sExt + ")" oCelula.FormulaLocal = sFormula End If Next j% Next i% ' ' insere um grfico de colunas Dim oRet As New com.sun.star.awt.Rectangle Dim oEndExt(0) As New com.sun.star.table.CellRangeAddress Dim oGraficos As Object ' define o nome do grfico sNome = "Trimestral" ' define o endereo da extenso de clulas com os dados oEndExt(0).Sheet = 0 oEndExt(0).StartColumn = 0 oEndExt(0).StartRow = 0 oEndExt(0).EndColumn = 3 oEndExt(0).EndRow = 4 ' define a rea do grfico oRet.X = 1000 oRet.Y = 3000 oRet.Width = 12000 oRet.Height = 12000 ' obtm a coleo de grficos da Planilha1 oGraficos = oPlanilha.Charts ' adiciona um grfico coleo oGraficos.addNewByName(sNome, oRet, oEndExt(), True, True) ' define as propriedades(Titulo) oGraf = oGraficos.getByName(sNome).getEmbeddedObject() oGraf.Title.String = "Faturamento Trimestral" oGraf.HasSubTitle = True oGraf.SubTitle.String = "Ano 2003" End Sub
Comeamos preenchendo as clulas com os dados, depois, definimos o nome do grfico, a extenso de clulas com os dados e a rea (retngulo) aonde o grfico ser plotado. Aps estes passos preliminares, obtemos a coleo dos grficos da planilha e adicionamos o nosso grfico na coleo, com uma chamada ao mtodo addNewByName ( ). Finalmente, obtemos o objeto grfico embutido, com uma chamada ao mtodo getByName ( ) associada ao mtodo getEmbeddedObject ( ) e, ento, alteramos algumas propriedades do grfico.
74
Verso 1
Documentos do Calc
Aproveitando o exemplo acima, vamos mostrar como alterar a propriedade Diagram de um grfico. Acrescente o cdigo fonte abaixo ao final da Sub criaGrafico e execute para criar um grfico do tipo Pizza, representando os dados da linha 2 da planilha.
' Criando um grfico do tipo Pizza Dim oExtPizza(1) As New com.sun.star.table.CellRangeAddress ' MsgBox "OK para uma Pizza" ' remove o grfico de barras oGraficos.removeByName(sNome) sNome = "GrafPizza" ' define o endereo da extenso de clulas com legendas oExtPizza(0).Sheet = 0 oExtPizza(0).StartColumn = 0 oExtPizza(0).StartRow = 0 oExtPizza(0).EndColumn = 3 oExtPizza(0).EndRow = 0 ' define o endereo da extenso de clulas com dados oExtPizza(1).Sheet = 0 oExtPizza(1).StartColumn = 0 oExtPizza(1).StartRow = 1 oExtPizza(1).EndColumn = 3 oExtPizza(1).EndRow = 1 ' adiciona um grfico coleo oGraficos.addNewByName(sNome, oRet, oExtPizza(), True, True) ' define as propriedades oGraf = oGraficos.getByName(sNome).getEmbeddedObject() oGraf.Diagram = oGraf.createInstance("com.sun.star.chart.PieDiagram") oGraf.Diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.ROWS oGraf.Title.String = "1 Trimestre 2003"
Observe que temos um vetor de estruturas CellRangeAddress, onde o primeiro elemento contm os dados da legenda do grfico e o segundo os dados a serem representados. Note tambm a mudana da propriedade Diagram com uma chamada ao mtodo createInstance ( ) e a mudana da propriedade DataRowSource do diagrama. Note, ainda, que o fato de podermos definir um vetor CellRangeAddress, indica que podemos ter extenses de clulas, consecutivas ou no, contendo os dados a serem representados graficamente.
75
Documentos do Calc
Verso 1
8 Mais informaes
8.1 Na rede
OpenOffice.org : http://www.openoffice.org http://www.openoffice.org.br Projeto de Documentao do OpenOffice.org: http://documentation.openoffice.org API do OpenOffice.org http://api.openoffice.org Este o local para quem est interessado em desenvolvimento com o OpenOffice.org. Alm do SDK, voc encontra:
OpenOffice.org 1.0.2 Developers Guide (~ 12 Mb ) Manual de Referncia da API OpenOffice.org (~ 8 Mb ) StarOffice Programmers Tutorial (~ 1 Mb ) Exemplos do Developers Guide (~ 1 Mb )
OOoDocs.Org http://www.ooodocs.org Documentao e notcias sobre o OpenOffice.org. OOExtras http://ooextras.sourceforge.net/ Repositrio de modelos, macros e assistentes para o OpenOffice.org. Baixe todas as macros e estude o cdigo fonte para aprender mais. Pitonyak.org www.pitonyak.org/ Andrew Pitonyak e seus colaboradores merecem a nossa gratido. Esta pgina contm um excelente documento sobre macros e sobre a linguagem Basic. Consulte-a periodicamente.
76
Verso 1
9.1 Crditos
Autor do layout grfico do modelo: Mirto Silvio Busico <m.busico@ieee.org> Autor do texto explanatrio do modelo: Gianluca Turconi <luctur@openoffice.org>
9.2
Agradecimentos
A Sun Microsystems, Inc pelo apoio para a criao e desenvolvimento do OpenOffice.org. A Sun Microsystems, Inc, mais uma vez, pela disponibilizao da documentao sobre a API do OpenOffice.org, sem a qual este trabalho no seria possvel. A todos os voluntrios que, com seu trabalho, contribuem para o crescimento do OpenOffice. org.
9.3 Licena
permitida a cpia, distribuio e / ou modificao deste documento, sob os termos da GNU Free Documentation License, Version 1.1 ou uma verso posterior publicada pela Free Software Foundation. Uma cpia da licena acompanha este documento, consulte o arquivo FDL. TXT. Se voc no recebeu uma cpia deste arquivo, por favor informe ao autor ou ao webmaster do site que disponibilizou este documento. Copyright 2003 Noelson Alves Duarte.
77