Július Pastierik / 05. 01. 2010, 10:49
Potrebujete v OpenOffice.org zmeniť rozostup (kerning) znakov, či nastaviť šírku písma tak, aby text bol pekne opticky vysádzaný? Naprogramujte si makro pre nastavenie rozostupu a šírky znakov.
V dnešnom pokračovaní seriálu o programovaní makier v OpenOffice.org si ukážeme makro, pomocou ktorého dokážete opravovať nesprávny kerning znakov (žiaľ, je to neduh aj komerčných fontov, hlavne pri znakoch s diakritikou) a nastaviť šírku znakov tak, aby v riadku neboli zbytočne veľké medzery.
Za týmto účelom si najprv vytvoríme dialógové okno, v ktorom zadefinujeme dve vstupné číselné položky – jednu pre nastavenie kerningu a druhú pre nastavenie šírky znakov. Aby sme mali väčšiu možnosť v nastavovaní, budeme v makre pracovať s označeným textom, ale pritom budeme môcť ešte aj v ňom vyberať znaky, pre ktoré chceme nastaviť zmeny – zalomiteľné či nezalomiteľné medzery, priamo zadaný reťazec alebo všetky znaky výberu. V prípade nastavovania šírky si zadefinujeme aj možnosť definície koeficientom alebo priamym nastavením.
Aby sa s makrom ľahšie pracovalo, budeme chcieť, aby sme dialógové okno nemuseli zatvárať pri posune či inej práci s vlastným textom dokumentu. Z tohto dôvodu nemôžeme použiť bežný spôsob pre otvorenie dialógového okna dlg.Execute()
, ktorý sme si predstavili už v minulých dieloch tohto seriálu, ale dialóg iba zviditeľníme – dlg.setVisible(true)
.
Ďalej musíme v makre zabezpečiť čakaciu slučku, v ktorej ponecháme časový priestor, počas ktorého môžeme pracovať vo vlastnom texte. Pre začiatok môžeme skúsiť nastaviť hodnotu 0,5 sekundy a podľa praktických skúseností ju následne upraviť tak, aby čo najviac vyhovovala našim predstavám.
Aby sme dialóg dokázali uzavrieť, nemôžeme v dialógu využiť klasické tlačidlá typu „OK“ alebo „Cancel“, ale musíme si vytvoriť tlačidlo, pomocou ktorého zavoláme funkciu, v ktorej dialógové okno zneviditeľníme – dlg.setVisible(false)
. Pomocou toho, či je dialógové okno vidíme alebo nie dokážeme riadiť aj už spomínanú čakaciu slučku – stačí, ak budeme testovať hodnotu dlg.isVisible()
. Pravdaže, na konci musíme dialóg, hoci je neviditeľný, klasicky zatvoriť pomocou dlg.dispose()
.
To by mohlo na vysvetlenie dnešného makra stačiť, pretože, ako obvykle, zdrojový text makra je dostatočne okomentovaný a na zosnímaných obrazovkách je ukážka, ako makro funguje.
dim oJP_kerning_Zaciatok, oJP_kerning_Koniec as object ' Odpamätanie začiatku a konca vybraného textu
dim dlg as object
REM Makro pre odpamätanie pôvodne označeného textu
sub Odpamataj_vyber
dim kurzor as object
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
oJP_kerning_Zaciatok=kurzor.getstart() ' Odpamätanie začiatku označeného textu
oJP_kerning_Koniec=kurzor.getend() ' Odpamätanie konca označeného textu
end sub
REM Makro pre nastavenie pôvodne označeného textu
sub Nastav_vyber
dim kurzor as object
on error resume next
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
kurzor.gotoRange(oJP_kerning_Zaciatok,false) ' Skočíme na začiatok pôvodne označeného textu
kurzor.gotoRange(oJP_kerning_Koniec,true) ' a skočením na koniec ho označíme
end sub
REM Makro pre vyhladanie textu v označenom texte
sub Oznac_hladany_text(vsetko, medzery, zalomitelne, nezalomitelne, retazec as long, co as string)
' Význam parametrov (=1):
' vsetko – nastavuje sa pôvodne označený text
' medzery – nastavujú sa všetky medzery
' zalomitelne – nastavuje sa iba znak SP
' nezalomitelne – nastavuje sa iba znak NBSP
' retazec – nastavuje sa reťazec "co"
' co – hladaný reťazec – má význam iba v spojitosti s parametrom retazec
dim dokument, dispatcher, kurzor as object
dim hladaj as string ' Hľadaný reťazec podľa parametrov
dim parametre as long
dim regularne as long
dim args(18) as new com.sun.star.beans.PropertyValue ' Parametre pre hľadanie v označenom texte
parametre=vsetko*10000+medzery*1000+zalomitelne*100+nezalomitelne*10+retazec
regularne=0
select case parametre
case 10000 ' vsetko
Nastav_vyber
exit sub
case 1000 ' medzery
hladaj=" |"+chr$(&HA0) ' nastavenie hľadania SP alebo NBSP
regularne=1
case 100 ' zalomiteľné
hladaj=" " ' nastavenie hľadania SP
case 10 ' nezalomiteľné
hladaj=chr$(&HA0) ' nastavenie hľadania NBSP
case 1 ' reťazec
hladaj=co
case else
Nastav_vyber
exit sub
end select
' Nastavenie nasledujúcich parametrov je z nahrávania makra
args(0).Name = "SearchItem.StyleFamily"
args(0).Value = 2
args(1).Name = "SearchItem.CellType"
args(1).Value = 0
args(2).Name = "SearchItem.RowDirection"
args(2).Value = true
args(3).Name = "SearchItem.AllTables"
args(3).Value = false
args(4).Name = "SearchItem.Backward"
args(4).Value = false
args(5).Name = "SearchItem.Pattern"
args(5).Value = false
args(6).Name = "SearchItem.Content"
args(6).Value = false
args(7).Name = "SearchItem.AsianOptions"
args(7).Value = false
args(8).Name = "SearchItem.AlgorithmType"
args(8).Value = regularne ' 1 – regulárne, 0 – obyčajné hľadanie
args(9).Name = "SearchItem.SearchFlags"
args(9).Value = 71680 ' Hľadá sa v označenom texte (výbere). Pre hľadanie v celom dokumente by muselo byť 65536
args(10).Name = "SearchItem.SearchString"
args(10).Value = hladaj ' Hľadaný reťazec
args(11).Name = "SearchItem.ReplaceString"
args(11).Value = ""
args(12).Name = "SearchItem.Locale"
args(12).Value = 255
args(13).Name = "SearchItem.ChangedChars"
args(13).Value = 2
args(14).Name = "SearchItem.DeletedChars"
args(14).Value = 2
args(15).Name = "SearchItem.InsertedChars"
args(15).Value = 2
args(16).Name = "SearchItem.TransliterateFlags"
args(16).Value = 1024 ' Pri hľadaní rozoznáva veľkosť písmen, inak by muselo byť 1280
args(17).Name = "SearchItem.Command"
args(17).Value = 1
args(18).Name = "Quiet"
args(18).Value = true
dokument=ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(dokument, ".uno:ExecuteSearch", "", 0, args()) ' Vlastné hľadanie – označenie všetkých nájdených znakov
end sub
REM Procedúra pre nastavenie kerningu počas definície hodnôt
sub Kerning_Initiated
dim medzera as long ' Pre získanie číselnej hodnoty z dialógovej premennej "Hodnota"
dim kurzor as object
Odpamataj_vyber ' Odpamätanie pôvodného výberu
medzera=val(dlg.model.Rozostup.text) ' Hodnota rozostupov
Oznac_hladany_text(dlg.model.Vyber_all.State,dlg.model.Vyber_SP_NBSP.State,dlg.model.Vyber_SP.State,_
dlg.model.Vyber_NBSP.State, dlg.model.Vyber_text.State,dlg.model.Hlad_text.text) ' Označenie textu podľa nastavených parametrov
kurzor= ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
kurzor.CharKerning=medzera ' Zmena rozostupu označených znakov
Nastav_vyber ' Nastavenie pôvodného výberu
end sub
REM Procedúra pre nastavenie šírky počas definície hodnôt
sub Sirka_Initiated
dim kurzor as object
dim retazec as string
dim koeficient as single
dim sirka as integer
Odpamataj_vyber ' Odpamätanie pôvodného výberu
sirka=val(dlg.model.Sirka.text)
koeficient=sirka/100.00
on error resume next
Oznac_hladany_text(dlg.model.Vyber_all.State,dlg.model.Vyber_SP_NBSP.State,dlg.model.Vyber_SP.State,_
dlg.model.Vyber_NBSP.State, dlg.model.Vyber_text.State,dlg.model.Hlad_text.text) ' Označenie textu podľa nastavených parametrov
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
if dlg.model.nastav_sirku.State=1 then
' Nastavujeme šírku priamo v celom označenom texte
kurzor.CharScaleWidth=sirka
else
' Nastavujeme koeficient šírky
if isEmpty(kurzor.CharScaleWidth) then
' Je tam rôznosť šírky, musíme nastaviť po znakoch – môžeme iba vtedy, ak je označený celý text
if dlg.model.Vyber_all.State=1 then
retazec=kurzor.getString() ' Označený text
kurzor.collapseToStart() ' ak je niečo označené, tak zrušíme výber a skočíme na začiatok
for i=1 to len(retazec)
kurzor.goRight(1, true) ' zvýraznenie znaku
kurzor.CharScaleWidth=kurzor.CharScaleWidth*koeficient
kurzor.collapseToEnd() ' Zrušíme označený vymenený text
next i
endif
else
' Je tam rovnaká šírka, nastavíme všade
kurzor.CharScaleWidth=kurzor.CharScaleWidth*koeficient
endif
endif
Nastav_vyber ' Nastavenie pôvodného výberu
end sub
REM Makro, ktoré zneviditeľní dialóg – t.j. nastaví, že sa má ukončiť čakací cyklus (volané stlačením klávesy "Koniec" v dialógu)
sub Koniec_Kerning_Initiated
dlg.setVisible(false )' Zneviditeľnenie dialógu
end sub
Rem Volanie dialógu a makra pre nastavenie rozostupov a šírky znakov
sub Kerning_znakov
dim kurzor as object
dim medzera, koeficient as long
DialogLibraries.LoadLibrary("JP_Kerning_znakov") ' Otvorenie knižnice
Odpamataj_vyber ' Odpamätanie pôvodného výberu
kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
kurzor.collapseToStart() ' ak je niečo označené, tak zrušíme výber a skočíme na začiatok
medzera=kurzor.CharKerning ' Kerning prvého znaku výberu
koeficient=kurzor.CharScaleWidth ' Šírka prvého znaku
Nastav_vyber ' Nastavenie pôvodného výberu
if not isnull(dlg) then exit sub ' Ak je okno otvorené, neotvárame druhé
dlg=CreateUnoDialog(DialogLibraries.JP_Kerning_znakov.Dialog_Kerning_znakov) ' Sprístupnenie dialógu
dlg.model.Vyber_all.State=1 ' V prepínačoch si prednastavíme, že budeme meniť rozostupy všetkých znakov
dlg.model.Vyber_SP_NBSP.State=0
dlg.model.Vyber_SP.State=0
dlg.model.Vyber_NBSP.State=0
dlg.model.Vyber_text.State=0
dlg.model.Hlad_text.text=""
dlg.model.Rozostup.text=str(medzera) ' Init aktuálneho kerningu
dlg.model.nastav_koeficient.State=1 ' V prepínačoch si prednastavíme, že budeme meniť koeficient šírky
dlg.model.nastav_sirku.State=0
dlg.model.Sirka.text=str(koeficient) ' Init aktuálnej šírky
dlg.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
while dlg.isVisible() ' Cyklus, ktorý čaká na stlačenie klávesy "Koniec" v dialógu (kým je dialóg viditeľný)
wait 500 ' Časová medzera 500 milisekúnd (0,5 sec) na to, aby sa dalo paralelne pracovať s dokumentom
wend
dlg.dispose() ' Zatvorenie dialógu
end sub
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk