vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
GuildAdsShiftClick = {

        metaInformations = {
                name = "GuildAdsShiftClick",
                guildadsCompatible = 100,
        };
        
        -- hook
        callHook = {};
        hookName = {};
        
        hook = function(id, hook, new)
                if getglobal(hook) then
                        GuildAdsShiftClick.hookName[id] = hook;
                        GuildAdsShiftClick.callHook[id] = getglobal(hook);
                        setglobal(hook, new);
                end
        end;
        
        unhook = function(id)
                if id and GuildAdsShiftClick.hookName[id] then
                        setglobal(GuildAdsShiftClick.hookName[id], GuildAdsShiftClick.callHook[id]);
                        GuildAdsShiftClick.hookName[id] = nil;
                        GuildAdsShiftClick.callHook[id] = nil;
                end
        end;
        
        -- onInit
        onInit = function()
                -- Patch in inventory OnClick
                GuildAdsShiftClick.hook("inventory", "ContainerFrameItemButton_OnClick", GuildAdsShiftClick.inventoryOnClick);
                
                -- Patch in chat link
                GuildAdsShiftClick.hook("chatFrameHyperlink", "ChatFrame_OnHyperlinkShow", GuildAdsShiftClick.chatFrameOnHyperlinkShow);
                
                -- Patch in bank OnClick
                GuildAdsShiftClick.hook("bank", "BankFrameItemButtonGeneric_OnClick", GuildAdsShiftClick.bankOnClick);
                
                -- Patch in paperdoll
                GuildAdsShiftClick.hook("paperdoll", "PaperDollItemSlotButton_OnClick", GuildAdsShiftClick.paperdollOnClick)
                
                -- Patch in merchant OnClick
                GuildAdsShiftClick.hook("merchant", "MerchantItemButton_OnClick", GuildAdsShiftClick.merchantOnClick);
                
                -- Patch in quest item OnClick
                -- GuildAdsShiftClick.hook("questProgress", "QuestItem_OnClick", GuildAdsShiftClick.quest.progressOnClick);
                -- GuildAdsShiftClick.hook("questReward", "QuestRewardItem_OnClick", GuildAdsShiftClick.quest.rewardOnClick);
                
                -- Patch in inspect : on parse of the LUA file
                
                -- Patch in auction house : on parse of the LUA file
                
                -- Patch in trade skill : on parse of the LUA file
                
                -- Patch in craft : on parse of the LUA file
                
                -- Patch in AllInOneInventory item OnClick
                GuildAdsShiftClick.hook("allInOneInventory", "AllInOneInventoryFrameItemButton_OnClick", GuildAdsShiftClick.allInOneInventoryOnClick)

                -- Patch in MyInventory item OnlLick
                GuildAdsShiftClick.hook("myInventory", "MyInventoryFrameItemButton_OnClick", GuildAdsShiftClick.myInventoryOnClick);
                
                -- Patch in EngInventory
                GuildAdsShiftClick.hook("engInventory", "EngInventory_ItemButton_OnClick", GuildAdsShiftClick.engInventoryOnClick);

                -- Patch in MyBank
                GuildAdsShiftClick.hook("myBank", "MyBankFrameItemButton_OnClick", GuildAdsShiftClick.myBankOnClick);
                
                -- Patch in BankItems OnClick
                GuildAdsShiftClick.hook("bankItemsItem", "BankItems_Button_OnClick", GuildAdsShiftClick.bankItems.itemOnClick);
                GuildAdsShiftClick.hook("bankItemsBag", "BankItems_BagItem_OnClick", GuildAdsShiftClick.bankItems.bagOnClick);
                
                -- Patch in BankStatement
                GuildAdsShiftClick.hook("bankStatementItem", "BankStatementItemButton_OnClick", GuildAdsShiftClick.bankStatement.itemOnClick);
                GuildAdsShiftClick.hook("bankStatementBag", "BankStatementContainerFrameItemButton_OnClick", GuildAdsShiftClick.bankStatement.bagOnClick);
                
                -- Patch in ItemsMatrix item  OnClick
                GuildAdsShiftClick.hook("itemMatrix", "ItemsMatrixItemButton_OnClick", GuildAdsShiftClick.itemMatrixOnClick);
                
                -- Patch in LootLink item OnClick
                GuildAdsShiftClick.hook("lootLink", "LootLinkItemButton_OnClick", GuildAdsShiftClick.lootLink.onClick);
        end;
        
        -- hook this click ?
        hookTest = function(button)
                return GuildAdsFrame:IsVisible() and IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown();
        end;
        
        -- set current item in GuildAds window
        setItem = function(button, link, texture, itemCount, text)
                if(link) then
                        GuildAds_MyAdsEdit(nil);
                        GuildAds_setEditItem(text, link, texture, itemCount);
                else
                        GuildAdsShiftClick.debug("Clicked on empty");
                end
        end;
        
        -- Inventory
        inventoryOnClick = function(button, ignoreShift)
                if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
                        local texture, itemCount = GetContainerItemInfo(this:GetParent():GetID(), this:GetID());
                        local link = GetContainerItemLink(this:GetParent():GetID(), this:GetID());
                        GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                else
                        GuildAdsShiftClick.callHook.inventory(button, ignoreShift);
                end
        end;

        -- Link into chatframe  
        chatFrameOnHyperlinkShow = function(link, text, button)
                if (GuildAdsShiftClick.hookTest(button)) then
                        if string.sub(link, 1, 5) == "item:" then
                                local info = GAS_GetItemInfo(link);
                                GuildAdsShiftClick.setItem(button, text, info.texture, 1);
                        else
                                GuildAdsShiftClick.callHook.chatFrameHyperlink(link, text, button);
                        end
                else
                        GuildAdsShiftClick.callHook.chatFrameHyperlink(link, text, button);
                end             
        end;
        
        -- Bank
        bankOnClick = function(button)
                if(GuildAdsShiftClick.hookTest(button)) then
                        local texture, itemCount = GetContainerItemInfo(BANK_CONTAINER, this:GetID());
                        local link = GetContainerItemLink(BANK_CONTAINER, this:GetID());
                        GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                else
                        GuildAdsShiftClick.callHook.bank(button);
                end
        end;
        
        -- Paperdoll
        paperdollOnClick = function(button, ignoreModifiers)
                if (GuildAdsShiftClick.hookTest(button) and not ignoreModifiers) then
                        local texture = GetInventoryItemTexture("player", this:GetID());
                        local count;
                        if texture then
                                count = GetInventoryItemCount("player", this:GetID());
                        end
                        local link = GetInventoryItemLink("player", this:GetID());
                        GuildAdsShiftClick.setItem(button, link, texture, count);
                else
                        GuildAdsShiftClick.callHook.paperdoll(button, ignoreModifiers);
                end
        end;
        
        -- Merchant
        merchantOnClick = function(button, ignoreModifiers)
                if button=="LeftButton" and not ignoreModifiers and GuildAdsShiftClick.hookTest(button) then
                        local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(this:GetID());
                        local link = GetMerchantItemLink(this:GetID());
                        if (quantity == 1) then
                                quantity = nil;
                        end
                        GuildAdsShiftClick.setItem(button, link, texture, quantity);
                else
                        GuildAdsShiftClick.callHook.merchant(button, ignoreModifiers);
                end
        end;
        
        -- Quest 
        quest = {
        
                itemOnClick = function(hookToCall, button, ignoreModifiers)
                        if GuildAdsShiftClick.hookTest(button) and this.rewardType ~= "spell" then
                                local name, texture, numItems, quality, isUsable = GetQuestItemInfo(this.type, this:GetID());
                                local link = GetQuestItemLink(this.type, this:GetID());
                                GuildAdsShiftClick.setItem(button, link, texture, nil);
                        else
                                hookToCall(button, ignoreModifiers);
                        end
                end;
                
                progressOnClick = function(button, ignoreModifiers)
                        GuildAdsShiftClick.quest.itemOnClick(GuildAdsShiftClick.callHook.questProgress);
                end;
                
                rewardOnClick = function(button, ignoreModifiers)
                        GuildAdsShiftClick.quest.itemOnClick(GuildAdsShiftClick.callHook.questReward);
                end;
                
        };
        
        -- Inspect
        inspect = {
                
                notHook = true;
        
                loadUI = function()
                        GuildAdsShiftClick.callHook.inspectLoadUI();
                        
                        if GuildAdsShiftClick.inspect.notHook then
                                GuildAdsShiftClick.inspect.notHook = nil;
                                GuildAdsShiftClick.hook("inspect", "InspectPaperDollItemSlotButton_OnClick", GuildAdsShiftClick.inspect.onClick);
                        end
                end;
        
                onClick = function(button)
                        if GuildAdsShiftClick.hookTest(button) then
                                local link = GetInventoryItemLink(InspectFrame.unit, this:GetID());
                                local texture = GetInventoryItemTexture(InspectFrame.unit, this:GetID());
                                local count;
                                if ( textureName ) then
                                        count = GetInventoryItemCount(unit, button:GetID());
                                end
                                GuildAdsShiftClick.setItem(button, link, texture, count);
                        else
                                GuildAdsShiftClick.callHook.inspect(button);
                        end
                end;
                
        };
        
        -- Auction House
        auctionHouse = {
        
                notHook = true;
        
                loadUI = function()
                        GuildAdsShiftClick.callHook.auctionHouseLoadUI();
                        
                        if GuildAdsShiftClick.auctionHouse.notHook then
                                GuildAdsShiftClick.auctionHouse.notHook = nil;
                                
                                -- Patch in auction OnClick
                                GuildAdsShiftClick.callHook.auctionHouseItemOnClick = BrowseButton1Item:GetScript("OnClick");
                                GuildAdsShiftClick.callHook.auctionHouseLineOnClick = BrowseButton1:GetScript("OnClick");
                                for i=1,9 do 
                                        local button = getglobal("BrowseButton"..i.."Item");
                                        if button then
                                                button:SetScript("OnClick", GuildAdsShiftClick.auctionHouse.itemOnClick);
                                        end;
                                        button = getglobal("BrowseButton"..i);
                                        if button then
                                                button:SetScript("OnClick", GuildAdsShiftClick.auctionHouse.lineOnClick);
                                        end;
                                end
                                
                        end
                end;
                
                itemOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local index = this:GetParent():GetID()+FauxScrollFrame_GetOffset(BrowseScrollFrame);
                                local name, texture, itemCount = GetAuctionItemInfo("list", index);
                                local link = GetAuctionItemLink("list", index);
                                GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                        else
                                GuildAdsShiftClick.callHook.auctionHouseItemOnClick(button);
                        end
                end;
                
                lineOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local index = this:GetID()+FauxScrollFrame_GetOffset(BrowseScrollFrame);
                                local name, texture, itemCount = GetAuctionItemInfo("list", index);
                                local link = GetAuctionItemLink("list", index);
                                GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                        else
                                GuildAdsShiftClick.callHook.auctionHouseLineOnClick(button);
                        end
                end;

        };
        
        -- Tradeskill
        tradeSkill = {
        
                notHook = true;
                
                loadUI = function()
                        GuildAdsShiftClick.callHook.tradeSkillLoadUI();
                        
                        if GuildAdsShiftClick.tradeSkill.notHook then
                                GuildAdsShiftClick.tradeSkill.notHook = nil;
                                
                                -- TradeSkillSkillIcon
                                GuildAdsShiftClick.callHook.tradeSkillSkillOnClick = TradeSkillSkillIcon:GetScript("OnClick");
                                TradeSkillSkillIcon:SetScript("OnClick", GuildAdsShiftClick.tradeSkill.SkillOnClick);

                                -- TradeSkillReagent1 .. TradeSkillReagent8
                                GuildAdsShiftClick.callHook.tradeSkillReagentOnClick = TradeSkillReagent1:GetScript("OnClick");
                                for i=1,TRADE_SKILLS_DISPLAYED do
                                        local button = getglobal("TradeSkillReagent"..i);
                                        if button then
                                                button:SetScript("OnClick", GuildAdsShiftClick.tradeSkill.ReagentOnClick);
                                        end;
                                end
                                
                        end
                end;
                
                SkillOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local id = TradeSkillFrame.selectedSkill;
                                local link = GetTradeSkillItemLink(id);
                                local texture = GetTradeSkillIcon(id);
                                local minMade, maxMade = GetTradeSkillNumMade(id);
                                GuildAdsShiftClick.setItem(button, link, texture, minMade);
                        else
                                GuildAdsShiftClick.callHook.tradeSkillSkillOnClick(button);
                        end;
                end;
                
                ReagentOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(TradeSkillFrame.selectedSkill, this:GetID());
                                local link = GetTradeSkillReagentItemLink(TradeSkillFrame.selectedSkill, this:GetID());
                                GuildAdsShiftClick.setItem(button, link, reagentTexture, reagentCount);
                        else
                                GuildAdsShiftClick.callHook.tradeSkillReagentOnClick(button);
                        end;
                end;
                
        };
        
        -- Craft 
        craft = {
        
                notHook = true;
        
                loadUI = function()
                
                        -- call old function
                        GuildAdsShiftClick.callHook.craftLoadUI();
                        
                        if GuildAdsShiftClick.craft.notHook then
                                GuildAdsShiftClick.craft.notHook = nil;                 
                
                                -- CraftIcon
                                GuildAdsShiftClick.callHook.craftIconOnClick = CraftIcon:GetScript("OnClick");
                                CraftIcon:SetScript("OnClick", GuildAdsShiftClick.craft.iconOnClick);
        
                                -- CraftReagent1 .. CraftReagent8
                                GuildAdsShiftClick.callHook.reagentIconOnClick = CraftReagent1:GetScript("OnClick");
                                for i=1,CRAFTS_DISPLAYED do
                                        local button = getglobal("CraftReagent"..i);
                                        if button then
                                                button:SetScript("OnClick", GuildAdsShiftClick.craft.reagentOnClick);
                                        end;
                                end     
                        end
                end;
                
                iconOnClick = function(button)
                        if GuildAdsShiftClick.hookTest(button) then
                                local id = GetCraftSelectionIndex();
                                local craftName, craftSubSpellName, craftType, numAvailable, isExpanded = GetCraftInfo(id);
                                local texture = GetCraftIcon(id);
                                local craftDesc = GetCraftDescription(id);              
                                GuildAdsShiftClick.setItem(button, GAS_PackLink("ffffffff", nil, craftName), texture, nil, craftDesc);
                        else
                                GuildAdsShiftClick.callHook.craftIconOnClick(button);
                        end
                end;
                
                reagentOnClick = function(button)
                        if GuildAdsShiftClick.hookTest(button) then
                                local id = GetCraftSelectionIndex();
                                local link = GetCraftReagentItemLink(id, this:GetID());
                                local reagentName, reagentTexture, reagentCount, playerReagentCount = GetCraftReagentInfo(id, this:GetID());
                                GuildAdsShiftClick.setItem(button, link, reagentTexture, reagentCount);
                        else
                                GuildAdsShiftClick.callHook.reagentIconOnClick(button);
                        end
                end;
        
        };      
        
        -- AllInOneInventory
        allInOneInventoryOnClick = function(button, ignoreShift)
                if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
                        local bag, slot = AllInOneInventory_GetIdAsBagSlot(this:GetID());
                        local texture, itemCount = GetContainerItemInfo(bag, slot);
                        local link = GetContainerItemLink(bag,slot);
                        GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                else
                        GuildAdsShiftClick.callHook.allInOneInventory(button, ignoreShift);
                end
        end;
        
        -- MyInventory
        myInventoryOnClick = function(button, ignoreShift)
                if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
                        local texture, itemCount = GetContainerItemInfo(this.bagIndex, this.itemIndex);
                        local link = GetContainerItemLink(this.bagIndex, this.itemIndex);
                        GuildAdsShiftClick.setItem(button, link, texture, itemCount);
                else
                        GuildAdsShiftClick.callHook.myInventory(button, ignoreShift);
                end
        end;
        
        -- EngInventory
        engInventoryOnClick = function(arg1)
                if GuildAdsShiftClick.hookTest(arg1) then
                        if (EngInventory_buttons[this:GetName()] ~= nil) then
                                bar = EngInventory_buttons[this:GetName()]["bar"];
                                position = EngInventory_buttons[this:GetName()]["position"];
        
                                bag = EngInventory_bar_positions[bar][position]["bagnum"];
                                slot = EngInventory_bar_positions[bar][position]["slotnum"];
                        
                                local texture, itemCount = GetContainerItemInfo(bag, slot);
                                local link = GetContainerItemLink(bag,slot);
                                GuildAdsShiftClick.setItem(button, link, texture, itemCount);                   
                        end
                else
                        GuildAdsShiftClick.callHook.engInventory(arg1);
                end
        end;
        
        -- MyBank
        myBankOnClick = function(button, ignoreShift)
                if(GuildAdsShiftClick.hookTest(button)) then
                        local myLink;
                        local item = MyBank_GetBag(this.bagIndex)[this.itemIndex];
                        if ItemsMatrix_GetLink then
                                myLink = ItemsMatrix_GetLink(item["name"]);
                        elseif LootLink_GetLink then
                                myLink = LootLink_GetLink(item["name"]);
                        else
                                myLink = MyBank_GetLink(item);
                        end
                        local icon, count = GetContainerItemInfo(this.bagIndex, this.itemIndex);
                        GuildAdsShiftClick.setItem(button, myLink, icon, count);
                else
                        GuildAdsShiftClick.callHook.myBank(button, ignoreShift);
                end
        end;
        
        -- BankItems
        bankItems = {
                
                itemOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local playerName = UIDropDownMenu_GetSelectedValue(BankItems_UserDropdown) 
                                local item = BankItems_Save[playerName][this:GetID()];
                                if (item) then
                                        GuildAdsShiftClick.setItem(button, item.link, item.icon, item.count);
                                end
                        else
                                GuildAdsShiftClick.callHook.bankItemsItem(button);
                        end
                end;
                
                bagOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local playerName = UIDropDownMenu_GetSelectedValue(BankItems_UserDropdown) 
                                local bag = BankItems_Save[playerName]["Bag"..this:GetParent():GetID()];
                                local itemID = bag.size - ( this:GetID() - 1 );
                                local item = bag[itemID];
                                if (item) then
                                        GuildAdsShiftClick.setItem(button, item.link, item.icon, item.count);
                                end
                        else
                                GuildAdsShiftClick.callHook.bankItemsBag(button);
                        end
                end;
        
        };
        
        -- BankStatement
        bankStatement = {
        
                getItemInfo = function(container, itemNum)
                        local item;
                        local player = BankStatementGetBSIIndex();
                        if (BankStatementItems and BankStatementItems[player]) then
                                if (itemNum == "bag") then
                                        item = BankStatementItems[player][container];
                                else
                                        if (BankStatementItems[player][container]) then
                                                item = BankStatementItems[player][container][itemNum];
                                        end
                                end
                        end
                        return item.link, item.icon, item.quantity;
                end;
                
                itemOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local link, icon, count = GuildAds_BS_GetItemInfo("bank", this:GetID());
                                GuildAdsShiftClick.setItem(button, link, icon, count);
                        else
                                GuildAdsShiftClick.callHook.bankStatementItem(button);
                        end
                end;
                
                bagOnClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local link, icon, count = GuildAds_BS_GetItemInfo("bag"..this:GetParent():GetID(), this:GetID());
                                GuildAdsShiftClick.setItem(button, link, icon, count);          
                        else
                                GuildAdsShiftClick.callHook.bankStatementBag(button);
                        end
                end;
        
        };
        
        -- ItemMatrix
        itemMatrixOnClick = function(button)
                if GuildAdsShiftClick.hookTest(button) then
                        --only input if link is linkable
                        if(IM_GetData(this:GetText(), "item")) then
                                local nameGIF, linkGIF, qualityGIF, minLevelGIF, classGIF, subclassGIF, maxStackGIF = GetItemInfo(IM_GetData(this:GetText(), "item"));
                                if(linkGIF and qualityGIF and nameGIF) then
                                        if(qualityGIF == 5) then --legendary
                                                useColor = "ffff8000";
                                        elseif(qualityGIF == 4) then --epic
                                                useColor = "ffa335ee";
                                        elseif(qualityGIF == 3) then --rare
                                                useColor = "ff0070dd";
                                        elseif(qualityGIF == 2) then --uncommon
                                                useColor = "ff1eff00";
                                        elseif(qualityGIF == 1) then--white
                                                useColor = "ffffffff";
                                        elseif(qualityGIF == 0) then--poor
                                                useColor = "ff9d9d9d";
                                        elseif(qualityGIF == -1) then--poor
                                                useColor = "ff9d9d9d";
                                        else
                                                useColor = "ff57BDFB";
                                        end

                                        --now insert it
                                        if(useColor) then       
                                                GuildAdsShiftClick.setItem(button, "|c"..useColor.."|H"..linkGIF.."|h["..nameGIF.."]|h|r", nil, nil);
                                        end
                                end
                        end
                else
                        GuildAdsShiftClick.callHook.itemMatrix(button);
                end
        end;

        
        -- LootLink
        lootLink = {
        
                -- Handle Lootlink OnClick events
                checkItemServer = function(item)
                -- If we haven't converted and this item predates multiple server support, count it as valid
                        if      (not item._) 
                            and ((not LootLinkState or not LootLinkState.DataVersion) or (LootLinkState.DataVersion < 110) ) then
                                return 1;
                        end
        
                        -- normal case (LootLink_CheckItemServerRaw function)
                        if item.s then
                                local index = LootLinkState.ServerNamesToIndices[GetRealmName()];
                                for server in string.gfind(item.s, "(%d+)") do
                                        if tonumber(server) == index then
                                                return 1;
                                        end
                                end
                        end
        
                        if( not item.s ) then
                                return nil;
                        end
        
                        return nil;
                end;
                
                getLink = function(name)
                        local itemLink = ItemLinks[name];
                        if( itemLink and itemLink.c and itemLink.i and GuildAdsShiftClick.lootLink.checkItemServer(itemLink) ) then
                                -- Remove instance-specific data that we captured from the link we return
                                local item = string.gsub(itemLink.i, "(%d+):(%d+):(%d+):(%d+)", "%1:0:%3:%4");
                                return "|c"..itemLink.c.."|Hitem:"..item.."|h["..name.."]|h|r";
                        end
                        return nil;
                end;
                
                onClick = function(button)
                        if(GuildAdsShiftClick.hookTest(button)) then
                                local link = GuildAdsShiftClick.lootLink.getLink(this:GetText());
                                GuildAdsShiftClick.setItem(button, link, nil, nil);
                        else
                                GuildAdsShiftClick.callHook.lootLink(button);
                        end
                end;
        
        };

};

GuildAdsPlugin.UIregister(GuildAdsShiftClick);
GuildAdsShiftClick.hook("inspectLoadUI", "InspectFrame_LoadUI", GuildAdsShiftClick.inspect.loadUI);
GuildAdsShiftClick.hook("auctionHouseLoadUI", "AuctionFrame_LoadUI", GuildAdsShiftClick.auctionHouse.loadUI);
GuildAdsShiftClick.hook("tradeSkillLoadUI", "TradeSkillFrame_LoadUI", GuildAdsShiftClick.tradeSkill.loadUI);
GuildAdsShiftClick.hook("craftLoadUI", "CraftFrame_LoadUI", GuildAdsShiftClick.craft.loadUI);