WoWInterface SVN BrokerRaidSave

[/] [trunk/] [Broker_RaidSave/] [Broker_RaidSave.lua] - Rev 27

Compare with Previous | Blame | View Log

-- Broker_RaidSave: A simplified LibDataBroker "port" of FuBar_RaidSaveFu by Tristanian
-- based on the original code with permission of jokeyrhyme (jokeyrhyme@gmail.com)
-- all rights recognised
-- TW localization by launcelot

-- Zzzz, embeds & stuff, create DO etc...
local BRRaidSave = CreateFrame("Frame", "Broker_RaidSave")
local Abacus = LibStub("LibAbacus-3.0")
local tooltip = LibStub("LibQTip-1.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Broker_RaidSave", true)
BRRaidSave.obj = LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("Broker_RaidSave", {type = "data source", label = "Broker RaidSave", icon = "Interface\\Addons\\Broker_RaidSave\\icon.tga", text = L["(Updating...)"]})

-- events registration
BRRaidSave:RegisterEvent("ADDON_LOADED")
BRRaidSave:RegisterEvent("UPDATE_INSTANCE_INFO")
BRRaidSave:RegisterEvent("RAID_INSTANCE_WELCOME")
BRRaidSave:RegisterEvent("CHAT_MSG_SYSTEM")

BRRaidSave:SetScript("OnEvent", function(_, event, ...)
        BRRaidSave[event](BRRaidSave, ...)
end)

-- locals
local _G = getfenv(0)
local headings = {}
local tt = nil
local totaltime = 0
local returnarg = {}

-- Helper funcs
local function RemoveColorCode(label)
if not label then return end
local tmpstr, line, normalized = nil, nil, ""
line = string.gsub(label, "|r", "")
        while string.len(line) > 0 do
                local pos = string.find(line, "|cff", 1, true)
                        if pos then
                                tmpstr = string.sub(line,1,pos-1)
                                line = string.sub(line,pos + 10)
                        else
                                tmpstr = line
                                line = ""
                        end
                        normalized = normalized..tmpstr
        end
        normalized = string.gsub(normalized, "|", "")
        return normalized
end

local function hidett(self, elapsed)
        totaltime = totaltime + elapsed
        if totaltime > 0.2 then
                totaltime = 0
                if tt and not MouseIsOver(tt) then
                        tt:SetScript("OnEnter", nil)
                        tt:SetScript("OnLeave", nil)    
                        tooltip:Release(tt)
                        tt = nil
                        BRRaidSave:SetScript("OnUpdate", nil)
                elseif not tt then
                        BRRaidSave:SetScript("OnUpdate", nil)
                end
        end
end

local function ClickHandlerFunc(cell, arg1, button)
        -- Obligatory sanity checks
        if not arg1 or type(arg1)~= "table" then return end     
        if not arg1[1] or not arg1[2] or not arg1[3] or not arg1[4] or arg1[5] == nil then return end
        
        -- Handlers
        if button == "LeftButton" and not IsShiftKeyDown() then
                local iindex, instanceID, numofsaved = nil, nil, GetNumSavedInstances()
                for i = 1, numofsaved do
                        instanceID = select(2, GetSavedInstanceInfo(i))
                        if instanceID == arg1[3] then iindex = i break end
                end
                if iindex and arg1[5] == false then
                         SetSavedInstanceExtend(iindex, true)
                elseif iindex and arg1[5] == true then
                         SetSavedInstanceExtend(iindex, false)
                end
                RequestRaidInfo() -- trigger update
        elseif button == "LeftButton" and IsShiftKeyDown() then
                if ChatFrameEditBox:IsVisible() then
                        local reportlabel = L["Instance"]..": "..RemoveColorCode(arg1[1])..", "..L["Difficulty"]..": "..RemoveColorCode(arg1[2])..", "..L["ID"]..": "..RemoveColorCode(arg1[3])..", "..L["Expires"]..": "..RemoveColorCode(arg1[4])
                        ChatFrameEditBox:Insert(reportlabel)
                end
        end
end

-- Ace config table
local options = {
        name = "Broker RaidSave",
        type = "group",
        args = {
        confdesc = {
                        order = 1,
                        type = "description",
                        name = L["Minimalistic LDB plugin that allows tracking of raid IDs across characters."].."\n",
                        cmdHidden = true
                },
                 generalheader = {
                 order = 2,
                 type = "header",
                 name = L["General Options"],
                },
                nulloption = {
                        order = 3,
                        type = "description",
                        name = " ",
                        cmdHidden = true
                },              
                        textWhenZero = {
                                type = 'toggle', width = "full",
                                name = L["Show text for no saved instances"],
                                desc = L["Show the plugin text instead of number, when the character has no saved instances."],
                                order = 5,
                                get = function() return Broker_RaidSaveConfig.textwhenzero end,
                                set = function(_,v)     Broker_RaidSaveConfig.textwhenzero = v
                                        BRRaidSave:Update()
                                end,
                        },
                        shortText = {
                                type = 'toggle', width = "full",
                                name = L["Short text"],
                                desc = L["Only show the number of saved instances, in the format [Group]:[Raid]:[Expired]."],
                                order = 6,
                                get = function() return Broker_RaidSaveConfig.shorttext end,
                                set = function(_,v)     Broker_RaidSaveConfig.shorttext = v
                                        BRRaidSave:Update()
                                end,
                        },
                        hidehint = {
                                order = 7, type = "toggle", width = "full",
                                name = L["Hide hint text"],
                                desc = L["Hides the tooltip information/hint text."],
                                get = function() return Broker_RaidSaveConfig.HideHint end,
                                set = function(_,v) Broker_RaidSaveConfig.HideHint = v
                                end,
                        },
                        sortinstancesbyname = {
                                type = 'toggle',
                                name = L["Sort by name"],
                                desc = L["Sorts the instances on the tooltip, using the name of the instance as a reference."],
                                order = 8,
                                get = function() return Broker_RaidSaveConfig.sortbyinstancename end,
                                set = function(_,v)
                                Broker_RaidSaveConfig.sortbyinstancediff = false
                                Broker_RaidSaveConfig.sortbyinstancename = v
                                end,
                        },
                        instancesnameorder = {
                        order = 9, type = "select",
                        name = L["List Ordering"],
                        desc = L["Order style for the saved instances list."],
                        get = function() return Broker_RaidSaveConfig.instancenameorder end,
                        set = function(_,v) Broker_RaidSaveConfig.instancenameorder = v end,
                        values = {
                                ["asc"] = L["Ascending"],
                                ["desc"] = L["Descending"]
                                },
                        },
                        sortinstancesbydifficulty = {
                                type = 'toggle',
                                name = L["Sort by difficulty"],
                                desc = L["Sorts the instances on the tooltip, using the instance difficulty as a reference."],
                                order = 10,
                                get = function() return Broker_RaidSaveConfig.sortbyinstancediff end,
                                set = function(_,v)
                                Broker_RaidSaveConfig.sortbyinstancename = false
                                Broker_RaidSaveConfig.sortbyinstancediff = v
                                end,
                                disabled = function() return not Broker_RaidSaveConfig.showdiff end,
                        },
                        instancesdifforder = {
                        order = 11, type = "select",
                        name = L["List Ordering"],
                        desc = L["Order style for the saved instances list."],
                        get = function() return Broker_RaidSaveConfig.instancedifforder end,
                        set = function(_,v) Broker_RaidSaveConfig.instancedifforder = v end,
                        values = {
                                ["asc"] = L["Ascending"],
                                ["desc"] = L["Descending"]
                                },
                        },
                        showslider = {
                                order = 12, type = "toggle",
                                name = L["Enable scrolling"],
                                desc = L["Activates and displays a scrolling slider bar, for the tooltip."],
                                get = function() return Broker_RaidSaveConfig.ShowSlider end,
                                set = function(_,v) Broker_RaidSaveConfig.ShowSlider = v
                                end,
                        },
                        slidermaxheight = {
                                order = 13, type = "range",
                                name = L["Tooltip Maximum Height"],
                                desc = L["Sets the tooltip maximum height, after which it will be scrollable."],
                                min = 100, max = 2000, step = 5,
                                get = function() return Broker_RaidSaveConfig.SliderMaxHeight end,
                                set = function(_,v) 
                                if v < 100 then v = 100 end
                                if v > 2000 then v = 2000 end
                                Broker_RaidSaveConfig.SliderMaxHeight = v end,
                                disabled = function() return not Broker_RaidSaveConfig.ShowSlider end,
                        },
                        nulloption2 = {
                        order = 14,
                        type = "description",
                        name = " ",
                        cmdHidden = true
                        },
                        instanceheader = {
                        order = 15,
                        type = "header",
                        name = L["Instance Information"],
                        },
                        nulloption3 = {
                        order = 16,
                        type = "description",
                        name = " ",
                        cmdHidden = true
                        },
                        showID = {
                                type = 'toggle', width = "full",
                                name = L["Show instance IDs"],
                                desc = L["Show or hide the numeric instance IDs."],
                                order = 17,
                                get = function() return Broker_RaidSaveConfig.showid end,
                                set = function(_,v)     Broker_RaidSaveConfig.showid = v                                        
                                end,
                        },                      
                        showDiff = {
                                type = 'toggle', width = "full",
                                name = L["Show instance difficulty mode"],
                                desc = L["Adds a new column, indicating the dungeon or raid difficulty for the specific instance name and ID."],
                                order = 18,
                                get = function() return Broker_RaidSaveConfig.showdiff end,
                                set = function(_,v)     Broker_RaidSaveConfig.showdiff = v
                                if not Broker_RaidSaveConfig.showdiff and Broker_RaidSaveConfig.sortbyinstancediff then -- if not showing difficulty and we are sorting by it, sort by instance name instead
                                        Broker_RaidSaveConfig.sortbyinstancediff = false
                                        Broker_RaidSaveConfig.sortbyinstancename = true
                                end
                                end,
                        },                      
                        showCooldown = {
                                type = 'toggle',
                                name = L["Show time remaining"],
                                desc = L["Display the time the instance ID is still valid."],
                                order = 19,
                                get = function() return Broker_RaidSaveConfig.showcooldown end,
                                set = function(_,v)     Broker_RaidSaveConfig.showcooldown = v
                                end,
                        },
                        formatCooldown = {
                        order = 20, type = "select",
                        name = L["Remaining time format"],
                        desc = L["Display style for the time until reset."],
                        get = function() return Broker_RaidSaveConfig.formatcooldown end,
                        set = function(_,v) Broker_RaidSaveConfig.formatcooldown = v end,
                        values = {
                                ["Extended"] = L["Extended"],
                                ["Full"] = L["Full"],
                                ["Short"] = L["Short"],
                                ["Condensed"] = L["Condensed"]
                                },
                        },
                        nulloption4 = {
                        order = 21,
                        type = "description",
                        name = " ",
                        cmdHidden = true
                        },
                        instanceExpirationheader = {
                        order = 22,
                        type = "header",
                        name = L["Instance Expiration"],
                        },
                        nulloption5 = {
                        order = 23,
                        type = "description",
                        name = " ",
                        cmdHidden = true
                        },
                        showReset = {
                        type = 'toggle', width = "full",
                        name = L["Show instance expiration data"],
                        desc = L["Display the date/time the instance ID expires."],
                        order = 24,
                        get = function() return Broker_RaidSaveConfig.showreset end,
                        set = function(_,v)     Broker_RaidSaveConfig.showreset = v                             
                        end,
                        },
                        formatDayW = {
                        type = 'toggle', width = "full",
                        name = L["Show day in week"],
                        desc = L["Display the name of the day of the week, for the instance expiration string."],
                        order = 25,
                        get = function() return Broker_RaidSaveConfig.formatdayw end,
                        set = function(_,v)     Broker_RaidSaveConfig.formatdayw = v                            
                        end,
                        },
                        hideExpiredbutton = {
                        type = 'toggle', width = "full",
                        name = L["Hide expired instances from plugin text"],
                        desc = L["Don't display instances with expired ID's on the plugin text."],
                        order = 26,
                        get = function() return Broker_RaidSaveConfig.hideexpiredbutton end,
                        set = function(_,v)     Broker_RaidSaveConfig.hideexpiredbutton = v
                        BRRaidSave:Update()
                        end,
                        },
                        hideExpiredTip = {
                        type = 'toggle', width = "full",
                        name = L["Hide expired instances from tooltip"],
                        desc = L["Don't display instances with expired ID's on the tooltip."],
                        order = 27,
                        get = function() return Broker_RaidSaveConfig.hideexpiredtip end,
                        set = function(_,v)     Broker_RaidSaveConfig.hideexpiredtip = v
                        end,
                        },
                        formatDate = {
                        order = 28, type = "select",
                        name = L["Expiry date format"],
                        desc = L["Display style for the date instance IDs expire."],
                        get = function() return Broker_RaidSaveConfig.formatdate end,
                        set = function(_,v) Broker_RaidSaveConfig.formatdate = v end,
                        values = {
                                ["Chinese"] = L["Chinese"],
                                ["European"] = L["European"],
                                ["USAmerican"] = L["US/American"]
                                },
                        },
                        formatTime = {
                        order = 29, type = "select",
                        name = L["Expiry time format"],
                        desc = L["Display style for the time instance IDs expire."],
                        get = function() return Broker_RaidSaveConfig.formattime end,
                        set = function(_,v) Broker_RaidSaveConfig.formattime = v end,
                        values = {
                                ["Show12"] = L["12-Hour"],
                                ["Show24"] = L["24-Hour"]
                                },
                        },                      
        }
}

-- Add config to Blizzard menu
LibStub("AceConfig-3.0"):RegisterOptionsTable("Broker RaidSave", options)
LibStub("AceConfigDialog-3.0"):AddToBlizOptions("Broker RaidSave")

function BRRaidSave:ADDON_LOADED(addon)
        if addon == "Broker_RaidSave" then      
                if not Broker_RaidSaveConfig then
        -- initialize default configuration
        Broker_RaidSaveConfig = {
        realm = {},    
        textwhenzero = false,
                        shorttext = false,
                        showid = true,
                        showdiff = true,
                        showcooldown = true,
                        formatcooldown = "Full",
                        showreset = true,
                        formatdate = "USAmerican",
                        formattime = "Show24",
                        formatdayw = false,
                        sortbyinstancename = true,
                        sortbyinstancediff = false,
                        instancenameorder = "desc",
                        instancedifforder = "desc",
                        hideexpiredtip = false,
                        hideexpiredbutton = false,
                        SliderMaxHeight = 600,
                        ShowSlider = true,
                        HideHint = false
        }
        end
        -- added config options for v2.0
        if not Broker_RaidSaveConfig.HideHint then Broker_RaidSaveConfig.HideHint = false end
        if not Broker_RaidSaveConfig.ShowSlider then Broker_RaidSaveConfig.ShowSlider = false end
        if not Broker_RaidSaveConfig.SliderMaxHeight then Broker_RaidSaveConfig.SliderMaxHeight = 600 end
        -- added config options for v1.7-v1.8
        if not Broker_RaidSaveConfig.hideexpiredtip then Broker_RaidSaveConfig.hideexpiredtip = false end
        if not Broker_RaidSaveConfig.hideexpiredbutton then Broker_RaidSaveConfig.hideexpiredbutton = false end
        -- added config options for v1.4
        if not Broker_RaidSaveConfig.sortbyinstancename then Broker_RaidSaveConfig.sortbyinstancename = false end
        if not Broker_RaidSaveConfig.sortbyinstancediff then Broker_RaidSaveConfig.sortbyinstancediff = false end
        if not Broker_RaidSaveConfig.instancenameorder then Broker_RaidSaveConfig.instancenameorder = "desc" end
        if not Broker_RaidSaveConfig.instancedifforder then Broker_RaidSaveConfig.instancedifforder = "desc" end
                -- added config options for v1.2
                if not Broker_RaidSaveConfig.showdiff then Broker_RaidSaveConfig.showdiff = false end
                -- additional initialization
                if not Broker_RaidSaveConfig.realm[GetRealmName()] then
                        Broker_RaidSaveConfig.realm[GetRealmName()] = { }
                end
                if not Broker_RaidSaveConfig.realm[GetRealmName()].char then
                        Broker_RaidSaveConfig.realm[GetRealmName()].char = { }
                end
                if not Broker_RaidSaveConfig.realm[GetRealmName()].name then
                        Broker_RaidSaveConfig.realm[GetRealmName()].name = GetRealmName()
                end
                if not Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")] then
                        Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")] = { }
                end
                local player = Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")]
                        if not player.numsaved then
                                player.numsaved = 0
                        end
                        if not player.instance then
                                player.instance = { }
                        end
                player.name = GetUnitName("player")
                player.class = strupper(select(2,UnitClass("player")))
                --workaround for DK class name to properly match global string entry for raid class colors
                player.class = string.gsub(player.class, " ", "")
        self:UnregisterEvent("ADDON_LOADED")
  self.ADDON_LOADED = nil
        end             
end

function BRRaidSave:Update()
        local player = Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")]
        local instancenum
        if Broker_RaidSaveConfig.hideexpiredbutton then instancenum = player.numactive else instancenum = player.numsaved end
        if instancenum == 0 and Broker_RaidSaveConfig.textwhenzero then self.obj.text = L["No Instances"] return end
        
        local labelgroup = _G["NORMAL_FONT_COLOR_CODE"].._G["GROUP"]..": ".."|r".."|cff68ccef"..string.format("%d", player.numgroup).."|r"
        local labelraid = _G["NORMAL_FONT_COLOR_CODE"].."  ".._G["RAID"]..": ".."|r".._G["GREEN_FONT_COLOR_CODE"]..string.format("%d", player.numraid).."|r"
        local labelexpired = _G["NORMAL_FONT_COLOR_CODE"].."  "..L["Expired: "].."|r".._G["RED_FONT_COLOR_CODE"]..string.format("%d", player.numsaved - player.numactive).."|r"
        
        if Broker_RaidSaveConfig.shorttext then
                if Broker_RaidSaveConfig.hideexpiredbutton then
                        self.obj.text = "|cff68ccef"..string.format("%d", player.numgroup).."|r".." : ".._G["GREEN_FONT_COLOR_CODE"]..string.format("%d", player.numraid).."|r"
                else
                        self.obj.text = "|cff68ccef"..string.format("%d", player.numgroup).."|r".." : ".._G["GREEN_FONT_COLOR_CODE"]..string.format("%d", player.numraid).."|r".." : ".._G["RED_FONT_COLOR_CODE"]..string.format("%d", player.numsaved - player.numactive).."|r"
                end
        else
                if Broker_RaidSaveConfig.hideexpiredbutton then labelexpired = "" end
                self.obj.text = labelgroup..labelraid..labelexpired
        end
end


function BRRaidSave.obj.OnEnter(self)
        local colnum = 1        
        local orientation = {}
        headings = {}
        headings[colnum] = _G["LIGHTYELLOW_FONT_COLOR_CODE"]..L["Instance"].."|r  "
        orientation[colnum] = "LEFT"
        if Broker_RaidSaveConfig.showdiff then
                colnum = colnum + 1
                headings[colnum] = _G["LIGHTYELLOW_FONT_COLOR_CODE"]..L["Difficulty"].."|r "
                orientation[colnum] = "CENTER"
        end
        if Broker_RaidSaveConfig.showid then                            
                colnum = colnum + 1
                headings[colnum] = _G["LIGHTYELLOW_FONT_COLOR_CODE"]..L["ID"].."|r  "
                orientation[colnum] = "CENTER"
        end
        if Broker_RaidSaveConfig.showcooldown then                      
                        colnum = colnum + 1
                        headings[colnum] = _G["LIGHTYELLOW_FONT_COLOR_CODE"]..L["Remaining"].."|r  "
                        orientation[colnum] = "CENTER"
        end
        if Broker_RaidSaveConfig.showreset then         
                colnum = colnum + 1
                headings[colnum] = _G["LIGHTYELLOW_FONT_COLOR_CODE"]..L["Expires"].."|r"                
                orientation[colnum] = "CENTER"
        end
        
        local maxentries = #orientation
        
  -- acquire frame
        tt = tooltip:Acquire("Broker_RaidSave", colnum, unpack(orientation, 1, maxentries))
        tt:EnableMouse(true)
        tt:SetScript("OnEnter", function(self) BRRaidSave:SetScript("OnUpdate", nil) end)
        tt:SetScript("OnLeave", function(self) BRRaidSave:SetScript("OnUpdate", hidett) end)
        tt:SmartAnchorTo(self)  
        tt:Clear()
        tt:SetScale(1)
        tt:SetBackdropBorderColor(1, 1, 1, 1)
        BRRaidSave:Drawtooltip()
        tt:Show()
end     
        
function BRRaidSave:Drawtooltip()
local player = Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")]
local savedinstances, templine

        local colcount = tt:GetColumnCount()    
        tt:AddLine("")
        tt:SetCell(1, 1, _G["HIGHLIGHT_FONT_COLOR_CODE"].."Broker RaidSave", nil, "CENTER", colcount)
        
        local k, v      
        for k, v in pairs(Broker_RaidSaveConfig.realm[GetRealmName()].char) do          
                if v.numsaved > 0 then
                        local displaytable = {}
                        for i = 1, v.numsaved do                                
                                if Broker_RaidSaveConfig.hideexpiredtip and (v.instance[i].expires == 0 or v.instance[i].expires < time()) then
                                else
                                        local colnum = 1
                                        local display = {}
                                        -- set namestring
                                        local namestring = ""
                                        if v.instance[i].extended then
                                                namestring = "|cff0090ff"..v.instance[i].name.."|r"
                                        else
                                                namestring = _G["NORMAL_FONT_COLOR_CODE"]..v.instance[i].name.."|r"
                                        end
                                        -- set idstring
                                        local idstring = "|cff2ce390".."["..v.instance[i].id.."]".."|r"
                                        -- set cooldown string
                                        local cooldownstring = ""
                                        if Broker_RaidSaveConfig.formatcooldown == "Extended" then
                                                cooldownstring = Abacus:FormatDurationExtended(v.instance[i].expires - time())
                                        elseif Broker_RaidSaveConfig.formatcooldown == "Condensed" then
                                                cooldownstring = Abacus:FormatDurationCondensed(v.instance[i].expires - time())
                                        elseif Broker_RaidSaveConfig.formatcooldown == "Short" then
                                                cooldownstring = Abacus:FormatDurationShort(v.instance[i].expires - time())
                                        else -- Full style
                                                cooldownstring = SecondsToTime(v.instance[i].expires - time())
                                        end                                     
                                        if v.instance[i].expires - time() <= 86400 then --less than a day
                                                cooldownstring = _G["RED_FONT_COLOR_CODE"]..cooldownstring.."|r"
                                        else -- more than a day
                                                cooldownstring = _G["GREEN_FONT_COLOR_CODE"]..cooldownstring.."|r"
                                        end
                                        -- set expire string
                                        local expirestring = BRRaidSave:FormatDate(v.instance[i].expires)
                                        expirestring = _G["NORMAL_FONT_COLOR_CODE"]..expirestring.." "..BRRaidSave:FormatTime(v.instance[i].expires).."|r"
                                        -- set difficulty string
                                        local instancediffstring = ""
                                        if v.instance[i].israid ~= nil then
                                                instancediffstring = BRRaidSave:GetDungeonDifficultyText(v.instance[i].difficulty, v.instance[i].israid)
                                        else
                                                instancediffstring = "|cffa0933d".._G["UNKNOWN"].."|r"
                                        end
                                        -- Desaturate label colors for expired instances
                                        if v.instance[i].expires == 0 or v.instance[i].expires < time() then
                                                namestring = _G["GRAY_FONT_COLOR_CODE"]..v.instance[i].name.."|r"
                                                idstring = _G["GRAY_FONT_COLOR_CODE"].."["..v.instance[i].id.."]".."|r"
                                                expirestring = _G["GRAY_FONT_COLOR_CODE"]..L["Expired"].."|r"
                                                cooldownstring = _G["GRAY_FONT_COLOR_CODE"]..L["Expired"].."|r"
                                                instancediffstring = _G["GRAY_FONT_COLOR_CODE"]..RemoveColorCode(instancediffstring).."|r"
                                        end
                                        -- set the columns
                                        display[1] = namestring.."  "
                                        if Broker_RaidSaveConfig.showdiff then
                                                colnum = colnum + 1
                                                display[colnum] = instancediffstring.." "
                                        end                                     
                                        if Broker_RaidSaveConfig.showid then
                                                colnum = colnum + 1
                                                display[colnum] = idstring.."  "
                                        end
                                        if Broker_RaidSaveConfig.showcooldown then                                                      
                                                        colnum = colnum + 1
                                                        display[colnum] = cooldownstring.."  "
                                        end
                                        if Broker_RaidSaveConfig.showreset then                                                 
                                                        colnum = colnum + 1
                                                        display[colnum] = expirestring
                                        end
                                        -- construct return table for currently logged on character only and insert it, into the display table
                                        -- Structure: returnarg = { <Instance Name>, <Diff>, <ID>, <Reset>, <Extended>}
                                  -- Instance Name : color coded string
                                  -- Diff : color coded string
                                  -- ID : string
                                  -- Reset : color coded string
                                  -- Extended : boolean
                                        if v.name == player.name then
                                                returnarg = {} -- reusable table
                                                returnarg[1] = namestring
                                                returnarg[2] = instancediffstring
                                                returnarg[3] = v.instance[i].id
                                                returnarg[4] = expirestring
                                                returnarg[5] = v.instance[i].extended
                                                display[colnum + 1] = returnarg
                                        end
                                        table.insert(displaytable, display)                                     
                                end
                        end
                        
                        if #displaytable > 0 then
                                
                                -- handle sorting
                                if Broker_RaidSaveConfig.sortbyinstancename then
                                        if Broker_RaidSaveConfig.instancenameorder == "desc" then
                                                table.sort(displaytable, function(a,b) return string.lower (RemoveColorCode(a[1])) < string.lower(RemoveColorCode(b[1])) end)
                                        else
                                                table.sort(displaytable, function(a,b) return string.lower (RemoveColorCode(a[1])) > string.lower(RemoveColorCode(b[1])) end)
                                        end
                                elseif Broker_RaidSaveConfig.sortbyinstancediff and Broker_RaidSaveConfig.showdiff then
                                        if Broker_RaidSaveConfig.instancedifforder == "desc" then
                                                table.sort(displaytable, function(a,b) return string.lower(RemoveColorCode(a[2])) < string.lower(RemoveColorCode(b[2])) end)
                                        else
                                                table.sort(displaytable, function(a,b) return string.lower(RemoveColorCode(a[2])) > string.lower(RemoveColorCode(b[2])) end)
                                        end
                                end
                                
                                                savedinstances = true
                                          tt:AddLine(" ")
                                        if v.name == player.name then
                                                tt:AddLine(BRRaidSave:ClassColorise(v.class, v.name).." "..L["(Current)"])
                                        else                                            
                                                tt:AddLine(BRRaidSave:ClassColorise(v.class, v.name))
                                        end                                                                             
                                        tt:AddLine(unpack(headings,1,colcount))
                                                                                
                                        for i = 1, #displaytable do                                             
                                                templine = tt:AddLine(unpack(displaytable[i],1,colcount))
                                                -- safeguard
                                                if displaytable[i][colcount + 1] then
                                                        tt:SetCellScript(templine, 1, "OnMouseDown", ClickHandlerFunc , displaytable[i][colcount + 1])
                                                end
                                        end                     
                        end
                end
        end
        
        -- check to display something if no savedinstances exist at all
        if not savedinstances then
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, _G["NORMAL_FONT_COLOR_CODE"]..L["No saved instances found."].."|r", nil, "CENTER", colcount)
        end
        
        -- Tooltip Hint
        if not Broker_RaidSaveConfig.HideHint then
                tt:AddLine(" ")
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, L["|cffeda55fLeft Click|r |cff19ff19on plugin to toggle Blizzard's Raid Information frame."], nil, "LEFT", colcount)
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, L["|cffeda55fLeft Click|r |cff19ff19on instance name to toggle ID extension."], nil, "LEFT", colcount)
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, L["|cffeda55fRight Click|r |cff19ff19on plugin to open Configuration Menu."], nil, "LEFT", colcount)
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, L["|cffeda55fShift+Left Click|r |cff19ff19to paste instance info into chat."], nil, "LEFT", colcount)
                templine = tt:AddLine("")
                tt:SetCell(templine, 1, L["|cff0090ffBlue|r |cff19ff19colored instance names, indicate|r |cff0090ffextended|r |cff19ff19IDs.|r"], nil, "LEFT", colcount)
        end
        
        if Broker_RaidSaveConfig.ShowSlider then
                tt:UpdateScrolling(Broker_RaidSaveConfig.SliderMaxHeight)       
        end
        
end

function BRRaidSave.obj.OnLeave()
        if tt and tt:IsVisible() then
                BRRaidSave:SetScript("OnUpdate", hidett)
        end
end


function BRRaidSave.obj.OnClick(self, button)
        if tt then
                tt:SetScript("OnEnter", nil)
                tt:SetScript("OnLeave", nil)
                tooltip:Release(tt)
                tt = nil
        end
        if button == "RightButton" then
                        InterfaceOptionsFrame_OpenToCategory("Broker RaidSave")
        elseif button == "LeftButton" then
                if RaidInfoFrame:IsVisible() then
                        if FriendsFrame:IsVisible() then ToggleFriendsFrame(5) end
                        RaidInfoFrame:Hide() -- this is really only needed if some addon has modified the Parent of RaidInfoFrame
                else
                        if not FriendsFrame:IsVisible() or FriendsFrame.selectedTab ~= 5 then ToggleFriendsFrame(5) end
                        RaidInfoFrame:Show()
                end
        end
end

function BRRaidSave:GetDungeonDifficultyText(setting, isRaid, withpar)
        local par1, par2 = "", ""
        if withpar then par1, par2 = "(", ")" end
        local diffstr = "|cffffff9a"..par1.._G["UNKNOWN"]..par2.."|r"
        if not setting then return diffstr end
        if isRaid then
        -- raids
        if not _G["RAID_DIFFICULTY"..tostring(setting)] then return diffstr end
        -- remove () chars from difficulty
        local tmpstr = string.gsub(_G["RAID_DIFFICULTY"..tostring(setting)], "%(", "")
        tmpstr = string.gsub(tmpstr, "%)", "")
                if setting == 3 or setting == 4 then
                        diffstr = _G["RED_FONT_COLOR_CODE"]..par1..tmpstr..par2.."|r"
                else
                        diffstr = _G["GREEN_FONT_COLOR_CODE"]..par1..tmpstr..par2.."|r"
                end
        else
        -- dungeons
        if not _G["DUNGEON_DIFFICULTY"..tostring(setting)] then return diffstr end
        -- remove () chars from difficulty
        local tmpstr = string.gsub(_G["DUNGEON_DIFFICULTY"..tostring(setting)], "%(", "")
        tmpstr = string.gsub(tmpstr, "%)", "")
                if setting == 2 or setting > 2 then
                        diffstr = _G["RED_FONT_COLOR_CODE"]..par1..tmpstr..par2.."|r"
                else
                        diffstr = _G["GREEN_FONT_COLOR_CODE"]..par1..tmpstr..par2.."|r"
                end
        end
        return diffstr
end

function BRRaidSave:Refresh()   
        local player = Broker_RaidSaveConfig.realm[GetRealmName()].char[GetUnitName("player")]
        player.numsaved = GetNumSavedInstances()
        player.numactive, player.numgroup, player.numraid = 0, 0, 0
        player.instance = {}
        if player.numsaved == 0 then
        else
                local iname, iid, iexpires, idiff, ilocked, iextended, iidmostsig, iisraid, temp
                for i = 1, player.numsaved do
                        iname, iid, iexpires, idiff, ilocked, iextended, iidmostsig, iisraid = GetSavedInstanceInfo(i)
                        if iexpires > 0 then
                                iexpires = iexpires + time()
                                player.numactive = player.numactive + 1
                                if iisraid == true then
                                        player.numraid = player.numraid + 1
                                elseif iisraid == false then
                                        player.numgroup = player.numgroup + 1
                                end
                        end
                        -- insert data into table
                        temp = { name = iname, id = iid, idMostSig = iidmostsig, expires = iexpires, difficulty = idiff, locked = ilocked, extended = iextended, israid = iisraid }
                        table.insert(player.instance, temp)
                end
        end
        self:Update()
        if tt and tt:IsVisible() then -- update tooltip if it exists and is visible
                tt:Clear()
                BRRaidSave:Drawtooltip()
        end
end

function BRRaidSave:GetDaysInMonth(year, month)
        local function is_leap_year(year)
                return year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0)
        end
        return month == 2 and is_leap_year(year) and 29 or ("\31\28\31\30\31\30\31\31\30\31\30\31"):byte(month)
end

function BRRaidSave:ClassColorise(class, targetstring)
        local colortable = _G["CUSTOM_CLASS_COLORS"] or _G["RAID_CLASS_COLORS"]
        local r = string.format("%x", math.floor(colortable[class].r * 255))
        if strlen(r) == 1 then
                r = "0"..r
        end
        local g = string.format("%x", math.floor(colortable[class].g * 255))
        if strlen(g) == 1 then
                g = "0"..g
        end
        local b = string.format("%x", math.floor(colortable[class].b * 255))
        if strlen(b) == 1 then
                b = "0"..b
        end
        return "|cff"..r..g..b..targetstring.."|r"
end

function BRRaidSave:FormatDate(seconds)
if not seconds then return end
        local datestring = ""
        local daym = date("%d", seconds).."/"
        local month = date("%m", seconds).."/"
        local year = date("%Y", seconds).."/"
        
        if Broker_RaidSaveConfig.formatdayw then
                datestring = date("%a", seconds).." "
        end
        
        if Broker_RaidSaveConfig.formatdate == "USAmerican" then
                datestring = datestring..month..daym..year
        elseif Broker_RaidSaveConfig.formatdate == "European" then
                datestring = datestring..daym..month..year
        else -- Chinese
                datestring = datestring..year..month..daym
        end
        return strsub(datestring, 1, strlen(datestring) - 1)
end

function BRRaidSave:FormatTime(seconds)
if not seconds then return end
        local timestring = ""
        if Broker_RaidSaveConfig.formattime == "Show12" then
                timestring = date("%I", seconds)..":"..date("%M", seconds).." "..date("%p", seconds)
        elseif Broker_RaidSaveConfig.formattime == "Show24" then
                timestring = date("%H", seconds)..":"..date("%M", seconds)
        end
        return timestring
end

function BRRaidSave:UPDATE_INSTANCE_INFO()
  self:Refresh()
end

function BRRaidSave:RAID_INSTANCE_WELCOME()
        RequestRaidInfo()
end

function BRRaidSave:CHAT_MSG_SYSTEM(msg)
        if tostring(msg) == _G["INSTANCE_SAVED"] then
                RequestRaidInfo()
        end
end

Compare with Previous | Blame