Typografické úpravy textu – načítavanie a ukladanie nastavení profilov

programovani.png 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.  

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

Dialogové okno Vybrat cestuDialogové okno Vybrat cestu

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ů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
(Jako ve škole) Průměr: 1.00 | Hodnotilo: 3
 

Komentáře

user avatar Mirda
Odpovědět
Typografické úpravy textu – načítavanie a ukladanie nastavení profilov
4. 10. 2011, 21:22:36
nevíte někdo kde si mužu stahnou nevím jak jse to jmenuje ale asi dokument nebo psani a mne to nejde na instalovat
user avatar Petr Valach
Odpovědět
Re:Typografické úpravy textu – načítavanie a ukladanie nastavení profilov
4. 10. 2011, 22:36:36
Promiňte my nehovořit jazyk váš kmen.

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
 
 
woo jaw demo hz