3.0.1.8634/FrameXML/BankFrame.lua
BANK_CONTAINER = -1;
NUM_BAG_SLOTS = 4;
NUM_BANKGENERIC_SLOTS = 28;
NUM_BANKBAGSLOTS = 7;
 
function ButtonInventorySlot (self)
	return BankButtonIDToInvSlotID(self:GetID(),self.isBag)
end
 
function BankFrameBaseButton_OnLoad (self)
	self:RegisterForDrag("LeftButton");
	self:RegisterForClicks("LeftButtonUp","RightButtonUp");
	self.GetInventorySlot = ButtonInventorySlot;
	self.UpdateTooltip = BankFrameItemButton_OnEnter;
end
 
function BankFrameItemButton_OnLoad (self)
	BankFrameBaseButton_OnLoad (self);
	self.SplitStack = function(button, split)
		SplitContainerItem(BANK_CONTAINER, button:GetID(), split);
	end
end
 
function BankFrameBagButton_OnLoad (self)
	self.isBag = 1;
	BankFrameBaseButton_OnLoad(self);
end
 
function BankFrameItemButton_OnEnter (self)
	GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
	if ( not GameTooltip:SetInventoryItem("player", self:GetInventorySlot()) ) then
		if ( self.isBag ) then
			GameTooltip:SetText(self.tooltipText);
		end
	end
	CursorUpdate(self);
end
 
function BankFrameItemButton_Update (button)
	local texture = getglobal(button:GetName().."IconTexture");
	local inventoryID = button:GetInventorySlot();
	local textureName = GetInventoryItemTexture("player",inventoryID);
	local slotName = button:GetName();
	local id;
	local slotTextureName;
	button.hasItem = nil;
 
	if( button.isBag ) then
		id, slotTextureName = GetInventorySlotInfo(strsub(slotName,10));
	end
 
	if ( textureName ) then
		texture:SetTexture(textureName);
		texture:Show();
		SetItemButtonCount(button,GetInventoryItemCount("player",inventoryID));
		button.hasItem = 1;
	elseif ( slotTextureName and button.isBag ) then
		texture:SetTexture(slotTextureName);
		SetItemButtonCount(button,0);
		texture:Show();
	else
		texture:Hide();
		SetItemButtonCount(button,0);
	end
 
	BankFrameItemButton_UpdateLocked(button);
end
 
function BankFrameItemButton_UpdateLocked (button)
	local inventoryID = button:GetInventorySlot();
	if ( IsInventoryItemLocked(inventoryID) ) then
		SetItemButtonDesaturated(button, 1, 0.5, 0.5, 0.5);
	else
		if ( button.isBag and ((button:GetID() - 4) > GetNumBankSlots()) ) then
			return;
		end
		SetItemButtonDesaturated(button, nil, 0.5, 0.5, 0.5);
	end
end
 
function BankFrame_OnLoad (self)
	self:RegisterEvent("BANKFRAME_OPENED");
	self:RegisterEvent("BANKFRAME_CLOSED");
end
 
function UpdateBagSlotStatus ()
	local purchaseFrame = BankFramePurchaseInfo;
	if( purchaseFrame == nil ) then
		return;
	end
 
	local numSlots,full = GetNumBankSlots();
	local button;
	for i=1, NUM_BANKBAGSLOTS, 1 do
		button = getglobal("BankFrameBag"..i);
		if ( button ) then
			if ( i <= numSlots ) then
				SetItemButtonTextureVertexColor(button, 1.0,1.0,1.0);
				button.tooltipText = BANK_BAG;
			else
				SetItemButtonTextureVertexColor(button, 1.0,0.1,0.1);
				button.tooltipText = BANK_BAG_PURCHASE;
			end
		end
	end
 
	-- pass in # of current slots, returns cost of next slot
	local cost = GetBankSlotCost(numSlots);
	BankFrame.nextSlotCost = cost;
	if( GetMoney() >= cost ) then
		SetMoneyFrameColor("BankFrameDetailMoneyFrame", "white");
	else
		SetMoneyFrameColor("BankFrameDetailMoneyFrame", "red")
	end
	MoneyFrame_Update("BankFrameDetailMoneyFrame", cost);
 
	if( full ) then
		purchaseFrame:Hide();
	else
		purchaseFrame:Show();
	end
end
 
function CloseBankBagFrames ()
	for i=NUM_BAG_SLOTS+1, (NUM_BAG_SLOTS + NUM_BANKBAGSLOTS), 1 do
		CloseBag(i);
	end
end
 
function BankFrame_OnEvent (self, event, ...)
	if ( event == "BANKFRAME_OPENED" ) then
		BankFrameTitleText:SetText(UnitName("npc"));
		SetPortraitTexture(BankPortraitTexture,"npc");
		ShowUIPanel(self);
		if ( not self:IsShown() ) then
			CloseBankFrame();
		end
	elseif ( event == "BANKFRAME_CLOSED" ) then
		HideUIPanel(self);
	elseif ( event == "ITEM_LOCK_CHANGED" ) then
		local bag, slot = ...;
		if ( bag == BANK_CONTAINER ) then
			if ( slot <= NUM_BANKGENERIC_SLOTS ) then
				BankFrameItemButton_UpdateLocked(getglobal("BankFrameItem"..slot));
			else
				BankFrameItemButton_UpdateLocked(getglobal("BankFrameBag"..(slot-NUM_BANKGENERIC_SLOTS)));
			end
		end
	elseif ( event == "PLAYERBANKSLOTS_CHANGED" ) then
		local slot = ...;
		if ( slot <= NUM_BANKGENERIC_SLOTS ) then
			BankFrameItemButton_Update(getglobal("BankFrameItem"..slot));
		else
			BankFrameItemButton_Update(getglobal("BankFrameBag"..(slot-NUM_BANKGENERIC_SLOTS)));
		end
	elseif ( event == "PLAYER_MONEY" or event == "PLAYERBANKBAGSLOTS_CHANGED" ) then
		UpdateBagSlotStatus();
	end
end
 
function BankFrame_OnShow (self)
	PlaySound("igMainMenuOpen");
 
	self:RegisterEvent("ITEM_LOCK_CHANGED");
	self:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
	self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
	self:RegisterEvent("PLAYER_MONEY");
 
	for i=1, NUM_BANKGENERIC_SLOTS, 1 do
		button = getglobal("BankFrameItem"..i);
		BankFrameItemButton_Update(button);
	end
	for i=1, NUM_BANKBAGSLOTS, 1 do
		button = getglobal("BankFrameBag"..i);
		BankFrameItemButton_Update(button);
	end
	UpdateBagSlotStatus();
end
 
function BankFrame_OnHide (self)
	PlaySound("igMainMenuClose");
 
	self:UnregisterEvent("ITEM_LOCK_CHANGED");
	self:UnregisterEvent("PLAYERBANKSLOTS_CHANGED");
	self:UnregisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
	self:UnregisterEvent("PLAYER_MONEY");
 
	StaticPopup_Hide("CONFIRM_BUY_BANK_SLOT");
	CloseBankBagFrames();
	CloseBankFrame();
	updateContainerFrameAnchors();
end
 
function BankFrameItemButtonGeneric_OnClick (self, button)
	if ( button == "LeftButton" ) then
		PickupContainerItem(BANK_CONTAINER, self:GetID());
	else
		UseContainerItem(BANK_CONTAINER, self:GetID());
	end
end
 
function BankFrameItemButtonGeneric_OnModifiedClick (self, button)
	if ( self.isBag ) then
		return;
	end
	if ( HandleModifiedItemClick(GetContainerItemLink(BANK_CONTAINER, self:GetID())) ) then
		return;
	end
	if ( IsModifiedClick("SPLITSTACK") ) then
		local texture, itemCount, locked = GetContainerItemInfo(BANK_CONTAINER, self:GetID());
		if ( not locked ) then
			OpenStackSplitFrame(self.count, self, "BOTTOMLEFT", "TOPLEFT");
		end
		return;
	end
end
 
function UpdateBagButtonHighlight (id)
	local texture = getglobal("BankFrameBag"..(id - NUM_BAG_SLOTS).."HighlightFrameTexture");
	if ( not texture ) then
		return;
	end
 
	local frame;
	for i=1, NUM_CONTAINER_FRAMES, 1 do
		frame = getglobal("ContainerFrame"..i);
		if ( ( frame:GetID() == id ) and frame:IsShown() ) then
			texture:Show();
			return;
		end
	end
	texture:Hide();
end
 
function BankFrameItemButtonBag_OnClick (self, button)
	local inventoryID = self:GetInventorySlot();
	local hadItem = PutItemInBag(inventoryID);
	local id = self:GetID();
	if ( not hadItem ) then
		-- open bag
		ToggleBag(id);
	end
	UpdateBagButtonHighlight(id);
end
 
function BankFrameItemButtonBag_Pickup (self)
	local inventoryID = self:GetInventorySlot();
	PickupBagFromSlot(inventoryID);
	UpdateBagButtonHighlight(self:GetID());
end