Makrá v OpenOffice.org: Spúšťanie makier podľa ich názvov v zozname

Július Pastierik  /  29. 12. 2010, 00:00

Ladíte makrá a potrebujete ich spúšťať pomocou výberu ich názvu zo zoznamu? Naprogramujte si makro, ktoré to umožní.

Pri ladení makier je ich spúšťanie pomerne nepohodlné – neustále sa musí vyhľadávať cez menu Nástroje – Makrá – Spustiť makro... Navyše, niektoré makrá síce chceme spúšťať pravidelne, ale nechceme ich mať priradené k žiadnej klávesovej skratke, menu či panelu nástrojov. Medzi takéto makrá môžeme zaradiť napr. procedúry zisťovanie vlastností premenných OpenOffice.org pomocou knižnice XrayTool (posledná verzia 5.2).

Zo všetkých uvedených dôvodov si túto knižnicu rozšírime o nové funkcie – o možnosť zadávania a spúšťania makier, ktorých názov zadáme do zoznamu. Pre ukážku si zároveň pripravíme dve funkcie, pomocou ktorých budeme zisťovať (s využitím knižnice XrayTool) hádam najčastejšie používané premenné – StarDesktop a ThisComponent:

sub xr_StarDesktop
 dim op : op=StarDesktop
 BasicLibraries.LoadLibrary("XrayTool")
 xray(op)
end sub

sub xr_ThisComponent
 dim op : op=ThisComponent
 BasicLibraries.LoadLibrary("XrayTool")
 xray(op)
end sub

Pre vlastné spúšťanie makier pomocou ich názvu musíme ešte uviesť, že prostredie OpenOffice.org Basic vyžaduje, aby boli zadané spolu s knižnicou aj modulom, v ktorej ich máme zadefinované. Pretože mnohokrát ladíme makrá v knižnici Standard a module Module1, budeme pri zadávaní názvov makier predpokladať, že pokiaľ názov knižnice a modulu nezadáme, chceme použiť tieto. Okrem toho si ešte uľahčíme prácu aj tým, že pokiaľ zadáme iba názov modulu, budeme predpokladať knižnicu Standard. Aby sme si ukázali čo najviac možností OpenOffice.org Basic, zoznam budeme, samozrejme, udržiavať abecedne usporiadaný.

Ostatné možnosti ako je ukladanie zoznamu do pracovného súboru, testovanie pokusu zápisu neprázdneho záznamu a pod. sú priamo viditeľné v okomentovanom zdrojovom texte, takže ich už nemusíme špeciálne pripomínať:

 

dim oDlg as object
dim bZmena as boolean

REM Procedúra pre uloženie zoznamu "xray funkcií" z dialógu do pracovného súboru

sub zapis_xray_funkcie
 dim sf, outStream, outFile ' Pre zápis do súboru
 dim sNazov$, kde$
 dim oZoznam: oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
 kde=basiclibraries.getLibraryLinkURL("XrayTool") ' Adresár, kde je rozšírenie nainštalované
 sNazov=left(kde,len(kde)-10)+"jp_xraytool_set.txt" ' Súbor s textom
 sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
 outStream = sf.openFileWrite(sNazov) 
 outFile = createUnoService("com.sun.star.io.TextOutputStream") 
 outFile.OutputStream = outStream
 outFile.Encoding = "UTF-8" ' Súbor bude v UTF-8 aby bola dobrá diakritika
 outStream.truncate() ' Vymazanie predchádzajúceho obsahu

 for i=0 to oZoznam.ItemCount-1 ' Zapíšeme všetky záznamy
  kde=trim(oZoznam.Items(i))
  if kde<>"" then
   if i<oZoznam.ItemCount-1 then
    outFile.writeString(kde+chr$(13))
   else
    outFile.writeString(kde)
   endif
  endif
 next i
 outStream.closeOutput
 outFile.closeOutput
end sub

REM Procedúra pre načítanie zoznamu "xray funkcií" do dialógu
sub citaj_xray_funkcie
 dim riadok$
 dim sNazov$, kde$
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 dim oZoznam: oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu

 on error resume next

 kde=basiclibraries.getLibraryLinkURL("XrayTool") ' Adresár, kde je rozšírenie nainštalované
 sNazov=left(kde,len(kde)-10)+"jp_xraytool_set.txt" ' Súbor s textom

 if fileexists(sNazov) then ' Ak súbor existuje, tak ho načítame
  sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  inStream = sf.openFileRead(sNazov) 
  inFile = createUnoService("com.sun.star.io.TextInputStream") 
  inFile.InputStream = inStream
  inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
  Do While not inFile.IsEOF
   riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
   if riadok<>"" then oZoznam.AddItem(riadok,oZoznam.ItemCount) ' Ak je záznam neprázdny, pridáme ho do dialógu
  loop 
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
 oZoznam.Text=oZoznam.Items(0) ' Nastavíme sa na prvý záznam
end sub

REM Procedúra pre pridanie novej položky do zoznamu "xray funkcií"
sub Vloz_xray_Initiated
 dim oZoznam : oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
 dim sNovy$ : sNovy=trim(oDlg.model.NovyXray.Text) ' Nový záznam
 dim bExistuje as boolean : bExistuje=false
 dim iPoloha : iPoloha=0

 if sNovy<>"" then ' Ak je zadaný názov
  ' Zistíme, či je záznam v tvare knižnica.modul.funkcia (teda musí obsahovať dve bodky). 
  i1=instr(sNovy,".")
  i2=instr(i1+1,sNovy,".")
  if (i1=0) and (i2=0) then sNovy="Standard.Module1."+sNovy ' Nezadaná ani knižnica ani modu – pridáme "Standard.Module1."
  if (i1>0) and (i2=0) then sNovy="Standard."+sNovy ' Nezadaná knižnica – pridáme "Standard."
  for i=0 to oZoznam.ItemCount-1 ' Zistíme, či záznam existuje a zároveň zistíme abecednú polohu nového záznamu
   bExistuje=bExistuje or (lcase(sNovy))=lCase(trim(oZoznam.Items(i)))
   if lcase(sNovy)>lCase(trim(oZoznam.Items(i))) then iPoloha=i+1 ' Ak je nový záznam "väčší" ako starý, tak ho vložíme zaň
  next i
  if not bExistuje then
   oZoznam.AddItem(sNovy,iPoloha)
   oDlg.model.NovyXray.Text=""
   bZmena=True
  else
   msgbox "Zray funkcia "+sNovy+" je už vložená."
  end if
 else
  msgbox "Názov musí byť zadaný!"
 end if
end sub

REM Procedúra pre vymazanie aktuálnej položky zo zoznamu "xray funkcií"
sub Vymaz_xray_Initiated
 dim oZoznam : oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
 dim sMazany$ : sMazany=trim(oZoznam.Text)
 for i=0 to oZoznam.ItemCount-1
  if sMazany=trim(oZoznam.Items(i)) then
   oZoznam.removeItems(i,1)
   bZmena=True
   exit sub
  endif
 next i
end sub

REM Procedúra pre spúšťanie iných makier zadaných ich názvom
REM Názov musí obsahovať knižnicu, mosul a názov procedúry (napr. XrayToool._JP.Xray_ThisComponent)
sub spusti_makro(sMakro as string)
 dim document as object
 dim dispatcher as object
 document = ThisComponent.CurrentController.Frame
 dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 dispatcher.executeDispatch(document, "vnd.sun.star.script:"+sMakro+"?language=Basic&location=application", "", 0, Array())
end sub

REM Procedúra pre otvorenie dialógu
sub Vyber_xray
 dim sFunkcia$ : sFunkcia=""
 DialogLibraries.LoadLibrary("XrayTool")
 oDlg=CreateUnoDialog(DialogLibraries.XrayTool.JP_Dialog)
 citaj_xray_funkcie
 bZmena=false
 if oDlg.Execute() then
  if bZmena then zapis_xray_funkcie
  oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
  sFunkcia=trim(oZoznam.Text)
 endif
 oDlg.dispose() ' Zatvorenie dialógu
 if sFunkcia<>"" then spusti_makro(sFunkcia)
end sub

 

Neprehliadnite: