import definition = require("trace"); import types = require("utils/types"); var _enabled = false; var _categories = {}; var _writers: Array = []; var _eventListeners: Array = []; export function enable() { _enabled = true; } export function disable() { _enabled = false; } export function addWriter(writer: definition.TraceWriter) { _writers.push(writer); } export function removeWriter(writer: definition.TraceWriter) { var index = _writers.indexOf(writer); if (index >= 0) { _writers.splice(index, 1); } } export function clearWriters() { if (_writers.length > 0) { _writers.splice(0, _writers.length); } } export function setCategories(categories: string) { var split = categories.split(","); _categories = {}; var i; for (i = 0; i < split.length; i++) { _categories[split[i].trim()] = true; } } export function write(message: any, category: string, type?: number) { if (!_enabled) { return; } if (!(category in _categories)) { return; } var i; for (i = 0; i < _writers.length; i++) { _writers[i].write(message, category, type); } } export function notifyEvent(object: Object, name: string, data?: any) { if (!_enabled) { return; } var i, listener: definition.EventListener, filters: Array; for (i = 0; i < _eventListeners.length; i++) { listener = _eventListeners[i]; if (listener.filter) { filters = listener.filter.split(","); filters.forEach((value: string) => { if (value.trim() === name) { listener.on(object, name, data); } }); } else { listener.on(object, name, data); } } } export function addEventListener(listener: definition.EventListener) { _eventListeners.push(listener); } export function removeEventListener(listener: definition.EventListener) { var index = _eventListeners.indexOf(listener); if (index >= 0) { _eventListeners.splice(index, 1); } } export module messageType { export var log = 0; export var info = 1; export var warn = 2; export var error = 3; } export module categories { export var VisualTreeEvents = "VisualTreeEvents"; export var Layout = "Layout"; export var Style = "Style"; export var ViewHierarchy = "ViewHierarchy"; export var NativeLifecycle = "NativeLifecycle"; export var Debug = "Debug"; export var Navigation = "Navigation"; export var Test = "Test"; export var Binding = "Binding"; export var Error = "Error"; export var All = VisualTreeEvents + "," + Layout + "," + Style + "," + ViewHierarchy + "," + NativeLifecycle + "," + Debug + "," + Navigation + "," + Test + "," + Binding + "," + Error; export var separator = ","; export function concat(): string { var i; var result: string; for (i = 0; i < arguments.length; i++) { if (!result) { result = arguments[i]; continue; } result = result.concat(separator, arguments[i]); } return result; } } class ConsoleWriter implements definition.TraceWriter { public write(message: any, category: string, type?: number) { if (!console) { return; } var msgType; if (types.isUndefined(type)) { msgType = messageType.log; } else { msgType = type; } switch (msgType) { case messageType.log: console.log(category + ": " + message); break; case messageType.info: console.info(category + ": " + message); break; case messageType.warn: console.warn(category + ": " + message); break; case messageType.error: console.error(category + ": " + message); break; } } } // register a ConsoleWriter by default addWriter(new ConsoleWriter());