vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Functions to implement slash commands for FlexBar
        Last Modified
                12/26/2004      Initial version
                08/12/2005  Added FlexBarButton_UpdateLocation and FlexBarButton_DragStart              - Sherkhan
                08/12/2005  Added Text3 Field   - Sherkhan
                08/24/2005  Adjusted FlexBarButton_OnClick() to "properly" handle pet autocast (ticket #13) - Ratbert_CP
--]]

FlexBarVersion = 1.5


-- Utility object
        local util = Utility_Class:New()

-- OnFoo functions

function FlexBar_OnLoad()
        -- Set up slash commands
        FB_Command_AddCommands(FBcmd)
        -- Register for events
        FlexBar:RegisterEvent("VARIABLES_LOADED");
        FlexBar:RegisterEvent("PLAYER_ENTERING_WORLD");
        FlexBar:RegisterEvent("PLAYER_ENTER_COMBAT");
        FlexBar:RegisterEvent("PLAYER_LEAVE_COMBAT");
        FlexBar:RegisterEvent("PLAYER_REGEN_ENABLED");
        FlexBar:RegisterEvent("PLAYER_REGEN_DISABLED");
        FlexBar:RegisterEvent("CHAT_MSG_COMBAT_SELF_MISSES");
        FlexBar:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE"); 
        FlexBar:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES");
        FlexBar:RegisterEvent("UNIT_HEALTH")
        FlexBar:RegisterEvent("UNIT_MANA")
        FlexBar:RegisterEvent("UNIT_RAGE")
        FlexBar:RegisterEvent("UNIT_ENERGY")
        FlexBar:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
        -- FlexBar:RegisterEvent("SPELLS_CHANGED")
        FlexBar:RegisterEvent("PLAYER_COMBO_POINTS")
        FlexBar:RegisterEvent("PLAYER_GAINED_CONTROL")
        FlexBar:RegisterEvent("PLAYER_LOST_CONTROL")
        FlexBar:RegisterEvent("BAG_UPDATE")
        FlexBar:RegisterEvent("UNIT_INVENTORY_CHANGED")
        FlexBar:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
        FlexBar:RegisterEvent("UPDATE_INVENTORY_ALERTS")
        FlexBar:RegisterEvent("MERCHANT_UPDATE")
        FlexBar:RegisterEvent("MERCHANT_CLOSED")
        FlexBar:RegisterEvent("UNIT_AURA")
        FlexBar:RegisterEvent("UNIT_COMBAT")
        FlexBar:RegisterEvent("PLAYER_TARGET_CHANGED")
        FlexBar:RegisterEvent("UNIT_PET")
        FlexBar:RegisterEvent("UNIT_FLAGS");
        FlexBar:RegisterEvent("PET_BAR_UPDATE");
        FlexBar:RegisterEvent("PET_BAR_UPDATE_COOLDOWN");
        FlexBar:RegisterEvent("PARTY_MEMBERS_CHANGED");
        FlexBar:RegisterEvent("PLAYER_AURAS_CHANGED");
        
end

function FlexBar_OnEvent(event)
-- Dispatch to standard event handlers
        local dispatch = FBEventHandlers[event]
        if dispatch then
                dispatch(event)
        end
-- Dispatch to extended event handlers
        local handlers = FBExtHandlers[string.upper(event)]
        if handlers then
                local index, dispatch
                for index, dispatch in pairs(handlers) do
                        dispatch(event)
                end
        end
end

function Flexbar_OnUpdate(elapsed)
-- Update any timers we have running.
        local name, timer
        for name, timer in pairs(FBTimers) do
                timer:Update(elapsed)
        end
        if not FBProfileLoaded then return end
        --local msg = ("Actual = %d,%d\nState = %d,%d\nSaved = %d,%d")
        --msg = format(msg,FlexFrame41:GetRight(),FlexFrame41:GetBottom(),FBState[41]["xcoord"],FBState[41]["ycoord"],FBSavedProfile[FBProfileName][41].State["xcoord"],FBSavedProfile[FBProfileName][41].State["ycoord"])
        FBLoadProfileDialogTitle:SetText("")
        FBLoadProfileDialogText:SetText("")
end

function FlexBarFrame_OnLoad(frame)
        -- Went nuts trying to figure out why I couldn't get clicks and drags
        -- in my handle frames - I didn't do this 
        frame:RegisterForDrag("LeftButton");
end

function FlexBarFrame_UpdateLocation(frame)
        -- The button frame has recieved a drag stop, or a moveABS/moveREL command has finished
        -- Get the current button co-ordinates and store them
        -- 1) Determine if this is a single button, or a group
        -- 2) If single, apply settings for the single button
        --    If group, apply settings for the button group - new coords for all buttons in the group
        local buttonnum=FB_GetButtonNum(frame)

        if (frame.moving) then
                frame.moving = nil;
                frame:StopMovingOrSizing();
                if (FBState[buttonnum]["group"]) and (FBState[buttonnum]["group"] == buttonnum) then
                        -- We have a group anchor that moved, save coordinate data for anchor, and set new
                        -- locations for non-anchor buttons in memory based upon the stored offset data
                        if(FB_DebugFlag == 1) then
                                FB_ReportToUser("<< Frame_UpdateLocation: Group #"..buttonnum.." Update >>"); 
                        end
                        
                        FB_GetCoords(buttonnum)
                        FB_RestoreGroupOffsetAfterMove(buttonnum)
                else
                        -- Single button moved, save coordinate data for just the button
                        if(FB_DebugFlag == 1) then
                                FB_ReportToUser("<< Frame_UpdateLocation: Button #"..buttonnum.." Update >>"); 
                        end
                        
                        FB_GetCoords(buttonnum)
                end
        end
        
end

function FlexBarFrame_DragStart(frame)
        local buttonnum=FB_GetButtonNum(frame)

        if (FBState[buttonnum]["group"]) and (FBState[buttonnum]["group"] == buttonnum) then
                -- Group move starting, store group button offsets prior to the move
                FB_StoreGroupOffsetForMove(buttonnum)
        end

        -- Set frame to Moving
        frame.moving = true;
        frame:StartMoving();
        
        if(FB_DebugFlag == 1) then
                FB_ReportToUser("<< Button_DragStart: Dragging button "..FB_GetButtonNum(frame).." >>"); 
        end
end

function FlexBarButtonDown(buttonnum)
-- Modified Blizzard code (removed bonus action check)
-- appears to simply change the look of the button to reflect that 
-- it is pushed.

-- originally coded to use the button ID - but why when this is only called from bindings?
        local button = getglobal("FlexBarButton".. buttonnum);
        if ( button:GetButtonState() == "NORMAL" ) then
                button:SetButtonState("PUSHED");
        end
end

function FlexBarButtonUp(buttonnum)
-- Modified Blizzard code (removed bonus action check)
-- besides the appearance change, not sure what they are doing here.
-- same as above
        local button = getglobal("FlexBarButton".. buttonnum);
        if ( button:GetButtonState() == "PUSHED" ) then
                button:SetButtonState("NORMAL");
                FBLastButtonDown = "LeftButton"
                FlexBarButton_OnClick(button, true, "LeftButton")
                if ( IsCurrentAction(FlexBarButton_GetID(button)) ) then
                        button:SetChecked(1);
                else
                        button:SetChecked(0);
                end
        end
end

function FlexBarButton_OnLoad(button)
-- Blizzard code:  Called as each button is loaded.
        button.showgrid = 1;
        button.flashing = 0;
        button.flashtime = 0;
        FlexBarButton_Update(button);
-- Went nuts trying to figure out why I couldn't get clicks and drags
-- in my handle frames - I didn't do this 
        button:RegisterForDrag("LeftButton", "RightButton");
        button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
        button:RegisterEvent("VARIABLES_LOADED");
        button:RegisterEvent("ACTIONBAR_SHOWGRID");
        button:RegisterEvent("ACTIONBAR_HIDEGRID");
        button:RegisterEvent("ACTIONBAR_PAGE_CHANGED");
        button:RegisterEvent("ACTIONBAR_SLOT_CHANGED");
        button:RegisterEvent("ACTIONBAR_UPDATE_STATE");
        button:RegisterEvent("ACTIONBAR_UPDATE_USABLE");
        button:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN");
        button:RegisterEvent("UPDATE_INVENTORY_ALERTS");
        button:RegisterEvent("PLAYER_AURAS_CHANGED");
        button:RegisterEvent("PLAYER_TARGET_CHANGED");
        button:RegisterEvent("UNIT_AURASTATE");
        button:RegisterEvent("UNIT_INVENTORY_CHANGED");
        button:RegisterEvent("CRAFT_SHOW");
        button:RegisterEvent("CRAFT_CLOSE");
        button:RegisterEvent("TRADE_SKILL_SHOW");
        button:RegisterEvent("TRADE_SKILL_CLOSE");
        button:RegisterEvent("UNIT_HEALTH");
        button:RegisterEvent("UNIT_MANA");
        button:RegisterEvent("UNIT_RAGE");
        button:RegisterEvent("UNIT_FOCUS");
        button:RegisterEvent("UNIT_ENERGY");
        button:RegisterEvent("PLAYER_ENTER_COMBAT");
        button:RegisterEvent("PLAYER_LEAVE_COMBAT");
        button:RegisterEvent("PLAYER_COMBO_POINTS");
        button:RegisterEvent("UPDATE_BINDINGS");
        button:RegisterEvent("START_AUTOREPEAT_SPELL");
        button:RegisterEvent("STOP_AUTOREPEAT_SPELL");
        button:RegisterEvent("PLAYER_ENTERING_WORLD");
        FlexBarButton_UpdateHotkeys(button);
end

function FlexBarButton_UpdateHotkeys(button)
-- This sets the hotkey text.  Originally borrowed from Telo's SideBar,
-- optionally puts binding or id in depending on user selection.

        local name = button:GetName();
        local hotkey = getglobal(name.."HotKey");
        local text2 = getglobal(name.."Text2");
        local text3 = getglobal(name.."Text3");
        local s, e, id = string.find(name, "^FlexBarButton(%d+)$");
        local action = "FLEXACTIONBUTTON"..id;
        local text = GetBindingKey(action)
        
        if text then
                text = string.upper(text)
                text = string.gsub(text, "CTRL--", "C-");
                text = string.gsub(text, "ALT--", "A-");
                text = string.gsub(text, "SHIFT--", "S-");
                text = string.gsub(text, "NUM PAD", "NP");
                text = string.gsub(text, "BACKSPACE", "Bksp");
                text = string.gsub(text, "SPACEBAR", "Space");
                text = string.gsub(text, "PAGE", "Pg");
                text = string.gsub(text, "DOWN", "Dn");
                text = string.gsub(text, "ARROW", "");
                text = string.gsub(text, "INSERT", "Ins");
                text = string.gsub(text, "DELETE", "Del");
        else
                text = ""
        end

        local buttonnum=FB_GetButtonNum(button)
        if FBState[buttonnum]["hotkeytext"] == nil then FBState[buttonnum]["hotkeytext"] = "" end
        -- going to add %s for slots free for bags here later
        if FBState[buttonnum]["hotkeytext"] == "%b" then
                hotkey:SetText(text);
        elseif FBState[buttonnum]["hotkeytext"] == "%c" then
                hotkey:SetText("**")
        elseif FBState[buttonnum]["hotkeytext"] == "%d" then
                hotkey:SetText(buttonnum)
        else
                FB_TextSub(buttonnum)
        end

        if FBState[buttonnum]["text2"] == nil then FBState[buttonnum]["text2"] = "" end
        -- going to add %s for slots free for bags here later
        if FBState[buttonnum]["text2"] == "%b" then
                text2:SetText(text);
        elseif FBState[buttonnum]["text2"] == "%c" then
                text2:SetText("**")
        elseif FBState[buttonnum]["text2"] == "%d" then
                text2:SetText(buttonnum)
        else
                FB_TextSub(buttonnum)
        end
        
        if FBState[buttonnum]["text3"] == nil then FBState[buttonnum]["text3"] = "" end
        -- going to add %s for slots free for bags here later
        if FBState[buttonnum]["text3"] == "%b" then
                text3:SetText(text);
        elseif FBState[buttonnum]["text3"] == "%c" then
                text3:SetText("**")
        elseif FBState[buttonnum]["text3"] == "%d" then
                text3:SetText(buttonnum)
        else
                FB_TextSub(buttonnum)
        end
end

function FlexBarButton_Update(button)
        local buttonnum=FB_GetButtonNum(button)
        local buttonID = FlexBarButton_GetID(button);

        -- Determine whether or not the button should be flashing or not since the button may have missed the enter combat event
        if ( IsAttackAction(buttonID) and IsCurrentAction(buttonID) ) then
                IN_ATTACK_MODE = 1;
        else
                IN_ATTACK_MODE = nil;
        end
        IN_AUTOREPEAT_MODE = IsAutoRepeatAction(buttonID);
        
        local icon = getglobal(button:GetName().."Icon");
        local buttonCooldown = getglobal(button:GetName().."Cooldown");
        local texture = GetActionTexture(FlexBarButton_GetID(button));
        if ( texture ) then
                icon:SetTexture(texture);
                icon:Show();
                button.rangeTimer = TOOLTIP_UPDATE_TIME;
                button:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2");
        else
                if      FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and
                        FBSavedProfile[FBProfileName].FlexActions[buttonID]["texture"] then
                        local fbtext = string.lower(FBSavedProfile[FBProfileName].FlexActions[buttonID]["texture"])
                        if      fbtext == "%player" or fbtext == "%party1" or
                                fbtext == "%party2" or fbtext == "%party3" or
                                fbtext == "%party4" or fbtext == "%target" or fbtext == "%pet" then
                                
                                SetPortraitTexture(icon,string.sub(fbtext,2))
                                icon:SetVertexColor(1,1,1)
                                icon:SetAlpha(1)
                        else
                                icon:SetTexture(FBSavedProfile[FBProfileName].FlexActions[buttonID]["texture"])
                        end
                        button:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2");
                        icon:Show()
                else
                        icon:Hide();
                        buttonCooldown:Hide();
                        button.rangeTimer = nil;
                        if not  (FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and
                                        FBSavedProfile[FBProfileName].FlexActions[buttonID]["texture"]) then
                                button:SetNormalTexture("Interface\\Buttons\\UI-Quickslot");
                        end
                        if not FBState[FB_GetButtonNum(button)]["hotkeycolor"] then getglobal(button:GetName().."HotKey"):SetVertexColor(0.6, 0.6, 0.6); end
                end
        end
        FlexBarButton_UpdateCount(button);
        if      ( HasAction(FlexBarButton_GetID(button)) ) or 
                ( FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] ) then 
                button:Show();
                -- somewhere right before here, this gets reset to whatever 
                -- has focus -- so put it back.  I don't know if this causes problems
                -- but it is certainly the first place to look.  This only happens with
                -- remapping an empty button with showgrid=0 to a non-empty button.
                FlexBarButton_UpdateUsable(button);
                FlexBarButton_UpdateCooldown(button);
        elseif ( button.showgrid == 0 ) then
                        button:Hide();
        else
                getglobal(button:GetName().."Cooldown"):Hide();
        end

        if ( IN_ATTACK_MODE or IN_AUTOREPEAT_MODE ) then
                FlexBarButton_StartFlash(button);
        else
                FlexBarButton_StopFlash(button);
        end

        if ( GameTooltip:IsOwned(button) ) then
                FlexBarButton_SetTooltip(button);
        else
                button.updateTooltip = nil;
        end

        -- Update Macro Text
        local macroName = getglobal(button:GetName().."Name");
        macroName:SetText(GetActionText(FlexBarButton_GetID(button)))
end

function FlexBarButton_ShowGrid(button)
-- Blizzard code;  Show button even if it doesn't have an action associated with it.
        button.showgrid = button.showgrid+1;
        getglobal(button:GetName().."NormalTexture"):SetVertexColor(1.0, 1.0, 1.0);
        button:Show();
        local _,frame = FB_GetWidgets(FB_GetButtonNum(button))
        frame:EnableDrawLayer()
end

function FlexBarButton_HideGrid(button) 
-- Blizzard code: Hide button if it doesn't have an action associated with it
        button.showgrid = button.showgrid-1;
        if      ( button.showgrid == 0 ) and not (HasAction(FlexBarButton_GetID(button)))  then
                button:Hide();
                local _,frame = FB_GetWidgets(FB_GetButtonNum(button))
                frame:DisableDrawLayer()
        end
end

function FlexBarButton_UpdateState(button)
-- Blizzard code: 
        if      ( IsCurrentAction(FlexBarButton_GetID(button)) or 
                IsAutoRepeatAction(FlexBarButton_GetID(button)) or
                FBState[FB_GetButtonNum(button)]["checked"] ) then
                button:SetChecked(1);
        else
                button:SetChecked(0);
        end
end

function FlexBarButton_UpdateUsable(button)
        local buttonnum=FB_GetButtonNum(button)

        -- If the button is currently hidden - we do not need to do anything for this button at this time
        if FBState[buttonnum]["hidden"] then return end;
        
-- Blizzard code:
        local icon = getglobal(button:GetName().."Icon");
        local normalTexture = getglobal(button:GetName().."NormalTexture");
-- Mana check available here - also has potential
        local isUsable, notEnoughMana = IsUsableAction(FlexBarButton_GetID(button));
-- Hotkey is the text displayed in the upper right corner.
        local count = getglobal(button:GetName().."HotKey");
        local text2 = getglobal(button:GetName().."Text2");
        local text3 = getglobal(button:GetName().."Text3");
        local text = count:GetText();
-- Here's the test for action in range - for further enhancements that let the player know button better
        local inRange = IsActionInRange(FlexBarButton_GetID(button));
        local buttonID = FlexBarButton_GetID(button)
        if not FBState[buttonnum]["hotkeycolor"] then
                if( inRange == 0 ) then
                        count:SetVertexColor(1.0, 0.1, 0.1);
                else
                        count:SetVertexColor(0.6, 0.6, 0.6);
                end
        end
        -- Default blizz code resets the vertex color every pass through, regardless of whether the state
        -- changed.  This may be a cause of FPS reduction when people have lots of buttons visible.  Added checks
        -- so coloring will only occur on an actual change of state.
        if ( isUsable ) then
-- Telo added this code - If the button has hotkey text it colors like normal on in/out of range
-- w/o hotkey text it colors the entire button.  
-- added toggle to force this behavior
                if ( (not text or text == "" or FBToggles["forceshading"]) and inRange == 0 ) then
                        if FBState[buttonnum]["coloring"] ~= "usable_out_of_range" then
                                icon:SetVertexColor(1.0, 0.1, 0.1);
                                normalTexture:SetVertexColor(1.0, 0.1, 0.1);
                                FBState[buttonnum]["coloring"] = "usable_out_of_range"
                        end
                else
                        if FBState[buttonnum]["coloring"] ~= "usable_in_range" then
                                icon:SetVertexColor(1.0, 1.0, 1.0);
                                normalTexture:SetVertexColor(1.0, 1.0, 1.0);
                                FBState[buttonnum]["coloring"] = "usable_in_range"
                        end
                end
        elseif ( notEnoughMana ) then
                if FBState[buttonnum]["coloring"] ~= "not_enough_mana" then
                        icon:SetVertexColor(0.5, 0.5, 1.0);
                        normalTexture:SetVertexColor(0.5, 0.5, 1.0);
                        FBState[buttonnum]["coloring"] = "not_enough_mana"
                end
        else
                if FBState[buttonnum]["coloring"] ~= "not_usable" then
                        icon:SetVertexColor(0.4, 0.4, 0.4);
                        normalTexture:SetVertexColor(1.0, 1.0, 1.0);
                        FBState[buttonnum]["coloring"] = "not_usable"
                end
        end
        if FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and FBSavedProfile[FBProfileName].FlexActions[buttonID]["texture"] then
                icon:SetVertexColor(1.0, 1.0, 1.0);
                normalTexture:SetVertexColor(1.0, 1.0, 1.0);
        end

        if FBState[buttonnum]["icon"] then
                local bcolors = FBState[buttonnum]["icon"]
                icon:SetVertexColor(bcolors[1], bcolors[2], bcolors[3])
        end
        
-- Digital cooldown - set the hotkey text to '%c' to get a digital cooldown
        if FBState[buttonnum]["hotkeytext"] then
                if FBState[buttonnum]["hotkeytext"] == "%c" then
                        local start, duration, enable = GetActionCooldown(button:GetID());
                        if      FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and 
                                FBSavedProfile[FBProfileName].FlexActions[buttonID]["action"] == "pet" then
                                start, duration, enable = GetPetActionCooldown(FBSavedProfile[FBProfileName].FlexActions[buttonID]["id"])
                        end
                        if start > 0 then
                                count:SetText(format("%d",duration-(GetTime()-start)))
                                count:SetVertexColor(1.0, 1.0, .5)
                        else
                                count:SetText("**")
                                count:SetVertexColor(.5, 1.0, .5)
                        end
                end
        end
-- Digital cooldown - set the hotkey text to '%c' to get a digital cooldown
        if FBState[buttonnum]["text2"] then
                if FBState[buttonnum]["text2"] == "%c" then
                        local start, duration, enable = GetActionCooldown(button:GetID());
                        if      FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and 
                                FBSavedProfile[FBProfileName].FlexActions[buttonID]["action"] == "pet" then
                                start, duration, enable = GetPetActionCooldown(FBSavedProfile[FBProfileName].FlexActions[buttonID]["id"])
                        end
                        if start > 0 then
                                text2:SetText(format("%d",duration-(GetTime()-start)))
                                text2:SetVertexColor(1.0, 1.0, .5)
                        else
                                text2:SetText("**")
                                text2:SetVertexColor(.5, 1.0, .5)
                        end
                end
        end
-- Digital cooldown - set the hotkey text to '%c' to get a digital cooldown
        if FBState[buttonnum]["text3"] then
                if FBState[buttonnum]["text3"] == "%c" then
                        local start, duration, enable = GetActionCooldown(button:GetID());
                        if      FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and 
                                FBSavedProfile[FBProfileName].FlexActions[buttonID]["action"] == "pet" then
                                start, duration, enable = GetPetActionCooldown(FBSavedProfile[FBProfileName].FlexActions[buttonID]["id"])
                        end
                        if start > 0 then
                                text3:SetText(format("%d",duration-(GetTime()-start)))
                                text3:SetVertexColor(1.0, 1.0, .5)
                        else
                                text3:SetText("**")
                                text3:SetVertexColor(.5, 1.0, .5)
                        end
                end
        end
end

function FlexBarButton_UpdateCount(button)
-- Blizzard code - purpose unknown at this time
        local text = getglobal(button:GetName().."Count");
        local count = GetActionCount(FlexBarButton_GetID(button));
        if ( count > 1 ) then
                text:SetText(count);
        else
                text:SetText("");
        end
end

function FlexBarButton_UpdateCooldown(button)
        local buttonnum=FB_GetButtonNum(button)
        local buttonID = button:GetID()
        
        -- If the button is currently hidden - we do not need to do anything for this button
        if FBState[buttonnum]["hidden"] then return end;
        
        -- Blizzard code - looks like it updates the little cooldown spinner.
        local cooldown = getglobal(button:GetName().."Cooldown");
        local hotkey = getglobal(button:GetName().."HotKey");
        local start, duration, enable = GetActionCooldown(FlexBarButton_GetID(button));
        if      FBProfileLoaded and FBSavedProfile[FBProfileName].FlexActions[buttonID] and 
                FBSavedProfile[FBProfileName].FlexActions[buttonID]["action"] == "pet" then
                start, duration, enable = GetPetActionCooldown(FBSavedProfile[FBProfileName].FlexActions[buttonID]["id"])
        end
        -- if digital cooldowns are enabled, disable spinner - it obscures the display.
        if FBState[buttonnum]["hotkeytext"] ~= "%c" and FBState[buttonnum]["text2"] ~= "%c"  and FBState[buttonnum]["text3"] ~= "%c" then
                CooldownFrame_SetTimer(cooldown, start, duration, enable)
        end
end

function FlexBarButton_OnEvent(event, button)
-- Event code for individual buttons 
        if( event == "VARIABLES_LOADED" ) then
        end

        if ( event == "ACTIONBAR_SLOT_CHANGED" ) then
                if ( arg1 == -1 or arg1 == FlexBarButton_GetID(button) ) then
                        FlexBarButton_Update(button);
                end
                return;
        end

        if ( event == "PLAYER_AURAS_CHANGED") then
                FlexBarButton_Update(button);
                FlexBarButton_UpdateState(button);
                return;
        end
        if ( event == "ACTIONBAR_SHOWGRID" ) then
                FlexBarButton_ShowGrid(button);
                return;
        end
        if ( event == "ACTIONBAR_HIDEGRID" ) then
                FlexBarButton_HideGrid(button);
                return;
        end
        if ( event == "UPDATE_BINDINGS" ) then
                FlexBarButton_UpdateHotkeys(button);
        end

        -- All event handlers below this line MUST only be valid when the button is visible
        if ( not button:IsVisible() ) then
                return;
        end

        if ( event == "PLAYER_TARGET_CHANGED" ) then
                FlexBarButton_UpdateUsable(button);
                return;
        end
        if ( event == "UNIT_AURASTATE" ) then
                if ( arg1 == "player" or arg1 == "target" ) then
                        FlexBarButton_UpdateUsable(button);
                end
                return;
        end
        if ( event == "UNIT_INVENTORY_CHANGED" ) then
                if ( arg1 == "player" ) then
                        FlexBarButton_Update(button);
                end
                return;
        end
        if ( event == "ACTIONBAR_UPDATE_STATE" ) then
                FlexBarButton_UpdateState(button);
                return;
        end

        if ( event == "ACTIONBAR_UPDATE_COOLDOWN" ) then
                local buttonnum = FB_GetButtonNum(button)
                local start, duration, enable = GetActionCooldown(button:GetID())
                if not FBState[buttonnum]["lastcooldown"] then
                        FlexBarButton_UpdateCooldown(button);
                        FlexBarButton_UpdateUsable(button);
                        FBState[buttonnum]["lastcooldown"] = {}
                        FBState[buttonnum]["lastcooldown"]["start"] = start
                        FBState[buttonnum]["lastcooldown"]["duration"] = duration
                elseif  FBState[buttonnum]["lastcooldown"]["start"] ~= start or
                                FBState[buttonnum]["lastcooldown"]["duration"] ~= duration then
                        FlexBarButton_UpdateCooldown(button);
                        FlexBarButton_UpdateUsable(button);
                        FBState[buttonnum]["lastcooldown"] = {}
                        FBState[buttonnum]["lastcooldown"]["start"] = start
                        FBState[buttonnum]["lastcooldown"]["duration"] = duration
                end
                return;
        end

        if ( event == "ACTIONBAR_UPDATE_USABLE" ) then
                FlexBarButton_UpdateUsable(button);
                FlexBarButton_UpdateCooldown(button);
                return
        end

        if ( event == "UPDATE_INVENTORY_ALERTS" ) then
                FlexBarButton_UpdateCooldown(button);
                FlexBarButton_UpdateUsable(button);
                return;
        end

        if ( event == "CRAFT_SHOW" or event == "CRAFT_CLOSE" or event == "TRADE_SKILL_SHOW" or event == "TRADE_SKILL_CLOSE" ) then
                FlexBarButton_UpdateState(button);
                return;
        end
        if ( arg1 == "player" and (event == "UNIT_HEALTH" or event == "UNIT_MANA" or event == "UNIT_RAGE" or event == "UNIT_FOCUS" or event == "UNIT_ENERGY") ) then
                FlexBarButton_UpdateUsable(button);
                return;
        end
        if ( event == "PLAYER_ENTER_COMBAT" ) then
                IN_ATTACK_MODE = 1;
                if ( IsAttackAction(FlexBarButton_GetID(button)) ) then
                        FlexBarButton_StartFlash(button);
                end
                return;
        end
        if ( event == "PLAYER_LEAVE_COMBAT" ) then
                IN_ATTACK_MODE = 0;
                if ( IsAttackAction(FlexBarButton_GetID(button)) ) then
                        FlexBarButton_StopFlash(button);
                end
                return;
        end
        if ( event == "PLAYER_COMBO_POINTS" ) then
                FlexBarButton_UpdateUsable(button);
                return;
        end
        if ( event == "START_AUTOREPEAT_SPELL" ) then
                IN_AUTOREPEAT_MODE = 1;
                if ( IsAutoRepeatAction(FlexBarButton_GetID(button)) ) then
                        FlexBarButton_StartFlash(button);
                end
                return;
        end
        if ( event == "STOP_AUTOREPEAT_SPELL" ) then
                IN_AUTOREPEAT_MODE = nil;
                if ( FlexBarButton_IsFlashing(button) and not IsAttackAction(FlexBarButton_GetID(button)) ) then
                        FlexBarButton_StopFlash(button);
                end
                return;
        end
end

function FlexBarButton_SetTooltip(button)
-- Blizzard code
-- appears to reset the manually set this from my routines.
        GameTooltip_SetDefaultAnchor(GameTooltip, button)       
--      GameTooltip:SetOwner(this);

        local FlexButtonID = FlexBarButton_GetID(button)
        local FlexButtonNum = FB_GetButtonNum(button)
        if ( GameTooltip:SetAction(FlexButtonID) ) then
                button.updateTooltip = TOOLTIP_UPDATE_TIME;
        elseif  FBProfileLoaded and
                        FBSavedProfile[FBProfileName].FlexActions[button:GetID()] and
                        FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] ~= "autoitem" and
                        FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["name"] then
                        
                        GameTooltip:SetText(FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["name"])
        else
                button.updateTooltip = nil;
        end
        if ( FBButtonInfoTooltipShown ) then
                local scale = 1.0
                local ttcolor = FBToggles["tooltipinfocolor"]
                local x = math.floor(FBState[FlexButtonNum].xcoord + .5)
                local y = math.floor(FBState[FlexButtonNum].ycoord + .5)
                if FBState[FlexButtonNum].scale ~= nil then
                        scale = FBState[FlexButtonNum].scale
                end
                GameTooltip:AddLine(" ")
                GameTooltip:AddLine("Flexbar Button "..FlexButtonNum, ttcolor.r, ttcolor.g, ttcolor.b)
                if (FBState[FlexButtonNum].remap ~= nil) then
                        GameTooltip:AddLine("Remaped ID: "..FBState[FlexButtonNum].remap, ttcolor.r, ttcolor.g, ttcolor.b)
                end
                if (FBState[FlexButtonNum].group ~= nil) then
                        GameTooltip:AddLine("Group: "..FBState[FlexButtonNum].group, ttcolor.r, ttcolor.g, ttcolor.b)
                end
                local PosInfo = "Position: <"..x..", "..y..">"
                if scale ~= 1 then PosInfo = PosInfo.." Scale:"..scale end
                GameTooltip:AddLine(PosInfo, ttcolor.r, ttcolor.g, ttcolor.b)
                GameTooltip:Show()
                button.updateTooltip = TOOLTIP_UPDATE_TIME;
        end
end


function FlexBarButton_OnUpdate(elapsed, button)
-- Blizzard code
        if ( FlexBarButton_IsFlashing(button) ) then
                button.flashtime = button.flashtime - elapsed;
                if ( button.flashtime <= 0 ) then
                        local overtime = -button.flashtime;
                        if ( overtime >= ATTACK_BUTTON_FLASH_TIME ) then
                                overtime = 0;
                        end
                        button.flashtime = ATTACK_BUTTON_FLASH_TIME - overtime;

                        local flashTexture = getglobal(button:GetName().."Flash");
                        if ( flashTexture:IsVisible() ) then
                                flashTexture:Hide();
                        else
                                flashTexture:Show();
                        end
                end
        end
        -- Handle range indicator
        if ( button.rangeTimer ) then
                if ( button.rangeTimer < 0 ) then
                        FlexBarButton_UpdateUsable(button);
                        button.rangeTimer = TOOLTIP_UPDATE_TIME;
                else
                        button.rangeTimer = button.rangeTimer - elapsed;
                end
        end

        if ( not button.updateTooltip ) then
                return;
        end

        button.updateTooltip = button.updateTooltip - elapsed;
        if ( button.updateTooltip > 0 ) then
                return;
        end

        if ( GameTooltip:IsOwned(button) ) then
                FlexBarButton_SetTooltip(button);
        else
                button.updateTooltip = nil;
        end
end

function FlexBarButton_GetID(button)
        return (button:GetID())
end

function FlexBarButton_StartFlash(button)
-- Blizzard code
        button.flashing = 1;
        button.flashtime = 0;
        FlexBarButton_UpdateState(button);
end

function FlexBarButton_StopFlash(button)
-- Blizzard code
        button.flashing = 0;
        getglobal(button:GetName().."Flash"):Hide();
        FlexBarButton_UpdateState(button);
end

function FlexBarButton_IsFlashing(button)
-- Blizzard code
        if ( button.flashing == 1 ) then
                return 1;
        else
                return nil;
        end
end

function FlexBarButton_OnClick(button, frombinding, mousebutton)
        if ( IsShiftKeyDown() ) and ( not frombinding ) then
                if not FBSavedProfile[FBProfileName].FlexActions[button:GetID()] then
                        PickupAction(FlexBarButton_GetID(button));
                else
                        local u = Utility_Class:New()
                        if FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "autoitem" then
                                u:Echo("Error:  Cannot drag an Auto Item off - disable auto item to remove")
                        elseif FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "pet" then
                                PickupPetAction(FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["id"])
                        end
                end
        else
                if not FBState[FB_GetButtonNum(button)]["disabled"] then
                        if (FBState[FB_GetButtonNum(button)]["advanced"] and mousebutton == "LeftButton") or
                                not FBState[FB_GetButtonNum(button)]["advanced"] then
                                local id = FlexBarButton_GetID(button);
                                if      not FBSavedProfile[FBProfileName].FlexActions[button:GetID()] or 
                                        FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "autoitem" then
                                        if (MacroFrame_SaveMacro) then
                                                MacroFrame_SaveMacro();
                                        end
                                        UseAction(id, 1);
                                else
                                        if FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "macro" then
                                                local name = FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["name"]
                                                local macro = FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["macro"]
                                                if type(macro) == "table" then
                                                        local index,command, longmacro
                                                        longmacro = "\n"
                                                        for index,command in ipairs(macro) do
                                                                longmacro=longmacro..command.."\n"
                                                        end
                                                        FB_Execute_MultilineMacro(longmacro,"InLineMacro"..GetTime())
                                                elseif FBScripts[macro] then
                                                        FB_Execute_MultilineMacro(FBScripts[macro],name)
                                                else
                                                        FB_Execute_Command(macro)
                                                end
                                        elseif FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "script" then
                                                if FBScripts[FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["script"]] then
                                                        RunScript(FBScripts[FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["script"]])
                                                else
                                                        RunScript(FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["script"])
                                                end
                                        elseif FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["action"] == "pet" then
                                                local id = FBSavedProfile[FBProfileName].FlexActions[button:GetID()]["id"]
                                                if arg1 == "RightButton" then
                                                        TogglePetAutocast(id)
                                                else
                                                        CastPetAction(id)
                                                end
                                        end
                                end
                        end
                end
                if FBEventToggles["buttonevents"] ~= "off" then
                        local lastbutton = FBLastButtonDown
                        if frombinding then lastbutton="LeftButton" end
                        FB_RaiseEvent(lastbutton.."Click", FB_GetButtonNum(button))
                        if FBState[FB_GetButtonNum(button)]["echo"] then
                                FB_RaiseEvent(lastbutton.."Click",FBState[FB_GetButtonNum(button)]["echo"])
                        end
                end
        end
        FlexBarButton_UpdateState(button);
end

function FlexBar_LoadDefaults()
        util:Echo("Flex Bar - first use")
end

------------------------- Bindings ---------------------------------------
BINDING_HEADER_FLEXBAR_SCRIPTS = "FlexBar GUI Panels";
BINDING_NAME_FLEXBAR_MAINMENU = "Open Flex Main Menu";
BINDING_NAME_FLEXBAR_AUTOITEM = "Open Auto Items";
BINDING_NAME_FLEXBAR_SCRIPTS = "Open Script Editor";
BINDING_NAME_FLEXBAR_PERFORMANCE = "Open Performance Panel";
BINDING_NAME_FLEXBAR_OPTIONS = "Open Options Panel";
BINDING_NAME_FLEXBAR_EVENTED = "Open Event Editor";
BINDING_NAME_FLEXBAR_BUTNINFO = "Button Information Toggle";
BINDING_NAME_FLEXBAR_BUTNTOOLTIP = "Button Info Tooltip Toggle";
BINDING_HEADER_FLEXBAR = "FlexBar Buttons";
BINDING_NAME_FLEXACTIONBUTTON1 = "FlexBar Button 1";
BINDING_NAME_FLEXACTIONBUTTON2 = "FlexBar Button 2";
BINDING_NAME_FLEXACTIONBUTTON3 = "FlexBar Button 3";
BINDING_NAME_FLEXACTIONBUTTON4 = "FlexBar Button 4";
BINDING_NAME_FLEXACTIONBUTTON5 = "FlexBar Button 5";
BINDING_NAME_FLEXACTIONBUTTON6 = "FlexBar Button 6";
BINDING_NAME_FLEXACTIONBUTTON7 = "FlexBar Button 7";
BINDING_NAME_FLEXACTIONBUTTON8 = "FlexBar Button 8";
BINDING_NAME_FLEXACTIONBUTTON9 = "FlexBar Button 9";
BINDING_NAME_FLEXACTIONBUTTON10 = "FlexBar Button 10";
BINDING_NAME_FLEXACTIONBUTTON11 = "FlexBar Button 11";
BINDING_NAME_FLEXACTIONBUTTON12 = "FlexBar Button 12";
BINDING_NAME_FLEXACTIONBUTTON13 = "FlexBar Button 13";
BINDING_NAME_FLEXACTIONBUTTON14 = "FlexBar Button 14";
BINDING_NAME_FLEXACTIONBUTTON15 = "FlexBar Button 15";
BINDING_NAME_FLEXACTIONBUTTON16 = "FlexBar Button 16";
BINDING_NAME_FLEXACTIONBUTTON17 = "FlexBar Button 17";
BINDING_NAME_FLEXACTIONBUTTON18 = "FlexBar Button 18";
BINDING_NAME_FLEXACTIONBUTTON19 = "FlexBar Button 19";
BINDING_NAME_FLEXACTIONBUTTON20 = "FlexBar Button 20";
BINDING_NAME_FLEXACTIONBUTTON21 = "FlexBar Button 21";
BINDING_NAME_FLEXACTIONBUTTON22 = "FlexBar Button 22";
BINDING_NAME_FLEXACTIONBUTTON23 = "FlexBar Button 23";
BINDING_NAME_FLEXACTIONBUTTON24 = "FlexBar Button 24";
BINDING_NAME_FLEXACTIONBUTTON25 = "FlexBar Button 25";
BINDING_NAME_FLEXACTIONBUTTON26 = "FlexBar Button 26";
BINDING_NAME_FLEXACTIONBUTTON27 = "FlexBar Button 27";
BINDING_NAME_FLEXACTIONBUTTON28 = "FlexBar Button 28";
BINDING_NAME_FLEXACTIONBUTTON29 = "FlexBar Button 29";
BINDING_NAME_FLEXACTIONBUTTON30 = "FlexBar Button 30";
BINDING_NAME_FLEXACTIONBUTTON31 = "FlexBar Button 31";
BINDING_NAME_FLEXACTIONBUTTON32 = "FlexBar Button 32";
BINDING_NAME_FLEXACTIONBUTTON33 = "FlexBar Button 33";
BINDING_NAME_FLEXACTIONBUTTON34 = "FlexBar Button 34";
BINDING_NAME_FLEXACTIONBUTTON35 = "FlexBar Button 35";
BINDING_NAME_FLEXACTIONBUTTON36 = "FlexBar Button 36";
BINDING_NAME_FLEXACTIONBUTTON37 = "FlexBar Button 37";
BINDING_NAME_FLEXACTIONBUTTON38 = "FlexBar Button 38";
BINDING_NAME_FLEXACTIONBUTTON39 = "FlexBar Button 39";
BINDING_NAME_FLEXACTIONBUTTON40 = "FlexBar Button 40";
BINDING_NAME_FLEXACTIONBUTTON41 = "FlexBar Button 41";
BINDING_NAME_FLEXACTIONBUTTON42 = "FlexBar Button 42";
BINDING_NAME_FLEXACTIONBUTTON43 = "FlexBar Button 43";
BINDING_NAME_FLEXACTIONBUTTON44 = "FlexBar Button 44";
BINDING_NAME_FLEXACTIONBUTTON45 = "FlexBar Button 45";
BINDING_NAME_FLEXACTIONBUTTON46 = "FlexBar Button 46";
BINDING_NAME_FLEXACTIONBUTTON47 = "FlexBar Button 47";
BINDING_NAME_FLEXACTIONBUTTON48 = "FlexBar Button 48";
BINDING_NAME_FLEXACTIONBUTTON49 = "FlexBar Button 49";
BINDING_NAME_FLEXACTIONBUTTON50 = "FlexBar Button 50";
BINDING_NAME_FLEXACTIONBUTTON51 = "FlexBar Button 51";
BINDING_NAME_FLEXACTIONBUTTON52 = "FlexBar Button 52";
BINDING_NAME_FLEXACTIONBUTTON53 = "FlexBar Button 53";
BINDING_NAME_FLEXACTIONBUTTON54 = "FlexBar Button 54";
BINDING_NAME_FLEXACTIONBUTTON55 = "FlexBar Button 55";
BINDING_NAME_FLEXACTIONBUTTON56 = "FlexBar Button 56";
BINDING_NAME_FLEXACTIONBUTTON57 = "FlexBar Button 57";
BINDING_NAME_FLEXACTIONBUTTON58 = "FlexBar Button 58";
BINDING_NAME_FLEXACTIONBUTTON59 = "FlexBar Button 59";
BINDING_NAME_FLEXACTIONBUTTON60 = "FlexBar Button 60";
BINDING_NAME_FLEXACTIONBUTTON61 = "FlexBar Button 61";
BINDING_NAME_FLEXACTIONBUTTON62 = "FlexBar Button 62";
BINDING_NAME_FLEXACTIONBUTTON63 = "FlexBar Button 63";
BINDING_NAME_FLEXACTIONBUTTON64 = "FlexBar Button 64";
BINDING_NAME_FLEXACTIONBUTTON65 = "FlexBar Button 65";
BINDING_NAME_FLEXACTIONBUTTON66 = "FlexBar Button 66";
BINDING_NAME_FLEXACTIONBUTTON67 = "FlexBar Button 67";
BINDING_NAME_FLEXACTIONBUTTON68 = "FlexBar Button 68";
BINDING_NAME_FLEXACTIONBUTTON69 = "FlexBar Button 69";
BINDING_NAME_FLEXACTIONBUTTON70 = "FlexBar Button 70";
BINDING_NAME_FLEXACTIONBUTTON71 = "FlexBar Button 71";
BINDING_NAME_FLEXACTIONBUTTON72 = "FlexBar Button 72";
BINDING_NAME_FLEXACTIONBUTTON73 = "FlexBar Button 73";
BINDING_NAME_FLEXACTIONBUTTON74 = "FlexBar Button 74";
BINDING_NAME_FLEXACTIONBUTTON75 = "FlexBar Button 75";
BINDING_NAME_FLEXACTIONBUTTON76 = "FlexBar Button 76";
BINDING_NAME_FLEXACTIONBUTTON77 = "FlexBar Button 77";
BINDING_NAME_FLEXACTIONBUTTON78 = "FlexBar Button 78";
BINDING_NAME_FLEXACTIONBUTTON79 = "FlexBar Button 79";
BINDING_NAME_FLEXACTIONBUTTON80 = "FlexBar Button 80";
BINDING_NAME_FLEXACTIONBUTTON81 = "FlexBar Button 81";
BINDING_NAME_FLEXACTIONBUTTON82 = "FlexBar Button 82";
BINDING_NAME_FLEXACTIONBUTTON83 = "FlexBar Button 83";
BINDING_NAME_FLEXACTIONBUTTON84 = "FlexBar Button 84";
BINDING_NAME_FLEXACTIONBUTTON85 = "FlexBar Button 85";
BINDING_NAME_FLEXACTIONBUTTON86 = "FlexBar Button 86";
BINDING_NAME_FLEXACTIONBUTTON87 = "FlexBar Button 87";
BINDING_NAME_FLEXACTIONBUTTON88 = "FlexBar Button 88";
BINDING_NAME_FLEXACTIONBUTTON89 = "FlexBar Button 89";
BINDING_NAME_FLEXACTIONBUTTON90 = "FlexBar Button 90";
BINDING_NAME_FLEXACTIONBUTTON91 = "FlexBar Button 91";
BINDING_NAME_FLEXACTIONBUTTON92 = "FlexBar Button 92";
BINDING_NAME_FLEXACTIONBUTTON93 = "FlexBar Button 93";
BINDING_NAME_FLEXACTIONBUTTON94 = "FlexBar Button 94";
BINDING_NAME_FLEXACTIONBUTTON95 = "FlexBar Button 95";
BINDING_NAME_FLEXACTIONBUTTON96 = "FlexBar Button 96";
BINDING_HEADER_FLEXBAR_EVENTS = "FlexBar Events";
BINDING_NAME_FLEXACTIONBUTTON97 = "FlexBar Button 97";
BINDING_NAME_FLEXACTIONBUTTON98 = "FlexBar Button 98";
BINDING_NAME_FLEXACTIONBUTTON99 = "FlexBar Button 99";
BINDING_NAME_FLEXACTIONBUTTON100 = "FlexBar Button 100";
BINDING_NAME_FLEXACTIONBUTTON101 = "FlexBar Button 101";
BINDING_NAME_FLEXACTIONBUTTON102 = "FlexBar Button 102";
BINDING_NAME_FLEXACTIONBUTTON103 = "FlexBar Button 103";
BINDING_NAME_FLEXACTIONBUTTON104 = "FlexBar Button 104";
BINDING_NAME_FLEXACTIONBUTTON105 = "FlexBar Button 105";
BINDING_NAME_FLEXACTIONBUTTON106 = "FlexBar Button 106";
BINDING_NAME_FLEXACTIONBUTTON107 = "FlexBar Button 107";
BINDING_NAME_FLEXACTIONBUTTON108 = "FlexBar Button 108";
BINDING_NAME_FLEXACTIONBUTTON109 = "FlexBar Button 109";
BINDING_NAME_FLEXACTIONBUTTON110 = "FlexBar Button 110";
BINDING_NAME_FLEXACTIONBUTTON111 = "FlexBar Button 111";
BINDING_NAME_FLEXACTIONBUTTON112 = "FlexBar Button 112";
BINDING_NAME_FLEXACTIONBUTTON113 = "FlexBar Button 113";
BINDING_NAME_FLEXACTIONBUTTON114 = "FlexBar Button 114";
BINDING_NAME_FLEXACTIONBUTTON115 = "FlexBar Button 115";
BINDING_NAME_FLEXACTIONBUTTON116 = "FlexBar Button 116";
BINDING_NAME_FLEXACTIONBUTTON117 = "FlexBar Button 117";
BINDING_NAME_FLEXACTIONBUTTON118 = "FlexBar Button 118";
BINDING_NAME_FLEXACTIONBUTTON119 = "FlexBar Button 119";
BINDING_NAME_FLEXACTIONBUTTON120 = "FlexBar Button 120";
BINDING_NAME_FLEXBAREVENT1 = "FlexBar Event 1";
BINDING_NAME_FLEXBAREVENT2 = "FlexBar Event 2";
BINDING_NAME_FLEXBAREVENT3 = "FlexBar Event 3";
BINDING_NAME_FLEXBAREVENT4 = "FlexBar Event 4";
BINDING_NAME_FLEXBAREVENT5 = "FlexBar Event 5";
BINDING_NAME_FLEXBAREVENT6 = "FlexBar Event 6";
BINDING_NAME_FLEXBAREVENT7 = "FlexBar Event 7";
BINDING_NAME_FLEXBAREVENT8 = "FlexBar Event 8";
BINDING_NAME_FLEXBAREVENT9 = "FlexBar Event 9";
BINDING_NAME_FLEXBAREVENT10 = "FlexBar Event 10";
BINDING_NAME_FLEXBAREVENT11 = "FlexBar Event 11";
BINDING_NAME_FLEXBAREVENT12 = "FlexBar Event 12";
BINDING_NAME_FLEXBAREVENT13 = "FlexBar Event 13";
BINDING_NAME_FLEXBAREVENT14 = "FlexBar Event 14";
BINDING_NAME_FLEXBAREVENT15 = "FlexBar Event 15";
BINDING_NAME_FLEXBAREVENT16 = "FlexBar Event 16";
BINDING_NAME_FLEXBAREVENT17 = "FlexBar Event 17";
BINDING_NAME_FLEXBAREVENT18 = "FlexBar Event 18";
BINDING_NAME_FLEXBAREVENT19 = "FlexBar Event 19";
BINDING_NAME_FLEXBAREVENT20 = "FlexBar Event 20";
BINDING_NAME_FLEXBAREVENT21 = "FlexBar Event 21";
BINDING_NAME_FLEXBAREVENT22 = "FlexBar Event 22";
BINDING_NAME_FLEXBAREVENT23 = "FlexBar Event 23";
BINDING_NAME_FLEXBAREVENT24 = "FlexBar Event 24";
BINDING_NAME_FLEXBAREVENT25 = "FlexBar Event 25";
BINDING_NAME_FLEXBAREVENT26 = "FlexBar Event 26";
BINDING_NAME_FLEXBAREVENT27 = "FlexBar Event 27";
BINDING_NAME_FLEXBAREVENT28 = "FlexBar Event 28";
BINDING_NAME_FLEXBAREVENT29 = "FlexBar Event 29";
BINDING_NAME_FLEXBAREVENT30 = "FlexBar Event 30";