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);
  }

}

実際にタブが押された時には、半角スペースで埋めるなんてのも後でできるようにしよと、解決できて満足です。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2009年5月
« 4月   6月 »
 123
45678910
11121314151617
18192021222324
25262728293031

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ