TextFieldを改行とTab入力できるようにした
使い方はTextFieldとほとんど同じです。
・自動インデント機能付き。インデントは前の行に従います。
・マウス右ボタンのメニューからファイルを開いたり保存したり出来ます。
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/8lau
*/
package {
import flash.display.Sprite;
import flash.system.*;
public class FlashTest extends Sprite {
public function FlashTest() {
var s:Sprite = new Sprite();
addChild(s);
s.tabChildren = false;//タブ入力に対応するためにtab移動を無効にする必要がある。
var editer:TextEditer = new TextEditer();
editer.width = 400;
editer.height = 400;
editer.border = true;
s.addChild(editer);
//IME.conversionMode = "JAPANESE_HIRAGANA";
//IME.conversionMode = "ALPHANUMERIC_FULL";
//IME.conversionMode = "KOREAN";
//editer.text = IME.conversionMode;
}
}
}
////////////////////////////////////////////////////////////////////////
// TextEditer class
////////////////////////////////////////////////////////////////////////
import flash.text.*;
import flash.ui.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
class TextEditer extends TextField {
private var file:FileReference;
private var prevText:Object;
private var nextText:Object;
public function TextEditer():void {
System.useCodePage = true;//UNICODE以外のテキストファイルをロードする場合 true
this.type = "input";//入力可能
//this.tabEnabled = true;
this.selectable = false;
this.addEventListener(KeyboardEvent.KEY_DOWN, onKey);
addEventListener(MouseEvent.CLICK, onFocus);
addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);
//コンテキストメニュー@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
var menu1:ContextMenuItem = new ContextMenuItem("ファイルを開く");
menu1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function():void {
//txt.appendText("menu");
load();
});
var menu2:ContextMenuItem = new ContextMenuItem("ファイルを保存");
menu2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function():void {
save();
});
contextMenu = new ContextMenu();
contextMenu.hideBuiltInItems();
contextMenu.customItems = [menu1,menu2];
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
}
private function onWheel(e:MouseEvent):void{
e.stopPropagation();
}
//改行コードの統一 (CR+LF or CR) → LF
private function unifyLineFeedCode(str:String):String {
var CR:String = String.fromCharCode(13);
var LF:String = String.fromCharCode(10);
str = str.split(CR+LF).join(LF);
str = str.split(CR).join(LF);
return str;
}
//セーブ
public function save():void {
var fileRef:FileReference = new FileReference();
fileRef.save(this.text, this.name);
}
//ファイルロード
public function load():void {//ファイル選択 ①
file = new FileReference();
file.addEventListener(Event.COMPLETE, onLoaded);
file.addEventListener(Event.SELECT, onSelect);
file.browse();
}
private function onSelect(e:Event):void{//ロード開始 ②
file.load();
}
private function onLoaded(e:Event):void {//ロード完了 ③
this.name = file.name;
var byte:int = file.data.length;
var byte2:uint;
//txt.text = String(file.data);
this.text = unifyLineFeedCode(file.data.toString());//改行コード統一
file.removeEventListener(Event.COMPLETE, onLoaded);
file.removeEventListener(Event.SELECT, onSelect);
}
//編集モード終了
private function outFocus(e:FocusEvent):void {
this.selectable = false;
removeEventListener(FocusEvent.FOCUS_OUT, outFocus);
removeEventListener(MouseEvent.MOUSE_DOWN, dragCansel);
addEventListener(MouseEvent.MOUSE_DOWN, onFocus);
//this.appendText(" Out ");
}
//編集モード開始
private function onFocus(e:MouseEvent):void {
this.selectable = true;
addEventListener(FocusEvent.FOCUS_OUT, outFocus);
removeEventListener(MouseEvent.MOUSE_DOWN, onFocus);
addEventListener(MouseEvent.MOUSE_DOWN, dragCansel);
//this.appendText(" In ");
//e.stopPropagation();
}
private function dragCansel(e:MouseEvent):void {
e.stopPropagation();
}
//キー入力
private function onKey(e:KeyboardEvent):void {
var sw:Boolean;
var str1:String;
var str2:String;
// エンターキーの状態
if (e.keyCode == 13) sw = true;
else if (e.keyCode == 108) sw = true;
else sw = false;
//キャレット位置に改行文字を挿入
if(sw == true){
str1 = this.text.substring(0, this.caretIndex);
str2 = this.text.substring(this.caretIndex, this.length);
this.text = str1;
this.appendText("\n");//キャレット位置で改行
//インデント構造(タブ&スペースの構成)を調べる
var indent:int=0;
var prevReturn:int = this.text.lastIndexOf('\r', this.caretIndex-1);//前回の改行位置
//一つ前の改行直後に続くタブコードの数=インデント深度
for (var j:int = prevReturn+1; j < this.caretIndex; j++) {
if (this.text.charAt(j) == '\t' || this.text.charAt(j) == ' ' ) indent++;
else break;
}
//上の行のインデントに従う
var indentStr:String = this.text.slice(prevReturn + 1, prevReturn + 1 + indent);
this.appendText(indentStr);//インデント
this.text += str2;//結合
//キャレット位置をインクリメント
this.setSelection(this.caretIndex +indent + 1, this.caretIndex +indent + 1);
dispatchEvent(new Event(Event.CHANGE));
return;
}
//tab
if (e.keyCode == 9) {
str1 = this.text.substring(0, this.caretIndex);
str2 = this.text.substring(this.caretIndex, this.length);
this.text = str1 + '\t' + str2;
//キャレット位置をインクリメント
this.setSelection(this.caretIndex + 1, this.caretIndex + 1);
dispatchEvent(new Event(Event.CHANGE));
return;
}
}
}