Na portáli inet.sk bolo doteraz uverejnených prvých desať dielov seriálu o typografických makrách „Typografické úpravy textu“, ktoré vychádzajú z rozšírenia JP Typografia. V týchto dieloch sme vás zoznámili so všeobecnými funkciami, funkciou pre odstraňovanie viacnásobných a nadbytočných medzier, funkciami pre nahrádzanie zalomiteľných medzier za nezalomiteľné, funkciami pre vkladanie nezalomiteľných medzier priamo počas písania textu či funkciami pre úpravu kerningu a šírky znakov.
V dnešnom pokračovaní tohto seriálu sa zameriame na prácu s dialógmi – a to konkrétne na funkcie pre jazykovú lokalizáciu dialógov a funkcie, v ktorých budeme pracovať so zoznamom profilov, ktoré sú definované v dialógovom okne. Týmto sa zároveň čiastočne dotkneme problematiky práce s externými súbormi, do ktorých sa ukladajú používateľské nastavenia.
Lokalizačné súbory
Pre nastavovanie jazykových lokalizácií dialógov budeme používať externé súbory uložené v UTF-8 kódovaní. Toto riešenie má tú výhodu, že bez potreby akéhokoľvek ďalšieho programovania či zásahu do dialógov v makrách sa dokáže do rozšírenia pridať ďalšia jazyková lokalizácia – súbory stačí skopírovať a, spolu s ostatnými časťami rozšírenia, uložiť do výstupného OXT súboru.
Vlastný definičný súbor lokalizácie je definovaný nasledovným spôsobom:
Dialog_Formatovanie=Formátování dokumentů FrameControl1=Náhrada zalomitelných mezer za nezalomitelné OptionButton1=Nahradit mezery před a za předložkami, tituly, spojkami...
Pred znakom „rovná sa“ sa nachádza názov premennej dialógu, za znakom „rovná sa“ vlastný jazykovo lokalizovaný popis. Pozor, OpenOffice.org pri premenných v dialógoch rozoznáva veľké a malé písmená, a preto musí byť aj ich definícia v lokalizačnom súbore presná.
Toľko k úvodu a teraz už môžeme uviesť okomentované zdrojové texty makier, ktoré sú uložené v module Profily_funkcie.
Zistenie jazyka rozhrania OpenOffice.org
Aby ste mohli nastaviť jazyk dialógu, musíte najprv zistiť jazyk pracovného rozhrania OpenOffice.org, na čo je určená
funkcia Jazyk_OOo. Pretože OpenOffice.org vracia jazyk rozhrania v rôznom tvare (napr. „cs“ pre češtinu,
ale „en-US“ pre americkú angličtinu), je vo funkcii tento reťazec skracovaný iba na prvé dve písmená, lebo vo väčšine
prípadov nie je potrebné uvažovať s rozdielnymi „angličtinami“ a pod. Niektoré funkcie, ktoré dnes uvedieme, pracujú
so spoločnými premennými, a preto musia makrá začať ich definíciou.
dim oDlg as object
global JP_aktualny_profil as string ' Aktuálny profil (platí pre všetky funkcie vrátane on-line vkladania)
dim oVstupy as object
REM Funkcia pre zistenie jazyka OO.o
function Jazyk_OOo as string
dim ConfigProvider, MasterKey as object
dim NodePath(0) as new com.sun.star.beans.PropertyValue
NodePath(0).Name = "nodepath"
NodePath(0).Value = "org.openoffice.Setup/L10N/"
ConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
MasterKey = ConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", NodePath())
Jazyk_OOo = left(trim(MasterKey.getByName("ooLocale")),2) '"sk", "cs", ...
end function
Nastavenie jazyka dialógu
Z programátorského hľadiska je pri nastavovaní jazyka dialógu potrebné rozoznávať dve položky – nadpis dialógu a
vlastné prvky dialógu, pretože sa nastavujú rozdielne – nadpis sa nastavuje pomocou metódy Title, kým
prvky pomocou metódy Label. Zároveň je vo funkcii Set_jazyk_dialogu ukázané, ako sa pracuje
s externými textovými súbormi v špecifikovanom formáte (v tomto prípade UTF-8). Funkcia je naprogramovaná tak, aby sa
pomocou nej dali jazykovo lokalizovať rôzne dialógy.
Aby ste mohli do lokalizačného súboru zadať napr. aj meno prekladateľa či pripraviť jeden lokalizačný súbor aj pre
viacero dialógov, musíte ošetriť chyby (zadaný prvok dialógu sa vo vlastnom dialógu nemusí nachádzať). Na tento účel
je vo funkcii použitý príkaz on error resume next, ktorým sa určuje, že v prípade chyby ju
OpenOffice.org ignoruje a makro pokračuje ďalej tak, ako by chyba nevznikla.
Pretože pri programovaní nemôžete vedieť, do akého adresára OpenOffice.org rozšírenie nainštaluje, musíte programovo
zistiť aj cestu k príslušnému lokalizačnému súboru. Na tento účel je určená funkcia inicializacny_subor.
Metóda getLibraryLinkURL, ktorú je na to vhodné použiť, vracia cestu k súboru script.xlb
(ktorý je súčasťou makier rozšírenia) vrátane desaťznakového názvu tohto súboru, a preto sa musí pred použitím
vrátený reťazec skrátiť o desať znakov.
REM Procedúra pre nastavenie jazyka dialógu
Sub Set_jazyk_dialogu(oDlgj, sNazov, sZahlavie)
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))
if premenna=sZahlavie then
oDlgj.Title=definicia
else
oDlgj.model.getByName(premenna).setpropertyvalue("Label",definicia)
endif
end if
loop
' Zatvorenie definičného súboru - namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end sub
REM Funkcia, ktorá vráti cestu k pracovnému TXT súboru
function inicializacny_subor (nazov_suboru as string) as string
REM Funkcia vracia cestu s názvom inicializačného súboru
kde=basiclibraries.getLibraryLinkURL("JP_typografia") ' Adresár, kde je rozšírenie nainštalované
inicializacny_subor=left(kde,len(kde)-10)+nazov_suboru+".txt" ' Súbor s definíciou profilu, ...
end function
Ukladanie a načítanie zoznamu profilov
Rozšírenie pre typografické úpravy ich prevádza na „jedno kliknutie“, pričom rôzne spôsoby úprav je možné definovať
do rôznych profilov. Z tohto hľadiska je potrebné programovo ukladať a zároveň načítavať ich zoznam pri definícii
profilov. Z programátorského hľadiska je vo funkciách zapis_nazvy_profilov a
init_dialog_profily dôležitá práca so zoznamom dialógu – získanie a pridávanie položiek zoznamu.
REM Procedúra pre uloženie zoznamu profilov z dialógu do pracovného súboru
sub zapis_nazvy_profilov
dim sf, outStream, outFile ' Pre zápis do súboru
dim sNazov$, kde$
dim oZoznam: oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu
sNazov=inicializacny_subor("Zoznam_Profilov_Formatovania_Dokumentov")
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"" then oZoznam.AddItem(riadok,oZoznam.ItemCount) ' Ak nie je záznam prázdny, pridáme ho do dialógu
loop
' Zatvorenie definičného súboru - namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
if JP_aktualny_profil="" then JP_aktualny_profil="Default" ' Ak nie je nastavený aktuálny profil, nastavíme ho na "Default"
oZoznam.Text=JP_aktualny_profil ' V zozname profilov zobrazíme názov aktuálneho profilu
end sub
Pridávanie a mazanie položiek zo zoznamu profilov
Pri vlastnej práci so zoznamom profilov je potrebné do nich pridávať, alebo z nich mazať jednotlivé položky. Na tento
účel sú určené funkcie Vloz_profil_Initiated a Vymaz_profil_Initiated. Pri tejto práci je
vhodné zoznam udržiavať utriedený, aby sa v ňom ľahšie orientovalo, a preto je vo funkcii
Vloz_profil_Initiated naprogramovaný aj jednoduchý triediaci mechanizmus (cyklus for i=0 to
oZoznam.ItemCount-1 ' Zistíme, či záznam existuje a zároveň zistíme abecednú polohu nového záznamu.). Okrem
toho sa vo funkcii Vymaz_profil_Initiated zoznámite aj s ďalšou programátorskou funkciou pre prácu so
zoznamom – vymazanie položky.
REM Procedúra pre pridanie novej položky do zoznamu profilov
sub Vloz_profil_Initiated
dim oZoznam : oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu
dim sNovy$ : sNovy=trim(oDlg.model.Novy_profil.Text) ' Nový záznam
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
KopirujSuboryProfilu(sNovy) ' Kopírovanie definičných súborov profilu Default do nového profilu
else
VypisSpravu(21, sNovy)
end if
else
VypisSpravu(23, "")
end if
end sub
REM Procedúra pre vymazanie aktuálnej položky zo zoznamu profilov
sub Vymaz_profil_Initiated
dim oZoznam : oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu
dim sMazany$ : sMazany=trim(oZoznam.Text)
if lcase(sMazany)<>"default" then
for i=0 to oZoznam.ItemCount-1
if sMazany=trim(oZoznam.Items(i)) then
if VypisSpravu(27,sMazany)=6 then
oZoznam.removeItems(i,1)
zapis_nazvy_profilov
VymazSuboryProfilu(sMazany) ' Vymazanie definičných súborov profilu
if JP_aktualny_profil=sMazany then JP_aktualny_profil="Default" ' Ak sme vymazali aktuálny profil, nastavíme aktuálny profil "Default"
endif
exit sub
endif
next i
else
VypisSpravu(24, "")
endif
end sub
Na portáli OpenOffice.cz začíname so seriálom o programovaní makier a rozšírení v OpenOffice.org. Tento seriál je
pokračovaním a náhradou seriálu „Makrá v OpenOffice.org“, ktorý doteraz vychádzal na portáli inet.sk, a preto naň
plynule nadviažeme a budeme pokračovať s typografickými makrami.








