Hoci OpenOffice.org umožňuje vkladať do dokumentu aktuálny dátum a čas, nie vždy tieto možnosti vyhovujú tomu, čo požadujete. Preto si pripravíme niekoľko funkcií, pomocou ktorých dokážeme vkladať dátum nielen v niektorom z preddefinovaných formátov, ale navyše pomocou dialógu si pripravíme možnosti pre vloženie týchto údajov v nami požadovanom formáte.
Za týmto účelom si musíme, samozrejme, určiť formátovacie značky – hodina (h), minúta (m), sekunda (s), deň (d), mesiac číslom (c), priamy názov mesiaca (n), skloňovaný názov mesiaca (a) a rok (r). Aby formátovacie možnosti boli čo najširšie, umožníme zadávať napr. deň v taktom počte cifier, koľko skutočne obsahuje (d), alebo povinne v dvojcifernom tvare (dd). Pravdaže, toto umožníme nielen pre deň, ale aj pre ostatné číselné údaje, pričom pre rok umožníme zápis od jednociferného až po štvorciferné číslo.

Aby sme mohli do dátumových a časových údajov vkladať aj písmená, ktoré sme určili pre formátovanie, toto umožníme tak, že pokiaľ sa pred nimi bude nachádzať znak opačnej lomky, vložíme značku ako písmeno (samotnú opačnú lomku potom vložíme jej dvojitým zadaním).
Ako obvykle, dátumy umožníme vkladať v rôznych jazykoch (automaticky podľa jazyka dokumentu) a to ako do textových dokumentov, tak aj do zošitov modulu Calc. Preto si v prvej časti predstavíme funkcie pre jazykovú lokalizáciu dialógového okna, v ktorom budeme definovať formát vkladaného dátumu a času a názvy mesiacov pre rôzne jazyky (okrem slovenčiny, ktorá je obsiahnutá priamo v makre).
dim oDlg as object
dim sJazyk$ ' Jazyk dokumentu
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=lcase(left(MasterKey.getByName("ooLocale"),2)) '"sk", "cs", …
end function
REM Procedúra pre nastavenie jazyka dialógu
Sub Set_jazyk_dialogu(oDlg, 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
oDlg.model.getByName("Jazyk").setpropertyvalue("Label","Jazyk: "+sJazyk)
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 = trim(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))
select case premenna
case sZahlavie
oDlg.Title=definicia
case "Pomoc1"
oDlg.model.getByName("Pomoc").setpropertyvalue("Label",definicia+chr$(&H0A))
case "Pomoc2", "Pomoc3", "Pomoc4", "Pomoc5", "Pomoc6", "Pomoc7", "Pomoc8", "Pomoc9"
pom=oDlg.model.getByName("Pomoc").getpropertyvalue("Label")
oDlg.model.getByName("Pomoc").setpropertyvalue("Label",pom+chr$(&H0A)+definicia)
case "Jazyk"
oDlg.model.getByName("Jazyk").setpropertyvalue("Label",definicia+" "+sJazyk)
case else
oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
end select
end if
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end sub
REM Funkcia pre načítanie názvov mesiacov z aktuálneho dokumentu alebo z definičného súboru
function nacitaj_nazvy_mesiacov as string
dim dokument, povodny as object
dim vysledok$, sSubor$
dim sf, inStream, inFile ' Pre čítanie z definičného súboru
vysledok=""
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
povodny=dokument.getCellByPosition(0,0) ' Aktuálna bunka
sJazyk=left(povodny.CharLocale.Language,2) ' Jazyk bunky (sk, cs, …)
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then ' Ak sme v textovom dokumente
kurzor= ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
povodny=kurzor.getstart() ' Odpamätanie pozície
kurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
sJazyk=left(kurzor.CharLocale.Language,2) ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, …)
if sJazyk<>"sk" then ' Pre slovenčinu nenačítavame údaje zo súboru
do ' Prejdeme súbor a vyhľadáme definície mesiacov
kurzor.gotoStartOfLine(false)
kurzor.gotoEndOfLine(true)
riadok=trim(kurzor.getstring())
kurzor.collapseToEnd()
if instr("m01=m02=m03=m04=m05=m06=m07=m08=m09=m10=m11=m12=a01=a02=a03=a04=a05=a06=a07=a08=a09=a10=a11=a12=",left(riadok,4))>0 and riadok<>"" then
if vysledok="" then
vysledok=riadok
else
vysledok=vysledok+chr(13)+riadok
endif
endif
loop while kurzor.goRight(1,false)
kurzor.gotoRange(Povodny,false)
end if
if vysledok="" then ' Ak nie je definícia jazykov v súbore, potom ju načítame z definičného súboru (ak existuje)
sSubor="JP_date_"+sJazyk+".txt"
kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
sNazov=left(kde,len(kde)-10)+sSubor ' Súbor s definíciou mesiacov
if fileexists(sNazov) then ' Ak súbor s mesiacmi 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" ' 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 vysledok="" then
vysledok=riadok
else
vysledok=vysledok+chr(13)+riadok
endif
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end if
end if
nacitaj_nazvy_mesiacov=vysledok
end function
REM Funkcia volaná pri stlačení tlačidla "Ulož"
sub uloz_initiated
' Uloženie definície mesiacov do súboru
dim premenna, definicia, riadok as string
dim prepisat as boolean
dim tt1, tt2, tt3 as string
dim sf, inStream, inFile, outStream, outFile ' Pre čítanie a zápis do lokalizačného súboru
riadok=trim(oDlg.model.Nazvy.Text)
if (sJazyk="sk") or (riadok="") then exit sub ' Ak sme nič nezadali a pre slovenčinu nemeníme nastavenia názvov mesiacov
sSubor="JP_date_"+sJazyk+".txt"
kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
sNazov=left(kde,len(kde)-10)+sSubor ' Súbor s definíciou mesiacov
prepisat=true ' Predpokladáme, že definičný súbor s názvami mesiacov neexistuje
if fileexists(sNazov) then ' Ak súbor existuje, tak sa opýtame, či prepísať
prepisat=prepisat_subor(sSubor)
endif
if prepisat then
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
outFile.writeString(riadok)
outStream.closeOutput
outFile.closeOutput
endif
end sub
REM Funkcia volaná pri stlačení tlačidla "Nastav"
sub nastav_initiated
' Uloženie definície formátu mesiaca do súboru
dim premenna, definicia, riadok as string
dim prepisat as boolean
dim tt1, tt2, tt3 as string
dim sf, inStream, inFile, outStream, outFile ' Pre čítanie a zápis do lokalizačného súboru
riadok=trim(oDlg.model.Pole.Text)
if riadok="" then exit sub ' Ak nič nezadáme, nemeníme definície
sSubor="JP_setup_"+sJazyk+".txt"
kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
sNazov=left(kde,len(kde)-10)+sSubor ' Súbor s definíciou dormátu
prepisat=true ' Predpokladáme, že definičný súbor s definíciou formátu mesiaca neexistuje
if fileexists(sNazov) then ' Ak súbor existuje, tak sa opýtame, či prepísať
prepisat=prepisat_subor(sSubor)
endif
if prepisat then
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
outFile.writeString(riadok)
outStream.closeOutput
outFile.closeOutput
endif
end sub
REM Procedúra pre otvorenie dialógu pre nastavenie mesiacov a formátu
sub spusti_dialog
DialogLibraries.LoadLibrary("JP_date_time")
oDlg=CreateUnoDialog(DialogLibraries.JP_date_time.DialogDateTime)
kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
nazov=left(kde,len(kde)-10)+"JP_date_time_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
oDlg.model.Nazvy.Text=trim(nacitaj_nazvy_mesiacov) ' Zistí aj jazyk dokumentu
oDlg.model.Pole.Text=trim(nacitaj_format(sJazyk))
Set_jazyk_dialogu(oDlg, nazov, "DialogDateTime") ' Nastavenie jazyka dialógu
oDlg.execute() ' Spustenie dialógu
oDlg.dispose() ' Zatvorenie dialógu
end sub