InDesignのスウォッチ色設定切り替えスクリプトをウィンドウにしてみる

こないだのスクリプトをちょっと改造してみました。
実行のたびにダイアログを生成するのではなく、一度実行したら(閉じない限り)InDesignを終了させるまでずっと表示されたままになるウィンドウを作ります。その他、ちらほら修正など。
例によって動作確認したのはWindows XP SP3 InDesign CS4(6.0.4)のみです。

#target "InDesign"
#targetengine "changeSwatchColor"

(function(){

  if ( app.documents.length == 0 ) { alert("ドキュメントが開かれていません"); return; }

  // スウォッチの設定セットをつくる
  var presetColorArr = [
    { name  : "見出し1用",
      cmyk  : [  0,100,100,  0],
      black : [  0,  0,  0,100],
      set3  : [ 20, 20, 20,100] },

    { name  : "見出し2用",
      cmyk  : [  0,  0,100,  0],
      black : [  0,  0,  0, 50],
      set3  : [ 10, 10, 10, 40] }

    // 長いので省略
  ];

  // ダイアログ(ウィンドウだけど)の内容を作成
  var dlg = new Window("window", "スウォッチ色変更");
  dlg.add("statictext", undefined, "どの設定に変更しますか?");
  dlg.add("button", undefined, "カラー").onClick = function(){ changeColor("cmyk"); }
  dlg.add("button", undefined, "モノクロ").onClick = function(){ changeColor("black"); }
  dlg.add("button", undefined, "設定3").onClick = function(){ changeColor("set3"); }

  // ダイアログを表示
  dlg.show();

  // 各スウォッチの色設定をモードに応じて変更する処理
  // ボタンを押すと、この関数が実行される
  var changeColor = function(mode){
    var actDoc = app.activeDocument; // ボタンを押した時点のアクティブドキュメントを処理するのでココ
    for ( var i = 0, len = presetColorArr.length; i < len; i++ ) {
      var tmpSet = presetColorArr[i];
      try {
        var targetColor = actDoc.swatches.item(tmpSet.name);
        targetColor.colorValue = tmpSet[mode];
      } catch(e) {
        alert("スウォッチがみつかりません: " + tmpSet.name);
      }
    }
  }

})();

私が使うときには複数のファイルに同じ設定をどんどん適用していくことになるので、いちいちダイアログを呼び出すのは面倒だなーって思ってこの形になりました*1
あと、せっかく覚えたのでウィンドウを作ってみたかった。これだったら、最初の起動時にスウォッチの設定セットを書いた外部ファイルを読み込むようにするのもありかもしれない。

ウィンドウの使用にはtargetengineの指定が必要です。最初の文はそれ。このスクリプトをESTKで実行するにはちょっと注意が必要ですね。
参考:Double-talk Publisher お手元系スクリプト考

ところで、applicationオブジェクトからたどって作るダイアログは使い終わったら破棄(destroy)すべしと言われてるけど、ScriptUIで作る場合はどうなんだろう?
そのへんよくわからないで作っています。(だめじゃん……)

*1:開いてるすべてのドキュメントに一発で適用してもいいけど、1ファイルずつ確かめながら実行したいんだ……