vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--  Title:  LoadIT Menu
--  Author: Saur of Emerald Dream (EU)
--  Original author: Ru of Frostmane
--
--  This is a simple mod to provide a GUI for LoadIT
--
-- * Making a Custom GUI
-- *
-- * to make a custom GUI for LoadIT, set LoadITmenu to 1 in your mod.  This will enable
-- * support for the external UI from within LoadIT and offer the '/mods menu' command.
-- * Name the Frame for the menu, LoadITmenuFrame, and define the following function in your GUI to
-- * receive status updates from LoadIT:
-- *
-- *            function LoadIT_UpdateMenu(func, param)
-- *
-- *                    func = function being performed (see code in LoadIT)
-- *                    param = parameter for function (see code in LoadIT)
-- *
-- * Be sure to declare LoadIT as a dependency in your .toc, so you can overwrite the value of
-- * LoadITmenu, by forcing your mod to load after LoadIT
-- *
LoadITmenu = 1;

local LO_RED      = '|cffff0000';
local LO_GREEN    = '|cff00ff00';
local LO_BLUE     = '|cff0000ff';
local LO_MAGENTA  = '|cffff00ff';
local LO_YELLOW   = '|cffffff00';
local LO_CYAN     = '|cff00ffff';
local LO_WHITE    = '|cffffffff';
local LO_GREY     = '|ccccccccc';
local LO_GREY_HI  = '|ceeeeeeee';
local LO_BLUE_LOW = '|cff5e9ae4';
local LO_BEIGE    = '|cffffffa0';

LOADIT_TAB_1 = 'Live';
LOADIT_TAB_2 = 'Profile';
LOADIT_TAB_3 = 'Options';
LOADIT_TAB_4 = 'Edit';
LOADIT_TAB_5 = 'Help';

LOADIT_NUM_TABS = 5;

LOADIT_SCROLL_LINES = 17;               -- number of lines to display in scrollbar
LOADIT_SCROLL_HEIGHT = 17;              -- height of each scrollbar line

local LoadITList = {};
local LoadITProfiles = {};
local LoadITEditList = {};
DDProfileList = {};

LoadITglo = {};

LOADITOPT_VERSION = LOADIT_VERSION .. ' by Saur (originally by Ru)';

BINDING_NAME_LOADITMENU = "Toggle Menu";
BINDING_HEADER_LOADITMENU = "LoadIT Menu";

LOADIT_SELECT_PROFILE = '(Select a profile to edit on the Profile tab)';
LOADIT_SELECTED_PROFILE = 'EDIT Profile: ';

-- * LoadIT_UpdateMenu()
-- * This function is called by LoadIT to notify the GUI of any changes
--
function LoadIT_UpdateMenu(func, param, norefresh)
-- * other valid func values = loadprofile

        -- * if module states change
        if ((func == "disable") or (func == "enable") or (func == "load") or (func == "defaults")) then
                local count = GetNumAddOns();
                LoadITList = {};
                if (count) then
                        local i = 1;
                        while (i <= count) do
                                local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(i);
                                local loaded = IsAddOnLoaded(i);
                                local loadondemand = IsAddOnLoadOnDemand(i);

                                if (not title) then title = name; end
                                if (not enabled) then enabled = 0; end
                                if (not loaded) then loaded = 0; end
                                if (not loadondemand) then loadondemand = 0; end

                                table.insert(LoadITList, { name=name, title=title, enabled=enabled, loaded=loaded, LoD=loadondemand });
                                i = i + 1;
                        end
                end
                if (not norefresh) then
                        LoadITLive_UpdateButtonData();
                        FauxScrollFrame_Update(LoadITLiveScrollFrame,table.getn(LoadITList),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
                end
        end

        -- * if profile states change
        if ((func == "saveprofile") or (func == "deleteprofile") or (func == "defaults")) then
                local key,s;
                local count = 0;
                local tmplist;
                LoadITProfiles = {};

                local sel = UIDropDownMenu_GetSelectedID(DDProfiles);
                if ((sel > 1) and (sel <= table.getn(DDProfileList))) then
                        tmplist = LoadITcf.Classes[DDProfileList[sel]];
                else
                        tmplist = LoadITcf.Sets;
                end

                for key,_ in tmplist do
                        table.insert(LoadITProfiles, { name=key });
                end
                table.sort(LoadITProfiles, function (a1, a2) return (string.lower(a1.name) < string.lower(a2.name)); end);
                LoadITLiveFrame.SelectedIndex = nil;
                LoadITLiveFrame.SelectedName = nil;
                LoadITProfileFrame.SelectedIndex = nil;
                LoadITProfileFrame.SelectedName = nil;
                if (not norefresh) then
                        LoadITProfile_UpdateButtonData();
                        FauxScrollFrame_Update(LoadITProfileScrollFrame,table.getn(LoadITProfiles),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
                end
                LoadITEdit_Reset();
                LoadITEdit_OnUpdate();
        end

        -- * if default settings were restored
        if (func == "defaults") then
                LoadIT_ResetMenu();
        end
end

function LoadITopt_OnLoad()
        this:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b, 0.4);
        this:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b, 0.8);

        tinsert(UISpecialFrames,"LoadITmenuFrame"); 

        PanelTemplates_SetNumTabs(LoadITmenuFrame, LOADIT_NUM_TABS);
        PanelTemplates_SetTab(LoadITmenuFrame, 1);
        PanelTemplates_DisableTab(LoadITmenuFrame, 5);
end

function LoadITopt_OnShow()
        LoadITLive_OnUpdate();
        LoadITProfile_OnUpdate();
        PlaySound("igCharacterInfoOpen");
end

function LoadITopt_OnHide()
        LoadITEdit_Reset();
        LoadITEdit_OnUpdate();
        LoadITProfile_UpdateButtonData();
        PlaySound("igCharacterInfoClose");
end

function LoadIToptTab_OnClick(id)
        PanelTemplates_Tab_OnClick(LoadITmenuFrame);
        PanelTemplates_SetTab(LoadITmenuFrame, id);
        if (id == 1) then
                LoadITLiveFrame:Show();
                LoadITProfileFrame:Hide();
                LoadITOptionsFrame:Hide();
                LoadITEditFrame:Hide();
                FauxScrollFrame_Update(LoadITLiveScrollFrame,table.getn(LoadITList),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
        elseif (id == 2) then
                LoadITLiveFrame:Hide();
                LoadITProfileFrame:Show();
                LoadITOptionsFrame:Hide();
                LoadITEditFrame:Hide();
                FauxScrollFrame_Update(LoadITProfileScrollFrame,table.getn(LoadITProfiles),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
        elseif (id == 3) then
                LoadITLiveFrame:Hide();
                LoadITProfileFrame:Hide();
                LoadITOptionsFrame:Show();
                LoadITEditFrame:Hide();
        elseif (id == 4) then
                LoadITLiveFrame:Hide();
                LoadITProfileFrame:Hide();
                LoadITOptionsFrame:Hide();
                LoadITEditFrame:Show();
                FauxScrollFrame_Update(LoadITEditScrollFrame,table.getn(LoadITEditList),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
        end

--      for i = 1, LOADIT_NUM_TABS do
--              if (i == 1) then
--                      getglobal(LOADIT_FRAMES[i]):Show();
--              else
--                      getglobal(LOADIT_FRAMES[i]):Hide();
--              end
--      end

        PlaySound("igCharacterInfoTab");
end

function LoadITopt_OnMouseDown(arg1)
        if (LoadITcf.LockMenu) then return; end
        if (arg1 == "LeftButton") then
                LoadITmenuFrame:StartMoving();
        end
end

function LoadITopt_OnMouseUp(arg1)
        if (LoadITcf.LockMenu) then return; end
        if (arg1 == "LeftButton") then
                LoadITmenuFrame:StopMovingOrSizing();
        end
end

function LoadITopt_ProfileLoad(id)
        local tmp = nil;
        local itemIndex = id + FauxScrollFrame_GetOffset(LoadITProfileScrollFrame);

        local sel = UIDropDownMenu_GetSelectedID(DDProfiles);
        if ((sel > 1) and (sel <= table.getn(DDProfileList))) then
                tmp = 'class';
        end
        LoadIT_LoadProfile(LoadITProfiles[itemIndex].name, tmp);
end

function LoadITopt_ProfileRemove(id)
        local tmp = nil;
        local itemIndex = id + FauxScrollFrame_GetOffset(LoadITProfileScrollFrame);

        local sel = UIDropDownMenu_GetSelectedID(DDProfiles);
        if ((sel > 1) and (sel <= table.getn(DDProfileList))) then
                tmp = 'class';
        end
        LoadIT_DeleteProfile(LoadITProfiles[itemIndex].name, tmp);
end

function LoadITEdit_Remove(id)
        local index = id + FauxScrollFrame_GetOffset(LoadITEditScrollFrame);
        table.remove(LoadITEditList, index);
        LoadITEdit_UpdateButtonData();
end

function LoadITLiveButton_OnClick()
        local i = this:GetID();
        local index = i + FauxScrollFrame_GetOffset(LoadITLiveScrollFrame);
        LoadITLiveFrame.SelectedIndex = index;
        LoadITLiveFrame.SelectedName = getglobal("LoadITLiveButton" .. i .."Name"):GetText();
        LoadITLive_UpdateButtonData();
end

function LoadITProfileButton_OnClick()
        local i = this:GetID();
        local index = i + FauxScrollFrame_GetOffset(LoadITProfileScrollFrame);

        -- * toggle highlighted selection since we clicked on it
        if (LoadITProfileFrame.SelectedIndex and (LoadITProfileFrame.SelectedIndex == index)) then
                LoadITEdit_Reset();
        else
                LoadITProfileFrame.SelectedIndex = index;
                LoadITProfileFrame.SelectedName = getglobal("LoadITProfileButton" .. i .."Name"):GetText();
                LoadITEdit_GetList();
        end
        LoadITProfile_UpdateButtonData();
        LoadITEdit_OnUpdate();
end

function LoadITEdit_Reset()
        LoadITProfileFrame.SelectedIndex = nil;
        LoadITProfileFrame.SelectedName = nil;
        LoadITEditFrame.SelectedIndex = nil;
        LoadITEditFrame.SelectedName = nil;
        EditProfileName:SetText('');
        EditProfileName:Hide();
        LoadITEditList = {};
        LoadITEditProfileNotSelectedText:SetText(LOADIT_SELECT_PROFILE);

        -- * hide buttons
        LoadITEditSaveButton:Hide();
        LoadITEditUndoButton:Hide();
        LoadITEditCheckAllButton:Hide();
        LoadITEditUnCheckAllButton:Hide();
        LoadITEditInfoButton:Hide();
end

function LoadITEditButton_OnClick()
        local i = this:GetID();
        local index = i + FauxScrollFrame_GetOffset(LoadITEditScrollFrame);

        -- * toggle highlighted selection since we clicked on it
        if (LoadITEditFrame.SelectedIndex and (LoadITEditFrame.SelectedIndex == index)) then
                LoadITEditFrame.SelectedIndex = nil;
                LoadITEditFrame.SelectedName = nil;
        else
                LoadITEditFrame.SelectedIndex = index;
                LoadITEditFrame.SelectedName = LoadITEditList[index].name;
        end
        LoadITEdit_UpdateButtonData();
end

function LoadITLive_SetSelection(id, checked)
        local index = id + FauxScrollFrame_GetOffset(LoadITLiveScrollFrame);
        LoadITopt_SetCheck(id, checked);
        if (id <= table.getn(LoadITList)) then
                LoadITList[index].enabled = checked;
                LoadITLiveFrame.SelectedIndex = index;
                LoadITLiveFrame.SelectedName = getglobal("LoadITLiveButton" .. id .. "Name"):GetText();
                LoadITProfile_UpdateButtonData();
        end
end

function LoadITEdit_SetCheck(id, checked)
        local index = id + FauxScrollFrame_GetOffset(LoadITEditScrollFrame);
        if (id <= table.getn(LoadITEditList)) then
                LoadITEditList[index].enabled = checked;
        end
        LoadITEditFrame.SelectedIndex = index;
        LoadITEditFrame.SelectedName = getglobal("LoadITEditButton" .. id .. "Name"):GetText();
        LoadITEdit_UpdateButtonData();
end

function LoadITLive_OnUpdate()
        LoadIT_UpdateMenu("load", 0, 1);
        LoadITLive_UpdateButtonData();
        FauxScrollFrame_Update(LoadITLiveScrollFrame,table.getn(LoadITList),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
end

function LoadITProfile_OnUpdate()
        LoadIT_UpdateMenu("saveprofile", 0, 1);
        LoadITProfile_UpdateButtonData();
        FauxScrollFrame_Update(LoadITProfileScrollFrame,table.getn(LoadITProfiles),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
end

function LoadITEdit_OnUpdate()
        LoadITEdit_UpdateButtonData();
        FauxScrollFrame_Update(LoadITEditScrollFrame,table.getn(LoadITEditList),LOADIT_SCROLL_LINES,LOADIT_SCROLL_HEIGHT);
end

function LoadITEdit_Undo()
        LoadITEdit_GetList();
        LoadITEdit_OnUpdate();
end

function LoadITEdit_Save()
        local tmplist = {};
        local p = LoadITProfileFrame.SelectedName;
        local sel = UIDropDownMenu_GetSelectedID(DDProfiles);

        local i;
        for i = 1, table.getn(LoadITEditList) do
                local tmp = LoadITEditList[i].enabled;
                if (tmp) then
                        tmplist[LoadITEditList[i].name] = 1;
                else
                        tmplist[LoadITEditList[i].name] = 0;
                end
        end

        if ((sel > 1) and (sel <= table.getn(DDProfileList))) then
                local class = DDProfileList[sel];
                if (LoadITcf.Classes[class][p]) then
                        LoadITcf.Classes[class][p].Modules = tmplist;
                        LoadIT_Print(LO_YELLOW .. 'Changes saved to ' .. class .. ' Profile: ' .. LO_CYAN .. p);
                end
        else
                if (LoadITcf.Sets[p]) then
                        LoadITcf.Sets[p].Modules = tmplist;
                        LoadIT_Print(LO_YELLOW .. 'Changes saved to Profile: ' .. LO_CYAN .. p);
                end
        end
end

function LoadITEdit_GetList()
        LoadITEditList = {};
        local tmplist = {};
        local p = LoadITProfileFrame.SelectedName;
        local sel = UIDropDownMenu_GetSelectedID(DDProfiles);
        local class = DDProfileList[sel];
        if ((sel > 1) and (sel <= table.getn(DDProfileList))) then
                if (LoadITcf.Classes[class][p]) then
                        tmplist = LoadITcf.Classes[class][p].Modules;
                end
        else
                if (LoadITcf.Sets[p]) then
                        tmplist = LoadITcf.Sets[p].Modules;
                end
        end
        local key, enabled;
        for key,enabled in tmplist do
                local name, title, notes, _, _, _, _ = GetAddOnInfo(key);
                local error = 0;
                if (not title) then
                        name = key;
                        error = 1;
                end
                if (not title) then title = name; end
                if (not notes) then notes = ''; end
                if (enabled == 0) then enabled = nil; end
                table.insert(LoadITEditList, { name=key, enabled=enabled, title=title, notes=notes, error=error });
        end
        table.sort(LoadITEditList, function (a1, a2) return (string.lower(a1.title) < string.lower(a2.title)); end);
        LoadITEditProfileNotSelectedText:SetText('');
        EditProfileName:SetText(LOADIT_SELECTED_PROFILE .. LoadITProfileFrame.SelectedName);
        EditProfileName:Show();

        -- * show buttons
        LoadITEditSaveButton:Show();
        LoadITEditUndoButton:Show();
        LoadITEditCheckAllButton:Show();
        LoadITEditUnCheckAllButton:Show();
        LoadITEditInfoButton:Show();
end

function LoadITLive_UpdateButtonData()
        local i;
        local index;

                for i = 1, LOADIT_SCROLL_LINES do
                        index = i + FauxScrollFrame_GetOffset(LoadITLiveScrollFrame);
                        if (index <= table.getn(LoadITList)) then
                                if (LoadITList[index].loaded == 1) then
                                        getglobal("LoadITLiveButton" .. i .. "Name"):SetVertexColor(1.0, 0.82, 0.0);
                                else
                                        getglobal("LoadITLiveButton" .. i .. "Name"):SetVertexColor(0.5, 0.5, 0.5);
                                end
                                getglobal("LoadITLiveButton" .. i .. "Name"):SetText(LoadITList[index].title);

                                -- * load on demand
                                if (LoadITList[index].LoD == 1) then
                                        getglobal("LoadITLiveButton" .. i .. "LoD"):SetText(LO_CYAN .. 'LD');
                                else
                                        getglobal("LoadITLiveButton" .. i .. "LoD"):SetText('');
                                end

                                getglobal("LoadITLiveButton".. i .."Enabled"):SetChecked(LoadITList[index].enabled);
                                getglobal("LoadITLiveButton" .. i):Show();
                                if ( LoadITLiveFrame.SelectedIndex == index ) then
                                        getglobal("LoadITLiveButton" .. i):LockHighlight();
                                else
                                        getglobal("LoadITLiveButton" .. i):UnlockHighlight();
                                end
                        else
                                getglobal("LoadITLiveButton" .. i .. "Name"):SetText('');
                                getglobal("LoadITLiveButton" .. i .. "LoD"):SetText('');
                                getglobal("LoadITLiveButton" .. i):Hide();
                                getglobal("LoadITLiveButton" .. i):UnlockHighlight();
                        end
                end
end

function LoadITEdit_UpdateButtonData()
        local i;
        local index;

                for i = 1, LOADIT_SCROLL_LINES do
                        index = i + FauxScrollFrame_GetOffset(LoadITEditScrollFrame);
                        if (index <= table.getn(LoadITEditList)) then
                                if (LoadITEditList[index].error == 0) then
                                        getglobal("LoadITEditButton" .. i .. "Name"):SetVertexColor(1.0, 0.82, 0.0);
                                else
                                        getglobal("LoadITEditButton" .. i .. "Name"):SetVertexColor(1.0, 0.0, 0.0);
                                end
                                getglobal("LoadITEditButton" .. i .. "Name"):SetText(LoadITEditList[index].title);

                                getglobal("LoadITEditButton".. i .."Enabled"):SetChecked(LoadITEditList[index].enabled);
                                getglobal("LoadITEditButton" .. i):Show();
                                if ( LoadITEditFrame.SelectedIndex == index ) then
                                        getglobal("LoadITEditButton" .. i):LockHighlight();
                                else
                                        getglobal("LoadITEditButton" .. i):UnlockHighlight();
                                end
                        else
                                getglobal("LoadITEditButton" .. i .. "Name"):SetText('');
                                getglobal("LoadITEditButton" .. i):Hide();
                                getglobal("LoadITEditButton" .. i):UnlockHighlight();
                        end
                end
end

-- * LoadITLive_ToggleAll(arg )
-- * Toggles enabled/disabled state for all modules
--
-- * arg - value to set all states to
--
function LoadITLive_ToggleAll(arg)
        local i;
        for i = 1, table.getn(LoadITList) do
                        if (arg == 1) then
                                LoadITList[i].enabled = 1;
                                LoadIT_Enable(LoadITList[i].name, LoadITcf.Verbose, 1);
                        else
                                LoadITList[i].enabled = 0;
                                LoadIT_Disable(LoadITList[i].name, LoadITcf.Verbose, 1);
                        end
                        if (i <= LOADIT_SCROLL_LINES) then
                                getglobal("LoadITLiveButton" .. i .. "Enabled"):SetChecked(LoadITList[i].enabled);
                        end
        end
end

function LoadITEdit_ToggleAll(arg)
        local i;
        for i = 1, table.getn(LoadITEditList) do
                        if (arg == 1) then
                                LoadITEditList[i].enabled = 1;
                        else
                                LoadITEditList[i].enabled = nil;
                        end
                        if (i <= LOADIT_SCROLL_LINES) then
                                getglobal("LoadITEditButton" .. i .. "Enabled"):SetChecked(LoadITEditList[i].enabled);
                        end
        end
end

function LoadITProfile_UpdateButtonData()
        local i;
        local index;

                for i = 1, LOADIT_SCROLL_LINES do
                        index = i + FauxScrollFrame_GetOffset(LoadITProfileScrollFrame);
                        if (index <= table.getn(LoadITProfiles)) then
                                getglobal("LoadITProfileButton" .. i .. "Name"):SetText(LoadITProfiles[index].name);
                                getglobal("LoadITProfileButton" .. i .. "Name"):SetVertexColor(1.0, 0.82, 0.0);
                                getglobal("LoadITProfileButton" .. i):Show();
                                if ( LoadITProfileFrame.SelectedIndex == index ) then
                                        getglobal("LoadITProfileButton" .. i):LockHighlight();
                                else
                                        getglobal("LoadITProfileButton" .. i):UnlockHighlight();
                                end
                        else
                                getglobal("LoadITProfileButton" .. i .. "Name"):SetText('');
                                getglobal("LoadITProfileButton" .. i):Hide();
                                getglobal("LoadITProfileButton" .. i):UnlockHighlight();
                        end
                end
end

function LoadITopt_SetCheck(id, checked)
        local index = id + FauxScrollFrame_GetOffset(LoadITLiveScrollFrame);
        if (checked) then
                LoadIT_Enable(LoadITList[index].name);
        else
                LoadIT_Disable(LoadITList[index].name);
        end
end

function LoadIT_FindAddonIndex(name)
        local i;
        for i = 1, table.getn(LoadITList) do
                if (LoadITList[i].name == name) then
                        return i;
                end
        end
end

function LoadIT_AddonTooltip(idx)
        local s;
        local txt = LO_YELLOW;
        local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(LoadITList[idx].name);
        local loaded = IsAddOnLoaded(LoadITList[idx].name);
        if (title) then
                txt = txt .. title .. "|r\n";
        else
                txt = txt .. name .. "|r\n";
        end

        local tmp = "";
        if (notes) then
                for s in string.gfind(notes, "%a+") do
                        if (string.len(tmp) > 30) then
                                txt = txt .. s .. "\n";
                                tmp = '';
                        else
                                txt = txt .. s .. ' ';
                                tmp = tmp .. s .. ' ';
                        end
                end 
        end
        if (string.byte(txt, string.len(txt)) ~= string.byte("\n", 1)) then
                txt = txt .. "\n";
        end
        GameTooltip:SetText(txt .. "\n", 0.5, 0.5, 0.5);

        if (enabled) then enabled = LO_GREEN .. "Yes"; else enabled = LO_RED .. "No"; end
        if (loadable) then loadable = LO_GREEN .. "Yes"; else loadable = LO_RED .. "No"; end
        if (loaded) then loaded = LO_GREEN .. "Yes"; else loaded = LO_RED .. "No"; end

        GameTooltip:AddDoubleLine(LO_BLUE_LOW .. 'Security:', security);
        GameTooltip:AddDoubleLine(LO_BLUE_LOW .. 'Loadable:', loadable);
        GameTooltip:AddDoubleLine(LO_BLUE_LOW .. 'Loaded:', loaded);
        GameTooltip:AddDoubleLine(LO_BLUE_LOW .. 'Enabled:', enabled);

        local loadondemand = IsAddOnLoadOnDemand(LoadITList[idx].name);
        if (loadondemand) then loadondemand = LO_GREEN .. "Yes"; else loadondemand = LO_RED .. "No"; end
        GameTooltip:AddDoubleLine(LO_BLUE_LOW .. 'Load On Demand:', loadondemand);

        local s = LoadIT_DependencyString(LoadITList[idx].name);
        if (s ~= '') then
                GameTooltip:AddDoubleLine(LO_BLUE_LOW .. "\nDependencies: ", "\n" .. s);
        end

end

function DDProfiles_OnLoad()

        DDProfileList = {};
        DDProfileList[1] = 'Global';

        -- * load this player's class
        DDProfileList[2] = UnitClass("player");

        -- * load profiles for all player classes (disabled for now)
--      local i = 2;
--      for key,_ in LoadITcf.Classes do
--              DDProfileList[i] = key;
--              i = i + 1;
--      end;

        if (not LoadITglo.View) then
                LoadITglo.View = 1;
        end

        UIDropDownMenu_Initialize(DDProfiles, DDProfiles_Initialize);
        UIDropDownMenu_SetSelectedID(DDProfiles, LoadITglo.View);
        UIDropDownMenu_SetText('View: ' .. DDProfileList[LoadITglo.View] .. ' Profiles', DDProfiles);

        UIDropDownMenu_SetWidth(190, DDProfiles);
        UIDropDownMenu_SetButtonWidth(190, DDProfiles);
end

function DDProfiles_OnShow()
        DDProfiles_OnLoad();
end

function DDProfiles_Initialize()
        local i;
        for i = 1, getn(DDProfileList), 1 do
                local info = { };
                info.text = DDProfileList[i] .. ' Profiles';
                info.value = DDProfileList[i];
                info.func = DDProfiles_OnClick;
                UIDropDownMenu_AddButton(info);
        end
end

function DDProfiles_OnClick()
        local id = this:GetID();
        UIDropDownMenu_SetSelectedID(DDProfiles, id);
        UIDropDownMenu_SetText('View: ' .. DDProfileList[id] .. ' Profiles', DDProfiles);

        LoadITEdit_Reset();
        LoadITProfile_OnUpdate();
        LoadITEdit_OnUpdate();

        -- * remember character's view preference
        LoadITglo.View = id;
end

function LoadITmenu_ToggleMenu()
        if (LoadITmenuFrame:IsVisible()) then
                HideUIPanel(LoadITmenuFrame);
        else
                if (LoadIT_OffScreen()) then
                        LoadIT_ResetMenu();
                end
                ShowUIPanel(LoadITmenuFrame);
        end
end