1  
     8  
     9  import com.sekati.log.OutPanel;
    10  import com.sekati.log.Inspector;
    11  import com.sekati.events.Dispatcher;
    12  import com.sekati.events.Event;
    13  import com.sekati.time.StopWatch;
    14  
    34  class com.sekati.log.Out {
    35  	private static var _instance:Out;
    36  	private static var _levels:Object = {TRACE:true, INFO:true, STATUS:true, WARN:true, ERROR:true, FATAL:true, OBJECT:true};
    37  	private static var _filters:Array = new Array( );
    38  	private static var _proxyObj:Object = new Object( );
    39  	private static var _isEnabled:Boolean = true;
    40  	private static var _isPanel:Boolean = false;
    41  	private static var _benchwatch:StopWatch = new StopWatch( false );
    42  	
    43  	public var trace:Function;
    44  	public var info:Function;
    45  	public var status:Function;
    46  	public var warn:Function;
    47  	public var error:Function;
    48  	public var fatal:Function;
    49  	
    52  	private function Out() {
    53  	}
    54  		
    58  	public static function getInstance():Out {
    59  		if (!_instance) _instance = new Out( );
    60  		return _instance;
    61  	}
    62  	
    65  	public static function get $():Out {
    66  		return Out.getInstance( );	
    67  	}	
    68  	
    74  	public function createPanel(w:Number, h:Number):Void {
    75  		_isPanel = true;
    76  		OutPanel.getInstance( w, h );
    77  	}
    78  	
    79  	
    83  	public function set enabled(b:Boolean):Void {
    84  		_isEnabled = b;
    85  	}
    86  		
    90  	public function get enabled():Boolean {
    91  		return _isEnabled;
    92  	}
    93  	
    97  	public function get _status():String {
    98  		return getLevels( ) + "\n" + getFilters( );
    99  	}
   100  	
   104  	public function reset():Void {
   105  		setAllLevels( true );
   106  		resetFilters( );
   107  	}
   108  	
   109  	
   115  	public function setLevel(level:String, isEnabled:Boolean):Void {
   116  		_levels[level.toUpperCase( )] = isEnabled;
   117  	}
   118  	
   123  	public function setAllLevels(isEnabled:Boolean):Void {
   124  		for (var i in _levels) {
   125  			setLevel( _levels[i], isEnabled );
   126  		}
   127  	}
   128  	
   132  	public function getLevels():String {
   133  		var a:Array = new Array( );
   134  		for (var i in _levels) {
   135  			a.push( i + ":" + _levels[i].toString( ) );
   136  		}
   137  		return "_levels={" + a.toString( ) + "};";
   138  	}
   139  	
   140  	
   146  	public function setFilter(origin:Object, isFiltered:Boolean):Void {
   147  		if(isFiltered) {
   148  			filter( origin );
   149  		} else {
   150  			unfilter( origin );
   151  		}
   152  	}
   153  	
   157  	public function getFilters():String {
   158  		return "_filters=[" + _filters.toString( ) + "];";
   159  	}
   160  	
   163  	public function resetFilters():Void {
   164  		_filters = [];
   165  	}
   166  	private function filter(origin:Object):Void {
   167  		var o:String = String( origin );
   168  		if (!isFiltered( o )) {
   169  			_filters.push( o );
   170  		}
   171  	}
   172  	private function unfilter(origin:Object):Void {
   173  		var o:String = String( origin );
   174  		for (var i:Number = 0; i < _filters.length ; i++) {
   175  			if (_filters[i] == o) {
   176  				_filters.splice( i, 1 );
   177  				break;
   178  			}
   179  		}
   180  	}
   181  	public function isFiltered(origin:Object):Boolean {
   182  		var o:String = String( origin );
   183  		for (var i:Number = 0; i < _filters.length ; i++) {
   184  			if (_filters[i] == o) {
   185  				return true;
   186  			}
   187  		}
   188  		return false;
   189  	}
   190  	
   191  	private function resolveOrigin($origin:Object):Void {
   192  		var o:Object = (typeof ($origin) == "string") ? $origin : $origin._classname;
   193  		if (!o) {
   194  			o = $origin;
   195  		}
   196  		trace( o );
   197  	}
   198  	
   199  	private function _output(level:String, origin:Object, msg:Object):Void {
   200  		if (!_isEnabled || !_levels[level] || isFiltered( origin )) {
   201  			return;
   202  		}
   203  		var o:String = level + ":[" + String( origin ) + "]: " + msg;
   204  		if(!_isPanel) {
   205  			trace( o );
   206  		} else {
   207  			var e:Event = new Event( "OUT_EVENT", this, {message:o, level:level} );
   208  			Dispatcher.$.dispatchEvent( e );
   209  		}
   210  	}
   211  	
   212  	private function __resolve(name:String):Function {
   213  		if (name.indexOf( "OUT_EVENT" ) > 1) {
   214  			return;
   215  		}
   216  		var f:Function = function ():Object {
   217  			arguments.unshift( name );
   218  			return __proxy.apply( _proxyObj, arguments );
   219  		};
   220  		_proxyObj[name] = f;
   221  		return f;
   222  	}
   223  	private function __proxy(name:String):Void {
   224  		arguments.shift( );
   225  		var n:String = String( name ).toUpperCase( );
   226  		var o:String = String( arguments[0] );
   227  		var s:String = String( arguments[1] );
   228  		_instance._output( n, o, s );
   229  	}
   230  	
   236  	public function object(origin:Object, obj:Object):Void {
   237  		var insp:Inspector = new Inspector( obj, origin );
   238  		_output( "OBJECT", origin, insp );
   239  	}
   240  	
   248  	public function benchmark(origin:Object, msg:String, mode:String):Void {
   249  		
   250  		
   256  		var b:Number;
   257  		switch (mode.toLowerCase( )) { 
   258  			case "start" : 
   259  				b = _benchwatch.start( );
   260  				break; 
   261  			case "stop" : 
   262  				b = _benchwatch.stop( ); 
   263  				break; 
   264  			case "lap" : 
   265  				b = _benchwatch.lap( ); 
   266  				break; 						
   267  			default : 
   268  				throw new Error( "@@@ com.sekati.log.Out Error: bench() expects mode param: 'start', 'stop' or 'lap'." );
   269  				return;
   270  			
   271  		}  
   272  		
   273  		var bs:String = String( _benchwatch.read( ) );
   274  		var str:String = String( msg + " | benchmark (" + mode + "): " + bs + "ms" );
   275  		
   276  		_output( "BENCHMARK", origin, str );
   277  	}
   278  }