Makrá v OpenOffice.org: Vkladanie dátumu a času podľa vlastného formátu (3)

Július Pastierik  /  20. 04. 2011, 00:00

V poslednom pokračovaní makier pre vkladanie dátumu si ukážeme funkcie pre analýzu zadefinovanej štruktúry a vlastné vloženie takto definovaného dátumu a času.

 

Ako čerešničku na torte si na záver ukážeme makrá pre analýzu nami zadefinovanej štruktúry dátumu času a jej vlastné vloženie do dokumentu.

 

Rem Funkcia, ktorá vracia jazyk pracovného rozhrania 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(MasterKey.getByName("ooLocale"),2) '"sk", "cs", …
end function

function prepisat_subor(sSubor$) as boolean
 dim tt1, tt2, tt3, sNazov as string
 tt1="Súbor '"
 tt2="' existuje. Prepísať?"
 tt3="Názvy mesiacov"
 dim sf, inStream, inFile ' Pre čítanie a zápis do lokalizačného súboru
 
 kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
 sNazov=left(kde,len(kde)-10)+"JP_otazka_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 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))
    select case premenna
     case "subor"
      tt1=definicia+" '"
     case "existuje"
      tt2="' "+definicia
     case "nadpis"
      tt3=definicia
    end select
   end if
  loop
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
 prepisat_subor=(msgbox(tt1+sSubor+tt2,52,tt3)=6)
end function

REM Funkcia pre načítanie definície formátu
function nacitaj_format(jazyk as string) as string
 dim sSubor$, riadok$
 dim sf, inStream, inFile ' Pre čítanie zo súboru
 
 riadok="dd.cc.rrrr"
 sSubor="JP_setup_"+jazyk+".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
 if fileexists(sNazov) then ' Ak 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
  riadok=trim(inFile.readLine) ' namiesto Line Input #subor, riadok
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
 nacitaj_format=riadok
end function

REM Funkcia pre nastavenie vkladaného dátumu a času podľa formátu
function nastav_DT(Jazyk$, Datum$, Cas$) as string
 dim sFormat$ : sFormat=nacitaj_format(Jazyk)
 dim sVysledok$, sDen$, sMesiac$, sRok$, sHodina$, sMinuta$, sSekunda$
 dim znak$, posledny$, definicia$, co$
 dim mmc%
 
 sDen=left(Datum,2)
 sMesiac=mid(Datum,4,2)
 sRok=right(Datum,4)
 sHodina=left(Cas,2)
 sMinuta=mid(Cas,4,2)
 sSekunda=right(Cas,2)
 
 sVysledok=""
 posledny=""
 definicia=""
 REM Analýza formátu
 for i=1 to len(sFormat)+1
  if i=len(sFormat)+1 then ' Sme "za", musíme zapísať definíciu
   znak=""
  else
   znak=(mid(sFormat,i,1)) ' i-ty formátovací znak
  endif
  if lcase(znak)<>lcase(posledny) and posledny<>"" then ' Zmena znaku, je potrebné zapísať definíciu
   co=lcase(left(definicia,1)) ' Prvý znak definície určuje, čo vkladáme
   select case co
    case "h" ' Hodina: hh (h)
     if (len(definicia)=1) and (left(sHodina,1)="0") then
      sVysledok=sVysledok+right(sHodina,1)
     else
      sVysledok=sVysledok+sHodina
     endif
    case "m" ' Minúta: mm (m)
     if (len(definicia)=1) and (left(sMinuta,1)="0") then
      sVysledok=sVysledok+right(sMinuta,1)
     else
      sVysledok=sVysledok+sMinuta
     endif
    case "s" ' Sekunda: ss (s)
     if (len(definicia)=1) and (left(sSekunda,1)="0") then
      sVysledok=sVysledok+right(sSekunda,1)
     else
      sVysledok=sVysledok+sSekunda
     endif
    case "d" ' Deň: dd (d)
     if (len(definicia)=1) and (left(sDen,1)="0") then
      sVysledok=sVysledok+right(sDen,1)
     else
      sVysledok=sVysledok+sDen
     endif
    case "c" ' Mesiac číslom: cc (c)
     if (len(definicia)=1) and (left(sMesiac,1)="0") then
      sVysledok=sVysledok+right(sMesiac,1)
     else
      sVysledok=sVysledok+sMesiac
     endif
    case "n" ' Mesiac názov: n
     mmc=val(sMesiac)
     sVysledok=sVysledok+Mesiac_zo_suboru(mmc, true, Jazyk)
    case "a" ' Mesiac skloňovaný: a
     mmc=val(sMesiac)
     sVysledok=sVysledok+Mesiac_zo_suboru(mmc, false, Jazyk)
    case "r" ' Rok: rrrr (rrr, rr, r)
     sVysledok=sVysledok+right(sRok,len(definicia))
    case "\" ' Pred znakom bola opačná lomka, znak pridávame priamo – nie je to formátovacia značka
     if len(definicia)>1 then ' Boli zadané opakované opačné lomky – vkladáme znak lomky
      sVysledok=sVysledok+"\"
     endif
     if len(definicia)<>2 then ' Bola zadaná jedna alebo tri a viac lomiek – vkladáme aj znak za poslednou lomkou
      sVysledok=sVysledok+znak ' Vkladáme znak za lomkou
      znak="" ' Posledný znak ignorujeme
     endif
    case else
     sVysledok=sVysledok+definicia
   end select
   definicia=""
  end if
  definicia=definicia+znak ' Pridanie znaku k definícii
  posledny=znak
 next i
 nastav_DT=sVysledok
end function

REM Funkcia pre vloženie dátumu a času podľa používateľskej definície
sub Vloz_Datum_pouzivatel
 dim dokument, bunka as object
 dim teraz, datum, cas, jazyk, format as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 datum=left(teraz,i-1) ' Dátum
 cas=right(teraz,len(teraz)-i) ' Čas
 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
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  jazyk=left(bunka.CharLocale.Language,2) ' Jazyk bunky (sk, cs, …)
  bunka.string=nastav_DT(jazyk,datum,cas) ' Vloženie dátumu ako reťazca
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
  dokument=ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
  dokument.collapseToEnd() ' Skočíme na koniec prípadne označeného textu a zrušíme označenie
  jazyk=left(dokument.CharLocale.Language,2) ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, …)
  vloz_do_dokumentu(nastav_DT(jazyk,datum,cas))
 endif
end sub

REM Funkcia pre zápis názvov mesiacov z aktuálneho dokumentu do jazykového súboru
sub zapis_definiciu_jazyka
end sub

Neprehliadnite: