Cíl lekce
Cílem třetí lekce je ukázat jednoduchý skript pro zavření otevřených souborů. Skript je možný modifikovat na několik kritérií. Zavření všech otevřených dokumentů. Zavření všech otevřených dokumentů, kromě aktivního dokumentu, či zavření pouze aktivního dokumentu. Skript není vůbec složitý a může mít další využití v jiných skriptech, navíc je velmi užitečný a určitě ušetří několikanásobné ruční klikání při zavírání dokumentů a odklikávání dialogového okna.
Využité třídy v této lekci
Výčet využívaných tříd v této lekci.
- Application: využiji atribut documents a metodu close().
- SaveOptions: konstanty výčtu SaveOptions.
Zjištění zda-li je otevřený soubor
Podobně jako v předchozí lekci je pro mě nežádoucí, aby v programu Adobe Photoshop nebyl otevřený jediný
soubor, jelikož bych neměl co zavírat svým skriptem.
Narozdíl od minulé lekce, kde jsem sestrojil podmínku (if) ve které jsem se ptal, pokud je
velikost atributu
documents> rovná nule. V případě, že ano, znamenalo to, že není otevřený žadný dokument. V této
ukázce
tedy tuto podmínku prohodím a trochu zjednodušším zápis, v případě použití v dalších lekcích se
touto problematikou již nezabývám a odkazuji se pouze na lekci 2, 3.
Jak jsem již zmínil v následujícím kódu tedy podmínku prohodím a zeptám se, jestli je atribut documents
větší než nula. Zároveň zkrátim zápis a neudám žádné znaménko <, =, > a vycházím z toho, že podmínka
se vyhodnotí jako true (pravda) v případě, že získaná hodnota je větší jak nula.
//pokud vyhovuje proveď...
if (documents.length) {
//libovolný počet dokumentů je otevřený
//pokud nevyhovuje podmínce proveď...
}else {
alert("Žádný dokument není otevřený.", "Varování");
}
Zavření souboru
Pro zavření dokumentu beze změn využiji konstantu DONOTSAVECHANGES třídy SaveOptions, kterou vložím do metody close() volanou nad aktivním dokumentem. Tedy skript pro zavření pouze aktivního dokumentu je již s podmínkou otevřeného dokumentu a řádku níže hotový. Na další dvě varianty je nutno skript trochu rozšířit.
//zavření aktivního dokumentu bez uložení změn
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
Zavření všech souborů
Zavření všech souborů bez uložení je podobné jako při kontrole otevřeného souboru, jednodušše se v cyklu ptám jestli má atribut documents větší velikost jak nula. Pokud ano, zavírám dál soubory. Níže vytvořím pro přehlednost funkci, které zavře všechny otevřené soubory.
function closeAllFiles(){
//cykly dokud je splněna podmínka...
while (documents.length > 0) {
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
}
Zavření všech souborů, kromě aktivního souboru
Při zavírání všech souborů, kromě aktivního je třeba si uvědomit, že atribut documents je list
(seznam) všech otevřených dokumentů v programu.
Od toho se poté může odvodit skript. Potřebuji tedy projít všechny položky v seznamu. To jsem již prováděl
o pár řádku výše. Nyní to jen upravím a místo (while)
cyklu použiji cyklus (for) a to z toho důvodu, že zároveň potřebuji využít proměnou jako
index, kde se v listu nacházím. Dále před
samotným cyklem je potřeba si uložit aktivní otevřený dokument, abych ho při procházení cyklu mohl
přeskočit a nezavřel i soubor, který má aby zůstat otevřený. K tomu
mi poslouží atribut activeDocument třídy Application. Ten vrací referenci (odkaz) na daný
soubor, který mohu poté porovnávat jenotlivými položkami ze seznamu. Pro tento
účel opět vytvořím funkci z důvodu přehlednosti a funkčnosti.
Z důvodu toho, abych zjistil zavření opravdu všech souborů, umístil jsem před for cyklus,
ještě jeden cyklus, který kontroluje zda-li jsou opravdu všechny soubory, kromě jednoho zavřeny.
Jelikož jsem objevil chybu, že některé ze souborů i přes prohledání celého seznamu zůstaly otevřeny.
Důležité je zde uvědomit si, že (while) cyklus zde musí mít podmínku > 1 tedy větší
jak jedna a nikoliv > 0.
Toto by byla velká chyba, jelikož by se skript zacyklil a nikdy neskončil. Jelikož aktivní soubor nikdy
neodstraním.
function closeAllFilesExceptActiveOne(){
var actDocument = app.activeDocument;
while (documents.length > 1) {
//v cyklu procházím...
for (var i = 0; i < documents.length; i++) {
//zavřít všechny, kromě aktivního
if (actDocument != documents[i]) {
documents[i].close(SaveOptions.DONOTSAVECHANGES);
}
}
}
}
Výsledný zdrojový kód
if (documents.length) {
//zavření aktivního dokumentu bez uložení změn
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
//Použijte funkci, odstraňte lomítka komentáře si 1. nebo 2.
//1. zavření všech dokumentů
closeAllFiles()
//2. zavření všech dokumentů, kromě aktivního
//closeAllFilesExceptActiveOne()
}
else {
alert("Žádný dokument není otevřený.", "Varování");
}
//funkce na zavření všech souborů
function closeAllFiles(){
//dokud je otevřený dokument, zavři
while (documents.length > 0) {
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
}
//funkce na zavření všech souborů, kromě aktivního
function closeAllFilesExceptActiveOne(){
var actDocument = app.activeDocument;
while (documents.length > 1) {
for (var i = 0; i < documents.length; i++) {
//zavřít všechny, kromě aktivního
if (actDocument != documents[i]) {
documents[i].close(SaveOptions.DONOTSAVECHANGES);
}
}
}
}