Archive for 2009/5/30
TextAreaにタブをキーボードから入力したいのであるが、これがまた何もしないとできないのだ。
プログラムやらを書いているとタブが入らず、結構ストレス。
このブログの記入もタブが記入できないのですが・・・・
というわけで今回はTextAreaにタブ(Tab、いわゆる”\t” ) を記入したいということです。
TextAreaのマニュアル見ましたよ。じーーくり。
そこで気になったイベントが3つ。
- KeyDown
- KeyFocusChange
- FocusOut
もちろんタブキーが押されたら、って考えたらKewDownが素直な考えですよね。
KeyCode == 9 なら、って考えましたよ。でも、タブを入れることができても、フォーカスがなくなってしまうのですよ!!
イベントをキャンセルしても関係がないですし・・・
結局、組み合わせなければいけないのかなーーーと。マニュアルと格闘。
そしたら、KeyFocusChange
「ユーザーがキーボード操作によってフォーカスを変更しようとすると送出されます。」
と書いてあります。
あれ!?、キーボード操作によってフォーカスが変わる時って、TAB以外にあるのかな?
つまり、タブが入力されたとき?
じゃ、これだけでいいんだ。あれ、思ったより簡単!?
後は、今いるカーソル(キャレット)にタブを差し込めばいい。
あとは、TextAreaのTextFieldを操作すればよい。
この辺は、ちょうどこの問題がRichTextEditorが不満なのでつくりかえていたところなので、
そのソースを解析中だったのでわかりました。
でも、RichTextEditorで textArea.getTextField()ってやっているのに、なぜできない?
mx_internal function getTextField():IUITextField
こういうことでした。
ここで、mx_internalのNamespaceを使ってしまってもいいのですが、
ここはTextAreaの継承クラスを作成することにしました。
できた、ソースはこんな感じ
public class CustomTextArea extends TextArea
{
public function CustomTextArea()
{
super();
this.addEventListener(FocusEvent.KEY_FOCUS_CHANGE,handleKeyFocusChange);
}
private function handleKeyFocusChange(e:FocusEvent):void{
e.preventDefault();
var str1:String = textField.text.substr(0,textField.selectionBeginIndex);
var str2:String = textField.text.substr(textField.selectionBeginIndex);
textField.text = str1 + "\t" + str2;
textField.setSelection(textField.selectionBeginIndex + 1,textField.selectionEndIndex + 1);
}
}
実際にタブが押された時には、半角スペースで埋めるなんてのも後でできるようにしよと、解決できて満足です。


