vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[---------------------------------------------------------------------------------
  AH Favorites
  Saves searches from the AH in a favorites list
  
  $Revision: 1.9 $
  $Date: 2005/10/26 11:59:43 $
------------------------------------------------------------------------------------]]

--[[
        Globals:

--]]

local DEFAULT_OPTIONS = {
        autoQuery = true,
        FSL = true,
};

-- Chat commands

AHFAV_OPTIONS = {
        {
                option = AH_FAV.AUTOQUERY,
                desc = AH_FAV.AUTOQUERY_DESC,
                method = "ToggleAutoQuery"
        },
        {
                option = AH_FAV.FSL,
                desc = AH_FAV.FSL_DESC,
                method = "ToggleFSL"
        }
};

ACE_MAP_ONOFF = {[0]="|cffff5050Off|r",[1]="|cff00ff00On|r"};

StaticPopupDialogs["AHF_SAVESEARCH"] = {
        text = AH_FAV.POPUP_TEXT,
        button1 = AH_FAV.SAVE,
        button2 = AH_FAV.CANCEL,
        hasEditBox = 1,
        maxLetters = 40,
        OnAccept = function()
                local editBox = getglobal(this:GetParent():GetName().."EditBox");
                AHFav:SaveSearch(editBox:GetText());
                this:GetParent():Hide();
        end,
        OnShow = function()
                getglobal(this:GetName().."EditBox"):SetFocus();
                getglobal(this:GetName().."EditBox"):SetText(BrowseName:GetText());
        end,
        OnHide = function()
                if ( ChatFrameEditBox:IsVisible() ) then
                        ChatFrameEditBox:SetFocus();
                end
                getglobal(this:GetName().."EditBox"):SetText("");
        end,
        EditBoxOnEnterPressed = function()
                local editBox = getglobal(this:GetParent():GetName().."EditBox");
                AHFav:SaveSearch(editBox:GetText());
                this:GetParent():Hide();
        end,
        EditBoxOnEscapePressed = function()
                this:GetParent():Hide();
        end,
        timeout = 0,
        exclusive = 1,
        whileDead = 1
};

--[[
        Class Setup

--]]

    AHFav = AceAddon:new({
        name          = AH_FAV.NAME,
        description   = AH_FAV.DESCRIPTION,
        version       = "1800.2",
        releaseDate   = "10-26-2005",
        aceCompatible = "102",
        author        = "Narwick",
        email         = "narwick@somewhere.com",
        website       = "http://",
        category      = "others",
        optionsFrame  = nil,
        db            = AceDatabase:new("AHFavDB"),
        defaults      = DEFAULT_OPTIONS,
        cmd           = AceChatCmd:new(AH_FAV.COMMANDS, AHFAV_OPTIONS),
    })

    function AHFav:Initialize()
                self.GetOpt = function(var) local v=self.db:get(self.profilePath,var) return v end
                self.SetOpt = function(var,val) self.db:set(self.profilePath,var,val)   end
                self.TogOpt = function(var) return self.db:toggle(self.profilePath,var) end
                
                if (self.GetOpt("autoQuery") == nil) then
                        self.SetOpt("autoQuery", DEFAULT_OPTIONS.autoQuery);
                end
                

                if (self.GetOpt("FSL") == nil) then
                        self.SetOpt("FSL", DEFAULT_OPTIONS.FSL);
                end

                -- setup search accessor/setter
                self.GetSearch = function(key)
                        local v=self.db:get({self.profilePath, "AHFavSearches"}, key)
                        return v 
                end
                self.SetSearch = function(key, val) self.db:set({self.profilePath, "AHFavSearches"}, key, val) end;
                self.AllSearches = function() 
                        local v = self.db:get(self.profilePath, "AHFavSearches");
                        if (v == nill) then
                                return {}
                        end
                        return v;
                end
                
                -- register to be notified when AH interface comes up
                self:RegisterEvent("AUCTION_HOUSE_SHOW", "Position")
                
                -- Tell the user we're initialized
                DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.INITMSG, 0.8, 0.8, 0.2);
    end

        -- Enable disable simply show or hide the frame
    function AHFav:Enable()
                DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.ENABLE_MSG, 0.8, 0.8, 0.2);
                AHFavs:Show();
    end

    function AHFav:Disable()
                DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.DISABLE_MSG, 0.8, 0.8, 0.2);
                AHFavs:Hide();
    end

        -- Toggle AutoQuery
        function AHFav:ToggleAutoQuery()
                self.TogOpt("autoQuery");
                if (self.GetOpt("autoQuery")) then
                        DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.AUTOQUERY_ENABLE_MSG, 0.8, 0.8, 0.2);
                else
                        DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.AUTOQUERY_DISABLE_MSG, 0.8, 0.8, 0.2);
                end
        end
        
        -- Toggle FSL integration
        function AHFav:ToggleFSL()
                self.TogOpt("FSL");
                if (self.GetOpt("FSL")) then
                        DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.FSL_ENABLE_MSG, 0.8, 0.8, 0.2);
                else
                        DEFAULT_CHAT_FRAME:AddMessage(AH_FAV.FSL_DISABLE_MSG, 0.8, 0.8, 0.2);
                end
        end

        function AHFav:GetFSL()
                if (self.GetOpt) then
                        local v = self.GetOpt("FSL")
                        return v
                else
                        return nil
                end
        end
        
        -- Save the current search criteria
        function AHFav:SaveSearch(searchName)

                -- Gather up the fields
                local lastSearch = { 
                        name = BrowseName:GetText(), 
                        minLevel = BrowseMinLevel:GetText(), 
                        maxLevel = BrowseMaxLevel:GetText(), 
                        invTypeIndex = AuctionFrameBrowse.selectedInvtypeIndex, 
                        classIndex = AuctionFrameBrowse.selectedClassIndex,
                        subclassIndex = AuctionFrameBrowse.selectedSubclassIndex,
                        subclass = AuctionFrameBrowse.selectedSubclass,
                        isUsable = IsUsableCheckButton:GetChecked(),
                        showOnPlayer = ShowOnPlayerCheckButton:GetChecked(),
                        qualityIndex = UIDropDownMenu_GetSelectedValue(BrowseDropDown)
                }
                
                -- now save them
                self.SetSearch(searchName, lastSearch);
                
                -- reinitialize the popup to set the new value in the proper place
                UIDropDownMenu_Initialize(AHFavs, SearchesDropDown_Initialize);

                -- set the popup list to the newly saved entry
                
                -- This is the way to do it looking at the API, but when
                -- a pseudo dropdown is being used, an internal call
                -- to SetText in UIDropDown.lua fails because there
                -- is no currently selected label.
--              UIDropDownMenu_SetSelectedName(AHFavs, searchName);

                -- Instead, set the internal vars directly.  This may blow up at
                -- some point in the future, but oh well.
                AHFavs.selectedName = searchName;
                AHFavs.selectedID = nil;
                AHFavs.selectedValue = nil;

        end
        
        function AHFav:LoadSearch(searchName, clear)

                -- initialze for a blank search
                local lastSearch = { 
                        name = "",
                        minLevel = "",
                        maxLevel = "",
                        qualityIndex = -1,
                };
                
                -- Get the selected search              
                if (not clear) then 
                        lastSearch = self.GetSearch(searchName);
                end
                                
                -- Load the fields
                BrowseName:SetText(lastSearch["name"]);
                BrowseMinLevel:SetText(lastSearch["minLevel"]);
                BrowseMaxLevel:SetText(lastSearch["maxLevel"]);
                AuctionFrameBrowse.selectedInvtypeIndex = lastSearch["invTypeIndex"];
                AuctionFrameBrowse.selectedClassIndex = lastSearch["classIndex"];
                AuctionFrameBrowse.selectedClass = CLASS_FILTERS[lastSearch["classIndex"]];
                AuctionFrameBrowse.selectedSubclassIndex = lastSearch["subclassIndex"];
                AuctionFrameBrowse.selectedSubclass = lastSearch["subclass"];
                IsUsableCheckButton:SetChecked(lastSearch["isUsable"]);
                ShowOnPlayerCheckButton:SetChecked(lastSearch["showOnPlayer"]);
                UIDropDownMenu_SetSelectedValue(BrowseDropDown, lastSearch["qualityIndex"]);
                
                -- Tell the filters to update
                AuctionFrameFilters_Update();
                
                -- Tell the rarity pulldown to update
                UIDropDownMenu_Refresh(BrowseDropDown, false);
                
                -- Update the popup to the current search, or clear it
                if (not clear) then
                        -- See notes in SaveSearch
--                      UIDropDownMenu_SetSelectedName(AHFavs, searchName);
                        AHFavs.selectedName = searchName;
                        AHFavs.selectedID = nil;
                        AHFavs.selectedValue = nil;
                else
                        -- See notes in SaveSearch
--                      UIDropDownMenu_ClearAll(AHFavs);
                        AHFavs.selectedName = nil;
                        AHFavs.selectedID = nil;
                        AHFavs.selectedValue = nil;
                end
                
                -- auto run the loaded search
                if ((not clear) and self.GetOpt("autoQuery") and CanSendAuctionQuery()) then
                        AuctionFrameBrowse_Search()
                end
                
        end
        
        function AHFav:DeleteSearch(searchName)
        
                -- check if nothing is selected, return if so
                if (searchName == nil) then
                        return
                end
                
                -- Remove the search
                self.SetSearch(searchName, nil);
                
                -- Clear the previously selected search
                -- See notes in SaveSearch
--              UIDropDownMenu_ClearAll(AHFavs);
                AHFavs.selectedName = nil;
                AHFavs.selectedID = nil;
                AHFavs.selectedValue = nil;
        end

        
        -- Ace report
        function AHFav:Report()
                self.cmd:report({
                        {text=AH_FAV.AUTOQUERY, val=self.GetOpt("autoQuery"), map=ACE_MAP_ONOFF},
                        {text=AH_FAV.FSL_NAME, val=self.GetOpt("FSL"), map=ACE_MAP_ONOFF},
                })
        end
        
        -- GUI Functions
        
        function AHFav:SearchesDropDown_OnLoad()
                UIDropDownMenu_Initialize(this:GetParent(), SearchesDropDown_Initialize);
                UIDropDownMenu_SetAnchor(-124, 0, this:GetParent(), "TOPLEFT", this:GetName(), "BOTTOMRIGHT")
        end
        
        function SearchesDropDown_Initialize()
        
                -- Skip everything if AHFav object hasn't loaded yet
                if (not AHFav) then
                        return
                end
                
                local info = {};
                local searches = {};

                -- Add a title item
                local favoritesTitle = {};
                favoritesTitle.text = AH_FAV.FAVORITES;
                favoritesTitle.notClickable = true;
                favoritesTitle.notCheckable = true;
                
                UIDropDownMenu_AddButton(favoritesTitle);
                
                -- Add all the saved searches
                if (AHFav.AllSearches) then
                        searches = AHFav:AllSearches();
                end
                                                
                for i,v in pairsByKeys(searches) do
                        info.text = i;
                        local staticText = i;
                        info.func = function () AHFav:LoadSearch(staticText); end;
                        info.checked = false;
                        UIDropDownMenu_AddButton(info);
                end
                
                -- Separator
                local separator = {};
                separator.text = "--------";
                separator.notClickable = true;
                separator.notCheckable = true;
                
                UIDropDownMenu_AddButton(separator);
                
                -- Save Button
                info.text = AH_FAV.SAVE;
                info.func = function () StaticPopup_Show("AHF_SAVESEARCH"); end;
                info.notCheckable = true;
                info.checked = false;

                UIDropDownMenu_AddButton(info);
                
                -- Delete Button
                info.text = AH_FAV.DELETE;
                info.func = function ()
                        currentSearch = UIDropDownMenu_GetSelectedName(AHFavs);
                        AHFav:DeleteSearch(currentSearch); 
                end;
                info.notCheckable = true;
                info.checked = false;
                
                UIDropDownMenu_AddButton(info);

                -- Clear Button
                info.text = AH_FAV.CLEAR;
                info.func = function ()
                        AHFav:LoadSearch(nil, true); 
                end;
                info.notCheckable = true;
                info.checked = false;
                
                UIDropDownMenu_AddButton(info);
                
                -- Add ShoppingList if enabled
                
                if (AHFav:GetFSL()) then
                        -- check if FSL is enabled
                        if (FSL_Config and FSL_Config.Enabled) then
                        
                                -- Add a separator
                                UIDropDownMenu_AddButton(separator);
                        
                                -- Add ShoppingList Header
                                local SLseparator = {};
                                SLseparator.text = AH_FAV.FSL_SHORT;
                                SLseparator.notClickable = true;
                                SLseparator.notCheckable = true;
                                
                                UIDropDownMenu_AddButton(SLseparator);
                                
                                -- Get the ShoppingList
                                local realm = GetCVar("realmName");
                                local realmList = FSL_ShoppingList[realm];

                                if realmList == nil then return; end

                                -- Loop through and add items
                                for _, itemLink in realmList do
                                        -- Get the name
                                        local name = GetItemInfo(itemLink);
                                        local staticItemLink = itemLink;

                                        info.value = itemLink
                                        info.func = function () AHFav:LoadSLSearch(staticItemLink) end
                                        info.checked = false
                                        info.notCheckable = false

                                        -- Totally lame that GetItemInfo doesn't return if not in local cache
                                        -- do this hack to get the name in that case
                                        -- technique stolen from LootLink
                                        if (not name) then
                                                for litem, lname in string.gfind(itemLink, "|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h") do
                                                        info.text = lname
                                                end
                                        else
                                                info.text = name
                                        end
                                        UIDropDownMenu_AddButton(info);
                                end
                        end
                end

        end
        
        function AHFav:LoadSLSearch(itemLink)

                local name = GetItemInfo(itemLink);
                
                if (not name) then
                        for litem, lname in string.gfind(itemLink, "|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h") do
                                name = lname
                        end             
                end
                
                -- Load the fields
                BrowseName:SetText(name);
                BrowseMinLevel:SetText("");
                BrowseMaxLevel:SetText("");
                AuctionFrameBrowse.selectedInvtypeIndex = nil;
                AuctionFrameBrowse.selectedClassIndex = nil;
                AuctionFrameBrowse.selectedClass = nil;
                AuctionFrameBrowse.selectedSubclassIndex = nil;
                AuctionFrameBrowse.selectedSubclass = nil;
                IsUsableCheckButton:SetChecked(nil);
                UIDropDownMenu_SetSelectedValue(BrowseDropDown, nil);
                
                -- Tell the filters to update
                AuctionFrameFilters_Update();
                
                -- Update the popup to the current search, or clear it
                -- See notes in SaveSearch
--              UIDropDownMenu_SetSelectedName(AHFavs, name);
                
                AHFavs.selectedName = name;
                AHFavs.selectedID = nil;
                AHFavs.selectedValue = nil;
                
                -- auto run the loaded search
                if (self.GetOpt("autoQuery") and CanSendAuctionQuery()) then
                        AuctionFrameBrowse_Search()
                end

        end
        
        -- repositions AHFav dropdown with dynamic loaded AH interface
        function AHFav:Position()
                AHFavs:ClearAllPoints()
                AHFavs:SetParent("AuctionFrameBrowse")
                AHFavs:SetFrameStrata("HIGH")
                AHFavs:SetPoint("TOPLEFT", "AuctionFrameBrowse", "TOPLEFT", 195, -45)
                AHFavsButton:Show()
                AHFavs:Show()
        end
        
        -- Utility function to sort searches
        -- Lifted from LUA book online
        function pairsByKeys (t, f)
                local a = {}
                for n in pairs(t) do table.insert(a, n) end
                table.sort(a, f)
                local i = 0      -- iterator variable
                local iter = function ()   -- iterator function
                        i = i + 1
                        if a[i] == nil then return nil
                        else return a[i], t[a[i]]
                        end
                end
                return iter
    end

--[[
        register the class

--]]

    AHFav:RegisterForLoad()