Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
-
30. září 2024
-
4. října 2024
-
14. listopadu 2024
-
11. prosince 2024
skenerista, osvitář
Skriptujeme InDesign (11): Dialogy
Adobe InDesign sazba
13. března 2006, 00.00 | Jednodušší i komplexní dialogy dovolí v prostředí skriptů nejen pohodlněji zadávat
uživatelské hodnoty a různě určovat chování skriptu, ale také napomohou třeba při ladění
a dalším zpracování. Více už v našem článku.
Jak jsme slíbili v minulé části našeho seriálu, budeme se nyní věnovat použití dialogů. Důvodů je zde vícero. Tím nejvíce nasnadě je lepší porozumění připraveným skriptům (jako jsou třeba ty, které jsme zmínili minule), které dialogy disponují: snáze budeme schopni oddělit samotný algoritmus od jeho "nástavbových" funkcí a pochopit, s jakými hodnotami se ve skriptu pracuje.
Samozřejmě ale ještě důležitější je užití ve skriptech vlastních. Mnohdy se bez těchto prvků obejdeme, jakmile je ale třeba dát skriptu na určité variabilitě, je jejich nasazení nezbytné. Konečně dialogy slouží i jako velmi účinný prostředek pro trasování a ladění skriptů. Více už ale v konkrétním výkladu.
Alert, confirm a prompt
ExtendScript (tedy podoba JavaScriptu určená ke skriptování InDesignu a dalších aplikací Creative Suite) disponuje třemi základními typy dialogů, které jsou mírnou modifikací standardních dialogů používaných v obecném JavaScriptu. Jsou to alert (upozorňovací), confirm (potvrzovací) a prompt (zadávací) dialog.
Dialog alert, s kterým jsme se seznámili již dříve, dovoluje zobrazit krátké hlášení, jež se uzavře stiskem klávesy Enter nebo kliknutím na příslušné tlačítko. Uvedeným způsobem lze nejen uživateli hlásit různé události (typicky v rámci podmínek, na konci zpracování atp., ať už se jedná o úspěch či neúspěch), ale také vypisovat obsah proměnných atd. a tím používat alert coby jednoduchý, ale o to účinnější ladící nástroj (pro ladění skriptů jsou pak k dispozici i komplexní nástroje v rámci ExtendScript Toolkitu, na který se podíváme někdy příště). Při uvedeném typu výpisů přijdou vhod nástroje pro práci s textovými řetězci, jako je spojování či zalomení pomocí escape sekvencí pro tabulátor (\t) nebo konec řádku (\n).
Typické nasazení dialogu alert vypadá následovně:
if (app.documents.length==0)
{
alert("Nemáte otevřen žádný dokument");
}
Pokročilejší výpis může vypadat třeba takhle:
//Vyzkoušejte s alespoň jedním otevřeným dokumentem
alert("Počet dokumentů otevřených v InDesignu je "+app.documents.length+".\n"+"Právě aktivní document se jmenuje: "+app.activeDocument.name);
Obecně má alert v rámci ExtendScript následující syntaxi:
alert(hlášení, záhlaví, ikona);
kde hlášení je výraz, který se má vypsat, volitelná volba záhlaví je text záhlaví okna (nelze použít v Mac OS X), volitelná logická hodnota ikona dovoluje (nastavena na true) místo standardní upozorňovací ikony systému použít ikonu indikující chyby (máme zde tedy jednoduchý prostředek jak v hlášeních odlišit pouhé informace od významnějších upozornění na chyby). Ukázka použití:
if (app.documents.length==0)
{
alert("Nemáte otevřen žádný dokument","Upozornění",true);
}
Dialog confirm slouží k potvrzení či odmítnutí otázky položené dialogem s pomocí tlačítek označených Yes a No, vrací tedy do skriptu logickou hodnotu (true pokud se stisklo Yes, false pokud se stisklo No), podle které se pak řídí další zpracování. Obecný tvar v ExtendScriptu je
confirm(hlášení, defaultní_tlačítko, záhlaví);
kde hlášení je výraz, jež se má zobrazit, volitelná volba defaultní_tlačítko určuje, že No má být výchozí volbou (výchozí je Yes), záhlaví volitelně určuje obsah záhlaví. Příklad použití:
if (confirm("Mám uzavřít aktivní dokument?",true,"Pokyn k
uzavření"))
{app.activeDocument.close();}
else {alert("Stiskli jste tlačítko No.");}
Prompt slouží k zadáván textových hodnot, tyto hodnoty pak vrací do skriptu (kde je lze použít i pro numerické výpočty po příslušné konverzi aj. - obecně zde ale jsou lepší prostředky v případě prvků, které popíšeme dále, pokud uživatel zvolí místo OK druhou nabízenou volbu Cancel, vrací se do skriptu hodnota null. Obecný tvar příkazu je:
prompt(hlášení, hodnota, záhlaví);
kde hlášení je řetězec, který se zobrazí v rámci dialogu, hodnota je volitelná přednastavená hodnota pro vložení a volitelné záhlaví určuje záhlaví dialogového okna. Příklady použití:
//Takhle zjistíme text
myText=prompt("Zadejte požadovaný řetězec","Ahoj");
//Takhle zjistíme celočíselný údaj (nesmyslné údaje ovšem neošetřujeme)
myRepeat=prompt("Zadejte počet opakování","1");
//Takhle tento údaj změníme na celé číslo
myRepeat=parseInt(myRepeat);
Komplexní dialogy
Skriptování InDesignu ovšem pro dialogy nabízí podstatně více než jen výše zmíněné možnosti. K dispozici je komplexní sada objektů, dovolující stavět (na platformě nezávislé) dialogové boxy (objekt app.dialog), jež vzhledem odpovídají tomu, co znají uživatelé ze svého operačního systému. Prostřednictvím uvedených boxů, resp. jejich objektů, pak uživatel předává skriptu hodnoty, na jejichž základě se provádí zpracování. Konkrétně jsou pro vkládání hodnot k dispozici tyto objekty:
- popisný text (staticText)
- pole pro vkládání textu (textEditbox)
- pole pro vkládání numerických hodnot, a to buďto reálných čísel (realEditbox), čísel celých (integerEditbox), procent (percentEditbox) či úhlů (angleEditbox)
- rozvinovací nabídky (dropdown)
- spojení editačních polí s rozvinovací nabídkou (realCombobox, integerCombobox atd.)
- zaškrtávací políčka (checkboxControl)
- přepínače (radiobuttonControl, radiobuttonGroup)
Každý dialogový box je složen z jednoho či více dialogových sloupců (dialogColumns), každý sloupec může být dále rozdělen do více sloupců a orámovaných panelů (borderPanels), jednotlivé volby lze sdružovat do skupin (enablingGroups - takže lze naráz celou skupinu voleb deaktivovat). Rámcovou představu o uvedených prvcích a jejich poslání poskytuje následující obrázek převzatý z uživatelské příručky skriptování InDesignu.
Každý objekt v dialogovém boxu má své vlastnosti, ke kterým patří především pojmenování (staticLabel) a dále třeba zaškrtnutí (checkedState) či editovaná hodnota (editValue). Hodnoty jednotlivých prvků se odpovídajícím přiřazením přebírají do skriptu, kde se s nimi provádí další operace. I po uzavření zůstává dialog v paměti InDesignu, což může být někdy výhodné (hodnoty se dají použít na více místech skriptu či ve více skriptech), obvykle to ale ku prospěchu věci příliš není (zabírají paměť). Po použití dialogu je tedy vhodné jej odstranit z paměti pomocí metody destroy.
Tolik teorie. Nyní ve stručnosti k praktickému užití (pro podrobný popis jednotlivých objektů dialogů je zde referenční příručka a hodně lze získat studiem ukázkových skriptů dodávaných s InDesignem). Nejprve něco k typickému způsobu použití dialogu, který bychom mohli schématicky popsat takto:
- vytvoření a popis struktury dialogu
- zobrazení dialogu
- převzetí hodnot z dialogu
- uzavření a odstranění dialogu z paměti
V JavScriptu to může vypadat nějak takto:
//Tvorba dialogu (vlastnost name určuje záhlaví dialogového
okna)
var myDialog=app.dialogs.add({name: "Jednoduchý dialog"});
//Popis struktury dialogu.
//Povšimněte si nastavení jedné či více vlastností hned při vytváření
daného objektu ve složených závorkách,
//kdy jednotlivé přiřazení mají tvar
//vlastnost: hodnota
//a jsou odděleny čárkou
//uvedený postup se dá použít u metody add nejen v případě dialogů
with(myDialog){
//Vytvoříme první sloupec v dialogu
with(dialogColumns.add()){
//Do sloupce vložíme první orámovaný panel
with(borderPanels.add()){
with(dialogColumns.add){
//Popiska prvku
staticTexts.add({staticLabel: "Zadejte text:"})
}
with(dialogColumns.add){
//Textové editační pole
//Ukázka přiřazení více vlastností současně
var myTextEditField=textEditboxes.add({editContents: "Ahoj",
minWidth:180})
}
}
//Takhle se dají vkládat prázdné řádky
staticTexts.add();
//Další orámovaný panel
with(borderPanels.add()){
with(dialogColumns.add){
//Popiska
staticTexts.add({staticLabel: "Velikost v bodech:"})
}
with(dialogColumns.add){
//Editační pole pro zadání reálného čísla
var myPointSizeField=realEditboxes.add({editValue: 72})
}
}
//A ještě jeden orámovaný panel
with(borderPanels.add()){
with(dialogColumns.add){
//Popiska
staticTexts.add({staticLabel: "Vertikální zarovnání:"})
}
with(dialogColumns.add){
//Ukázka použití seznamu (zobrazenou pozici určuje vlastnost
selectedIndex, první pozici odpovídá hodnota 0)
var myVerticalJustificationMenu=dropdowns.add({stringList: ["Nahoru",
"Doprostřed", "Dolů"], selectedIndex: 1});
}
}
}
}
//Zobrazení dialogu
myResult=myDialog.show();
//Převzetí hodnot z dialogu
if (myResult == true) //byl-li dialog uzavřen
tlačítkem OK
{var myParagraphAlignment, myString, myPointSize,
myVerticalJustification;
myString = myTextEditField.editContents;
myPointSize = myPointSizeField.editValue;
myVerticalJustification=myVerticalJustificationMenu.selectedIndex;
}
//Získané hodnoty pak lze v daném případě použít třeba ke zformátování
obsahu textového rámečku
//Blíže viz příklad v uživatelské příručce skriptování InDesignu CS2 s.
37-38
//Zde si je jenom necháme vypsat na obrazovce
alert(myString+"\n"+myPointSize+"\n"+myVerticalJustification);
//Nezapomeňme dialog odstranit z paměti
myDialog.destroy();
Jak je tedy vidět, samotné strukturování dialogu může být poměrně otravná činnost, která přímo volá po nějakém interaktivním nástroji. Musíme se ovšem obejít bez něj, přičemž doporučujeme následující postup:
- dialog si rozvrhneme na papíře
- zapíšeme nejprve "kostru", tj. příslušnou definici dialogu (obvykle konstrukt with jak je naznačeno výše) včetně uzavření všech párových závorek
- postupně dovnitř zápisu vkládáme zápisy menších celků, na stejné úrovni vnoření vždy nejprve příslušný blok zkopírujeme, a pak přepíšeme pouze hodnoty uvnitř tohoto bloku
- dialog testujeme v průběhu jeho budování průběžně, ne až je celý zapsán. Vyhneme se nepříjemnému procesu hledání chybně použitých závorek apod.
V rozsáhlejších skriptech se pak dialogy vytvářejí a zpracovávají v rámci funkcí. Rozmanité ukázky daného přístupu lze najít prakticky v každém z ukázkových skriptů dodávaných s InDesignem. Za pozornost pak stojí způsob zpracování dialogu ve skriptu StepAndRepeat, kdy je při konstruování použito jiného přístupu (bez použití with).
Obsah seriálu (více o seriálu):
- Skriptujeme InDesign (1): Úvod
- Skriptujeme InDesign (2): První kroky
- Skriptujeme InDesign (3): Základy JavaScriptu poprvé
- Skriptujeme InDesign (4): Základy JavaScriptu podruhé
- Skriptujeme InDesign (5): Dokumenty poprvé
- Skriptujeme InDesign (6): Dokumenty podruhé
- Skriptujeme InDesign (7): Výstup
- Skriptujeme InDesign (8): Stránky
- Skriptujeme InDesign (9): Stránkové objekty poprvé
- Skriptujeme InDesign (10): Stránkové objekty podruhé
- Skriptujeme InDesign (11): Dialogy
- Skriptujeme InDesign (12): Text poprvé
- Skriptujeme InDesign (13): Text podruhé
- Skriptujeme InDesign (14): Text potřetí
- Skriptujeme InDesign (15): Hledání a záměny poprvé
- Skriptujeme InDesign (16): Hledání a záměny podruhé
- Skriptujeme InDesign (17): Regulární výrazy
- Skriptujeme InDesign (18): Tabulky poprvé
- Skriptujeme InDesign (19): Tabulky podruhé
- Skriptujeme InDesign (20): Obrázky poprvé
- Skriptujeme InDesign (21): Obrázky podruhé
- Skriptujeme InDesign (22): Obrázky potřetí
- Skriptujeme InDesign (23): ESTK aneb jak na editaci a ladění skriptů
- Skriptujeme InDesign (24): Vrstvy
- Skriptujeme InDesign (25): Barvy poprvé
- Skriptujeme InDesign (26): Barvy podruhé
- Skriptujeme InDesign (27): Barvy potřetí
- Skriptujeme InDesign (29): Metadata podruhé
- Skriptujeme InDesign (30): Návěští
- Skriptujeme InDesign (31): Okna
- Skriptujeme InDesign (32): Reakce na události
- Skriptujeme InDesign (33): Novinky v CS3 verzi
Tématické zařazení:
» Rubriky » Polygrafie
-
14. května 2014
Jak vkládat snímky do galerií a soutěží? Stručný obrazový průvodce
-
23. dubna 2014
Konica Minolta přenesla výhody velkých zařízení do kompaktních modelů
-
12. června 2012
-
9. dubna 2014
-
5. ledna 2017
-
6. září 2004
OKI snižuje ceny barevných laserových tiskáren C3100 a C5200n
-
13. května 2004
-
19. ledna 2004
QuarkXPress Passport 6: předvedení nové verze na konferenci Apple Forum 27.1.2004
-
6. února 2001
-
30. listopadu 2014
Nový fotoaparát α7 II: první plnoformát s pětiosou optickou stabilizací obrazu na světě
-
14. října 2024
-
10. prosince 2024