C'est un SWF qui permet de voir les logs. Il a été généré avec mtasc.
Création.
Ajout d'un filtre de message.
Ajout d'un filtre par type.
import TextField.StyleSheet; /** * Affichage des logs * @author neolao <neo@neolao.com> * @version 1.2 (12/12/2005) * @license http://creativecommons.org/licenses/by-sa/2.5/ */ class Logs { static var TYPES:Array = ["All", "Info", "Action", "Error"]; static var _localConnection:LocalConnection; static var _textField:TextField; static var _style:StyleSheet; static var _buttonType:MovieClip; static var _buttonLevel:MovieClip; static var _buttonTime:MovieClip; static var _buttonMs:MovieClip; static var _filter:MovieClip; /** * Script principal */ static function main() { // Connexion local _localConnection = new LocalConnection(); // Création du CSS createCSS(); // Création des boutons displayType(); displayLevel(); displayTime(); displayMs(); displayFilter(); // Création du champ de texte displayTextField(); } /** * Création du CSS */ static function createCSS(){ _style = new StyleSheet(); _style.setStyle(".button", {fontFamily:"sans-serif", textAlign:"center"}); _style.setStyle(".info1", {fontFamily:"mono", color:"#0000FF"}); _style.setStyle(".info2", {fontFamily:"mono", color:"#5555FF"}); _style.setStyle(".info3", {fontFamily:"mono", color:"#9999FF"}); _style.setStyle(".action1", {fontFamily:"mono", color:"#000000"}); _style.setStyle(".action2", {fontFamily:"mono", color:"#555555"}); _style.setStyle(".action3", {fontFamily:"mono", color:"#999999"}); _style.setStyle(".error1", {fontFamily:"mono", color:"#FF0000"}); _style.setStyle(".error2", {fontFamily:"mono", color:"#FF5555"}); _style.setStyle(".error3", {fontFamily:"mono", color:"#FF9999"}); _style.setStyle(".light", {fontFamily:"mono", color:"#DAAB21", fontWeight:"bold", textDecoration:"underline"}); } /** * Affichage champ de texte */ static function displayTextField(){ // Création du champ de texte _textField = _root.createTextField("logs", _root.getNextHighestDepth(), 5, 5, 790, 565); _textField.border = true; _textField.background = true; _textField.multiline = true; _textField.html = true; _textField.styleSheet = _style; _localConnection.textField = _textField; _localConnection.nChar = _nChar; _localConnection.milli2time = _milli2time; _localConnection.replace = _replace; _localConnection.time = _buttonTime.time; _localConnection.ms = _buttonMs.ms; _localConnection.TYPES = TYPES; _localConnection.type = _buttonType.index; _localConnection.level = _buttonLevel.level; _localConnection.filter = _filter.content; _localConnection.addLog = function(pMessage:String, pType:String, pLevel:Number, pName:String){ var ok:Boolean = true; // filtre par type if(this.type > 0 && pType != this.TYPES[this.type].toLowerCase()){ ok = false; } // filtre par level if(this.level < pLevel){ ok = false; } // filtre par message if(this.filter != "" && pMessage.indexOf(this.filter)+pName.indexOf(this.filter) == -2){ ok = false; } if(ok){ this.textField.htmlText += "<p class=\""+pType+pLevel+"\">"; // Le temps if(this.time){ if(this.ms){ this.textField.htmlText += "[" + this.nChar(getTimer(), 8, false) + "] "; }else{ this.textField.htmlText += "[" + this.milli2time(getTimer()) + "] "; } } // L'instance if(pName != undefined){ if(this.filter != ""){ pName = this.replace(pName, this.filter, "<span class=\"light\">"+this.filter+"</span>"); } this.textField.htmlText += "("+pName+") "; } // Le message if(this.filter != ""){ pMessage = this.replace(pMessage, this.filter, "<span class=\"light\">"+this.filter+"</span>"); } this.textField.htmlText += pMessage; this.textField.htmlText += "</p>"; this.textField.scroll = this.textField.maxscroll; } }; _localConnection.connect("neolaoLogs"); } /** * Affichage des types de logs */ static function displayType(){ // Création du clip _buttonType = _generateButton(_root, "type_btn", function(){ if(this.index < this.TYPES.length - 1){ this.index++; }else{ this.index = 0; } this.localConnection.type = this.index; this.setTitle(this.TYPES[this.index]); }); _buttonType.localConnection = _localConnection; _buttonType.index = 0; _buttonType.TYPES = TYPES; _buttonType.setTitle(TYPES[_buttonType.index]); _buttonType._x = 5; _buttonType._y = 575; } /** * Affichage des niveaux de logs */ static function displayLevel(){ // Création du clip _buttonLevel = _generateButton(_root, "level_btn", function(){ if(this.level < 3){ this.level++; }else{ this.level = 1; } this.localConnection.level = this.level; this.setTitle("Level "+this.level); }); _buttonLevel.localConnection = _localConnection; _buttonLevel.level = 3; _buttonLevel.setTitle("Level "+_buttonLevel.level); _buttonLevel._x = 105; _buttonLevel._y = 575; } /** * Affichage du temps */ static function displayTime(){ // Création du clip _buttonTime = _generateButton(_root, "time_btn", function(){ this.time = !this.time; if(this.time){ this.setTitle("Show time"); }else{ this.setTitle("Hide time"); } this.localConnection.time = this.time; }); _buttonTime.localConnection = _localConnection; _buttonTime.time = true; _buttonTime.setTitle("Show time"); _buttonTime._x = 205; _buttonTime._y = 575; } /** * Affichage du temps en milliseconde */ static function displayMs(){ // Création du clip _buttonMs = _generateButton(_root, "ms_btn", function(){ this.ms = !this.ms; if(this.ms){ this.setTitle("Milliseconds"); }else{ this.setTitle("Hours"); } this.localConnection.ms = this.ms; }); _buttonMs.localConnection = _localConnection; _buttonMs.ms = true; _buttonMs.setTitle("Milliseconds"); _buttonMs._x = 305; _buttonMs._y = 575; } /** * Affichage du filtre */ static function displayFilter(){ var vTitle:TextField; var vInput:TextField; var vFormat:TextFormat = new TextFormat(); // Création du clip _filter = _root.createEmptyMovieClip("filter_mc", _root.getNextHighestDepth()); _filter._x = 405; _filter._y = 575; _filter.lineStyle(0, 0, 100); _filter.beginFill(0xCCCCCC, 100); _filter.lineTo(390, 0); _filter.lineTo(390, 20); _filter.lineTo(0, 20); _filter.lineTo(0, 0); _filter.endFill(); vTitle = _filter.createTextField("title_txt", _filter.getNextHighestDepth(), 0, 2, 60, 20); vTitle.styleSheet = _style; vTitle.selectable = false; vTitle.html = true; vTitle.htmlText = "<p class=\"button\">Contains</p>"; vInput = _filter.createTextField("input_txt", _filter.getNextHighestDepth(), 60, 1, 328, 17); vFormat.font = "_sans"; vInput.setNewTextFormat(vFormat); vInput.border = true; vInput.borderColor = 0x999999; vInput.background = true; vInput.embedFonts = false; vInput.type = "input"; vInput.text = ""; vInput.localConnection = _localConnection; vInput.onChanged = function(textfield_txt:TextField) { textfield_txt.localConnection.filter = textfield_txt.text; }; _filter.content = ""; } /** * Génération de bouton pour la visualisation des logs * @param pTarget La cible, où va être le bouton * @param pName Le nom du bouton * @param pOnRelease La fonction appelé lorsque l'on clique sur le bouton * @return L'instance du bouton */ private static function _generateButton(pTarget:MovieClip, pName:String, pOnRelease:Function):MovieClip{ var vTmp:MovieClip; var vTitle:TextField; vTmp = pTarget.createEmptyMovieClip(pName, pTarget.getNextHighestDepth()); vTmp.lineStyle(0, 0, 100); vTmp.beginFill(0xCCCCCC, 100); vTmp.lineTo(95, 0); vTmp.lineTo(95, 20); vTmp.lineTo(0, 20); vTmp.lineTo(0, 0); vTmp.endFill(); vTitle = vTmp.createTextField("title_txt", vTmp.getNextHighestDepth(), 0, 2, 95, 20); vTitle.styleSheet = _style; vTitle.selectable = false; vTitle.html = true; vTmp.setTitle = function(pTitle:String){ this.title_txt.htmlText = "<span class=\"button\">"+pTitle+"</span>" }; vTmp.onRelease = pOnRelease; return vTmp; } /** * Formate un nombre sur n caractères. * @param pNum Le nombre à formater * @param pN Le nombre de caractère total * @param pZero true pour utiliser des zero, false pour des espaces [option = true] * @param pRight true pour compléter à droite, sinon à gauche [option = false] * @return Le nombre sous forme chaine de pN caractères */ private static function _nChar(pNum:Number, pN:Number, pZero:Boolean, pRight:Boolean):String { var vAfficheZero:Boolean = (pZero == undefined)?true:pZero; var vDiff:Number = pN - pNum.toString().length; var vReste:String = ""; if(vDiff > 0){ for(var i:Number=0; i<vDiff; i++){ vReste += (vAfficheZero)?"0":" "; } } return (pRight)?pNum + vReste:vReste + pNum; } /** * Converti les millisecondes en secondes * @param pMilliseconde Millisecondes à convertir * @return L'équivalent en secondes */ private static function _milli2sec(pMilliseconde:Number):Number { return Math.floor(pMilliseconde / 1000); } /** * Converti les millisecondes en minutes * @param pMilliseconde Millisecondes à convertir * @return L'équivalent en minutes */ private static function _milli2min(pMilliseconde:Number):Number { return Math.floor(pMilliseconde / (1000 * 60)); } /** * Converti les millisecondes en heures * @param pMilliseconde Millisecondes à convertir * @return L'équivalent en heures */ private static function _milli2hour(pMilliseconde:Number):Number { return Math.floor(pMilliseconde / (1000 * 60 * 60)); } /** * Converti les millisecondes en temps au format hh:mm:ss * @param pSeconde Millisecondes à convertir * @return L'équivalent temps au format hh:mm:ss */ private static function _milli2time(pMilliseconde:Number):String { return _nChar(_milli2hour(pMilliseconde)%24, 2) + ":" + _nChar(_milli2min(pMilliseconde)%60, 2) + ":" + _nChar(_milli2sec(pMilliseconde)%60, 2); } /** * Remplacer un texte * @param pMsg Le texte où faire le remplacement * @param pOldText Le texte à remplacer * @param pNewText Le nouveau texte à mettre * @return Nouveau texte */ private static function _replace(pMsg:String, pOldText:String, pNewText:String):String { return pMsg.split(pOldText).join(pNewText); } }