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; } }