import TextField.StyleSheet;
/**
* 输出调试信息
* 支持 Number, String, Boolean, MovieClip, Array, Object, XMLNode
* @usage
* 先调用Debug.init()初始化输出文本的设置信息
* 也可以使用默认设置或者通过setter单独设置需要的变量
* @author eidiot
* @data 2006-10-14 上午10:04:26
*/
class net.eidiot.debug.Debug
{
//##########################################################################
//
// Constants
//
//##########################################################################
private static var TXT_NAME:String = "traceTxt";
// ====== type ======
private static var TYPE_NUMBER:String = "number";
private static var TYPE_STRING:String = "string";
private static var TYPE_BOOLEAN:String = "boolean";
private static var TYPE_FUNCION:String = "function";
private static var TYPE_MOVIE_CLIP:String = "movieclip";
private static var TYPE_OBJECT:String = "object";
// ====== title ======
private static var TITLE_NUMBER:String = "[Number]";
private static var TITLE_STRING:String = "[String]";
private static var TITLE_BOOLEAN:String = "[Boolean]";
private static var TITLE_FUNCION:String = "[Function]";
private static var TITLE_MOVIE_CLIP:String = "[MovieClip]";
private static var TITLE_ARRAY:String = "[Array]";
private static var TITLE_XML_NODE:String = "[XMLNode]";
private static var TITLE_OBJECT:String = "[Object]";
// ====== MC ======
private static var MC_X:String = "_x";
private static var MC_Y:String = "_y";
private static var MC_WIDTH:String = "_width";
private static var MC_HEIGHT:String = "_height";
// ====== XML ======
private static var XML_NAME:String = "nodeName";
private static var XML_ATTRIBUTES:String = "attributes";
private static var XML_VALUE:String = "nodeValue";
private static var XML_NODES:String = "childNodes";
// ====== CSS ======
private static var CSS_DOT:String = ".";
private static var CSS_COLOR:String = "{color:";
// ====== 文字颜色,可根据喜好设置 ======
private static var COLOR_TITLE:String = "#FF0000";
private static var COLOR_TYPE:String = "#003366";
private static var COLOR_NUMBER:String = "#990000";
private static var COLOR_STRING:String = "#336600";
private static var COLOR_BOOLEAN:String = "#996633";
private static var COLOR_LABEL:String = "#666666";
// ====== class name ======
private static var CLASS_TITLE:String = "title";
private static var CLASS_TYPE:String = "type";
private static var CLASS_NUMBER:String = "number";
private static var CLASS_STRING:String = "string";
private static var CLASS_BOOLEAN:String = "boolean";
private static var CLASS_LABEL:String = "label";
//文字字体,可根据需要设置,并可添加其他CSS属性
private static var CSS_FOUNT:String = ";font-family: Courier New;}";
// ====== expression ======
private static var VAR_TITLE:String = "--> ";
private static var SPACE:String = " ";
private static var RETURN:String = "
";
private static var TAB:String = " ";
private static var BLANK:String = "";
// ====== span ======
private static var SPAN_TITLE:String = "";
private static var SPAN_TYPE:String = "";
private static var SPAN_NUMBER:String = "";
private static var SPAN_STRING:String = "";
private static var SPAN_BOOLEAN:String = "";
private static var SPAN_LABEL:String = "";
private static var SPAN_END:String = "";
// ====== other ======
private static var UNDEFINED:String = "undefined";
//##########################################################################
//
// Variables
//
//##########################################################################
//
private static var traceTxt:TextField;
//
private static var __holder:MovieClip = _root;
private static var __x:Number = 800;
private static var __y:Number = 0;
private static var __width:Number = 400;
private static var __height:Number = 600;
private static var __bgColor:Number = 0xEEEFF0;
private static var __borderColor:Number = 0xEEEFF0;
//
private static var isInit:Boolean = false;
//##########################################################################
//
// Property
//
//##########################################################################
public static function set holder(v:MovieClip):Void
{
__holder = v;
}
public static function set x(v:Number):Void
{
__x = v;
}
public static function set y(v:Number):Void
{
__y = v;
}
public static function set width(v:Number):Void
{
__width = v;
}
public static function set height(v:Number):Void
{
__height = v;
}
public static function set bgColor(v:Number):Void
{
__bgColor = v;
}
public static function set borderColor(v:Number):Void
{
__borderColor= v;
}
//##########################################################################
//
// Methods
//
//##########################################################################
/**
* 输出信息
* @param info 要输出的信息
* @param title 信息标题,可以省略
*/
public static function trace(info, title:String):Void
{
if (!isInit)
{
init();
}
title = title == undefined ? BLANK : title;
traceTxt.htmlText += getTitleSpan(title) + RETURN;
var infoStr:String = info == undefined ? UNDEFINED : getString(info);
traceTxt.htmlText += infoStr + RETURN;
}
/**
* 初始化trace信息显示的位置、大小、背景和边框颜色
*/
public static function init(holder:MovieClip, x:Number, y:Number, width:Number, height:Number, bgColor:Number, borderColor):Void
{
if (holder != undefined)
{
__holder = holder;
}
if (x != undefined)
{
__x = x;
}
if (y != undefined)
{
__y = y;
}
if (width != undefined)
{
__width = width;
}
if (height != undefined)
{
__height = height;
}
if (bgColor != undefined)
{
__bgColor = bgColor;
}
if (borderColor != undefined)
{
__borderColor= borderColor;
}
//traceTxt
traceTxt = __holder.createTextField(TXT_NAME, __holder.getNextHighestDepth(), __x, __y, __width, __height);
traceTxt.border = true;
traceTxt.background = true;
traceTxt.backgroundColor = __bgColor;
traceTxt.borderColor = __borderColor;
traceTxt.multiline = true;
traceTxt.wordWrap = true;
traceTxt.html = true;
traceTxt.htmlText = BLANK;
//CSS
var ss:StyleSheet = new StyleSheet();
var css:String = BLANK;
css += CSS_DOT + CLASS_TITLE + CSS_COLOR + COLOR_TITLE + CSS_FOUNT;
css += CSS_DOT + CLASS_TYPE + CSS_COLOR + COLOR_TYPE + CSS_FOUNT;
css += CSS_DOT + CLASS_NUMBER+ CSS_COLOR + COLOR_NUMBER + CSS_FOUNT;
css += CSS_DOT + CLASS_STRING + CSS_COLOR + COLOR_STRING + CSS_FOUNT;
css += CSS_DOT + CLASS_BOOLEAN + CSS_COLOR + COLOR_BOOLEAN + CSS_FOUNT;
css += CSS_DOT + CLASS_LABEL + CSS_COLOR + COLOR_LABEL + CSS_FOUNT;
ss.parseCSS(css);
traceTxt.styleSheet = ss;
//
isInit = true;
}
//##########################################################################
//
// Functions
//
//##########################################################################
//------------------------------------------------------
// getString 获取输出文本,tabNo是缩进的TAB数
//------------------------------------------------------
private static function getString(info, tabNo:Number):String
{
var type:String = typeof(info);
tabNo = tabNo == undefined ? 0 : tabNo;
switch(type)
{
case TYPE_STRING:
{
return getTypeSpan(TITLE_STRING)+ getTab(1) + getStringSpan(info);
}
case TYPE_NUMBER:
{
return getTypeSpan(TITLE_NUMBER) + getTab(1) + getNumberSpan(info);
}
case TYPE_BOOLEAN:
{
return getTypeSpan(TITLE_BOOLEAN) + getTab(1) + getBooleanSpan(info);
}
case TYPE_FUNCION:
{
return getTypeSpan(TITLE_FUNCION);
}
case TYPE_MOVIE_CLIP:
{
return getTypeSpan(TITLE_MOVIE_CLIP) + TAB + getMovieClip(info, tabNo);
}
case TYPE_OBJECT:
{
if (info instanceof Array)
{
return getTypeSpan(TITLE_ARRAY) + TAB + getArray(info, tabNo);
} else if (info instanceof XMLNode)
{
return getTypeSpan(TITLE_XML_NODE) + TAB + getXML(info, tabNo);
} else
{
return getTypeSpan(TITLE_OBJECT) + TAB + getObject(info, tabNo);
}
break;
}
}
return BLANK;
}
//================================================================
// get sub string
//================================================================
private static function getMovieClip(mc:MovieClip, tabNo:Number):String
{
var str:String = getStringSpan(mc._name);
tabNo = tabNo == undefined ? 0 : tabNo;
var tabStr:String = getTab(tabNo);
str += RETURN + tabStr + getLabelSpan(MC_X) + getTab(2) + getNumberSpan(String(mc._x));
str += RETURN + tabStr + getLabelSpan(MC_Y) + getTab(2) + getNumberSpan(String(mc._y));
str += RETURN + tabStr + getLabelSpan(MC_WIDTH) + TAB + getNumberSpan(String(mc._width));
str += RETURN + tabStr + getLabelSpan(MC_HEIGHT) + TAB + getNumberSpan(String(mc._height));
return str;
}
private static function getArray(arr:Array, tabNo:Number):String
{
var str:String = BLANK;
tabNo = tabNo == undefined ? 0 : tabNo;
var tabStr:String = getTab(tabNo++);
for (var i : Number = 0; i < arr.length; i++)
{
str += RETURN + tabStr + getLabelSpan(String(i)) + TAB + getString(arr[i], tabNo);
}
return str;
}
private static function getObject(obj:Object, tabNo:Number):String
{
var str:String = BLANK;
tabNo = tabNo == undefined ? 0 : tabNo;
var tabStr:String = getTab(tabNo++);
for (var i : String in obj)
{
str += RETURN + tabStr + getLabelSpan(i) + TAB + getString(obj[i], tabNo);
}
return str;
}
private static function getXML(xml:XMLNode, tabNo:Number):String
{
var str:String = BLANK;
tabNo = tabNo == undefined ? 0 : tabNo;
var tabStr:String = RETURN + getTab(tabNo++);
if (xml instanceof XML)
{
xml = xml.firstChild;
}
str += tabStr + getLabelSpan(XML_NAME) + TAB + getString(xml.nodeName);
var attStr:String = getObject(xml.attributes, tabNo);
if (attStr.length > 0)
{
str += tabStr + getLabelSpan(XML_ATTRIBUTES) + TAB + attStr;
}
if (xml.hasChildNodes())
{
if (xml.childNodes.length == 1 && !xml.firstChild.hasChildNodes())
{
str += tabStr + getLabelSpan(XML_VALUE) + TAB + getString(xml.firstChild.nodeValue, tabNo);
} else
{
str += tabStr + getLabelSpan(XML_NODES) + TAB + getArray(xml.childNodes, tabNo);
}
}
return str;
}
//================================================================
// str
//================================================================
private static function getTitleSpan(title:String):String
{
return SPAN_TITLE + VAR_TITLE + title + SPAN_END;
}
private static function getTypeSpan(str:String):String
{
return SPAN_TYPE + str + SPAN_END;
}
private static function getNumberSpan(str:String):String
{
return SPAN_NUMBER+ str + SPAN_END;
}
private static function getStringSpan(str:String):String
{
return SPAN_STRING + str + SPAN_END;
}
private static function getBooleanSpan(str:String):String
{
return SPAN_BOOLEAN + str + SPAN_END;
}
private static function getLabelSpan(str:String):String
{
return SPAN_LABEL+ str + SPAN_END;
}
//================================================================
// other
//================================================================
private static function getTab(num:Number):String
{
var str:String = BLANK;
while (num > 0)
{
str += TAB;
num--;
}
return str;
}
}