Logs FP8

C'est un SWF qui permet de voir les logs. Il a été généré avec mtasc.

Télécharger

Logs.swf

Change log

[01/12/2005] Version 1.0

Création.

[06/12/2005] Version 1.1

Ajout d'un filtre de message.

[12/12/2005] Version 1.2

Ajout d'un filtre par type.

Source

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