vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Allows the mail frame to be pushed
if ( UIPanelWindows["MailFrame"] ) then
        UIPanelWindows["MailFrame"].pushable = 1;
else
        UIPanelWindows["MailFrame"] = { area = "left", pushable = 1 };
end
-- This makes sure the FriendsFrame will close if you try to open a mail with mailframe+friendsframe open
if ( UIPanelWindows["FriendsFrame"] ) then
        UIPanelWindows["FriendsFrame"].pushable = 2;
else
        UIPanelWindows["FriendsFrame"] = { area = "left", pushable = 2 };
end
CT_MAIL_NUMITEMBUTTONS = 21;

-- Hook the ContainerFrameItemButton_OnClick function
local CT_MM_oldCFIB_OC = ContainerFrameItemButton_OnClick;

function CT_MM_ContainerFrameItemButton_OnClick(btn, ignore)
        if ( CT_Mail_GetItemFrame(this:GetParent():GetID(), this:GetID()) ) then
                return;
        end

        CT_MM_oldCFIB_OC(btn, ignore);

        CT_Mail_UpdateItemButtons();
end

ContainerFrameItemButton_OnClick = CT_MM_ContainerFrameItemButton_OnClick;

CT_oldPickupContainerItem = PickupContainerItem;

function CT_newPickupContainerItem(bag, item, special)
        if ( ( CT_Mail_GetItemFrame(bag, item) or ( CT_Mail_addItem and CT_Mail_addItem[1] == bag and CT_Mail_addItem[2] == item ) ) and not special ) then
                return;
        end
        if ( not CursorHasItem() ) then
                CT_MailFrame.bag = bag;
                CT_MailFrame.item = item;
        end
        if ( IsAltKeyDown() and CT_MailFrame:IsVisible() and not CursorHasItem() ) then
                local i;
                for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                        if ( not getglobal("CT_MailButton" .. i).item ) then

                                local canMail = CT_Mail_ItemIsMailable(bag, item);
                                if ( canMail ) then
                                        DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Cannot attach item, item is " .. canMail, 1, 0.5, 0);
                                        return;
                                end

                                CT_oldPickupContainerItem(bag, item);
                                CT_MailButton_OnClick(getglobal("CT_MailButton" .. i));
                                CT_Mail_UpdateItemButtons();
                                return;
                        end
                end
        elseif ( IsAltKeyDown() and SendMailFrame:IsVisible() and not CursorHasItem() ) then
                CT_oldPickupContainerItem(bag, item);
                ClickSendMailItemButton();
                return;
        elseif ( IsAltKeyDown() and TradeFrame:IsVisible() and not CursorHasItem() ) then
                for i = 1, 6, 1 do
                        if ( not GetTradePlayerItemLink(i) ) then
                                CT_oldPickupContainerItem(bag, item);
                                ClickTradeButton(i);
                                return;
                        end
                end
        elseif ( IsAltKeyDown() and not CursorHasItem() and ( not TradeFrame or not TradeFrame:IsVisible() ) and ( not AuctionFrame or not AuctionFrame:IsVisible() ) and UnitExists("target") and CheckInteractDistance("target", 2) and UnitIsFriend("player", "target") and UnitIsPlayer("target") ) then
                InitiateTrade("target");
                CT_Mail_addItem = { bag, item, UnitName("target"), 2 };
                for i = 1, NUM_CONTAINER_FRAMES, 1 do
                        if ( getglobal("ContainerFrame" .. i):IsVisible() ) then
                                ContainerFrame_Update(getglobal("ContainerFrame" .. i));
                        end
                end
                return;
        end
        CT_oldPickupContainerItem(bag, item);
        CT_Mail_UpdateItemButtons();
end

PickupContainerItem = CT_newPickupContainerItem;

-- Hook the MailFrameTab_OnClick function
local CT_MM_oldMFT_OC = MailFrameTab_OnClick;
function CT_MM_MailFrameTab_OnClick(tab)
        if ( not tab ) then 
                tab = this:GetID();
        end

        if ( tab == 3 ) then
                PanelTemplates_SetTab(MailFrame, 3);
                InboxFrame:Hide();
                SendMailFrame:Hide();
                CT_MailFrame:Show();
                SendMailFrame.sendMode = "massmail";
                MailFrameTopLeft:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopLeft");
                MailFrameTopRight:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopRight");
                MailFrameBotLeft:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-BotLeft");
                MailFrameBotRight:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-BotRight");
                MailFrameTopLeft:SetPoint("TOPLEFT", "MailFrame", "TOPLEFT", 2, -1);
                return;
        else
                CT_MailFrame:Hide();
        end
        CT_MM_oldMFT_OC(tab);
end

MailFrameTab_OnClick = CT_MM_MailFrameTab_OnClick;

-- Hook the ClickSendMailItemButton function
local CT_MM_oldCSMIB = ClickSendMailItemButton;
function CT_MM_newCSMIB()
        if ( not GetSendMailItem() ) then
                CT_MailFrame.mailbag = CT_MailFrame.bag;
                CT_MailFrame.mailitem = CT_MailFrame.item;
        end
        CT_MM_oldCSMIB();
end

ClickSendMailItemButton = CT_MM_newCSMIB;

-- Handle the dragging of items

function CT_MailButton_OnClick(button)

        if ( not button ) then button = this; end
        if ( CursorHasItem() ) then

                local bag = CT_MailFrame.bag;
                local item = CT_MailFrame.item;

                if ( not bag or not item ) then return; end
                
                local canMail = CT_Mail_ItemIsMailable(bag, item)
                if ( canMail ) then
                        DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Cannot attach item, item is " .. canMail, 1, 0.5, 0);
                        CT_oldPickupContainerItem(bag, item);
                        return;
                end

                CT_oldPickupContainerItem(bag, item);

                if ( this.bag and this.item ) then
                        -- There's already an item there
                        -- Pickup that item to replicate Send Mail's behaviour
                        CT_oldPickupContainerItem(button.bag, button.item);
                        CT_MailFrame.bag = button.bag;
                        CT_MailFrame.item = button.item;
                else
                        CT_MailFrame.bag = nil;
                        CT_MailFrame.item = nil;
                end

                local texture, count = GetContainerItemInfo(bag, item);

                getglobal(button:GetName() .. "IconTexture"):Show();
                getglobal(button:GetName() .. "IconTexture"):SetTexture(texture);

                if ( count > 1 ) then
                        getglobal(button:GetName() .. "Count"):SetText(count);
                        getglobal(button:GetName() .. "Count"):Show();
                else
                        getglobal(button:GetName() .. "Count"):Hide();
                end

                button.bag = bag;
                button.item = item;
                button.texture = texture;
                button.count = count;

        elseif ( button.item and button.bag ) then

                CT_oldPickupContainerItem(button.bag, button.item);
                getglobal(button:GetName() .. "IconTexture"):Hide();
                getglobal(button:GetName() .. "Count"):Hide();

                CT_MailFrame.bag = button.bag;
                CT_MailFrame.item = button.item;

                button.item = nil;
                button.bag = nil;
                button.count = nil;
                button.texture = nil;

        end
        local num = CT_Mail_GetNumMails();
        CT_MailFrame.num = num;
        CT_Mail_CanSend(CT_MailNameEditBox);
        if ( num == 0 ) then num = 1; end
        MoneyFrame_Update("CT_MailCostMoneyFrame", GetSendMailPrice()*num);
        for i = 1, NUM_CONTAINER_FRAMES, 1 do
                if ( getglobal("ContainerFrame" .. i):IsVisible() ) then
                        ContainerFrame_Update(getglobal("ContainerFrame" .. i));
                end
        end
end

function CT_Mail_ItemIsMailable(bag, item)

        -- Make sure tooltip is cleared
        for i = 1, 29, 1 do
                getglobal("CT_MMTooltipTextLeft" .. i):SetText("");
        end

        CT_MMTooltip:SetBagItem(bag, item);
        for i = 1, CT_MMTooltip:NumLines(), 1 do
                local text = getglobal("CT_MMTooltipTextLeft" .. i):GetText();
                if ( text == ITEM_SOULBOUND ) then
                        return "soulbound.";
                elseif ( text == ITEM_BIND_QUEST ) then
                        return "a quest item.";
                elseif ( text == ITEM_CONJURED ) then
                        return "a conjured item.";
                end
        end
        return nil;
end


function CT_Mail_UpdateItemButtons(frame)
        local i;
        for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                local btn = getglobal("CT_MailButton" .. i);
                if ( not frame or btn ~= frame ) then
                        local texture, count;
                        if ( btn.item and btn.bag ) then
                                texture, count = GetContainerItemInfo(btn.bag, btn.item);
                        end
                        if ( not texture ) then
                                getglobal(btn:GetName() .. "IconTexture"):Hide();
                                getglobal(btn:GetName() .. "Count"):Hide();
                                btn.item = nil; btn.bag = nil; btn.count = nil; btn.texture = nil;
                        else
                                btn.count = count;
                                btn.texture = texture;
                                getglobal(btn:GetName() .. "IconTexture"):Show();
                                getglobal(btn:GetName() .. "IconTexture"):SetTexture(texture);
                                if ( count > 1 ) then
                                        getglobal(btn:GetName() .. "Count"):Show();
                                        getglobal(btn:GetName() .. "Count"):SetText(count);
                                else
                                        getglobal(btn:GetName() .. "Count"):Hide();
                                end
                        end
                end
        end
end

function CT_Mail_GetItemFrame(bag, item)
        local i;
        for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                local btn = getglobal("CT_MailButton" .. i);
                if ( btn.item == item and btn.bag == bag ) then
                        return btn;
                end
        end
        return nil;
end

function CT_Mail_GetNumMails()
        local i;
        local num = 0;
        for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                local btn = getglobal("CT_MailButton" .. i);
                if ( btn.item and btn.bag ) then
                        num = num + 1;
                end
        end
        return num;
end

function CT_Mail_ClearItems()
        local i;
        local num = 0;
        for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                local btn = getglobal("CT_MailButton" .. i);
                btn.item = nil;
                btn.count = nil;
                btn.bag = nil;
                btn.texture = nil;
        end
        CT_Mail_UpdateItemButtons();
        CT_MailMailButton:Disable();
        CT_MailNameEditBox:SetText("");
        CT_MailSubjectEditBox:SetText("");
        CT_MailStatusText:SetText("");
        CT_MailAbortButton:Hide();

        CT_Mail_AcceptSendFrame:Hide();
end

function CT_Mail_AutoComplete()
        local text = this:GetText();
        local textlen = strlen(text);
        local numFriends = GetNumFriends();
        local name;
        if ( numFriends > 0 ) then
                for i=1, numFriends do
                        name =  GetFriendInfo(i);
                        if ( name ) then
                                if ( strfind(strupper(name), "^"..strupper(text)) ) then
                                        this:SetText(name);
                                        this:HighlightText(textlen, -1);
                                        return;
                                end
                        end
                end
        end

        -- Hack to scan offline members
        local oldOffline = GetGuildRosterShowOffline();
        SetGuildRosterShowOffline(true);

        local numGuildMembers = GetNumGuildMembers();
        if ( numGuildMembers > 0 ) then
                for i=1, numGuildMembers do
                        name = GetGuildRosterInfo(i);
                        if ( strfind(strupper(name), "^"..strupper(text)) ) then
                                this:SetText(name);
                                this:HighlightText(textlen, -1);
                                return;
                        end
                end
        end

        -- Revert to old scanning
        SetGuildRosterShowOffline(oldOffline);
end

SendMailFrame_SendeeAutocomplete = CT_Mail_AutoComplete; -- No need for a before/after hook, since our function does both friends & guildies

function CT_Mail_CanSend(eb)
        if ( not eb ) then eb = this; end
        if ( strlen(eb:GetText()) > 0 and CT_MailFrame.num > 0 and GetSendMailPrice()*CT_MailFrame.num <= GetMoney() ) then
                CT_MailMailButton:Enable();
        else
                CT_MailMailButton:Disable();
        end
end

function CT_Mail_SendMail()
        for key, val in this.queue do
                CT_MailStatusText:SetText(format(CT_MAIL_SENDING, key, this.total));
                CT_MailAbortButton:Show();

                if ( GetSendMailItem() and CT_MailFrame.mailbag and CT_MailFrame.mailitem ) then
                        -- There's already an item in the slot
                        ClickSendMailItemButton();
                        CT_oldPickupContainerItem(CT_MailFrame.mailbag, CT_MailFrame.mailitem);
                        CT_MailFrame.mailbag = nil;
                        CT_MailFrame.mailitem = nil;
                elseif ( CursorHasItem() and CT_MailFrame.bag and CT_MailFrame.item ) then
                        PickupContainerItem(CT_MailFrame.bag, CT_MailFrame.item);
                        CT_MailFrame.bag = nil;
                        CT_MailFrame.item = nil;
                end

                CT_oldPickupContainerItem(val.bag, val.item);

                ClickSendMailItemButton();

                local name, useless, count = GetSendMailItem();

                if ( not name ) then 
                        DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_MAIL_ERROR, 1, 0, 0);
                else

                        local subjectstr = CT_MailSubjectEditBox:GetText();
                        if ( strlen(subjectstr) > 0 ) then
                                subjectstr = subjectstr .. " ";
                        end

                        if ( count > 1 ) then
                                subjectstr = subjectstr .. "[" .. name .. " x" .. count .. "]";
                        else
                                subjectstr = subjectstr .. "[" .. name .. "]";
                        end

                        SendMail(val.to, subjectstr, format(CT_MAIL_ITEMNUM, key, this.total));
                end

                CT_MailGlobalFrame.queue[key] = nil;
                return;
        end
        CT_MailStatusText:SetText(format(CT_MAIL_DONESENDING, this.total));
        CT_MailAbortButton:Hide();
        CT_MailGlobalFrame:Hide();

        CT_MailGlobalFrame.total = 0;
        CT_MailGlobalFrame.queue = { };
end

function CT_Mail_FillItemTable()
        local arr = { };
        for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                local btn = getglobal("CT_MailButton" .. i);
                if ( btn.item and btn.bag ) then
                        tinsert(arr, { ["item"] = btn.item, ["bag"] = btn.bag, ["to"] = CT_MailNameEditBox:GetText() });
                end
        end
        return arr;
end

function CT_Mail_ProcessQueue(elapsed)
        if ( not CT_Mail_CanSendNext ) then
                return;
        end
        this.sendmail = this.sendmail + elapsed;
        if ( this.sendmail > 0.5 ) then
                this.sendmail = 0;
                if ( this.total > 0 ) then
                        CT_Mail_SendMail();
                        CT_Mail_CanSendNext = nil;
                end
        end
end

local CT_oldMM_CF_U = ContainerFrame_Update

function CT_Mail_ContainerFrame_Update(frame)
        CT_oldMM_CF_U(frame);

        local id = frame:GetID();
        if ( CT_MailFrame:IsVisible() ) then
                local i;
                for i = 1, CT_MAIL_NUMITEMBUTTONS, 1 do
                        local btn = getglobal("CT_MailButton" .. i);
                        if ( btn.item and btn.bag ) then
                                if ( btn.bag == frame:GetID() ) then
                                        SetItemButtonDesaturated(getglobal(frame:GetName() .. "Item" .. (frame.size-btn.item)+1), 1, 0.5, 0.5, 0.5);
                                end
                        end
                end
        end
        
        if ( CT_Mail_addItem and CT_Mail_addItem[1] == frame:GetID() ) then
                SetItemButtonDesaturated(getglobal(frame:GetName() .. "Item" .. (frame.size-CT_Mail_addItem[2])+1), 1, 0.5, 0.5, 0.5);
        end

end

ContainerFrame_Update = CT_Mail_ContainerFrame_Update;

function CT_Mail_AddSubject()
        if ( not SendMailFrame:IsVisible() ) then return; end
        local name, useless, count = GetSendMailItem();

        if ( name and strlen(SendMailSubjectEditBox:GetText()) == 0 ) then
                if ( count > 1 ) then
                        name = name .. " x" .. count;
                end
                SendMailSubjectEditBox:SetText(name);
        end
end

function CT_Mail_OnEvent(event)
        if ( event == "MAIL_SEND_SUCCESS" ) then
                CT_Mail_CanSendNext = 1;
        else
                CT_Mail_AddSubject();
        end
end

-- Show item link if there is one
CT_Mail_oldInboxFrameItem_OnEnter = InboxFrameItem_OnEnter;
function CT_Mail_newInboxFrameItem_OnEnter()
        local didSetTooltip;
        if ( this.index ) then
                if ( GetInboxItem(this.index) ) then
                        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
                        GameTooltip:SetInboxItem(this.index);
                        didSetTooltip = 1;
                end
        end
        if ( not didSetTooltip ) then
                GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        end
        if (this.money) then
                GameTooltip:AddLine(ENCLOSED_MONEY, "", 1, 1, 1);
                SetTooltipMoney(GameTooltip, this.money);
                SetMoneyFrameColor("GameTooltipMoneyFrame", HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
        elseif (this.cod) then
                GameTooltip:AddLine(COD_AMOUNT, "", 1, 1, 1);
                SetTooltipMoney(GameTooltip, this.cod);
                if ( this.cod > GetMoney() ) then
                        SetMoneyFrameColor("GameTooltipMoneyFrame", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
                else
                        SetMoneyFrameColor("GameTooltipMoneyFrame", HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
                end
        end
        if ( didSetTooltip and ( this.money or this.cod ) ) then
                GameTooltip:SetHeight(GameTooltip:GetHeight()+getglobal("GameTooltipTextLeft" .. GameTooltip:NumLines()):GetHeight());
                if ( GameTooltipMoneyFrame:IsVisible() ) then
                        GameTooltip:SetHeight(GameTooltip:GetHeight()+GameTooltipMoneyFrame:GetHeight());
                end
        end
        GameTooltip:Show();
end
InboxFrameItem_OnEnter = CT_Mail_newInboxFrameItem_OnEnter;

-- Hook the TradeFrame OnShow
CT_Mail_oldTradeFrameShow = TradeFrame:GetScript("OnShow");
function CT_Mail_newTradeFrameShow()
        CT_Mail_oldTradeFrameShow();
        if ( CT_Mail_addItem and not CursorHasItem() and UnitName("NPC") == CT_Mail_addItem[3] ) then
                CT_oldPickupContainerItem(CT_Mail_addItem[1], CT_Mail_addItem[2]);
                ClickTradeButton(1);
        end
        CT_Mail_addItem = nil;
end
TradeFrame:SetScript("OnShow", CT_Mail_newTradeFrameShow);

-- Add slash command for stacking
SlashCmdList["MAILSTACK"] = function()
        CT_MMInbox_StackMail = not CT_MMInbox_StackMail;
        if ( CT_MMInbox_StackMail ) then
                CT_MMInbox_Print("<CTMod> Mail Stacking is now turned |cFF00FF00on|r.", 1, 1, 0);
        else
                CT_MMInbox_Print("<CTMod> Mail Stacking is now turned |cFFFF0000off|r.", 1, 1, 0);
        end
end
SLASH_MAILSTACK1 = "/mailstack";
SLASH_MAILSTACK2 = "/ms";

Generated by GNU Enscript 1.6.5.90.