V minulom dieli seriálu o typografických makrách sme sa venovali procedúram pre jazykovú lokalizáciu dialógov a procedúram, v ktorých sme pracovali so zoznamom profilov, ktoré sú definované v dialógovom okne. Dnes budeme v týchto funkciách pokračovať a doplníme ich o procedúry pre načítavanie a ukladanie nastavení profilov, export a import profilov a pre otváranie dialógových okien.
Načítavanie a ukladanie nastavení profilov
Podobne, ako pri súboroch s jazykovou lokalizáciou, aj nastavenia profilov sú uložené v tvare
premenná=definícia, a preto vlastné načítavanie z inicializačného súboru je rovnaké. Na rozdiel od
jazykovej lokalizácie dialógu sa však teraz budú inicializovať zaškrtávacie políčka a prepínače v dialógu (metóda
setpropertyvalue("State",...)), čím sú ukázané ďalšie možnosti programového ovládania dialógov.
REM Procedúra pre nastavenie príznakov dialógu
Sub Set_priznaky_dialogu(oDlgj, sNazov)
 dim riadok, premenna, definicia as string
 dim rovna as integer
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 on error resume next
 
 if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
  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 = inFile.readLine ' namiesto Line Input #subor, riadok
   rovna=instr(riadok,"=")
   if rovna<>0 then
    premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
    definicia=trim(right(riadok,len(riadok)-rovna))
    oDlgj.model.getByName(premenna).setpropertyvalue("State",val(definicia))
   end if
  loop 
  ' Zatvorenie definičného súboru - namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
end sub
Kým sa museli pri jazykovej lokalizácii vytvoriť príslušné súbory v externom editore, nastavenia dialógov sa robia priamo v makre, a preto sa aj musia programátorsky ošetriť. Vzhľadom na veľké množstvo nastavení by bolo prácne (a aj zbytočné), aby sa dookola opakovali príkazy typu:
riadok="OptionButton1="+trim(str(oDlgj.model.getByName("OptionButton1").getpropertyvalue("State")))+chr$(13)
outFile.writeString(riadok)
riadok="OptionButton2="+trim(str(oDlgj.model.getByName("OptionButton2").getpropertyvalue("State")))+chr$(13)
outFile.writeString(riadok)
riadok="OptionButton3="+trim(str(oDlgj.model.getByName("OptionButton3").getpropertyvalue("State")))+chr$(13)
outFile.writeString(riadok)
...
Aby sa uvedené príkazy nemuseli dookola opakovať, budeme názvy premenných vytvárať programovo pomocou cyklu, takže aj
v prípade ich zvýšenia stačí následne iba zmeniť hornú hranicu v príkaze for bez toho, aby sa do makra
musel pridávať čo i len jeden programový riadok. Takýchto cyklov je v makre viac – sú rozdelené podľa názvov
nastavení a, pravdaže, tam, kde by bol cyklus zbytočný, budeme používať pred chvíľou uvedené opakované príkazy zápisu
do externého súboru.
 Profily pro formátování dokumentů
Profily pro formátování dokumentů
Samozrejme súčasťou makra je aj zapisovanie do externého textového súboru v kódovaní UTF-8 a - ako inak - v prípade,
že súbor neexistuje, tak sa vytvorí. Zároveň je ukázané, ako sa získavajú nastavenia zo zaškrtávacích políčok a
prepínačov (metóda getpropertyvalue("State")).
REM Procedúra pre uloženie nastavení profilu do súboru
sub Uloz_definiciu_profilu(oDlgj, sNazov)
 dim sf, outStream, outFile ' Pre zápis do súboru
 dim riadok$, premenna$
 
 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
 
 ' Nastavenia čo sa má robiť
 for i=1 to 20
  premenna="OptionButton"+trim(str(i))
  riadok=premenna+"="+trim(str(oDlgj.model.getByName(premenna).getpropertyvalue("State")))+chr$(13)
  outFile.writeString(riadok)
 next i
 ' Nastavenia prepínačov NBSP/WJ
 for i=1 to 3
  premenna="NBSP"+trim(str(i))
  riadok=premenna+"="+trim(str(oDlgj.model.getByName(premenna).getpropertyvalue("State")))+chr$(13)
  outFile.writeString(riadok)
  premenna="WJ"+trim(str(i))
  riadok=premenna+"="+trim(str(oDlgj.model.getByName(premenna).getpropertyvalue("State")))+chr$(13)
  outFile.writeString(riadok)
 next i
 
 ' Nastavenia prepínačov troch bodiek
 for i=1 to 3
  premenna="Tri_Bodky_"+trim(str(i))
  riadok=premenna+"="+trim(str(oDlgj.model.getByName(premenna).getpropertyvalue("State")))+chr$(13)
  outFile.writeString(riadok)
 next i
 ' Nastavenia prepínačov zliatkov
 riadok="Fi_1="+trim(str(oDlgj.model.Fi_1.State))+chr$(13)
 outFile.writeString(riadok)
 riadok="Fi_2="+trim(str(oDlgj.model.Fi_2.State))
 outFile.writeString(riadok)
 
 outStream.closeOutput
 outFile.closeOutput
end sub
Export a import profilov
Pri práci s profilmi je potrebné, aby sa mohli exportovať a importovať. Tieto možnosti sa dajú využiť nielen pri nastavovaní rovnakých profilov pre viacerých používateľov, ale aj pri inštalácii novej verzie rozšírenia, pretože vtedy sa predchádzajúce nastavenia „stratia“.
Pre vlastný export a import musí používateľ zadať adresár, kde chce nastavenia exportovať alebo odkiaľ ich chce importovať, na čo je určená nasledujúca funkcia:
REM Funkcia pre zadanie adresára (používa sa pri importe a exporte)
function ZadajAdresar as string
 dim oAdresarDialog : oAdresarDialog=CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
 dim oAdresarExistuje : oAdresarExistuje=createUnoService("com.sun.star.ucb.SimpleFileAccess")
 dim sAdresar$ : sAdresar=""
 if oAdresarExistuje.Exists(sAdresarURL) then oAdresarDialog.SetDisplayDirectory(sAdresarURL)
 if oAdresarDialog.Execute() then
  sAdresar=oAdresarDialog.GetDirectory()+"/"
 end if
 ZadajAdresar=sAdresar
end function
Po zadaní adresára sa môžu profily exportovať. Aby sa export mohol uskutočniť, musíme prejsť adresár, kde sú uložené príslušné súbory s nastaveniami v rozšírení a tieto súbory musíme následne skopírovať do vybraného zálohovacieho adresára. Pretože nie je možné robiť zálohu do adresára, ktorý zálohujeme, musíme ošetriť aj tento prípad, pretože nevieme, aký zálohovací adresár používateľ zadá.
Aby bolo toto makro čo najjednoduchšie, prejdeme súbory adresára rozšírenia pomocou štandardnej funkcie jazyka
OpenOffice.org Basic dir a podľa názvu súboru zistíme, či sa jedná o súbor s definíciou nastavení
(txt súbory začínajúce Profil_, ProfilZ_ a ProfilM_, alebo súbor
Zoznam_Profilov_Formatovania_Dokumentov.txt). Pokiaľ áno, tak tento súbor skopírujeme do zálohovacieho
adresára.
REM Export zoznamu a definície profilov do vybraného adresára
sub export_profilov
 dim sNovyAdresarURL$ : sNovyAdresarURL$=ZadajAdresar
 dim sSubor$, sNovy$, sPom$
 dim sStaryAdresarURL$
 
 sStaryAdresarURL=basiclibraries.getLibraryLinkURL("JP_typografia") ' Adresár, kde je rozšírenie nainštalované
 sStaryAdresarURL=left(sStaryAdresarURL,len(sStaryAdresarURL)-10)
 
 on error resume next
 if sNovyAdresarURL<>sStaryAdresarURL then ' Nemôžeme exportovať do interného adresára rozšírenia
  sSubor=dir(sStaryAdresarURL, 0)
  While sSubor<>"" ' Pre všetky súbory zo zadaného adresára
   sPom=sStaryAdresarURL+sSubor
   sNovy=sNovyAdresarURL+sSubor
   ' Kopírovanie zoznamu profilov
   if sSubor="Zoznam_Profilov_Formatovania_Dokumentov.txt" then Filecopy sPom, sNovy
   ' Kopírovanie definície profilov
   if left(sSubor,7)="Profil_" then Filecopy sPom, sNovy
   ' Kopírovanie definície zliatkov profilov
   if left(sSubor,8)="ProfilZ_" then Filecopy sPom, sNovy
   ' Kopírovanie definície reťazcov profilov
   if left(sSubor,8)="ProfilM_" then Filecopy sPom, sNovy
   sSubor=dir() ' Ďalší súbor
  Wend
 endif
 VypisSpravu(25, "")
end sub
Pri importe zálohovaných súborov je situácia už zložitejšia – nejde totiž iba o kopírovanie súborov, ale zároveň sa musia názvy profilov vložiť (ak tam nie sú) aj do ich zoznamu v dialógu. Preto si ako prvú uvedieme funkciu, pomocou ktorej budeme testovať, či sa zadaný názov v dialógu nachádza, a pokiaľ nie, tak ho tam (v abecednom usporiadaní) vložíme.
REM Procedúra pre pridanie novej položky do zoznamu profilov pre import
sub Import_profil_Vloz (sNovy as string)
 dim oZoznam : oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu
 dim bExistuje as boolean : bExistuje=false
 dim iPoloha : iPoloha=0
 
 if sNovy<>"" then ' Ak je zadaný názov
  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.Novy_profil.Text=""
   zapis_nazvy_profilov
  end if
 end if
end sub
Teraz už môžeme pristúpiť k vlastnému importu profilov. Podobne ako pri exporte aj teraz musíme ošetriť prípad, že používateľ zadá ako zálohovací adresár adresár rozšírenia – nie je možné robiť import z adresára, do ktorého importujeme. Až po tomto ošetrení môžeme pristúpiť k vlastnému importu.
Na rozdiel od exportu už nemôžeme iba jednoducho prechádzať adresár so zálohou, pretože musíme vkladať názvy profilov
do dialógu. Z tohto dôvodu sa musí najprv v adresári so zálohou otvoriť súbor
Zoznam_Profilov_Formatovania_Dokumentov.txt. Následne, podľa jeho položiek, sa budú kopírovať vlastné
nastavenia (txt súbory začínajúce Profil_, ProfilZ_ a ProfilM_)
profilu a, samozrejme, pridávať ich názvy do zoznamu v dialógu.
REM Import (pridanie) zoznamu a definície profilov z vybraného adresára
sub import_profilov
 dim sStaryAdresarURL$ : sStaryAdresarURL$=ZadajAdresar
 dim sNazov$ : sNazov=sStaryAdresarURL+"Zoznam_Profilov_Formatovania_Dokumentov.txt" 
 dim sSubor$, sNovy$, sPom$, sTest$, sProfil$
 dim sNovyAdresarURL$
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 
 sNovyAdresarURL=basiclibraries.getLibraryLinkURL("JP_typografia") ' Adresár, kde je rozšírenie nainštalované
 sNovyAdresarURL=left(sNovyAdresarURL,len(sNovyAdresarURL)-10) 
 
 on error resume next
 
 if sNovyAdresarURL<>sStaryAdresarURL then ' Nemôžeme importovať z interného adresára rozšírenia
  ' Ak nastavovací súbor existuje, importujeme profily, ktoré obsahuje
  if fileexists(sNazov) then
   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
    sProfil= trim(inFile.readLine) ' namiesto Line Input #subor, riadok
    if sProfil<>"" then
     Import_profil_Vloz(sProfil)
     sSubor=dir(sStaryAdresarURL, 0)
     While sSubor<>"" ' Pre všetky súbory zo zadaného adresára
      sPom=sStaryAdresarURL+sSubor
      sNovy=sNovyAdresarURL+sSubor
      ' Kopírovanie definície profilu
      if sSubor="Profil_"+sProfil+".txt" then Filecopy sPom, sNovy
      ' Kopírovanie definície zliatkov profilu
      if sSubor="ProfilZ_"+sProfil+".txt" then Filecopy sPom, sNovy
      ' Kopírovanie definície reťazcov profilov
      sTest="ProfilM_"+sProfil
      if left(sSubor,len(sTest))=sTest then Filecopy sPom, sNovy
      sSubor=dir() ' Ďalší súbor
     Wend
    endif
   loop 
   ' Zatvorenie definičného súboru - namiesto close #subor
   inStream.closeInput
   inFile.closeInput
  end if
 end if
 VypisSpravu(26, "")
end sub
Otváranie dialógov
Ako posledné funkcie pre prácu s dialógmi sa musia uviesť procedúry pre ich otváranie, čím dokončíme procedúry modulu
Profily_funkcie. Ako prvotná sa spúšťa procedúra Nastav_Profil_Formatovania, ktorá obsahuje štandardné
funkcie jazyka OpenOffice.org Basic pre otváranie (CreateUnoDialog), zatváranie (dispose) a
vlastné spúšťanie (Execute) dialógov. Pred vlastným otvorením dialógov sa však musí sprístupniť
knižnica, kde sú definované (DialogLibraries.LoadLibrary), inak by OpenOffice.org zhavaroval.
Pravdaže, súčasťou makra je aj volanie funkcií pre jazykovú lokalizáciu dialógu a jeho počiatočná inicializácia (nastavenie zoznamu profilov).
REM Procedúra pre spustenie dialógu pre prácu s profilmi
sub Nastav_Profil_Formatovania
 dim nazov$
 DialogLibraries.LoadLibrary("JP_typografia")
 oDlg=CreateUnoDialog(DialogLibraries.JP_typografia.Dialog_Profily)
 nazov=inicializacny_subor("JP_Dialog_Profily_"+Jazyk_OOo) ' Súbor s jazykovou lokalizáciou
 Set_jazyk_dialogu(oDlg, nazov, "Dialog_Profily") ' Nastavenie jazyka dialógu
 init_dialog_profily
 if oDlg.Execute()=1 then
  zapis_nazvy_profilov
  JP_aktualny_profil=oDlg.model.Zoznam_profilov.text
  Citaj_definiciu_profilu
 endif
 if JP_aktualny_profil="" then
  JP_aktualny_profil="Default"
  Citaj_definiciu_profilu
 end if 
 oDlg.dispose()
end sub
Po výbere zmeny profilu v dialógu sa musí otvoriť nový dialóg, kde však už musíme poznať profil, ktorý meníme. Pretože pri definícii makra, ktoré sa volá pri stlačení príslušného tlačidla, nie je možné zadať parameter, musia sa volať prechodné funkcie, ktoré zistia profil, ktorý bol v zozname profilov vybraný a túto hodnotu použijú ako parameter pre vlastné funkcie, pomocou ktorých sa definujú príslušné profily.
REM Procedúra pre zmenu definície profilu sub Zmen_profil_Initiated pom_text=oDlg.model.Zoznam_Profilov.Text Spusti_dialog_formatovania(pom_text) end sub REM Procedúra pre zmenu definície zliatkov sub Zmen_zliatky_Initiated pom_text=oDlg.model.Zoznam_Profilov.Text Spusti_dialog_zliatky(pom_text) end sub
Na záver nám nezostáva už nič iné, iba ukázať procedúru pre volanie dialógu, v ktorom sa nastavujú príslušné profily.
Pretože sme to neuviedli pred chvíľou, zmienime sa teraz trochu viac o metóde (Execute) pre vlastné
spúšťanie dialógov.
 Finální vzhled okna Formátování
dokumentů
Finální vzhled okna Formátování
dokumentů
Táto metóda nielenže otvorí dialóg, ale zároveň vracia hodnotu 1, ak bol dialóg zatvorený tlačidlom typu
OK, čím môžeme veľmi ľahko otestovať, či si používateľ želá nastavenia uložiť – a ak áno, tak ich aj
uložíme.
Metóda Execute má však aj svoju (možno) tienistú stránku – pokiaľ pomocou nej otvoríme dialóg, nie je
možné pokračovať v práci s aktuálnym dokumentom (jedno v akom module OpenOffice.org). Našťastie existujú spôsoby, ako
sa s týmto problémom vysporiadať, ale o tom si budeme hovoriť až v niektorých z budúcich pokračovaní seriálu o
programovaní makier.
REM Procedúra pre spustenie dialógu pre nastavenie parametrov profilu
sub Spusti_dialog_formatovania (profil as string)
 dim oDialog as object
 dim sAktualnyProfil$
  
 if profil="" then profil="Default"
 sAktualnyProfil=JP_aktualny_profil ' Odpamätanie aktuálneho profilu
 JP_aktualny_profil=profil ' Nastavenie definovaného profilu (pre názvy súborov)
 
 oDialog=CreateUnoDialog(DialogLibraries.JP_typografia.Dialog_Formatovanie)
 
 nazov=inicializacny_subor("JP_Dialog_Formatovanie_"+Jazyk_OOo) ' Súbor s jazykovou lokalizáciou
 Set_jazyk_dialogu(oDialog, nazov, "Dialog_Formatovanie") ' Nastavenie jazyka dialógu
 nazov=inicializacny_subor("Profil_"+profil) ' Súbor s definíciou profilu
 Set_priznaky_dialogu(oDialog, nazov) ' Nastavenie príznakov profilu
 
 if oDialog.Execute()=1 then
  nazov=inicializacny_subor("Profil_"+profil) ' Súbor s definíciou profilu
  Uloz_definiciu_profilu(oDialog, nazov) ' Uloženie príznakov profilu  
 endif
 JP_aktualny_profil=sAktualnyProfil ' Vrátenie aktuálneho profilu na pôvodnú hodnotu
 oDialog.dispose()
end sub
 
 Pri nastavovaní používateľských profilov je potrebné, aby sa príslušné nastavenia prejavili aj pri
otvorení dialógových okien a, samozrejme, aj ukladali do definičných súborov. Preto sa v dnešnom pokračovaní
typografických makier zameriame na tieto funkcie.
Pri nastavovaní používateľských profilov je potrebné, aby sa príslušné nastavenia prejavili aj pri
otvorení dialógových okien a, samozrejme, aj ukladali do definičných súborov. Preto sa v dnešnom pokračovaní
typografických makier zameriame na tieto funkcie.












