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