--[[ Name: AceDebug-2.0 Revision: $Rev: 15024 $ Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) Inspired By: Ace 1.x by Turan (turan@gryphon.com) Website: http://www.wowace.com/ Documentation: http://www.wowace.com/index.php/AceDebug-2.0 SVN: http://svn.wowace.com/root/trunk/Ace2/AceDebug-2.0 Description: Mixin to allow for simple debugging capabilities. Dependencies: AceLibrary, AceOO-2.0 ]] local MAJOR_VERSION = "AceDebug-2.0" local MINOR_VERSION = "$Revision: 15024 $" if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end local DEBUGGING, TOGGLE_DEBUGGING if GetLocale() == "frFR" then DEBUGGING = "D\195\169boguage" TOGGLE_DEBUGGING = "Activer/d\195\169sactiver le d\195\169boguage" elseif GetLocale() == "deDE" then DEBUGGING = "Debuggen" TOGGLE_DEBUGGING = "Aktiviert/Deaktiviert Debugging" elseif GetLocale() == "koKR" then DEBUGGING = "디버깅" TOGGLE_DEBUGGING = "디버깅 기능 사용함/사용안함" elseif GetLocale() == "zhTW" then DEBUGGING = "除錯" TOGGLE_DEBUGGING = "啟用/停用除錯功能" elseif GetLocale() == "zhCN" then DEBUGGING = "\232\176\131\232\175\149" TOGGLE_DEBUGGING = "\229\144\175\231\148\168/\231\166\129\231\148\168 \232\176\131\232\175\149" else -- enUS DEBUGGING = "Debugging" TOGGLE_DEBUGGING = "Enable/disable debugging" end local table_setn do local version = GetBuildInfo() if string.find(version, "^2%.") then -- 2.0.0 table_setn = function() end else table_setn = table.setn end end local math_mod = math.mod or math.fmod local AceOO = AceLibrary:GetInstance("AceOO-2.0") local AceDebug = AceOO.Mixin {"Debug", "CustomDebug", "IsDebugging", "SetDebugging", "SetDebugLevel", "LevelDebug", "CustomLevelDebug", "GetDebugLevel"} local function print(text, r, g, b, frame, delay) (frame or DEFAULT_CHAT_FRAME):AddMessage(text, r, g, b, 1, delay or 5) end local tmp function AceDebug:CustomDebug(r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) if not self.debugging then return end local output = string.format("|cff7fff7f(DEBUG) %s:[%s%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000) if string.find(tostring(a1), "%%") then output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20)) else if not tmp then tmp = {} end -- This block dynamically rebuilds the tmp array stopping on the first nil. table.insert(tmp, output) table.insert(tmp, tostring(a1)) table.insert(tmp, a2) table.insert(tmp, a3) table.insert(tmp, a4) table.insert(tmp, a5) table.insert(tmp, a6) table.insert(tmp, a7) table.insert(tmp, a8) table.insert(tmp, a9) table.insert(tmp, a10) table.insert(tmp, a11) table.insert(tmp, a12) table.insert(tmp, a13) table.insert(tmp, a14) table.insert(tmp, a15) table.insert(tmp, a16) table.insert(tmp, a17) table.insert(tmp, a18) table.insert(tmp, a19) table.insert(tmp, a20) while tmp[table.getn(tmp)] == nil do table.remove(tmp) end for k = 1, table.getn(tmp) do tmp[k] = tostring(tmp[k]) end output = table.concat(tmp, " ") for k,v in pairs(tmp) do tmp[k] = nil end table_setn(tmp, 0) end print(output, r, g, b, frame or self.debugFrame, delay) end function AceDebug:Debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) AceDebug.CustomDebug(self, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) end function AceDebug:IsDebugging() return self.debugging end function AceDebug:SetDebugging(debugging) self.debugging = debugging end -- Takes a number 1-3 -- Level 1: Critical messages that every user should receive -- Level 2: Should be used for local debugging (function calls, etc) -- Level 3: Very verbose debugging, will dump everything and anything -- If set to nil, you will receive no debug information function AceDebug:SetDebugLevel(level) AceDebug:argCheck(level, 1, "number", "nil") if not level then self.debuglevel = nil return end if level < 1 or level > 3 then AceDebug:error("Bad argument #1 to `SetDebugLevel`, must be a number 1-3") end self.debuglevel = level end function AceDebug:GetDebugLevel() return self.debuglevel end function AceDebug:CustomLevelDebug(level, r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) if not self.debugging or not self.debuglevel then return end AceDebug:argCheck(level, 1, "number") if level < 1 or level > 3 then AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3") end if level > self.debuglevel then return end local output = string.format("|cff7fff7f(DEBUG) %s:[%s.%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000) if string.find(tostring(a1), "%%") then output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20)) else if not tmp then tmp = {} end -- This block dynamically rebuilds the tmp array stopping on the first nil. table.insert(tmp, output) table.insert(tmp, tostring(a1)) table.insert(tmp, a2) table.insert(tmp, a3) table.insert(tmp, a4) table.insert(tmp, a5) table.insert(tmp, a6) table.insert(tmp, a7) table.insert(tmp, a8) table.insert(tmp, a9) table.insert(tmp, a10) table.insert(tmp, a11) table.insert(tmp, a12) table.insert(tmp, a13) table.insert(tmp, a14) table.insert(tmp, a15) table.insert(tmp, a16) table.insert(tmp, a17) table.insert(tmp, a18) table.insert(tmp, a19) table.insert(tmp, a20) while tmp[table.getn(tmp)] == nil do table.remove(tmp) end for k = 1, table.getn(tmp) do tmp[k] = tostring(tmp[k]) end output = table.concat(tmp, " ") for k,v in pairs(tmp) do tmp[k] = nil end table_setn(tmp, 0) end print(output, r, g, b, frame or self.debugFrame, delay) end function AceDebug:LevelDebug(level, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) if not self.debugging or not self.debuglevel then return end AceDebug:argCheck(level, 1, "number") if level < 1 or level > 3 then AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3") end if level > self.debuglevel then return end AceDebug.CustomLevelDebug(self, level, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) end local options function AceDebug:GetAceOptionsDataTable(target) if not options then options = { debug = { name = DEBUGGING, desc = TOGGLE_DEBUGGING, type = "toggle", get = "IsDebugging", set = "SetDebugging", order = -2, } } end return options end AceLibrary:Register(AceDebug, MAJOR_VERSION, MINOR_VERSION, AceDebug.activate) AceDebug = AceLibrary(MAJOR_VERSION)