eventlistenerの応用例
あのさあ、思うんだけどさあ、パッケージ切るんだったら料金プランとか、しっかり考えてもらわないとクラウドなんか永久に全社導入とはならないよね。全部使えるんだよ!だからこの値段!じゃなくて、これとこれでいくらだよって出来ないか???この業界なんか、ほとんどの端末でデザインスタンダード動いてたんじゃね?要らないんだよPremire。AfterEffectsなんか動かすのわたししか居ないし、その他、日本語ロケールに対応出来ないアプリあっても使わないってメンバー大半なんだから…ストレージも今時20Gで何すれば良いの?DropBox使うって。
なんだかんだ言ってベータから付き合いですが、感覚的に当時の感じが抜けきれていなくて何となく中途半端な感じを未だに受けるのですがみなさんどうですか?
愚痴だけでは面白くないのでこんなのを作ったので置いておきます。
非常に単純な例です。捉えるイベントは「ペースト」これをデフォルトの挙動から逸脱させます。概要を先に書きますと、
ペースト検知→処理を横取り→ターゲットの確認→クリップボードの内容をデータ展開→マーカーをスワップ→デフォルトの挙動をキャンセル
と言った感じです。
マーカーは以下の様な感じで仕込みます。それに対するテキストは単純にタブ区切りです。ターゲットはテキストフレームで、選択されているのがそれ以外では通常のペースト動作となります。今回は処理してませんがマーカーがない場合もそのままスルーするようにすると良いでしょう。
ペースト一発でテキストボックス内のデータが差し代わります。とりあえずコードを見てみましょう。
#targetengine sessionif (app.menuActions.item(“$ID/Paste”).eventListeners.item(‘exPaste’)!=null){
app.menuActions.item(“$ID/Paste”).eventListeners.item(‘exPaste’).remove();
}
var m = app.menuActions.item(“$ID/Paste”);
var myEv = m.eventListeners.add(“beforeInvoke”, mltPaste);
myEv.name = “exPaste”;
function mltPaste(q_k){
var tg = app.activeDocument.selection[0];
if (tg!=”[object TextFrame]”) return;
var tmp = app.activeWindow.activeSpread.textFrames.add();
app.select(tmp.insertionPoints[0]);
app.paste();
var txt = tmp.parentStory.contents;
tmp.remove();
if (txt==””) return;
var marker = [“❶”,”❷”,”❸”,”❹”,”❺”,”❻”,”❼”];
var str = txt.split (“\t”);
for (var i=0;i<7;i++){
app.findGrepPreferences.findWhat = marker[i];
app.changeGrepPreferences.changeTo = str[i];
tg.changeGrep(true);
}
q_k.stopPropagation();
q_k.preventDefault();
}
//remove listener
//app.menuActions.item(“$ID/Paste”).eventListeners.item(‘exPaste’).remove();
クリップボードデータの展開部分が面倒ですが、それ以外はとても単純です。findWhatとchangeToでマーカーを差換えた後、stopPropagationとpreventDefaultで通常の挙動をキャンセルします。
操作的にはエクセルから一行抜いてきてペーストするとテキストフレーム内が一気に差し替えられる感じで、カタログとか賃貸物件なんかのテンプレ差し替えるのに重宝します。