ESTKとSnow Leopardと酒と泪と嘘とビデオテープとYシャツと私とこたつと宇宙船 2

前回、神がかった仮説を立てたっきりすっかり放置してましたが

 コピーやペーストの失敗は起こり得るのですが、失敗するかしないかをある程度ですが捕捉する方法が
若干ながらおぼついたので書き留めておきます。

元の状態。仕事用スクリプトです。危なっかしいので公開してません。


コピーしたい範囲をくくります。
 そしてコピー実行。



普通にコピー失敗して(普通に、というのがイヤだ)
 選択範囲が消え失せました。



ここで、なんでもいいので和文を入力してみます。
 「あ」と入れてみたところ。


カーソルとは程遠い、先頭に入力されました。変換受け付け中なのでアンダーラインがついています。
 このまま入力確定(Returnキー)します。


しました。すぐ削除します。
 そしてカーソル位置を別の所に移動します。
  任意のカーソル位置に「あ」が出るまで、以上を延々繰り返します。
 たいがい1回。ひどいと3回ぐらい。


狙った所に「あ」が出たらオッケーです。削除して、コピーとかカットとか正常にできるはずです。
 ただし、ペースト先が他のESTK書類だった場合、ペースト先でも上記手順を踏まないとまたワヤクチャです。
  目的のカーソル位置がコードの先頭だった場合、逆にわざと別の位置でテストする必要があります。
 あくまでも「映りの悪くなったテレビの有効な叩き方」の示唆にすぎませんが。
  だって、真新しいテレビですら...ねえ。

■ ←冷ややかな拍手ボタン

ScriptUI のEditTextは1バイト環境推奨ですか

..ですね(終了)。



このようなテスト用UIをこしらえた。


実行するとこんな感じ。
 左の入力窓にタイピングすると、ボタンをまたいだ右側の空間に窓の内容が逐一吐き出され、
  ボタンをカチッとすると窓の内容でアラートメッセージが出る。
 それだけの物。


いま、入力は英数ですね。
 ちょちょっと何か入力してみます。思惑通りに動作してます。フツーです。


ボタンをカチっと。
 フツー。


“Shift” + “←” キーをポンポンして2文字選択したところ


そのまま1字入力してボタンをカチッと。
 フツー。


ここから、ことえりに切り替えてみる。ATOKなんかでも同様ですが
 4字入力してカチッと。正常に動作。たまたま。


“Shift” + “←” キーをポンして1文字だけ選択。


そのまま1字入力。カチッと。
 反映されていない。


今度は同様に2字選択。


そこから1字だけ入力。
 今度は反映した。


もう一度、2字選択してみる。


カーソルを矢印キーで移動してみる。
 すると反映する。


同様に反映しない状態を作っておき、英数入力に切り替えて1字ダミーのつもりで入力。
 即座に反応。


【ここまでのまとめ】
・範囲選択した文字数と、再入力した文字数が一致する場合、入力は内部に反映されない
 (英数入力時は1文字選択時のみの不具合、和文の場合は4文字選択して4文字いっぺんに入力確定するなどでも不具合)
・マウス操作や”Shift” + “←→” キー等で文字列の範囲選択状態を作り、カーソルキー入力でそれをクリアすると反映する。マウスクリックでのカーソル位置変更は不可

【とりあえずの回避策】
・入力窓の内容を目的の状態に編集し終え、次の動作に内容を渡す前にダミー文字を入力、すぐ削除
、を手クセ的に行うよう義務づける(無理だろう)
・もう、使うのをやめる


次。上記のテスト用UIを、少し書き換えた。
 InDesign上で動作し、ボタンをカチッとすると選択されたテキストフレームに吐き出す仕組み。


選択フレームのテキスト「あいうえお」のうち「いうえ」を選択した状態で
 入力窓に和文を入力してみた。すると同時にテキストフレームにも文字が入る。
  あらー便利ねこれー。
   もとい、これはひどい。


ならば、InDesignの外で動かせばよいんでしょう。
 ExtendScript ToolKit から実行して、
  BridgeTalkでInDesignにちょっかい出すよう変更。


問題なし。


カチッとすると流れ込む。


しかし、InDesignドキュメントで作業していると前面に出ててくれないのであった。

【思い当たる道】
・ドキュメントの選択範囲に常に気を配る(らせる)
・我慢する(させる)
・もう、使うのをやめる
・SDKに手を染める(Javascript以外の言語も覚える)

星よ..導き給え。
 いや誰か。どなたか。
こんなに困ってますよ。助けて下さいよ。
 日本語絡みなので外人にも頼れませんよ。

EditTextのtextselectionを自分なりに使ってみる

PlaceOptionalTextの新機能盛り付けに着手する余裕が若干ながら出てきたので、

 現状の不具合なんかには目もくれずごてごてと肉付け中であります。

で、サンプル窓に表示されたテキストのうち一部だけを使用したい場合、
 これまではそこからドキュメント上にコピペしておったのですが、そこはもうちょっとどうにかしたい。
そんでEditTextのtextselectionとゆうのを長期にわたりいじくってたのですが、
 いちおうの区切りとして。

【当初の思い込み的見解】
●EditText内”ABCDEF” という文字列に対し、選択された範囲の文字列を読み込む事ができる
●EditText内”ABCDEF” という文字列に対し、任意の部分を選択された状態にする事ができる

【現状判明している実際できる事】

●EditText内の選択された範囲の文字列、及び挿入点を任意の文字列に置換する事ができる

【できたいのにまだできてない、或いは元々できないのかしらな事】

●EditText内”ABCDEF” という文字列に対し、選択された範囲の文字列を読み込む事ができる

というわけで、『EditText内の選択された範囲の文字列、及び挿入点を任意の文字列に置換』して、
置換前と置換後の文字列を比較する事で選択範囲にいた文字列を割り出すテスト。



dlg=
“palette{orientation:’row’ ,text:’test’,\
edit1:EditText{characters:30},\
btn1:Button{text:’カチッと’},\
}”;
win=new Window(dlg);
win.edit1.text=“0123456”; //元のテキスト
dammyObj=”絶対かぶらない文字列”; //選択範囲に置換する文字列
win.btn1.onClick = function(){
textObj=win.edit1.text; //置換前テキスト
win.edit1.textselection=dammyObj; //選択範囲の置換
repObj=win.edit1.text.split(dammyObj); //置換文字列を挟む前後を分割
win.edit1.text=textObj; //表示テキストを元に戻しておく
regObj=new RegExp(repObj[0]+“(.+)”+repObj[1]); //選択されていた部分を抜き出す正規表現
selObj=textObj.replace(regObj,“$1”); //抜き出し
alert(“選択された文字列は\n『 “+selObj+” 』\nであるべきなのです”); //結果
}
win.show();


ボタンをカチッと押すとテキストの選択範囲の文字列をアラートで表示します。

 選択が文字列ではなく挿入点だった場合、元テキスト全体が返ります。

  なんかreplace()じゃなくてmatch()だけでかっちょよく済ませたかったのですが。まだよくわかっていない。
1行だけのEditTextであればこれでいちおう問題ないかと。
 しかし複数行になり改行コード(\n)が混ざると挙動がおかしくなる。


regObj.multiline = true;


 としてみても改善なし。まだよくわかっていない。
なので、本番ではreplaceを諦めて(早い)


selObj=orgObj.slice(repObj[0].length,);
if(repObj[1].length !=0){
selObj=selObj.slice(0,-(repObj[1].length));
}


としてみた。非常にかっこよくないが、なんとか動いたモヨウ。
 もうちょっとエレガントになりませんかこれ。


10.4.24

最後のsliceの行の書き間違いを修正。しつれいおば