Mercurial > wow > reaction
comparison modules/FuBar_ReActionFu/lib/AceAddon-2.0/AceAddon-2.0.lua @ 28:21bcaf8215ff
- converted to Ace3
- rearranged file layout
- configGUI menus not working right now
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Mon, 17 Mar 2008 18:24:53 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 27:f1e838841ce1 | 28:21bcaf8215ff |
|---|---|
| 1 --[[ | |
| 2 Name: AceAddon-2.0 | |
| 3 Revision: $Rev: 46764 $ | |
| 4 Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) | |
| 5 Inspired By: Ace 1.x by Turan (turan@gryphon.com) | |
| 6 Website: http://www.wowace.com/ | |
| 7 Documentation: http://www.wowace.com/wiki/AceAddon-2.0 | |
| 8 SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceAddon-2.0 | |
| 9 Description: Base for all Ace addons to inherit from. | |
| 10 Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, (optional) AceConsole-2.0 | |
| 11 License: LGPL v2.1 | |
| 12 ]] | |
| 13 | |
| 14 local MAJOR_VERSION = "AceAddon-2.0" | |
| 15 local MINOR_VERSION = "$Revision: 46764 $" | |
| 16 | |
| 17 -- This ensures the code is only executed if the libary doesn't already exist, or is a newer version | |
| 18 if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end | |
| 19 if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end | |
| 20 | |
| 21 if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end | |
| 22 | |
| 23 local function safecall(func,...) | |
| 24 local success, err = pcall(func,...) | |
| 25 if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end | |
| 26 end | |
| 27 -- Localization | |
| 28 local STANDBY, TITLE, NOTES, VERSION, AUTHOR, DATE, CATEGORY, EMAIL, CREDITS, WEBSITE, CATEGORIES, ABOUT, LICENSE, PRINT_ADDON_INFO, DONATE, DONATE_DESC, HOWTO_DONATE_WINDOWS, HOWTO_DONATE_MAC | |
| 29 if GetLocale() == "deDE" then | |
| 30 STANDBY = "|cffff5050(Standby)|r" -- capitalized | |
| 31 | |
| 32 TITLE = "Titel" | |
| 33 NOTES = "Anmerkung" | |
| 34 VERSION = "Version" | |
| 35 AUTHOR = "Autor" | |
| 36 DATE = "Datum" | |
| 37 CATEGORY = "Kategorie" | |
| 38 EMAIL = "E-Mail" | |
| 39 WEBSITE = "Webseite" | |
| 40 CREDITS = "Credits" -- fix | |
| 41 LICENSE = "License" -- fix | |
| 42 | |
| 43 ABOUT = "Über" | |
| 44 PRINT_ADDON_INFO = "Gibt Addondaten aus" | |
| 45 DONATE = "Donate" -- fix | |
| 46 DONATE_DESC = "Give a much-needed donation to the author of this addon." -- fix | |
| 47 HOWTO_DONATE_WINDOWS = "Press Ctrl-A to select the link, then Ctrl-C to copy, then Alt-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 48 HOWTO_DONATE_MAC = "Press Cmd-A to select the link, then Cmd-C to copy, then Cmd-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 49 | |
| 50 CATEGORIES = { | |
| 51 ["Action Bars"] = "Aktionsleisten", | |
| 52 ["Auction"] = "Auktion", | |
| 53 ["Audio"] = "Audio", | |
| 54 ["Battlegrounds/PvP"] = "Schlachtfeld/PvP", | |
| 55 ["Buffs"] = "Stärkungszauber", | |
| 56 ["Chat/Communication"] = "Chat/Kommunikation", | |
| 57 ["Druid"] = "Druide", | |
| 58 ["Hunter"] = "Jäger", | |
| 59 ["Mage"] = "Magier", | |
| 60 ["Paladin"] = "Paladin", | |
| 61 ["Priest"] = "Priester", | |
| 62 ["Rogue"] = "Schurke", | |
| 63 ["Shaman"] = "Schamane", | |
| 64 ["Warlock"] = "Hexenmeister", | |
| 65 ["Warrior"] = "Krieger", | |
| 66 ["Healer"] = "Heiler", | |
| 67 ["Tank"] = "Tank", | |
| 68 ["Caster"] = "Zauberer", | |
| 69 ["Combat"] = "Kampf", | |
| 70 ["Compilations"] = "Zusammenstellungen", | |
| 71 ["Data Export"] = "Datenexport", | |
| 72 ["Development Tools"] = "Entwicklungs Tools", | |
| 73 ["Guild"] = "Gilde", | |
| 74 ["Frame Modification"] = "Frame Veränderungen", | |
| 75 ["Interface Enhancements"] = "Interface Verbesserungen", | |
| 76 ["Inventory"] = "Inventar", | |
| 77 ["Library"] = "Bibliotheken", | |
| 78 ["Map"] = "Karte", | |
| 79 ["Mail"] = "Post", | |
| 80 ["Miscellaneous"] = "Diverses", | |
| 81 ["Quest"] = "Quest", | |
| 82 ["Raid"] = "Schlachtzug", | |
| 83 ["Tradeskill"] = "Beruf", | |
| 84 ["UnitFrame"] = "Einheiten-Fenster", | |
| 85 } | |
| 86 elseif GetLocale() == "frFR" then | |
| 87 STANDBY = "|cffff5050(attente)|r" | |
| 88 | |
| 89 TITLE = "Titre" | |
| 90 NOTES = "Notes" | |
| 91 VERSION = "Version" | |
| 92 AUTHOR = "Auteur" | |
| 93 DATE = "Date" | |
| 94 CATEGORY = "Catégorie" | |
| 95 EMAIL = "E-mail" | |
| 96 WEBSITE = "Site web" | |
| 97 CREDITS = "Credits" -- fix | |
| 98 LICENSE = "License" -- fix | |
| 99 | |
| 100 ABOUT = "A propos" | |
| 101 PRINT_ADDON_INFO = "Afficher les informations sur l'addon" | |
| 102 DONATE = "Donate" -- fix | |
| 103 DONATE_DESC = "Give a much-needed donation to the author of this addon." -- fix | |
| 104 HOWTO_DONATE_WINDOWS = "Press Ctrl-A to select the link, then Ctrl-C to copy, then Alt-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 105 HOWTO_DONATE_MAC = "Press Cmd-A to select the link, then Cmd-C to copy, then Cmd-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 106 | |
| 107 CATEGORIES = { | |
| 108 ["Action Bars"] = "Barres d'action", | |
| 109 ["Auction"] = "Hôtel des ventes", | |
| 110 ["Audio"] = "Audio", | |
| 111 ["Battlegrounds/PvP"] = "Champs de bataille/JcJ", | |
| 112 ["Buffs"] = "Buffs", | |
| 113 ["Chat/Communication"] = "Chat/Communication", | |
| 114 ["Druid"] = "Druide", | |
| 115 ["Hunter"] = "Chasseur", | |
| 116 ["Mage"] = "Mage", | |
| 117 ["Paladin"] = "Paladin", | |
| 118 ["Priest"] = "Prêtre", | |
| 119 ["Rogue"] = "Voleur", | |
| 120 ["Shaman"] = "Chaman", | |
| 121 ["Warlock"] = "Démoniste", | |
| 122 ["Warrior"] = "Guerrier", | |
| 123 ["Healer"] = "Soigneur", | |
| 124 ["Tank"] = "Tank", | |
| 125 ["Caster"] = "Casteur", | |
| 126 ["Combat"] = "Combat", | |
| 127 ["Compilations"] = "Compilations", | |
| 128 ["Data Export"] = "Exportation de données", | |
| 129 ["Development Tools"] = "Outils de développement", | |
| 130 ["Guild"] = "Guilde", | |
| 131 ["Frame Modification"] = "Modification des fenêtres", | |
| 132 ["Interface Enhancements"] = "Améliorations de l'interface", | |
| 133 ["Inventory"] = "Inventaire", | |
| 134 ["Library"] = "Bibliothèques", | |
| 135 ["Map"] = "Carte", | |
| 136 ["Mail"] = "Courrier", | |
| 137 ["Miscellaneous"] = "Divers", | |
| 138 ["Quest"] = "Quêtes", | |
| 139 ["Raid"] = "Raid", | |
| 140 ["Tradeskill"] = "Métiers", | |
| 141 ["UnitFrame"] = "Fenêtres d'unité", | |
| 142 } | |
| 143 elseif GetLocale() == "koKR" then | |
| 144 STANDBY = "|cffff5050(사용가능)|r" | |
| 145 | |
| 146 TITLE = "제목" | |
| 147 NOTES = "노트" | |
| 148 VERSION = "버전" | |
| 149 AUTHOR = "저작자" | |
| 150 DATE = "날짜" | |
| 151 CATEGORY = "분류" | |
| 152 EMAIL = "전자 우편" | |
| 153 WEBSITE = "웹 사이트" | |
| 154 CREDITS = "공로자" | |
| 155 LICENSE = "라이센스" | |
| 156 | |
| 157 ABOUT = "정보" | |
| 158 PRINT_ADDON_INFO = "애드온에 대한 정보를 출력합니다." | |
| 159 DONATE = "기부" | |
| 160 DONATE_DESC = "이 애드온의 저작자에게 기부를 합니다." | |
| 161 HOWTO_DONATE_WINDOWS = "Ctrl-A를 눌려 링크를 선택후, Ctrl-C로 복사합니다. Alt-Tab 눌려 게임으로 부터 나간후 웹 브라우저를 엽니다. 복사된 링크를 주소 창에 붙여넣기 합니다." | |
| 162 HOWTO_DONATE_MAC = "Cmd-A를 눌려 링크를 선택후, Cmd-C로 복사합니다. Cmd-Tab 눌려 게임으로 부터 나간후 웹 브라우저를 엽니다. 복사된 링크를 주소 창에 붙여넣기 합니다." | |
| 163 | |
| 164 CATEGORIES = { | |
| 165 ["Action Bars"] = "액션바", | |
| 166 ["Auction"] = "경매", | |
| 167 ["Audio"] = "음향", | |
| 168 ["Battlegrounds/PvP"] = "전장/PvP", | |
| 169 ["Buffs"] = "버프", | |
| 170 ["Chat/Communication"] = "대화/의사소통", | |
| 171 ["Druid"] = "드루이드", | |
| 172 ["Hunter"] = "사냥꾼", | |
| 173 ["Mage"] = "마법사", | |
| 174 ["Paladin"] = "성기사", | |
| 175 ["Priest"] = "사제", | |
| 176 ["Rogue"] = "도적", | |
| 177 ["Shaman"] = "주술사", | |
| 178 ["Warlock"] = "흑마법사", | |
| 179 ["Warrior"] = "전사", | |
| 180 ["Healer"] = "힐러", | |
| 181 ["Tank"] = "탱커", | |
| 182 ["Caster"] = "캐스터", | |
| 183 ["Combat"] = "전투", | |
| 184 ["Compilations"] = "복합", | |
| 185 ["Data Export"] = "자료 출력", | |
| 186 ["Development Tools"] = "개발 도구", | |
| 187 ["Guild"] = "길드", | |
| 188 ["Frame Modification"] = "구조 변경", | |
| 189 ["Interface Enhancements"] = "인터페이스 강화", | |
| 190 ["Inventory"] = "인벤토리", | |
| 191 ["Library"] = "라이브러리", | |
| 192 ["Map"] = "지도", | |
| 193 ["Mail"] = "우편", | |
| 194 ["Miscellaneous"] = "기타", | |
| 195 ["Quest"] = "퀘스트", | |
| 196 ["Raid"] = "공격대", | |
| 197 ["Tradeskill"] = "전문기술", | |
| 198 ["UnitFrame"] = "유닛 프레임", | |
| 199 } | |
| 200 elseif GetLocale() == "zhTW" then | |
| 201 STANDBY = "|cffff5050(待命)|r" | |
| 202 | |
| 203 TITLE = "標題" | |
| 204 NOTES = "註記" | |
| 205 VERSION = "版本" | |
| 206 AUTHOR = "作者" | |
| 207 DATE = "日期" | |
| 208 CATEGORY = "類別" | |
| 209 EMAIL = "電子郵件" | |
| 210 WEBSITE = "網站" | |
| 211 CREDITS = "特別感謝" | |
| 212 LICENSE = "版權" | |
| 213 | |
| 214 ABOUT = "關於" | |
| 215 PRINT_ADDON_INFO = "顯示插件資訊。" | |
| 216 DONATE = "捐贈" | |
| 217 DONATE_DESC = "捐贈金錢給插件作者。" | |
| 218 HOWTO_DONATE_WINDOWS = "請按Ctrl-A選擇網站連結,Ctrl-C複製網址,Alt-Tab切換到電腦桌面,打開瀏覽器,在網址列貼上網址。" | |
| 219 HOWTO_DONATE_MAC = "請按Cmd-A選擇網站連結,Cmd-C複製網址,Cmd-Tab切換到電腦桌面,打開瀏覽器,在網址列貼上網址。" | |
| 220 | |
| 221 CATEGORIES = { | |
| 222 ["Action Bars"] = "動作條", | |
| 223 ["Auction"] = "拍賣", | |
| 224 ["Audio"] = "音效", | |
| 225 ["Battlegrounds/PvP"] = "戰場/PvP", | |
| 226 ["Buffs"] = "增益", | |
| 227 ["Chat/Communication"] = "聊天/通訊", | |
| 228 ["Druid"] = "德魯伊", | |
| 229 ["Hunter"] = "獵人", | |
| 230 ["Mage"] = "法師", | |
| 231 ["Paladin"] = "聖騎士", | |
| 232 ["Priest"] = "牧師", | |
| 233 ["Rogue"] = "盜賊", | |
| 234 ["Shaman"] = "薩滿", | |
| 235 ["Warlock"] = "術士", | |
| 236 ["Warrior"] = "戰士", | |
| 237 ["Healer"] = "治療者", | |
| 238 ["Tank"] = "坦克", | |
| 239 ["Caster"] = "施法者", | |
| 240 ["Combat"] = "戰鬥", | |
| 241 ["Compilations"] = "整合", | |
| 242 ["Data Export"] = "資料匯出", | |
| 243 ["Development Tools"] = "開發工具", | |
| 244 ["Guild"] = "公會", | |
| 245 ["Frame Modification"] = "框架修改", | |
| 246 ["Interface Enhancements"] = "介面增強", | |
| 247 ["Inventory"] = "庫存", | |
| 248 ["Library"] = "程式庫", | |
| 249 ["Map"] = "地圖", | |
| 250 ["Mail"] = "郵件", | |
| 251 ["Miscellaneous"] = "雜項", | |
| 252 ["Quest"] = "任務", | |
| 253 ["Raid"] = "團隊", | |
| 254 ["Tradeskill"] = "交易技能", | |
| 255 ["UnitFrame"] = "單位框架", | |
| 256 } | |
| 257 elseif GetLocale() == "zhCN" then | |
| 258 STANDBY = "|cffff5050(暂挂)|r" | |
| 259 | |
| 260 TITLE = "标题" | |
| 261 NOTES = "附注" | |
| 262 VERSION = "版本" | |
| 263 AUTHOR = "作者" | |
| 264 DATE = "日期" | |
| 265 CATEGORY = "分类" | |
| 266 EMAIL = "电子邮件" | |
| 267 WEBSITE = "网站" | |
| 268 CREDITS = "Credits" -- fix | |
| 269 LICENSE = "License" -- fix | |
| 270 | |
| 271 ABOUT = "关于" | |
| 272 PRINT_ADDON_INFO = "印列出插件信息" | |
| 273 DONATE = "Donate" -- fix | |
| 274 DONATE_DESC = "Give a much-needed donation to the author of this addon." -- fix | |
| 275 HOWTO_DONATE_WINDOWS = "Press Ctrl-A to select the link, then Ctrl-C to copy, then Alt-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 276 HOWTO_DONATE_MAC = "Press Cmd-A to select the link, then Cmd-C to copy, then Cmd-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 277 | |
| 278 CATEGORIES = { | |
| 279 ["Action Bars"] = "动作条", | |
| 280 ["Auction"] = "拍卖", | |
| 281 ["Audio"] = "音频", | |
| 282 ["Battlegrounds/PvP"] = "战场/PvP", | |
| 283 ["Buffs"] = "增益魔法", | |
| 284 ["Chat/Communication"] = "聊天/交流", | |
| 285 ["Druid"] = "德鲁伊", | |
| 286 ["Hunter"] = "猎人", | |
| 287 ["Mage"] = "法师", | |
| 288 ["Paladin"] = "圣骑士", | |
| 289 ["Priest"] = "牧师", | |
| 290 ["Rogue"] = "盗贼", | |
| 291 ["Shaman"] = "萨满祭司", | |
| 292 ["Warlock"] = "术士", | |
| 293 ["Warrior"] = "战士", | |
| 294 -- ["Healer"] = "治疗保障", | |
| 295 -- ["Tank"] = "近战控制", | |
| 296 -- ["Caster"] = "远程输出", | |
| 297 ["Combat"] = "战斗", | |
| 298 ["Compilations"] = "编译", | |
| 299 ["Data Export"] = "数据导出", | |
| 300 ["Development Tools"] = "开发工具", | |
| 301 ["Guild"] = "公会", | |
| 302 ["Frame Modification"] = "框架修改", | |
| 303 ["Interface Enhancements"] = "界面增强", | |
| 304 ["Inventory"] = "背包", | |
| 305 ["Library"] = "库", | |
| 306 ["Map"] = "地图", | |
| 307 ["Mail"] = "邮件", | |
| 308 ["Miscellaneous"] = "杂项", | |
| 309 ["Quest"] = "任务", | |
| 310 ["Raid"] = "团队", | |
| 311 ["Tradeskill"] = "商业技能", | |
| 312 ["UnitFrame"] = "头像框架", | |
| 313 } | |
| 314 elseif GetLocale() == "esES" then | |
| 315 STANDBY = "|cffff5050(espera)|r" | |
| 316 | |
| 317 TITLE = "Título" | |
| 318 NOTES = "Notas" | |
| 319 VERSION = "Versión" | |
| 320 AUTHOR = "Autor" | |
| 321 DATE = "Fecha" | |
| 322 CATEGORY = "Categoría" | |
| 323 EMAIL = "E-mail" | |
| 324 WEBSITE = "Web" | |
| 325 CREDITS = "Créditos" | |
| 326 LICENSE = "License" -- fix | |
| 327 | |
| 328 ABOUT = "Acerca de" | |
| 329 PRINT_ADDON_INFO = "Muestra información acerca del accesorio." | |
| 330 DONATE = "Donate" -- fix | |
| 331 DONATE_DESC = "Give a much-needed donation to the author of this addon." -- fix | |
| 332 HOWTO_DONATE_WINDOWS = "Press Ctrl-A to select the link, then Ctrl-C to copy, then Alt-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 333 HOWTO_DONATE_MAC = "Press Cmd-A to select the link, then Cmd-C to copy, then Cmd-Tab out of the game, open your favorite web browser, and paste the link into the address bar." -- fix | |
| 334 | |
| 335 CATEGORIES = { | |
| 336 ["Action Bars"] = "Barras de Acción", | |
| 337 ["Auction"] = "Subasta", | |
| 338 ["Audio"] = "Audio", | |
| 339 ["Battlegrounds/PvP"] = "Campos de Batalla/JcJ", | |
| 340 ["Buffs"] = "Buffs", | |
| 341 ["Chat/Communication"] = "Chat/Comunicación", | |
| 342 ["Druid"] = "Druida", | |
| 343 ["Hunter"] = "Cazador", | |
| 344 ["Mage"] = "Mago", | |
| 345 ["Paladin"] = "Paladín", | |
| 346 ["Priest"] = "Sacerdote", | |
| 347 ["Rogue"] = "Pícaro", | |
| 348 ["Shaman"] = "Chamán", | |
| 349 ["Warlock"] = "Brujo", | |
| 350 ["Warrior"] = "Guerrero", | |
| 351 ["Healer"] = "Sanador", | |
| 352 ["Tank"] = "Tanque", | |
| 353 ["Caster"] = "Conjurador", | |
| 354 ["Combat"] = "Combate", | |
| 355 ["Compilations"] = "Compilaciones", | |
| 356 ["Data Export"] = "Exportar Datos", | |
| 357 ["Development Tools"] = "Herramientas de Desarrollo", | |
| 358 ["Guild"] = "Hermandad", | |
| 359 ["Frame Modification"] = "Modificación de Marcos", | |
| 360 ["Interface Enhancements"] = "Mejoras de la Interfaz", | |
| 361 ["Inventory"] = "Inventario", | |
| 362 ["Library"] = "Biblioteca", | |
| 363 ["Map"] = "Mapa", | |
| 364 ["Mail"] = "Correo", | |
| 365 ["Miscellaneous"] = "Misceláneo", | |
| 366 ["Quest"] = "Misión", | |
| 367 ["Raid"] = "Banda", | |
| 368 ["Tradeskill"] = "Habilidad de Comercio", | |
| 369 ["UnitFrame"] = "Marco de Unidades", | |
| 370 } | |
| 371 else -- enUS | |
| 372 STANDBY = "|cffff5050(standby)|r" | |
| 373 | |
| 374 TITLE = "Title" | |
| 375 NOTES = "Notes" | |
| 376 VERSION = "Version" | |
| 377 AUTHOR = "Author" | |
| 378 DATE = "Date" | |
| 379 CATEGORY = "Category" | |
| 380 EMAIL = "E-mail" | |
| 381 WEBSITE = "Website" | |
| 382 CREDITS = "Credits" | |
| 383 LICENSE = "License" | |
| 384 | |
| 385 ABOUT = "About" | |
| 386 PRINT_ADDON_INFO = "Show information about the addon." | |
| 387 DONATE = "Donate" | |
| 388 DONATE_DESC = "Give a much-needed donation to the author of this addon." | |
| 389 HOWTO_DONATE_WINDOWS = "Press Ctrl-A to select the link, then Ctrl-C to copy, then Alt-Tab out of the game, open your favorite web browser, and paste the link into the address bar." | |
| 390 HOWTO_DONATE_MAC = "Press Cmd-A to select the link, then Cmd-C to copy, then Cmd-Tab out of the game, open your favorite web browser, and paste the link into the address bar." | |
| 391 | |
| 392 CATEGORIES = { | |
| 393 ["Action Bars"] = "Action Bars", | |
| 394 ["Auction"] = "Auction", | |
| 395 ["Audio"] = "Audio", | |
| 396 ["Battlegrounds/PvP"] = "Battlegrounds/PvP", | |
| 397 ["Buffs"] = "Buffs", | |
| 398 ["Chat/Communication"] = "Chat/Communication", | |
| 399 ["Druid"] = "Druid", | |
| 400 ["Hunter"] = "Hunter", | |
| 401 ["Mage"] = "Mage", | |
| 402 ["Paladin"] = "Paladin", | |
| 403 ["Priest"] = "Priest", | |
| 404 ["Rogue"] = "Rogue", | |
| 405 ["Shaman"] = "Shaman", | |
| 406 ["Warlock"] = "Warlock", | |
| 407 ["Warrior"] = "Warrior", | |
| 408 ["Healer"] = "Healer", | |
| 409 ["Tank"] = "Tank", | |
| 410 ["Caster"] = "Caster", | |
| 411 ["Combat"] = "Combat", | |
| 412 ["Compilations"] = "Compilations", | |
| 413 ["Data Export"] = "Data Export", | |
| 414 ["Development Tools"] = "Development Tools", | |
| 415 ["Guild"] = "Guild", | |
| 416 ["Frame Modification"] = "Frame Modification", | |
| 417 ["Interface Enhancements"] = "Interface Enhancements", | |
| 418 ["Inventory"] = "Inventory", | |
| 419 ["Library"] = "Library", | |
| 420 ["Map"] = "Map", | |
| 421 ["Mail"] = "Mail", | |
| 422 ["Miscellaneous"] = "Miscellaneous", | |
| 423 ["Quest"] = "Quest", | |
| 424 ["Raid"] = "Raid", | |
| 425 ["Tradeskill"] = "Tradeskill", | |
| 426 ["UnitFrame"] = "UnitFrame", | |
| 427 } | |
| 428 end | |
| 429 | |
| 430 setmetatable(CATEGORIES, { __index = function(self, key) -- case-insensitive | |
| 431 local lowerKey = key:lower() | |
| 432 for k,v in pairs(CATEGORIES) do | |
| 433 if k:lower() == lowerKey then | |
| 434 return v | |
| 435 end | |
| 436 end | |
| 437 end }) | |
| 438 | |
| 439 -- Create the library object | |
| 440 | |
| 441 local AceOO = AceLibrary("AceOO-2.0") | |
| 442 local AceAddon = AceOO.Class() | |
| 443 local AceEvent | |
| 444 local AceConsole | |
| 445 local AceModuleCore | |
| 446 | |
| 447 function AceAddon:GetLocalizedCategory(name) | |
| 448 self:argCheck(name, 2, "string") | |
| 449 return CATEGORIES[name] or UNKNOWN | |
| 450 end | |
| 451 | |
| 452 function AceAddon:ToString() | |
| 453 return "AceAddon" | |
| 454 end | |
| 455 | |
| 456 local function print(text) | |
| 457 DEFAULT_CHAT_FRAME:AddMessage(text) | |
| 458 end | |
| 459 | |
| 460 function AceAddon:ADDON_LOADED(name) | |
| 461 local unregister = true | |
| 462 local initAddon = {} | |
| 463 while #self.nextAddon > 0 do | |
| 464 local addon = table.remove(self.nextAddon, 1) | |
| 465 if addon.possibleNames[name] then | |
| 466 table.insert(initAddon, addon) | |
| 467 else | |
| 468 unregister = nil | |
| 469 table.insert(self.skipAddon, addon) | |
| 470 end | |
| 471 end | |
| 472 self.nextAddon, self.skipAddon = self.skipAddon, self.nextAddon | |
| 473 if unregister then | |
| 474 AceAddon:UnregisterEvent("ADDON_LOADED") | |
| 475 end | |
| 476 while #initAddon > 0 do | |
| 477 local addon = table.remove(initAddon, 1) | |
| 478 table.insert(self.addons, addon) | |
| 479 if not self.addons[name] then | |
| 480 self.addons[name] = addon | |
| 481 end | |
| 482 addon.possibleNames = nil | |
| 483 self:InitializeAddon(addon, name) | |
| 484 end | |
| 485 end | |
| 486 | |
| 487 local function RegisterOnEnable(self) | |
| 488 if DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage then -- HACK | |
| 489 AceAddon.playerLoginFired = true | |
| 490 end | |
| 491 if AceAddon.playerLoginFired then | |
| 492 AceAddon.addonsStarted[self] = true | |
| 493 if (type(self.IsActive) ~= "function" or self:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(self) or AceModuleCore:IsModuleActive(self)) then | |
| 494 AceAddon:ManualEnable(self) | |
| 495 end | |
| 496 else | |
| 497 if not AceAddon.addonsToOnEnable then | |
| 498 AceAddon.addonsToOnEnable = {} | |
| 499 end | |
| 500 table.insert(AceAddon.addonsToOnEnable, self) | |
| 501 end | |
| 502 end | |
| 503 | |
| 504 function AceAddon:InitializeAddon(addon, name) | |
| 505 if addon.name == nil then | |
| 506 addon.name = name | |
| 507 end | |
| 508 if GetAddOnMetadata then | |
| 509 -- TOC checks | |
| 510 if addon.title == nil then | |
| 511 addon.title = GetAddOnMetadata(name, "Title") | |
| 512 end | |
| 513 if type(addon.title) == "string" then | |
| 514 local num = addon.title:find(" |cff7fff7f %-Ace2%-|r$") | |
| 515 if num then | |
| 516 addon.title = addon.title:sub(1, num - 1) | |
| 517 end | |
| 518 addon.title = addon.title:trim() | |
| 519 end | |
| 520 if addon.notes == nil then | |
| 521 addon.notes = GetAddOnMetadata(name, "Notes") | |
| 522 end | |
| 523 if type(addon.notes) == "string" then | |
| 524 addon.notes = addon.notes:trim() | |
| 525 end | |
| 526 if addon.version == nil then | |
| 527 addon.version = GetAddOnMetadata(name, "Version") | |
| 528 end | |
| 529 if type(addon.version) == "string" then | |
| 530 if addon.version:find("%$Revision: (%d+) %$") then | |
| 531 addon.version = addon.version:gsub("%$Revision: (%d+) %$", "%1") | |
| 532 elseif addon.version:find("%$Rev: (%d+) %$") then | |
| 533 addon.version = addon.version:gsub("%$Rev: (%d+) %$", "%1") | |
| 534 elseif addon.version:find("%$LastChangedRevision: (%d+) %$") then | |
| 535 addon.version = addon.version:gsub("%$LastChangedRevision: (%d+) %$", "%1") | |
| 536 end | |
| 537 addon.version = addon.version:trim() | |
| 538 end | |
| 539 if addon.author == nil then | |
| 540 addon.author = GetAddOnMetadata(name, "Author") | |
| 541 end | |
| 542 if type(addon.author) == "string" then | |
| 543 addon.author = addon.author:trim() | |
| 544 end | |
| 545 if addon.credits == nil then | |
| 546 addon.credits = GetAddOnMetadata(name, "X-Credits") | |
| 547 end | |
| 548 if type(addon.credits) == "string" then | |
| 549 addon.credits = addon.credits:trim() | |
| 550 end | |
| 551 if addon.donate == nil then | |
| 552 addon.donate = GetAddOnMetadata(name, "X-Donate") | |
| 553 end | |
| 554 if type(addon.donate) == "string" then | |
| 555 addon.donate = addon.donate:trim() | |
| 556 end | |
| 557 if addon.date == nil then | |
| 558 addon.date = GetAddOnMetadata(name, "X-Date") or GetAddOnMetadata(name, "X-ReleaseDate") | |
| 559 end | |
| 560 if type(addon.date) == "string" then | |
| 561 if addon.date:find("%$Date: (.-) %$") then | |
| 562 addon.date = addon.date:gsub("%$Date: (.-) %$", "%1") | |
| 563 elseif addon.date:find("%$LastChangedDate: (.-) %$") then | |
| 564 addon.date = addon.date:gsub("%$LastChangedDate: (.-) %$", "%1") | |
| 565 end | |
| 566 addon.date = addon.date:trim() | |
| 567 end | |
| 568 | |
| 569 if addon.category == nil then | |
| 570 addon.category = GetAddOnMetadata(name, "X-Category") | |
| 571 end | |
| 572 if type(addon.category) == "string" then | |
| 573 addon.category = addon.category:trim() | |
| 574 end | |
| 575 if addon.email == nil then | |
| 576 addon.email = GetAddOnMetadata(name, "X-eMail") or GetAddOnMetadata(name, "X-Email") | |
| 577 end | |
| 578 if type(addon.email) == "string" then | |
| 579 addon.email = addon.email:trim() | |
| 580 end | |
| 581 if addon.license == nil then | |
| 582 addon.license = GetAddOnMetadata(name, "X-License") | |
| 583 end | |
| 584 if type(addon.license) == "string" then | |
| 585 addon.license = addon.license:trim() | |
| 586 end | |
| 587 if addon.website == nil then | |
| 588 addon.website = GetAddOnMetadata(name, "X-Website") | |
| 589 end | |
| 590 if type(addon.website) == "string" then | |
| 591 addon.website = addon.website:trim() | |
| 592 end | |
| 593 end | |
| 594 local current = addon.class | |
| 595 while true do | |
| 596 if current == AceOO.Class or not current then | |
| 597 break | |
| 598 end | |
| 599 if current.mixins then | |
| 600 for mixin in pairs(current.mixins) do | |
| 601 if type(mixin.OnEmbedInitialize) == "function" then | |
| 602 mixin:OnEmbedInitialize(addon, name) | |
| 603 end | |
| 604 end | |
| 605 end | |
| 606 current = current.super | |
| 607 end | |
| 608 local n = AceAddon.addonsToOnEnable and #AceAddon.addonsToOnEnable or 0 | |
| 609 | |
| 610 if type(addon.OnInitialize) == "function" then | |
| 611 safecall(addon.OnInitialize, addon, name) | |
| 612 end | |
| 613 if AceEvent then | |
| 614 AceEvent:TriggerEvent("Ace2_AddonInitialized", addon) | |
| 615 end | |
| 616 RegisterOnEnable(addon) | |
| 617 local n2 = AceAddon.addonsToOnEnable and #AceAddon.addonsToOnEnable or 0 | |
| 618 if n2 - n > 1 then | |
| 619 local mine = table.remove(AceAddon.addonsToOnEnable) | |
| 620 table.insert(AceAddon.addonsToOnEnable, n+1, mine) | |
| 621 end | |
| 622 end | |
| 623 | |
| 624 local aboutFrame | |
| 625 local function createAboutFrame() | |
| 626 aboutFrame = CreateFrame("Frame", "AceAddon20AboutFrame", UIParent, "DialogBoxFrame") | |
| 627 aboutFrame:SetWidth(500) | |
| 628 aboutFrame:SetHeight(400) | |
| 629 aboutFrame:SetPoint("CENTER") | |
| 630 aboutFrame:SetBackdrop({ | |
| 631 bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], | |
| 632 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], | |
| 633 tile = true, tileSize = 16, edgeSize = 16, | |
| 634 insets = { left = 5, right = 5, top = 5, bottom = 5 } | |
| 635 }) | |
| 636 aboutFrame:SetBackdropColor(0,0,0,1) | |
| 637 | |
| 638 local donateButton = CreateFrame("Button", "AceAddon20AboutFrameDonateButton", aboutFrame, "UIPanelButtonTemplate2") | |
| 639 aboutFrame.donateButton = donateButton | |
| 640 donateButton:SetPoint("BOTTOMRIGHT", -20, 20) | |
| 641 _G.AceAddon20AboutFrameDonateButtonText:SetText(DONATE) | |
| 642 donateButton:SetWidth(_G.AceAddon20AboutFrameDonateButtonText:GetWidth()+20) | |
| 643 donateButton:SetScript("OnClick", function() | |
| 644 aboutFrame.currentAddon:OpenDonationFrame() | |
| 645 end) | |
| 646 | |
| 647 local text = aboutFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge") | |
| 648 aboutFrame.title = text | |
| 649 text:SetPoint("TOP", 0, -5) | |
| 650 | |
| 651 aboutFrame:Hide() | |
| 652 | |
| 653 aboutFrame.lefts = {} | |
| 654 aboutFrame.rights = {} | |
| 655 aboutFrame.textLefts = {} | |
| 656 aboutFrame.textRights = {} | |
| 657 function aboutFrame:Clear() | |
| 658 self.title:SetText("") | |
| 659 for i = 1, #self.lefts do | |
| 660 self.lefts[i] = nil | |
| 661 self.rights[i] = nil | |
| 662 end | |
| 663 end | |
| 664 | |
| 665 function aboutFrame:AddLine(left, right) | |
| 666 aboutFrame.lefts[#aboutFrame.lefts+1] = left | |
| 667 aboutFrame.rights[#aboutFrame.rights+1] = right | |
| 668 end | |
| 669 | |
| 670 local aboutFrame_Show = aboutFrame.Show | |
| 671 function aboutFrame:Show(...) | |
| 672 local maxLeftWidth = 0 | |
| 673 local maxRightWidth = 0 | |
| 674 local textHeight = 0 | |
| 675 for i = 1, #self.lefts do | |
| 676 if not self.textLefts[i] then | |
| 677 local left = aboutFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal") | |
| 678 self.textLefts[i] = left | |
| 679 local right = aboutFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") | |
| 680 self.textRights[i] = right | |
| 681 if i == 1 then | |
| 682 left:SetPoint("TOPRIGHT", aboutFrame, "TOPLEFT", 75, -35) | |
| 683 else | |
| 684 left:SetPoint("TOPRIGHT", self.textLefts[i-1], "BOTTOMRIGHT", 0, -5) | |
| 685 end | |
| 686 right:SetPoint("LEFT", left, "RIGHT", 5, 0) | |
| 687 end | |
| 688 self.textLefts[i]:SetText(self.lefts[i] .. ":") | |
| 689 self.textRights[i]:SetText(self.rights[i]) | |
| 690 local leftWidth = self.textLefts[i]:GetWidth() | |
| 691 local rightWidth = self.textRights[i]:GetWidth() | |
| 692 textHeight = self.textLefts[i]:GetHeight() | |
| 693 if maxLeftWidth < leftWidth then | |
| 694 maxLeftWidth = leftWidth | |
| 695 end | |
| 696 if maxRightWidth < rightWidth then | |
| 697 maxRightWidth = rightWidth | |
| 698 end | |
| 699 end | |
| 700 for i = #self.lefts+1, #self.textLefts do | |
| 701 self.textLefts[i]:SetText('') | |
| 702 self.textRights[i]:SetText('') | |
| 703 end | |
| 704 aboutFrame:SetWidth(75 + maxRightWidth + 20) | |
| 705 aboutFrame:SetHeight(#self.lefts * (textHeight + 5) + 100) | |
| 706 | |
| 707 aboutFrame_Show(self, ...) | |
| 708 end | |
| 709 aboutFrame:Hide() | |
| 710 | |
| 711 createAboutFrame = nil | |
| 712 end | |
| 713 local donateFrame | |
| 714 | |
| 715 local function unobfuscateEmail(email) | |
| 716 return email:gsub(" AT ", "@"):gsub(" DOT ", ".") | |
| 717 end | |
| 718 | |
| 719 local function isGoodVariable(var) | |
| 720 return type(var) == "string" or type(var) == "number" | |
| 721 end | |
| 722 function AceAddon.prototype:PrintAddonInfo() | |
| 723 if createAboutFrame then | |
| 724 createAboutFrame() | |
| 725 end | |
| 726 aboutFrame:Clear() | |
| 727 local x | |
| 728 if isGoodVariable(self.title) then | |
| 729 x = tostring(self.title) | |
| 730 elseif isGoodVariable(self.name) then | |
| 731 x = tostring(self.name) | |
| 732 else | |
| 733 x = "<" .. tostring(self.class) .. " instance>" | |
| 734 end | |
| 735 if type(self.IsActive) == "function" then | |
| 736 if not self:IsActive() then | |
| 737 x = x .. " " .. STANDBY | |
| 738 end | |
| 739 end | |
| 740 aboutFrame.title:SetText(x) | |
| 741 | |
| 742 if isGoodVariable(self.version) then | |
| 743 aboutFrame:AddLine(VERSION, tostring(self.version)) | |
| 744 end | |
| 745 if isGoodVariable(self.notes) then | |
| 746 aboutFrame:AddLine(NOTES, tostring(self.notes)) | |
| 747 end | |
| 748 if isGoodVariable(self.author) then | |
| 749 aboutFrame:AddLine(AUTHOR, tostring(self.author)) | |
| 750 end | |
| 751 if isGoodVariable(self.credits) then | |
| 752 aboutFrame:AddLine(CREDITS, tostring(self.credits)) | |
| 753 end | |
| 754 if isGoodVariable(self.date) then | |
| 755 aboutFrame:AddLine(DATE, tostring(self.date)) | |
| 756 end | |
| 757 if self.category then | |
| 758 local category = CATEGORIES[self.category] | |
| 759 if category then | |
| 760 aboutFrame:AddLine(CATEGORY, tostring(self.category)) | |
| 761 end | |
| 762 end | |
| 763 if isGoodVariable(self.email) then | |
| 764 aboutFrame:AddLine(EMAIL, unobfuscateEmail(tostring(self.email))) | |
| 765 end | |
| 766 if isGoodVariable(self.website) then | |
| 767 aboutFrame:AddLine(WEBSITE, tostring(self.website)) | |
| 768 end | |
| 769 if isGoodVariable(self.license) then | |
| 770 aboutFrame:AddLine(LICENSE, tostring(self.license)) | |
| 771 end | |
| 772 | |
| 773 if donateFrame and donateFrame:IsShown() then | |
| 774 donateFrame:Hide() | |
| 775 end | |
| 776 | |
| 777 aboutFrame.currentAddon = self | |
| 778 | |
| 779 aboutFrame:Show() | |
| 780 | |
| 781 if self.donate then | |
| 782 aboutFrame.donateButton:Show() | |
| 783 else | |
| 784 aboutFrame.donateButton:Hide() | |
| 785 end | |
| 786 end | |
| 787 | |
| 788 local function createDonateFrame() | |
| 789 donateFrame = CreateFrame("Frame", "AceAddon20Frame", UIParent, "DialogBoxFrame") | |
| 790 | |
| 791 donateFrame:SetWidth(500) | |
| 792 donateFrame:SetHeight(200) | |
| 793 donateFrame:SetPoint("CENTER") | |
| 794 donateFrame:SetBackdrop({ | |
| 795 bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], | |
| 796 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], | |
| 797 tile = true, tileSize = 16, edgeSize = 16, | |
| 798 insets = { left = 5, right = 5, top = 5, bottom = 5 } | |
| 799 }) | |
| 800 donateFrame:SetBackdropColor(0,0,0,1) | |
| 801 | |
| 802 local text = donateFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge") | |
| 803 text:SetPoint("TOP", 0, -5) | |
| 804 text:SetText(DONATE) | |
| 805 | |
| 806 local howto = donateFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") | |
| 807 howto:SetPoint("TOP", text, "BOTTOM", 0, -5) | |
| 808 howto:SetPoint("LEFT", 16, 0) | |
| 809 howto:SetPoint("RIGHT", -16, 0) | |
| 810 if not IsMacClient() then | |
| 811 -- Windows or Linux | |
| 812 howto:SetText(HOWTO_DONATE_WINDOWS) | |
| 813 else | |
| 814 howto:SetText(HOWTO_DONATE_MAC) | |
| 815 end | |
| 816 | |
| 817 local scrollFrame = CreateFrame("ScrollFrame", "AceAddon20FrameScrollFrame", donateFrame, "UIPanelScrollFrameTemplate") | |
| 818 scrollFrame:SetToplevel(true) | |
| 819 scrollFrame:SetPoint("TOP", -10, -76) | |
| 820 scrollFrame:SetWidth(455) | |
| 821 scrollFrame:SetHeight(70) | |
| 822 howto:SetPoint("BOTTOM", scrollFrame, "TOP") | |
| 823 | |
| 824 local editBox = CreateFrame("EditBox", nil, scrollFrame) | |
| 825 donateFrame.editBox = editBox | |
| 826 scrollFrame:SetScrollChild(editBox) | |
| 827 editBox:SetFontObject(ChatFontNormal) | |
| 828 editBox:SetMultiLine(true) | |
| 829 editBox:SetMaxLetters(99999) | |
| 830 editBox:SetWidth(450) | |
| 831 editBox:SetHeight(54) | |
| 832 editBox:SetPoint("BOTTOM", 5, 0) | |
| 833 editBox:SetJustifyH("LEFT") | |
| 834 editBox:SetJustifyV("TOP") | |
| 835 editBox:SetAutoFocus(false) | |
| 836 editBox:SetScript("OnTextChanged", function(this) | |
| 837 if this:GetText() ~= this.text then | |
| 838 this:SetText(this.text) | |
| 839 end | |
| 840 end) | |
| 841 editBox:SetScript("OnEscapePressed", function(this) | |
| 842 this:ClearFocus() | |
| 843 end) | |
| 844 createDonateFrame = nil | |
| 845 end | |
| 846 | |
| 847 local function fix(char) | |
| 848 return ("%%%02x"):format(char:byte()) | |
| 849 end | |
| 850 | |
| 851 local function urlencode(text) | |
| 852 return text:gsub("[^0-9A-Za-z]", fix) | |
| 853 end | |
| 854 | |
| 855 function AceAddon.prototype:OpenDonationFrame() | |
| 856 if createDonateFrame then | |
| 857 createDonateFrame() | |
| 858 end | |
| 859 local donate = self.donate | |
| 860 if type(donate) ~= "string" then | |
| 861 donate = "Wowace" | |
| 862 end | |
| 863 local style, data = (":"):split(donate, 2) | |
| 864 style = style:lower() | |
| 865 if style ~= "website" and style ~= "paypal" then | |
| 866 style = "wowace" | |
| 867 end | |
| 868 if style == "wowace" then | |
| 869 donateFrame.editBox.text = "http://www.wowace.com/wiki/Donations" | |
| 870 elseif style == "website" then | |
| 871 donateFrame.editBox.text = data | |
| 872 else -- PayPal | |
| 873 local text = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=" .. urlencode(unobfuscateEmail(data)) | |
| 874 local name | |
| 875 if type(self.title) == "string" then | |
| 876 name = self.title | |
| 877 elseif type(self.name) == "string" then | |
| 878 name = self.name | |
| 879 end | |
| 880 if name then | |
| 881 name = name:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", "") | |
| 882 text = text .. "&item_name=" .. urlencode(name) | |
| 883 end | |
| 884 donateFrame.editBox.text = text | |
| 885 end | |
| 886 donateFrame.editBox:SetText(donateFrame.editBox.text) | |
| 887 | |
| 888 if aboutFrame and aboutFrame:IsShown() then | |
| 889 aboutFrame:Hide() | |
| 890 end | |
| 891 | |
| 892 donateFrame:Show() | |
| 893 | |
| 894 donateFrame.editBox:SetFocus() | |
| 895 end | |
| 896 | |
| 897 local options | |
| 898 function AceAddon:GetAceOptionsDataTable(target) | |
| 899 return { | |
| 900 about = { | |
| 901 name = ABOUT, | |
| 902 desc = PRINT_ADDON_INFO, | |
| 903 type = "execute", | |
| 904 func = "PrintAddonInfo", | |
| 905 order = -1, | |
| 906 }, | |
| 907 donate = { | |
| 908 name = DONATE, | |
| 909 desc = DONATE_DESC, | |
| 910 type = "execute", | |
| 911 func = "OpenDonationFrame", | |
| 912 order = -1, | |
| 913 hidden = function() | |
| 914 return not target.donate | |
| 915 end | |
| 916 } | |
| 917 } | |
| 918 end | |
| 919 | |
| 920 function AceAddon:PLAYER_LOGIN() | |
| 921 self.playerLoginFired = true | |
| 922 if self.addonsToOnEnable then | |
| 923 while #self.addonsToOnEnable > 0 do | |
| 924 local addon = table.remove(self.addonsToOnEnable, 1) | |
| 925 self.addonsStarted[addon] = true | |
| 926 if (type(addon.IsActive) ~= "function" or addon:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(addon) or AceModuleCore:IsModuleActive(addon)) then | |
| 927 AceAddon:ManualEnable(addon) | |
| 928 end | |
| 929 end | |
| 930 self.addonsToOnEnable = nil | |
| 931 end | |
| 932 end | |
| 933 | |
| 934 function AceAddon.prototype:Inject(t) | |
| 935 AceAddon:argCheck(t, 2, "table") | |
| 936 for k,v in pairs(t) do | |
| 937 self[k] = v | |
| 938 end | |
| 939 end | |
| 940 | |
| 941 function AceAddon.prototype:init() | |
| 942 if not AceEvent then | |
| 943 error(MAJOR_VERSION .. " requires AceEvent-2.0", 4) | |
| 944 end | |
| 945 AceAddon.super.prototype.init(self) | |
| 946 | |
| 947 self.super = self.class.prototype | |
| 948 | |
| 949 AceAddon:RegisterEvent("ADDON_LOADED", "ADDON_LOADED") | |
| 950 local names = {} | |
| 951 for i = 1, GetNumAddOns() do | |
| 952 if IsAddOnLoaded(i) then names[GetAddOnInfo(i)] = true end | |
| 953 end | |
| 954 self.possibleNames = names | |
| 955 table.insert(AceAddon.nextAddon, self) | |
| 956 end | |
| 957 | |
| 958 function AceAddon.prototype:ToString() | |
| 959 local x | |
| 960 if type(self.title) == "string" then | |
| 961 x = self.title | |
| 962 elseif type(self.name) == "string" then | |
| 963 x = self.name | |
| 964 else | |
| 965 x = "<" .. tostring(self.class) .. " instance>" | |
| 966 end | |
| 967 if (type(self.IsActive) == "function" and not self:IsActive()) or (AceModuleCore and AceModuleCore:IsModule(addon) and AceModuleCore:IsModuleActive(addon)) then | |
| 968 x = x .. " " .. STANDBY | |
| 969 end | |
| 970 return x | |
| 971 end | |
| 972 | |
| 973 AceAddon.new = function(self, ...) | |
| 974 local class = AceAddon:pcall(AceOO.Classpool, self, ...) | |
| 975 return class:new() | |
| 976 end | |
| 977 | |
| 978 function AceAddon:ManualEnable(addon) | |
| 979 AceAddon:argCheck(addon, 2, "table") | |
| 980 local first = nil | |
| 981 if AceOO.inherits(addon, "AceAddon-2.0") then | |
| 982 if AceAddon.addonsEnabled and not AceAddon.addonsEnabled[addon] then | |
| 983 first = true | |
| 984 AceAddon.addonsEnabled[addon] = true | |
| 985 end | |
| 986 end | |
| 987 local current = addon.class | |
| 988 while current and current ~= AceOO.Class do | |
| 989 if current.mixins then | |
| 990 for mixin in pairs(current.mixins) do | |
| 991 if type(mixin.OnEmbedEnable) == "function" then | |
| 992 safecall(mixin.OnEmbedEnable, mixin, addon, first) | |
| 993 end | |
| 994 end | |
| 995 end | |
| 996 current = current.super | |
| 997 end | |
| 998 if type(addon.OnEnable) == "function" then | |
| 999 safecall(addon.OnEnable, addon, first) | |
| 1000 end | |
| 1001 if AceEvent then | |
| 1002 AceEvent:TriggerEvent("Ace2_AddonEnabled", addon, first) | |
| 1003 end | |
| 1004 end | |
| 1005 | |
| 1006 function AceAddon:ManualDisable(addon) | |
| 1007 AceAddon:argCheck(addon, 2, "table") | |
| 1008 local current = addon.class | |
| 1009 while current and current ~= AceOO.Class do | |
| 1010 if current.mixins then | |
| 1011 for mixin in pairs(current.mixins) do | |
| 1012 if type(mixin.OnEmbedDisable) == "function" then | |
| 1013 safecall(mixin.OnEmbedDisable, mixin, addon) | |
| 1014 end | |
| 1015 end | |
| 1016 end | |
| 1017 current = current.super | |
| 1018 end | |
| 1019 if type(module.OnDisable) == "function" then | |
| 1020 safecall(module.OnDisable, addon) | |
| 1021 end | |
| 1022 if AceEvent then | |
| 1023 AceEvent:TriggerEvent("Ace2_AddonDisabled", addon) | |
| 1024 end | |
| 1025 end | |
| 1026 | |
| 1027 local function external(self, major, instance) | |
| 1028 if major == "AceEvent-2.0" then | |
| 1029 AceEvent = instance | |
| 1030 | |
| 1031 AceEvent:embed(self) | |
| 1032 | |
| 1033 self:RegisterEvent("PLAYER_LOGIN", "PLAYER_LOGIN", true) | |
| 1034 elseif major == "AceConsole-2.0" then | |
| 1035 AceConsole = instance | |
| 1036 | |
| 1037 local slashCommands = { "/ace2" } | |
| 1038 local _,_,_,enabled,loadable = GetAddOnInfo("Ace") | |
| 1039 if not enabled or not loadable then | |
| 1040 table.insert(slashCommands, "/ace") | |
| 1041 end | |
| 1042 local function listAddon(addon, depth) | |
| 1043 if not depth then | |
| 1044 depth = 0 | |
| 1045 end | |
| 1046 | |
| 1047 local s = (" "):rep(depth) .. " - " .. tostring(addon) | |
| 1048 if rawget(addon, 'version') then | |
| 1049 s = s .. " - |cffffff7f" .. tostring(addon.version) .. "|r" | |
| 1050 end | |
| 1051 if rawget(addon, 'slashCommand') then | |
| 1052 s = s .. " |cffffff7f(" .. tostring(addon.slashCommand) .. ")|r" | |
| 1053 end | |
| 1054 print(s) | |
| 1055 if type(rawget(addon, 'modules')) == "table" then | |
| 1056 local i = 0 | |
| 1057 for k,v in pairs(addon.modules) do | |
| 1058 i = i + 1 | |
| 1059 if i == 6 then | |
| 1060 print((" "):rep(depth + 1) .. " - more...") | |
| 1061 break | |
| 1062 else | |
| 1063 listAddon(v, depth + 1) | |
| 1064 end | |
| 1065 end | |
| 1066 end | |
| 1067 end | |
| 1068 local function listNormalAddon(i) | |
| 1069 local name,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 1070 if not loadable then | |
| 1071 enabled = false | |
| 1072 end | |
| 1073 if self.addons[name] then | |
| 1074 listAddon(self.addons[name]) | |
| 1075 else | |
| 1076 local s = " - " .. tostring(GetAddOnMetadata(i, "Title") or name) | |
| 1077 local version = GetAddOnMetadata(i, "Version") | |
| 1078 if version then | |
| 1079 if version:find("%$Revision: (%d+) %$") then | |
| 1080 version = version:gsub("%$Revision: (%d+) %$", "%1") | |
| 1081 elseif version:find("%$Rev: (%d+) %$") then | |
| 1082 version = version:gsub("%$Rev: (%d+) %$", "%1") | |
| 1083 elseif version:find("%$LastChangedRevision: (%d+) %$") then | |
| 1084 version = version:gsub("%$LastChangedRevision: (%d+) %$", "%1") | |
| 1085 end | |
| 1086 s = s .. " - |cffffff7f" .. version .. "|r" | |
| 1087 end | |
| 1088 if not enabled then | |
| 1089 s = s .. " |cffff0000(disabled)|r" | |
| 1090 end | |
| 1091 if IsAddOnLoadOnDemand(i) then | |
| 1092 s = s .. " |cff00ff00[LoD]|r" | |
| 1093 end | |
| 1094 print(s) | |
| 1095 end | |
| 1096 end | |
| 1097 local function mySort(alpha, bravo) | |
| 1098 return tostring(alpha) < tostring(bravo) | |
| 1099 end | |
| 1100 AceConsole.RegisterChatCommand(self, slashCommands, { | |
| 1101 desc = "AddOn development framework", | |
| 1102 name = "Ace2", | |
| 1103 type = "group", | |
| 1104 args = { | |
| 1105 about = { | |
| 1106 desc = "Get information about Ace2", | |
| 1107 name = "About", | |
| 1108 type = "execute", | |
| 1109 func = function() | |
| 1110 print("|cffffff7fAce2|r - |cffffff7f2.0." .. MINOR_VERSION:gsub("%$Revision: (%d+) %$", "%1") .. "|r - AddOn development framework") | |
| 1111 print(" - |cffffff7f" .. AUTHOR .. ":|r Ace Development Team") | |
| 1112 print(" - |cffffff7f" .. WEBSITE .. ":|r http://www.wowace.com/") | |
| 1113 end | |
| 1114 }, | |
| 1115 list = { | |
| 1116 desc = "List addons", | |
| 1117 name = "List", | |
| 1118 type = "group", | |
| 1119 args = { | |
| 1120 ace2 = { | |
| 1121 desc = "List addons using Ace2", | |
| 1122 name = "Ace2", | |
| 1123 type = "execute", | |
| 1124 func = function() | |
| 1125 print("|cffffff7fAddon list:|r") | |
| 1126 table.sort(self.addons, mySort) | |
| 1127 for _,v in ipairs(self.addons) do | |
| 1128 listAddon(v) | |
| 1129 end | |
| 1130 end | |
| 1131 }, | |
| 1132 all = { | |
| 1133 desc = "List all addons", | |
| 1134 name = "All", | |
| 1135 type = "execute", | |
| 1136 func = function() | |
| 1137 print("|cffffff7fAddon list:|r") | |
| 1138 local count = GetNumAddOns() | |
| 1139 for i = 1, count do | |
| 1140 listNormalAddon(i) | |
| 1141 end | |
| 1142 end | |
| 1143 }, | |
| 1144 enabled = { | |
| 1145 desc = "List all enabled addons", | |
| 1146 name = "Enabled", | |
| 1147 type = "execute", | |
| 1148 func = function() | |
| 1149 print("|cffffff7fAddon list:|r") | |
| 1150 local count = GetNumAddOns() | |
| 1151 for i = 1, count do | |
| 1152 local _,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 1153 if enabled and loadable then | |
| 1154 listNormalAddon(i) | |
| 1155 end | |
| 1156 end | |
| 1157 end | |
| 1158 }, | |
| 1159 disabled = { | |
| 1160 desc = "List all disabled addons", | |
| 1161 name = "Disabled", | |
| 1162 type = "execute", | |
| 1163 func = function() | |
| 1164 print("|cffffff7fAddon list:|r") | |
| 1165 local count = GetNumAddOns() | |
| 1166 for i = 1, count do | |
| 1167 local _,_,_,enabled,loadable = GetAddOnInfo(i) | |
| 1168 if not enabled or not loadable then | |
| 1169 listNormalAddon(i) | |
| 1170 end | |
| 1171 end | |
| 1172 end | |
| 1173 }, | |
| 1174 lod = { | |
| 1175 desc = "List all LoadOnDemand addons", | |
| 1176 name = "LoadOnDemand", | |
| 1177 type = "execute", | |
| 1178 func = function() | |
| 1179 print("|cffffff7fAddon list:|r") | |
| 1180 local count = GetNumAddOns() | |
| 1181 for i = 1, count do | |
| 1182 if IsAddOnLoadOnDemand(i) then | |
| 1183 listNormalAddon(i) | |
| 1184 end | |
| 1185 end | |
| 1186 end | |
| 1187 }, | |
| 1188 ace1 = { | |
| 1189 desc = "List all addons using Ace1", | |
| 1190 name = "Ace 1.x", | |
| 1191 type = "execute", | |
| 1192 func = function() | |
| 1193 print("|cffffff7fAddon list:|r") | |
| 1194 local count = GetNumAddOns() | |
| 1195 for i = 1, count do | |
| 1196 local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) | |
| 1197 if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then | |
| 1198 listNormalAddon(i) | |
| 1199 end | |
| 1200 end | |
| 1201 end | |
| 1202 }, | |
| 1203 libs = { | |
| 1204 desc = "List all libraries using AceLibrary", | |
| 1205 name = "Libraries", | |
| 1206 type = "execute", | |
| 1207 func = function() | |
| 1208 if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then | |
| 1209 print("|cffffff7fLibrary list:|r") | |
| 1210 for name, data in pairs(AceLibrary.libs) do | |
| 1211 local s | |
| 1212 if data.minor then | |
| 1213 s = " - " .. tostring(name) .. "." .. tostring(data.minor) | |
| 1214 else | |
| 1215 s = " - " .. tostring(name) | |
| 1216 end | |
| 1217 if rawget(AceLibrary(name), 'slashCommand') then | |
| 1218 s = s .. " |cffffff7f(" .. tostring(AceLibrary(name).slashCommand) .. "|cffffff7f)" | |
| 1219 end | |
| 1220 print(s) | |
| 1221 end | |
| 1222 end | |
| 1223 end | |
| 1224 }, | |
| 1225 search = { | |
| 1226 desc = "Search by name", | |
| 1227 name = "Search", | |
| 1228 type = "text", | |
| 1229 usage = "<keyword>", | |
| 1230 input = true, | |
| 1231 get = false, | |
| 1232 set = function(...) | |
| 1233 local arg = { ... } | |
| 1234 for i,v in ipairs(arg) do | |
| 1235 arg[i] = v:gsub('%*', '.*'):gsub('%%', '%%%%'):lower() | |
| 1236 end | |
| 1237 local count = GetNumAddOns() | |
| 1238 for i = 1, count do | |
| 1239 local name = GetAddOnInfo(i) | |
| 1240 local good = true | |
| 1241 for _,v in ipairs(arg) do | |
| 1242 if not name:lower():find(v) then | |
| 1243 good = false | |
| 1244 break | |
| 1245 end | |
| 1246 end | |
| 1247 if good then | |
| 1248 listNormalAddon(i) | |
| 1249 end | |
| 1250 end | |
| 1251 end | |
| 1252 } | |
| 1253 }, | |
| 1254 }, | |
| 1255 enable = { | |
| 1256 desc = "Enable addon(s).", | |
| 1257 name = "Enable", | |
| 1258 type = "text", | |
| 1259 usage = "<addon 1> <addon 2> ...", | |
| 1260 get = false, | |
| 1261 input = true, | |
| 1262 set = function(...) | |
| 1263 for i = 1, select("#", ...) do | |
| 1264 local addon = select(i, ...) | |
| 1265 local name, title, _, enabled, _, reason = GetAddOnInfo(addon) | |
| 1266 if reason == "MISSING" then | |
| 1267 print(("|cffffff7fAce2:|r AddOn %q does not exist."):format(addon)) | |
| 1268 elseif not enabled then | |
| 1269 EnableAddOn(addon) | |
| 1270 print(("|cffffff7fAce2:|r %s is now enabled."):format(addon or name)) | |
| 1271 else | |
| 1272 print(("|cffffff7fAce2:|r %s is already enabled."):format(addon or name)) | |
| 1273 end | |
| 1274 end | |
| 1275 end, | |
| 1276 }, | |
| 1277 disable = { | |
| 1278 desc = "Disable addon(s).", | |
| 1279 name = "Disable", | |
| 1280 type = "text", | |
| 1281 usage = "<addon 1> <addon 2> ...", | |
| 1282 get = false, | |
| 1283 input = true, | |
| 1284 set = function(...) | |
| 1285 for i = 1, select("#", ...) do | |
| 1286 local addon = select(i, ...) | |
| 1287 local name, title, _, enabled, _, reason = GetAddOnInfo(addon) | |
| 1288 if reason == "MISSING" then | |
| 1289 print(("|cffffff7fAce2:|r AddOn %q does not exist."):format(addon)) | |
| 1290 elseif enabled then | |
| 1291 DisableAddOn(addon) | |
| 1292 print(("|cffffff7fAce2:|r %s is now disabled."):format(addon or name)) | |
| 1293 else | |
| 1294 print(("|cffffff7fAce2:|r %s is already disabled."):format(addon or name)) | |
| 1295 end | |
| 1296 end | |
| 1297 end, | |
| 1298 }, | |
| 1299 load = { | |
| 1300 desc = "Load addon(s).", | |
| 1301 name = "Load", | |
| 1302 type = "text", | |
| 1303 usage = "<addon 1> <addon 2> ...", | |
| 1304 get = false, | |
| 1305 input = true, | |
| 1306 set = function(...) | |
| 1307 for i = 1, select("#", ...) do | |
| 1308 local addon = select(i, ...) | |
| 1309 local name, title, _, _, loadable, reason = GetAddOnInfo(addon) | |
| 1310 if reason == "MISSING" then | |
| 1311 print(("|cffffff7fAce2:|r AddOn %q does not exist."):format(addon)) | |
| 1312 elseif not loadable then | |
| 1313 print(("|cffffff7fAce2:|r AddOn %q is not loadable. Reason: %s."):format(addon, reason)) | |
| 1314 else | |
| 1315 LoadAddOn(addon) | |
| 1316 print(("|cffffff7fAce2:|r %s is now loaded."):format(addon or name)) | |
| 1317 end | |
| 1318 end | |
| 1319 end | |
| 1320 }, | |
| 1321 info = { | |
| 1322 desc = "Display information", | |
| 1323 name = "Information", | |
| 1324 type = "execute", | |
| 1325 func = function() | |
| 1326 local mem, threshold = gcinfo() | |
| 1327 print((" - |cffffff7fMemory usage [|r%.3f MiB|cffffff7f]|r"):format(mem / 1024)) | |
| 1328 if threshold then | |
| 1329 print((" - |cffffff7fThreshold [|r%.3f MiB|cffffff7f]|r"):format(threshold / 1024)) | |
| 1330 end | |
| 1331 print((" - |cffffff7fFramerate [|r%.0f fps|cffffff7f]|r"):format(GetFramerate())) | |
| 1332 local bandwidthIn, bandwidthOut, latency = GetNetStats() | |
| 1333 bandwidthIn, bandwidthOut = floor(bandwidthIn * 1024), floor(bandwidthOut * 1024) | |
| 1334 print((" - |cffffff7fLatency [|r%.0f ms|cffffff7f]|r"):format(latency)) | |
| 1335 print((" - |cffffff7fBandwidth in [|r%.0f B/s|cffffff7f]|r"):format(bandwidthIn)) | |
| 1336 print((" - |cffffff7fBandwidth out [|r%.0f B/s|cffffff7f]|r"):format(bandwidthOut)) | |
| 1337 print((" - |cffffff7fTotal addons [|r%d|cffffff7f]|r"):format(GetNumAddOns())) | |
| 1338 print((" - |cffffff7fAce2 addons [|r%d|cffffff7f]|r"):format(#self.addons)) | |
| 1339 local ace = 0 | |
| 1340 local enabled = 0 | |
| 1341 local disabled = 0 | |
| 1342 local lod = 0 | |
| 1343 for i = 1, GetNumAddOns() do | |
| 1344 local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) | |
| 1345 if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then | |
| 1346 ace = ace + 1 | |
| 1347 end | |
| 1348 if IsAddOnLoadOnDemand(i) then | |
| 1349 lod = lod + 1 | |
| 1350 end | |
| 1351 local isActive, loadable = select(4, GetAddOnInfo(i)) | |
| 1352 if not isActive or not loadable then | |
| 1353 disabled = disabled + 1 | |
| 1354 else | |
| 1355 enabled = enabled + 1 | |
| 1356 end | |
| 1357 end | |
| 1358 print((" - |cffffff7fAce 1.x addons [|r%d|cffffff7f]|r"):format(ace)) | |
| 1359 print((" - |cffffff7fLoadOnDemand addons [|r%d|cffffff7f]|r"):format(lod)) | |
| 1360 print((" - |cffffff7fenabled addons [|r%d|cffffff7f]|r"):format(enabled)) | |
| 1361 print((" - |cffffff7fdisabled addons [|r%d|cffffff7f]|r"):format(disabled)) | |
| 1362 local libs = 0 | |
| 1363 if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then | |
| 1364 for _ in pairs(AceLibrary.libs) do | |
| 1365 libs = libs + 1 | |
| 1366 end | |
| 1367 end | |
| 1368 print((" - |cffffff7fAceLibrary instances [|r%d|cffffff7f]|r"):format(libs)) | |
| 1369 end | |
| 1370 } | |
| 1371 } | |
| 1372 }) | |
| 1373 elseif major == "AceModuleCore-2.0" then | |
| 1374 AceModuleCore = instance | |
| 1375 end | |
| 1376 end | |
| 1377 | |
| 1378 local function activate(self, oldLib, oldDeactivate) | |
| 1379 AceAddon = self | |
| 1380 | |
| 1381 self.playerLoginFired = oldLib and oldLib.playerLoginFired or DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage | |
| 1382 self.addonsToOnEnable = oldLib and oldLib.addonsToOnEnable | |
| 1383 self.addons = oldLib and oldLib.addons or {} | |
| 1384 self.nextAddon = oldLib and oldLib.nextAddon or {} | |
| 1385 self.skipAddon = oldLib and oldLib.skipAddon or {} | |
| 1386 self.addonsStarted = oldLib and oldLib.addonsStarted or {} | |
| 1387 self.addonsEnabled = oldLib and oldLib.addonsEnabled or {} | |
| 1388 | |
| 1389 if oldDeactivate then | |
| 1390 oldDeactivate(oldLib) | |
| 1391 end | |
| 1392 end | |
| 1393 | |
| 1394 AceLibrary:Register(AceAddon, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) |
