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

自作 TextArea ver.3

TextAreaの自作 ver.3
*
* ある程度は動かせると思う。簡単にしか実験もしてないので不安
* いつか自分で自作コンポーネントを作ってみたいものです。
*
* アドバイスを頂けたら嬉しいです。
*
Get Adobe Flash player
by zahir 14 Sep 2009

    Talk

    keitakun at 17 Sep 2009 05:49
    おっ、結構前に僕が書いたコード使ってる。 色々直したかったことあるけど結局直さなかった。。。 ビットマットフォントでないフォントを使ったとき周りの色がうまい具合変わらないところを直したかったけど。。。必要なかったのでやらなかった。。。=P

    Tags

    Embed
/**
 * Copyright zahir ( http://wonderfl.net/user/zahir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8Od2
 */

/* 
 * TextAreaの自作 ver.3
 *
 * ある程度は動かせると思う。簡単にしか実験もしてないので不安
 * いつか自分で自作コンポーネントを作ってみたいものです。
 *
 * アドバイスを頂けたら嬉しいです。
 *
 */
package{
	import flash.display.Sprite;
	
	[SWF(width = 465, height = 465, backgroundColor = 0xFFFFFF)]

	public class TF_test1 extends Sprite{
		public function TF_test1(){
			var txt:String = "";
			txt += " 1  ::  ";
			for(var i:int= 2; i<=25; i++){
				txt += "\n " + i + "  ::  ";
			}
			var ta:TextArea = new TextArea( 320, 180, true, true, false, true);
			addChild( ta );
			ta.x = (stage.stageWidth - ta.width) >>1;
			ta.y = (stage.stageHeight - ta.height) >>1;
			ta.text = txt;
		}
	}
}
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.FocusEvent;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TextEvent;
import flash.filters.ColorMatrixFilter;
import flash.geom.Rectangle;
import flash.text.StyleSheet;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.text.TextLineMetrics;

class TextArea extends Sprite{
	
	public const SCROLL_BAR_WIDTH : int = 16;
	
	private var t:TextField;
	
	// HScrollBar
	private var hSliderBg:Sprite;
	private var hSlider:HSlider;
	
	// VScrollBar
	private var upBtn:UpButton;
	private var downBtn:DownButton;
	private var vSliderBg:Sprite;
	private var vSlider:VSlider;
	
	// up, down, over
	private var _arrowColor:Array = [0x999999, 0x333333, 0x666666];
	private var _baseColor:Array = [0xEEEEEE, 0xCCCCCC, 0xCCCCCC];
	private var _lineColor:Array = [0x999999, 0x0099FF, 0x666666];
	private var _barBackgroundColor:uint = 0xCCCCCC;
	
	private var _bg:uint = 0xEEEEEE;
	private var _border:uint = 0x333333;
	
	private var _focusBg:uint = 0xFFFFCC;
	private var _focusBorder:uint = 0x0099FF;
	
	private var _textColor:uint = 0x000000;
	private var _selectTextColor:uint = 0xFFFFFF;
	private var _selectBackgroundColor:uint = 0x0099FF;
	
	private var _useHScrollBar:Boolean;
	private var _useVScrollBar:Boolean;
	private var _useFilter:Boolean;
	private var _edit:Boolean;
	private var _focus:Boolean;
	private var _inFocus:Boolean = false;
	private var _draw:Boolean = true;
	private var _drag_flg:Boolean = false;
	
	private var hScroll_flg:Boolean = false;
	private var vScroll_flg:Boolean = false;
	
	private var w:int, h:int;
	private var hScrollThickness:Number;
	private var vScrollThickness:Number;
	
	private var clickPoint:int;
	private var minHScrollX:int;
	private var maxHScrollX:int;
	private var minVScrollY:int;
	private var maxVScrollY:int;
	
	private var _delayFrame:int = 8;
	private var count:int = 0;
	
	public function TextArea(	width:int, height:int,
												useHScrollBar:Boolean, useVScrollBar:Boolean,
												focus:Boolean = false, 
												useFilter:Boolean = false, editable:Boolean = true){
		t = new TextField();
		addChild( t );
		w = t.width = width;
		h = t.height = height;
		t.x = t.y = 0;
		
		_useHScrollBar = useHScrollBar;
		_useVScrollBar = useVScrollBar;
		_useFilter = useFilter;
		this.focus = focus;
		
		this.editable = editable;
		this.multiline = true;
		init();
	}
	
	private function init():void{
		t.type = (_edit == true) ? TextFieldType.INPUT : TextFieldType.DYNAMIC;
		setFilter();
		draw();
		 
		t.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
		t.addEventListener( Event.CHANGE, onChange );
		t.addEventListener(Event.SCROLL, onScroll);
		t.addEventListener( TextEvent.LINK, onLink );
	}
	
	private function addHScrollUI():void{
		if(hScroll_flg){
			updataHScrollUI();
			return;
		}
		t.height -= SCROLL_BAR_WIDTH;
		hSliderBg = new Sprite();
		addChild( hSliderBg );
		drawH();
		var _w:int = hSliderBg.width * (t.width / t.textWidth);
		_w = _w < 12 ? 12 : _w;
		hSlider = new HSlider( _w, SCROLL_BAR_WIDTH, _arrowColor, _baseColor, _lineColor );
		addChild(hSlider);
		
		hSliderBg.addEventListener( MouseEvent.MOUSE_DOWN, onHSliderBgDown);
		hSlider.addEventListener( MouseEvent.MOUSE_DOWN, onHSliderDown);
		
		hSlider.cacheAsBitmap = true;
		if(useVScrollBar && vScroll_flg)
			updataVScrollUI();
		updataHScrollUI();
		hScroll_flg = true;
		_draw = true;
	}
	
	private function addVScrollUI():void{
		if(vScroll_flg){
			updataVScrollUI();
			return;
		}
		t.width -= SCROLL_BAR_WIDTH;
		vSliderBg = new Sprite();
		addChild(vSliderBg);
		upBtn = new UpButton( SCROLL_BAR_WIDTH, _arrowColor, _baseColor, _lineColor);
		addChild( upBtn );
		downBtn = new DownButton( SCROLL_BAR_WIDTH, _arrowColor, _baseColor, _lineColor);
		addChild( downBtn );
		var _h:int = (h - SCROLL_BAR_WIDTH*2) * (t.height / t.textHeight);
		_h = _h < 12 ? 12 : _h;
		vSlider = new VSlider( _h , SCROLL_BAR_WIDTH, _arrowColor, _baseColor, _lineColor);
		addChild( vSlider );
		drawV();
		
		upBtn.addEventListener( MouseEvent.MOUSE_DOWN, onUpDown );
		downBtn.addEventListener( MouseEvent.MOUSE_DOWN, onDownDown );
		vSliderBg.addEventListener( MouseEvent.MOUSE_DOWN, onVSliderBgDown );
		vSlider.addEventListener( MouseEvent.MOUSE_DOWN, onVSliderDown );
		
		vSlider.cacheAsBitmap = true;
		if(useHScrollBar && hScroll_flg)
			updataHScrollUI();
		updataVScrollUI();
		vScroll_flg = true;
		_draw = true;
	}
	
	private function removeHScrollUI():void{
		if( hSliderBg != null && this.contains( hSliderBg) ){
			hSliderBg.removeEventListener( MouseEvent.MOUSE_DOWN, onHSliderBgDown);
			removeChild(hSliderBg);
		}
		if( hSlider != null && this.contains( hSlider) ){
			hSlider.removeEventListener( MouseEvent.MOUSE_DOWN, onHSliderDown);
			removeChild(hSlider);
		}
		t.height = h;
		hScroll_flg = false;
	}
	private function removeVScrollUI():void{
		if( upBtn != null  && this.contains(upBtn) ){
			upBtn.removeEventListener( MouseEvent.MOUSE_DOWN, onUpDown );
			removeChild( upBtn );
		}
		if( downBtn  != null && this.contains(downBtn) ){
			downBtn.removeEventListener( MouseEvent.MOUSE_DOWN, onDownDown );
			removeChild( downBtn );
		}
		if( vSliderBg != null && this.contains(vSliderBg) ){
			vSliderBg.removeEventListener( MouseEvent.CLICK, onVSliderBgDown);
			removeChild( vSliderBg );
		}
		if( vSlider != null  && this.contains(vSlider) ){
			vSlider.removeEventListener( MouseEvent.MOUSE_DOWN, onVSliderDown );
			removeChild( vSlider );
		}
		
		t.width = w;
		vScroll_flg = false;
	}
	private function updataHScrollUI():void{
		hSliderBg.y = hSlider.y = t.height;
		var _w:int = hSliderBg.width * ( (maxScrollH / 3) / maxScrollH);
		hSlider.sliderWidth = _w = _w < 12 ? 12 : _w;
		minHScrollX = 0;
		maxHScrollX = t.width - hSlider.width;
		hScrollThickness = (maxHScrollX -  minHScrollX) / ( t.maxScrollH);
		hSlider.x = minHScrollX + hScrollThickness * ( t.scrollH);
		draw();
	}
	private function updataVScrollUI():void{
		vSliderBg.x = upBtn.x = downBtn.x = vSlider.x = t.width;
		downBtn.y = h - SCROLL_BAR_WIDTH - 1;
		var _h:int = ( t.height - SCROLL_BAR_WIDTH*2) * (t.height / t.textHeight);
		vSlider.sliderHeight = _h < 12 ? 12 : _h;
		minVScrollY = upBtn.y + upBtn.height;
		maxVScrollY = downBtn.y - vSlider.height;
		vScrollThickness = (maxVScrollY - minVScrollY ) / (t.maxScrollV);
		vSlider.y = minVScrollY + vScrollThickness * (scrollV - 1);
		draw();
	}
	
	private function checkUseScrollBar():void{
		if( !useHScrollBar && !useVScrollBar ) return;
		if( useHScrollBar ){
			if( maxScrollH >= 1){
				addHScrollUI();
			}else if( maxScrollH == 0){
				removeHScrollUI();
			}
		}
		if( useVScrollBar ){
			if( maxScrollV > 1){
				addVScrollUI();
			}else if( maxScrollV == 1){
				removeVScrollUI();
			}
		}
	}
	
	private function draw():void{
		if(!_draw) return;
		var g:Graphics = this.graphics;
		g.clear();
		g.lineStyle( _inFocus ? 2 : 1, _inFocus ? focusBorderColor : borderColor , _inFocus ? 0.8 : 1);
		g.beginFill( _inFocus ? focusBackgroundColor : backgroundColor );
		g.drawRect(0,0, width, height -1);
		g.endFill();
		if( hScroll_flg ) drawH();
		if( vScroll_flg ) drawV();
		_draw = false;
	}
	private function drawH():void{
		var g:Graphics = hSliderBg.graphics;
		g.clear();
		g.lineStyle( 1, _lineColor[0]);
		g.beginFill( _barBackgroundColor );
		g.drawRect( 1,0, t.width - 1, SCROLL_BAR_WIDTH - 2);
		g.endFill();
	}
	private function drawV():void{
		var g:Graphics = vSliderBg.graphics;
		g.clear();
		g.lineStyle( 1, _lineColor[0]);
		g.beginFill( _barBackgroundColor );
		g.drawRect( 1,1, SCROLL_BAR_WIDTH - 2, h -3);
		g.endFill();
	}
	
	private function setFilter():void{
		//引用元 :: http://labs.hellokeita.com/2008/03/13/textfield-selection-color/
		// filterを使用する場合 htmlTextで<font color="#RRGGBB">を利用してもテキストの色は統一されるので注意
		if( !_useFilter ) return;
		
		const n:Number = 1/255;
		var cf:ColorMatrixFilter = new ColorMatrixFilter();
		var c:Array = [];
		var r:int, g:int, b:int;
		
		c[0] = _selectBackgroundColor >> 16;
		c[1] = _selectBackgroundColor >> 8 &0xFF;
		c[2] = _selectBackgroundColor &0xFF;
		
		r = _textColor >>16; g = _textColor >> 8 &0xFF; b = _textColor &0xFF;
		c[3] = (r - (255 + c[0])) * n + 1;
		c[4] = (g - (255 + c[1])) * n + 1;
		c[5] = (b - (255 + c[2])) * n + 1;
		
		r = _selectTextColor >>16; g = _selectTextColor >> 8 &0xFF; b = _selectTextColor &0xFF;
		c[6] = (r - (255 + c[0])) * n + 1 - c[3];
		c[7] = (g - (255 + c[1])) * n + 1 - c[4];
		c[8] = (b - (255 + c[2])) * n + 1 - c[5];
		
		cf.matrix = [c[3], c[6], 0, 0, c[0], c[4], c[7], 0, 0, c[1], c[5], c[8], 0, 0, c[2], 0, 0, 0, 1, 0];
		t.textColor = 0xFF0000;
		t.filters = [ cf ];
	}
	
	
	public function get backgroundColor():uint{
		return _bg;
	}
	public function set backgroundColor( value:uint ):void{
		_bg = value;
		_draw = true;
		draw()
	}
	
	public function get borderColor():uint{
		return _border;
	}
	public function set borderColor( value:uint ):void{
		_border = value;
		_draw = true;
		draw();
	}
	
	public function set barBackgroundColor( value:uint ):void{
		_barBackgroundColor = value;
		_draw = true;
		draw();
	}
	
	public function get delayFrame():int{
		return _delayFrame;
	}
	public function set delayFrame( value:int ):void{
		_delayFrame = value < 0 ? 0:Math.round( value );
	}
	
	public function get editable():Boolean{ return _edit; }
	public function set editable( flg:Boolean ):void {
		_edit = flg;
		t.type = (_edit == true) ? TextFieldType.INPUT : TextFieldType.DYNAMIC; 
	}
	
	public function get filtering():Boolean{ return _useFilter; }
	public function set filtering( flg:Boolean ):void{
		_useFilter = flg;
		if(!flg) t.filters = [];
	}
	
	public function get focus():Boolean{ return _focus; }
	public function set focus( flg:Boolean ):void{
		_focus = flg;
		if(flg){
			t.addEventListener(FocusEvent.FOCUS_IN, inFocus);
		}else{
			t.removeEventListener(FocusEvent.FOCUS_IN, inFocus);
		}
	}
	
	public function get focusBackgroundColor():uint{ return _focusBg; }
	public function set focusBackgroundColor( value:uint ):void{ _focusBg = value; }
	
	public function get focusBorderColor():uint{ return _focusBorder; }
	public function set focusBorderColor( value:uint ):void{ _focusBorder = value; }
	
	public override function get height():Number{
		return Math.floor( super.height );
	}
	public override function set height( value:Number ):void{
		h = Math.round( value );
		_draw = true;
		if(hScroll_flg){
			t.height = h - SCROLL_BAR_WIDTH;
			updataHScrollUI();
		}else t.height = h;
		if(vScroll_flg) updataVScrollUI();
		draw();
	}
	
	public function get selectBackgroundColor():uint{ return _selectBackgroundColor; }
	public function set selectBackgroundColor( value:uint ):void{_selectBackgroundColor = value; setFilter();}
	
	public function get selectTextColor():uint{ return _selectTextColor; }
	public function set selectTextColor( value:uint ):void{ _selectTextColor = value; setFilter();}
	
	public function get textColor():uint{ return _textColor; }
	public function set textColor(value:uint):void{ _textColor = value; setFilter();}
	
	public function set UIArrowColor( arr:Array ):void{
		if(arr.length != 3) return;
		_arrowColor = arr;
		upBtn.arrowColors = downBtn.arrowColors = vSlider.arrowColors = arr;
	}
	public function set UIBaseColor( arr:Array ):void{
		if(arr.length != 3) return;
		_baseColor = arr;
		upBtn.baseColors = downBtn.baseColors = vSlider.baseColors = arr;
	}
	public function set UILineColor( arr:Array ):void{
		if(arr.length != 3) return;
		_lineColor = arr;
		upBtn.lineColors = downBtn.lineColors = vSlider.lineColors = arr;
	}
	
	public function get useHScrollBar():Boolean{ return _useHScrollBar; }
	public function set useHScrollBar( flg:Boolean ):void{ _useHScrollBar = flg; }
	
	public function get useVScrollBar():Boolean{ return _useVScrollBar; }
	public function set useVScrollBar( flg:Boolean ):void{ _useVScrollBar = flg; }
	
	public override function get width():Number{
		return Math.floor( super.width );
	}
	public override function set width(value:Number):void{
		w = Math.round( value );
		_draw = true;
		if(vScroll_flg){
			t.width = w - SCROLL_BAR_WIDTH;
			updataVScrollUI();
		}else t.width = w;
		if(hScroll_flg) updataHScrollUI();
		draw();
	}
	
	// HSliderBg
	protected function onHSliderBgDown( e:MouseEvent ):void{
		var p:int = mouseX;
		p = p < minHScrollX ? minHScrollX : p > maxHScrollX? maxHScrollX : p;
		scrollH = p / hScrollThickness + 1;
		
		hSliderBg.stage.addEventListener(MouseEvent.MOUSE_MOVE, onHSliderBgMove);
		hSliderBg.stage.addEventListener(MouseEvent.MOUSE_UP, onHSliderBgUp);
	}
	protected function onHSliderBgMove( e:MouseEvent ):void{
		var p:int = mouseX;
		p = p < minHScrollX ? minHScrollX : p > maxHScrollX? maxHScrollX : p;
		scrollH = p / hScrollThickness + 1;
		e.updateAfterEvent();
	}
	protected function onHSliderBgUp( e:MouseEvent ):void{
		hSliderBg.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onHSliderBgMove);
		hSliderBg.stage.removeEventListener(MouseEvent.MOUSE_UP, onHSliderBgUp);
	}
	
	protected function onHSliderDown( e:MouseEvent ):void{
		_drag_flg = true;
		clickPoint = hSlider.mouseX;
		hSlider.stage.addEventListener( MouseEvent.MOUSE_MOVE, onHSliderMove );
		hSlider.stage.addEventListener( MouseEvent.MOUSE_UP, onHSliderUp );
	}
	protected function onHSliderMove( e:MouseEvent ):void{
		var p:int = mouseX - clickPoint;
		hSlider.x = p = p < minHScrollX ? minHScrollX : p > maxHScrollX? maxHScrollX : p;
		scrollH = p / hScrollThickness + 1;
	}
	protected function onHSliderUp( e:MouseEvent ):void{
		_drag_flg = false;
		hSlider.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onHSliderMove );
		hSlider.stage.removeEventListener( MouseEvent.MOUSE_UP, onHSliderUp );
	}
	
	// VSliderBg
	protected function onVSliderBgDown( e:MouseEvent ):void{
		var p:int = mouseY;
		p = p < minVScrollY ? minVScrollY : p > maxVScrollY? maxVScrollY : p;
		scrollV = ( p - SCROLL_BAR_WIDTH ) / vScrollThickness + 1;
		
		vSliderBg.stage.addEventListener(MouseEvent.MOUSE_MOVE, onVSliderBgMove);
		vSliderBg.stage.addEventListener(MouseEvent.MOUSE_UP, onVSliderBgUp);
	}
	protected function onVSliderBgMove( e:MouseEvent ):void{
		var p:int = mouseY;
		p = p < minVScrollY ? minVScrollY : p > maxVScrollY? maxVScrollY : p;
		scrollV = ( p - SCROLL_BAR_WIDTH ) / vScrollThickness + 1;
		e.updateAfterEvent();
	}
	protected function onVSliderBgUp( e:MouseEvent ):void{
		vSliderBg.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onVSliderBgMove);
		vSliderBg.stage.removeEventListener(MouseEvent.MOUSE_UP, onVSliderBgUp);
	}
	// VSlider
	protected function onVSliderDown( e:MouseEvent ):void{
		_drag_flg = true;
		clickPoint = vSlider.mouseY;
		vSlider.stage.addEventListener( MouseEvent.MOUSE_MOVE, onVSliderMove );
		vSlider.stage.addEventListener( MouseEvent.MOUSE_UP, onVSliderUp );
	}
	protected function onVSliderMove( e:MouseEvent):void{
		var p:int = mouseY - clickPoint;
		vSlider.y = p = p < minVScrollY ? minVScrollY : p > maxVScrollY? maxVScrollY : p;
		scrollV = ( p - SCROLL_BAR_WIDTH ) / vScrollThickness + 1;
		e.updateAfterEvent();
	}
	protected function onVSliderUp( e:MouseEvent ):void{
		_drag_flg = false;
		vSlider.stage.removeEventListener( MouseEvent.MOUSE_MOVE, onVSliderMove );
		vSlider.stage.removeEventListener( MouseEvent.MOUSE_UP, onVSliderUp );
	}
	// Up Button
	protected function onUpDown( e:MouseEvent ):void{
		scrollV--;
		count = 0;
		addEventListener(Event.ENTER_FRAME, onUpFrame);
		stage.addEventListener( MouseEvent.MOUSE_UP, onUpUp);
	}
	protected function onUpUp( e:MouseEvent ):void{
		removeEventListener(Event.ENTER_FRAME, onUpFrame);
		stage.removeEventListener( MouseEvent.MOUSE_UP, onUpUp);
	}
	protected function onUpFrame( e:Event ):void{
		if( count <= delayFrame){
			count ++;
			return;
		}
		scrollV--;
	}
	// Down Button
	protected function onDownDown( e:MouseEvent):void{
		scrollV++;
		count = 0;
		addEventListener(Event.ENTER_FRAME, onDownFrame);
		stage.addEventListener( MouseEvent.MOUSE_UP, onDownUp);
	}
	protected function onDownUp(e:MouseEvent):void{
		removeEventListener(Event.ENTER_FRAME, onDownFrame);
		stage.removeEventListener( MouseEvent.MOUSE_UP, onDownUp);
	}
	protected function onDownFrame( e:Event ):void{
		if( count <= delayFrame){
			count ++;
			return;
		}
		scrollV++;
	}

	
	protected function onChange( e:Event ):void{
		checkUseScrollBar();
		dispatchEvent( e );
	}
	protected function onScroll( e:Event ):void{
		dispatchEvent( e );
		if(_drag_flg) return;
		if(hScroll_flg)
			hSlider.x = scrollH == 1 ? minHScrollX : minHScrollX + hScrollThickness * scrollH;
		if(vScroll_flg)
			vSlider.y = scrollV == 1 ? minVScrollY : minVScrollY + vScrollThickness * scrollV;
	}
	protected function inFocus( e:FocusEvent ):void{
		_inFocus = true;
		_draw = true;
		draw();
	}
	protected function outFocus( e:FocusEvent ):void{
		_inFocus = false;
		_draw = true;
		draw();
	}
	protected function onLink( e:TextEvent ):void{
		dispatchEvent( e );
	}
	protected function onKeyDown( e:KeyboardEvent ):void{
		t.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
	}
	protected function onKeyUp( e:KeyboardEvent ):void{
		t.removeEventListener( KeyboardEvent.KEY_UP, onKeyUp);
	}
	
	
	// TextFieldのプロパティーとかメソッドとか
	public function get alwaysShowSelection():Boolean{ return t.alwaysShowSelection; }
	public function set alwaysShowSelection(flg:Boolean):void{ t.alwaysShowSelection = flg; }
	public function get antiAliasType():String{ return t.antiAliasType; }
	public function set antiAliasType(str:String):void{ t.antiAliasType = str; }
	public function get bottomScroll():int{ return t.bottomScrollV; }
	public function get caretIndex():int{ return t.caretIndex; }
	public function get condenseWhite():Boolean{ return t.condenseWhite; }
	public function set condenseWhite(flg:Boolean):void{ t.condenseWhite = flg; }
	public function get defaultTextFormat():TextFormat{ return t.defaultTextFormat; }
	public function set defaultTextFormat(data:TextFormat):void{ t.defaultTextFormat = data; }
	public function get embedFonts():Boolean{ return t.embedFonts; }
	public function set embedFonts(flg:Boolean):void{ t.embedFonts = flg; }
	public function get gridFitType():String{ return t.gridFitType; }
	public function set gridFitType(str:String):void{ t.gridFitType = str; }
	public function get htmlText():String{ return t.htmlText; }
	public function set htmlText(str:String):void{ t.htmlText = str; checkUseScrollBar();}
	public function get length():int{ return t.length; }
	public function get maxChars():int{ return t.maxChars; }
	public function set maxChars(value:int):void{ t.maxChars = value; }
	public function get maxScrollH():int{ return t.maxScrollH; }
	public function get maxScrollV():int{ return t.maxScrollV; }
	public function get mouseWheelEnabled():Boolean{ return t.mouseWheelEnabled; }
	public function set mouseWheelEnabled(flg:Boolean):void{ t.mouseWheelEnabled = flg; }
	public function get multiline():Boolean{ return t.multiline; }
	public function set multiline(flg:Boolean):void{ t.multiline = flg; }
	public function get numLines():int{ return t.numLines; }
	public function get restrict():String{ return t.restrict; }
	public function set restrict(str:String):void{ t.restrict = str; }
	public function get scrollH():int{ return t.scrollH; }
	public function set scrollH(value:int):void{ t.scrollH = value; }
	public function get scrollV():int{ return t.scrollV; }
	public function set scrollV(value:int):void{ t.scrollV = value; }
	public function get selectable():Boolean{ return t.selectable; }
	public function set selectable(flg:Boolean):void{ t.selectable = flg; }
	public function get selectedText():String{ return t.selectedText; }
	public function get selectionBeginIndex():int{ return t.selectionBeginIndex; }
	public function get selectionEndIndex():int{ return t.selectionEndIndex; }
	public function get sharpness():Number{ return t.sharpness; }
	public function set sharpness(value:Number):void{ t.sharpness = value; }
	public function get styleSheet():StyleSheet{ return t.styleSheet; }
	public function set styleSheet(data:StyleSheet):void{ t.styleSheet = data; }
	public function get text():String{ return t.text; }
	public function set text(str:String):void{ t.text = str; checkUseScrollBar();}
	public function get textHeight():Number{ return t.textHeight; }
	public function get textWidth():Number{ return t.textWidth; }
	public function get thickness():Number{ return t.thickness; }
	public function set thickness(value:Number):void{ t.thickness = value; }
	public function get useRichTextClipboard():Boolean{ return t.useRichTextClipboard; }
	public function set useRichTextClipboard(flg:Boolean):void{ t.useRichTextClipboard = flg; }
	public function get wordWrap():Boolean{ return t.wordWrap; }
	public function set wordWrap(flg:Boolean):void{ t.wordWrap = flg; }
	public function appendText(newText:String):void{ t.appendText( newText ); }
	
	public function getCharBoundaries(charIndex:int):Rectangle{ return t.getCharBoundaries( charIndex ); }
	public function getCharIndexAtPoint(x:Number, y:Number):int{ return t.getCharIndexAtPoint( x, y ); }
	public function getFirstCharInParagraph(charIndex:int):int{ return t.getFirstCharInParagraph( charIndex ); }
	public function getImageReference(id:String):DisplayObject{ return t.getImageReference( id ); }
	public function getLineIndexAtPoint(x:Number, y:Number):int{ return t.getLineIndexAtPoint( x, y); }
	public function getLineIndexOfChar(charIndex:int):int{ return t.getLineIndexOfChar( charIndex ); }
	public function getLineLength(lineIndex:int):int{ return t.getLineLength( lineIndex ); }
	public function getLineMetrics(lineIndex:int):TextLineMetrics{ return t.getLineMetrics( lineIndex ); }
	public function getLineOffset(lineIndex:int):int{ return t.getLineOffset( lineIndex ); }
	public function getLineText(lineIndex:int):String{ return t.getLineText( lineIndex ); }
	public function getParagraphLength(charIndex:int):int{ return t.getParagraphLength( charIndex ); }
	public function getRawText():String{ return t.getRawText(); }
	public function getTextFormat(beginIndex:int, endIndex:int):TextFormat{ return t.getTextFormat( beginIndex, endIndex ); }
	public function getTextRuns(beginIndex:int=0, endIndex:int=2147483647):Array{ return t.getTextRuns( beginIndex, endIndex ); }
	public function getXMLText(beginIndex:int=0, endIndex:int=2147483647):String{ return t.getXMLText( beginIndex, endIndex ); }
	public function replaceSelectedText(value:String):void{ t.replaceSelectedText( value ); }
	public function replaceText(beginIndex:int, endIndex:int, newText:String):void{ t.replaceText( beginIndex, endIndex, newText ); }
	public function setSelection(beginIndex:int, endIndex:int):void{ t.setSelection( beginIndex, endIndex ); }
	public function setTextFormat(format:TextFormat, beginIndex:int, endIndex:int):void{ t.setTextFormat( format, beginIndex, endIndex ); }
}

class MyButton extends Sprite{
	protected var flg:Boolean = false;
	protected var over_flg:Boolean = false;
	
	// up, down, over
	protected var _arrowColor:Array ;
	protected var _baseColor:Array;
	protected var _lineColor:Array;
	protected var _thickness:Array = [1,2,1];
	
	protected var _side:int;
	protected var ui:Sprite;
	public function set arrowColors( arr:Array ):void{
		_arrowColor = arr;
		draw();
	}
	public function set baseColors( arr:Array ):void{
		_baseColor = arr;
		draw();
	}
	public function set lineColors( arr:Array ):void{
		_lineColor = arr;
		draw();
	}
	public function MyButton( side:int, arrowColor:Array, baseColor:Array, lineColor:Array ){
		_side = side;
		_arrowColor = arrowColor;
		_baseColor = baseColor;
		_lineColor = lineColor;
		
		ui = new Sprite();
		addChild( ui );
		
		var g:Graphics = this.graphics;
		g.beginFill( _baseColor[ 0 ], 0.02);
		g.drawRect( 0,0, side,side);
		g.endFill();
		
		draw();
		
		addEventListener( MouseEvent.MOUSE_DOWN, onDown );
		addEventListener( MouseEvent.MOUSE_OVER, onOver );
	}
	protected function draw( num:int = 0 ):void{
		if( num >= 3) return;
		// overrideして描画処理しよう
	}
	protected function onDown( e:MouseEvent ):void{
		flg = true;
		draw( 1 );
		stage.addEventListener( MouseEvent.MOUSE_UP, onUp );
	}
	protected function onUp( e:MouseEvent ):void{
		flg = false;
		over_flg == true ? draw(2): draw();
		stage.removeEventListener( MouseEvent.MOUSE_UP, onUp );
	}
	protected function onOver( e:MouseEvent ):void{
		over_flg = true;
		if(flg) return;
		draw( 2 );
		addEventListener( MouseEvent.MOUSE_OUT, onOut );
	}
	protected function onOut( e:MouseEvent ):void{
		over_flg = false;
		if(flg) return;
		draw();
		removeEventListener( MouseEvent.MOUSE_OUT, onOut );
	}
}
class HSlider extends MyButton{
	private var _width:int;
	public function HSlider( width:int, side:int, arrowColor:Array, baseColor:Array, lineColor:Array ){
		_width = width;
		super( side, arrowColor, baseColor, lineColor );
	}
	public function set sliderWidth( value:int ):void{
		_width = value;
		draw();
	}
	protected override function draw( num:int = 0):void{
		super.draw( num );
		var g:Graphics = ui.graphics;
		g.clear();
		g.lineStyle( 1, _lineColor[ num ]);
		g.beginFill( _baseColor[ num ] );
		g.drawRect( 2,1, _width, _side - 4);
		g.endFill();
		var ww:int = _width >>1;
		var t:int = _side >>1;
		var b:int = t;
		t -= 4;
		b +=4; 
		g.lineStyle( 1, _arrowColor[ num ]);
		g.moveTo( ww -3, t);
		g.lineTo( ww - 3, b);
		g.moveTo( ww, t);
		g.lineTo( ww, b);
		g.moveTo( ww +3, t);
		g.lineTo( ww + 3, b);
	}
}
class VSlider extends MyButton{
	private var _height:int;
	public function VSlider( height:int, side:int, arrowColor:Array, baseColor:Array, lineColor:Array ){
		_height = height;
		super( side, arrowColor, baseColor, lineColor );
	}
	public function set sliderHeight( value:int ):void{
		_height = value;
		draw();
	}
	protected override function draw( num:int = 0):void{
		super.draw( num );
		var g:Graphics = ui.graphics;
		g.clear();
		g.lineStyle( 1, _lineColor[ num ]);
		g.beginFill( _baseColor[ num ] );
		g.drawRect( 2,1, _side - 4, _height);
		g.endFill();
		var hh:int = _height >>1;
		var l:int = _side >>1;
		var r:int = l;
		l -= 4;
		r +=4; 
		g.lineStyle( 1, _arrowColor[ num ]);
		g.moveTo( l, hh - 3);
		g.lineTo( r, hh - 3);
		g.moveTo( l, hh);
		g.lineTo( r, hh);
		g.moveTo( l, hh + 3);
		g.lineTo( r, hh + 3);
	}
}
class UpButton extends MyButton{
	public function UpButton( side:int, arrowColor:Array, baseColor:Array, lineColor:Array ){
		super( side, arrowColor, baseColor, lineColor );
	}
	protected override function draw( num:int = 0):void{
		super.draw( num );
		var g:Graphics = ui.graphics;
		var l:int =_thickness[ num ];
		g.clear();
		g.lineStyle( l, _lineColor[ num ]);
		g.beginFill( _baseColor[ num ] );
		g.drawRect( l,l, _side - (l+1),_side - (l+1));
		g.endFill();
		g.lineStyle( 0, 0, 0);
		g.beginFill( _arrowColor[ num ]);
		
		g.moveTo( 5, _side - 5);
		g.lineTo( _side - 5, _side -5);
		g.lineTo( _side/2, 6);
		g.lineTo( 5, _side -5);
		g.endFill();
	}
}
class DownButton extends MyButton{
	public function DownButton( side:int, arrowColor:Array, baseColor:Array, lineColor:Array ){
		super( side, arrowColor, baseColor, lineColor );
	}
	protected override function draw( num:int = 0):void{
		super.draw( num );
		var g:Graphics = ui.graphics;
		var l:int =_thickness[ num ];
		g.clear();
		g.lineStyle( l, _lineColor[ num ]);
		g.beginFill( _baseColor[ num ] );
		g.drawRect( l,l, _side - (l+1),_side - (l+1));
		g.endFill();
		g.lineStyle( 0, 0, 0);
		g.beginFill( _arrowColor[ num ]);
		g.moveTo( 5, 7);
		g.lineTo( _side - 5, 7);
		g.lineTo( _side/2, _side - 5);
		g.lineTo( 5, 7);
		g.endFill();
	}
}