Skriptujeme InDesign (11): Dialogy - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

Saal Digital

 

Jaký největší formát fotoknihy v řadě Professional Line ve formátu na šířku lze ve standardní nabídce Saal Digital Fotoservice objednat? Nápověda: Logo sponzora soutěže

V dnešní soutěži hrajeme o:



Software

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);

skriptid11-2f.jpg

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);
}

skriptid11-1f.jpg

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.");}

skriptid11-3f.jpg

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);

skriptid11-4f.jpg

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.

skriptid11-6f.jpg

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();

skriptid11-5f.jpg

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):

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 » Rubriky  » Polygrafie  

 » Rubriky  » Software  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: