今更知ったselectedPageItems
先日まで古籏さんからオブジェクトモデル図の修正をたくさんいただきまして、修正・公開しました。そこでようやっと、CC2017(12.1)、CC2018(13.1)のオブジェクトモデル図に取り掛かり始めましたよ。
CC2017は以前に軽く調べてあるんですが、CC2018はやっと今更、です。おそらく来月のAdobe MAXで次のバージョンが発表されるはず、なのですが。
私のオブジェクトモデルは前バージョンと比較して差分を取るものなので、作成に時間がかかります。もしかすると出来上がるころには次バージョンが出ているかも知れません。場合によっては、次のバージョンもまとめて公開するかもしれません。
さて、スクリプトの機能なんですが、ここ数バージョンは、InDesignの機能で追加された部分にあわせて追加されることばかりで、スクリプトだけの機能が追加されることはほぼなかったんです。そのため、InDesignのUIで新たに追加された機能を使わなければスクリプトを書き換える必要はなかったので、これだけのんびりしていても問題はありませんでした。ですが今調べていた中で、久々にスクリプトの書き方に変化をもたらす機能が追加されていた、ということに今更気づいてしまったというわけですわ。アドビフォーラム(本家)とかを見ている人であれば既に知ってる人もいるのでしょうが、日本語で解説したものはなさそうなので、書いておきます。
それがDocumentオブジェクトのselectedPageItemsプロパティです。今まで選択状態を示すものはApplicationオブジェクトやLayoutWindowオブジェクトなどのselectionプロパティしかなかったんですが、CC2018から新たに追加されたわけですよ。なので残念ながら、CC2017以前の方には恩恵がないので、いずれバージョンアップしたら思い出してね、ということになってます。
では、selectionプロパティとselectedPageItemsプロパティの違いを見ていきましょう。まず従来のselectionプロパティでは、対象は次のようになっています。
- Rectangle / Oval / Polygon / GraphicLine
- EPSText
- TextFrame / EndnoteTextFrame(CC2018)
- Button / MultiStateObject
- CheckBox / ComboBox / ListBox / TextBox / RadioButton / SignatureField
- Group
- Text / TextColumn / TextStyleRange / Line / Paragraph / Character / InsertionPoint
- Guide
- Page
(多分これだけだと思うのだが、不足があったら教えてください!)
それに対してselectedPageItemsプロパティは、
- Rectangle / Oval / Polygon / GraphicLine
- EPSText
- TextFrame / EndnoteTextFrame(CC2018)
- Button / MultiStateObject
- CheckBox / ComboBox / ListBox / TextBox / RadioButton / SignatureField
- Group
- Guide
となってます(これで合っているはず)。つまり、selectionに比べて対象が少ない。
なので、操作対象を選択した状態でスクリプトを実行する際に、正しく操作対象が選択されているかを確認する必要があるのですが、その確認方法が増えたということになります。
選択されているものがページアイテムの場合は、selectionPageItems.lengthの値が1以上であるということになりますし、選択されているものがテキストであればselectionPageItems.lengthの値が0で、selection.lengthの値が1になります。
ただし、この逆が成り立たないところが辛いところ。selectionPageItems.lengthの値が1以上であってもガイドが選択されていれば操作対象ではないかもしれませんし、selectionPageItems.lengthの値が0でselection.lengthの値が1であってもそれはページかもしれません。
ということで厳密には決めつけられないのですが、ガイドを選択していたり、ページを選択しているという状態は極めて稀なので(そもそもページツールを日常的に使っている人がどれくらいいるの?)、たいていの場合は無視しても問題はないと思います。ただ、不具合が発生する可能性を知っていながらそのままにしておくのも気持ち悪い。
なお、テキストの場合は、これを利用してもInsertionPointを除外する必要がある場合には意味がないので、従来通りです。あんまり使えないかな?