divendres, 26 de novembre del 2010

L'enregistrador de macros de l'OpenOffice.org

Aquest article està basat en http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls

Des del punt de vista d'un desenvolupador, fer una macro és "escriure" una macro, o programar una macro.

Tanmateix, des del punt de vista de l'usuari, una macro es pot fer de forma molt senzilla sense més que enregistrar-la:  Eines - Macros - Enregistra una macro. Amb aquesta eina l'OpenOffice.org guarda la sequència d'accions que realitzem a la interfase de l'aplicació fins que li en diem que aturi l'enregistrament, moment en que ens demana que li donem un nom  a la macro.

Doncs bé, la macro es guarda com una seqüència d'accions d'OpenOffice.org Basic.

Ara bé, el codi que trobarem potser ens sorprendrà. Es tractarà d'una seqüència comandes UNO, és dir, d'invocacions a URL de tipus UNO mitjançant el servei DispatchHelper. Bàsicament carregarà un array de paràmetres i invocarà la URL que correspongui passant-li l'array.

En general, a cada acció que es pot realitzar des de la interfase de l'aplicació, ja sigui per menú o per barra d'eines, li correspon una URL UNO del tipus ".uno:AccioDeLaInterfase"

En aquest punt, el desenvolupador pot tornar a entrar en acció. És un exercici interessant analitzar les macros en Basic que ha generat automàticament l'OpenOffice.org.

Per exemple, poso el següent text de prova al Writer:

"A continuació escric un petit text de prova
Ara formataré el text de diverses formes.
El que faré serà enregistrar una macro per veure com es fa l'acció amb OooBasic
D'aquesta forma el mateix OpenOffice.org em fa de “mestre” de programació.
Som-hi"

Comencem, busco "text" i el reemplaço per "escrit".
Això es tradueix en aquesta macro:

sub Replace
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatchersub Replace
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(18) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "text"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = "escrit"
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 3
args1(18).Name = "Quiet"
args1(18).Value = true

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
end sub

Ja es veu que aquesta aproximació no és tan eficient com invocar els objectes i els components del document mitjançant la API de UNO, però pot ser útil en algunes ocasions. El que caldria fer és provar les diferents comandes a veure com les enregistra el gravador de macros.

La llista de comandes és prou llarga. Una llista de les comandes UNO la podem trobar en aquest enllaç.

Cap comentari:

Publica un comentari a l'entrada