In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: シェルみたいなものを作りたい...

TextFieldを元に、シェルみたいなものを作りたい
Enterキーが押されたときの処理がうまく動かず、
プロンプトが出る時と出ない時がある、スクロールされないなどの場合がある
/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bCuMY
 */

// forked from tana's シェルみたいなものを作りたい...
//TextFieldを元に、シェルみたいなものを作りたい
//Enterキーが押されたときの処理がうまく動かず、
//プロンプトが出る時と出ない時がある、スクロールされないなどの場合がある
package {
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            // write as3 code here..
            var field:ShellField = new ShellField(">");
            field.text = "aaaaaaaaaaaaaaaa";
            addChild(field);
        }
    }
}

import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.TextEvent;
import flash.ui.Keyboard;

import flash.events.KeyboardEvent;
class ShellField extends TextField {
	private var prompt:String;
	public function ShellField(prompt:String = "") {
		this.type = TextFieldType.INPUT;
		this.prompt = prompt;
		this.multiline = true;
		addEventListener(TextEvent.TEXT_INPUT, onTextInput);
		addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
	}
	public override function appendText(str:String):void {
		//一番下までスクロールされていたら、
		//追加する文字列に含まれる改行の数だけ下にスクロール
		var lastLine:Boolean = false;
		if (scrollV == maxScrollV) {
			lastLine = true;
		}
		super.appendText(str);
		if (lastLine) {
			scrollV = maxScrollV;
//			scrollV += text.match(/\n/).length;
		}
	}
	
	private var _keyCode : uint = 0;
	
	// @see http://blog1.aitacos.com/?p=183
	private function onTextInput(e : TextEvent) : void
	{
		if (_keyCode == Keyboard.ENTER) {
			appendText("\n");
			dispatchEvent(new ShellEvent(ShellEvent.ENTER_DOWN, "hoge"));
			appendText(prompt);
			setSelection(text.length, text.length);
			e.preventDefault();
		}
	}
	
	private function keyDown(e:KeyboardEvent):void {
		//Enterキーが押された時は、
		//改行してからイベントを発生された後、プロンプトを表示
		//ここの動作が怪しい
		_keyCode = e.keyCode;
	}
}

class ShellEvent extends Event {
	public static const ENTER_DOWN:String = "EnterDown";
	public var str:String; //入力された文字列
	public function ShellEvent(type:String, str:String) {
		super(type);
		this.str = str;
	}
	public override function clone():Event {
		return new ShellEvent(type, str);
	}
	public override function toString():String {
		return formatToString("ShellEvent", "type", "bubbles", "cancelable", "eventPhase", "str");
	}
}