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ů
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ů
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.











