-- ------------------------------------------------------------------------------ --
--                                TradeSkillMaster                                --
--                http://www.curse.com/addons/wow/tradeskill-master               --
--                                                                                --
--             A TradeSkillMaster Addon (http://tradeskillmaster.com)             --
--    All Rights Reserved* - Detailed license information included with addon.    --
-- ------------------------------------------------------------------------------ --

-- Much of this code is copied from .../AceGUI-3.0/widgets/AceGUIWidget-Dropdown-Items.lua
-- This Dropdown-Items widget is modified to fit TSM's theme / needs
local _, TSM = ...
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)

-- Lua APIs
local select, assert = select, assert

-- WoW APIs
local PlaySound, SOUNDKIT = PlaySound, SOUNDKIT
local CreateFrame = CreateFrame


local ItemBase = {}
do
	--[[-----------------------------------------------------------------------------
	Support functions
	-------------------------------------------------------------------------------]]

	local function fixlevels(parent,...)
		local i = 1
		local child = select(i, ...)
		while child do
			child:SetFrameLevel(parent:GetFrameLevel()+1)
			fixlevels(child, child:GetChildren())
			i = i + 1
			child = select(i, ...)
		end
	end


	--[[-----------------------------------------------------------------------------
	Scripts
	-------------------------------------------------------------------------------]]

	local function Frame_OnEnter(this)
		local self = this.obj

		if self.useHighlight then
			self.highlight:Show()
		end
		self:Fire("OnEnter")
		
		if self.specialOnEnter then
			self.specialOnEnter(self)
		end
	end

	local function Frame_OnLeave(this)
		local self = this.obj
		
		self.highlight:Hide()
		self:Fire("OnLeave")
		
		if self.specialOnLeave then
			self.specialOnLeave(self)
		end
	end


	--[[-----------------------------------------------------------------------------
	Methods
	-------------------------------------------------------------------------------]]

	local methods = {
		["OnAcquire"] = function(self)
			self:SetDisabled()
			self.frame:SetToplevel(true)
			self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
		end,

		["OnRelease"] = function(self)
			self:SetDisabled()
			self.pullout = nil
			self.frame:SetParent(nil)
			self.frame:ClearAllPoints()
			self.frame:Hide()
		end,

		["SetPullout"] = function(self, pullout)
			self.pullout = pullout
			
			self.frame:SetParent(nil)
			self.frame:SetParent(pullout.itemFrame)
			self.parent = pullout.itemFrame
			fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
		end,

		["SetText"] = function(self, text)
			self.text:SetText(text or "")
		end,

		["GetText"] = function(self)
			return self.text:GetText()
		end,

		["SetPoint"] = function(self, ...)
			self.frame:SetPoint(...)
		end,

		["Show"] = function(self)
			self.frame:Show()
		end,

		["Hide"] = function(self)
			self.frame:Hide()
		end,

		["SetDisabled"] = function(self, disabled)
			self.disabled = disabled
			TSMAPI.Design:SetWidgetTextColor(self.text, disabled)
			self.useHighlight = not disabled
		end,

		["SetOnLeave"] = function(self, func)
			self.specialOnLeave = func
		end,

		["SetOnEnter"] = function(self, func)
			self.specialOnEnter = func
		end,
	}

	function ItemBase.Create(type)
		local count = AceGUI:GetNextWidgetNum(type)
		local frame = CreateFrame("Button", "TSMDropDownItem"..count)
		
		frame:SetHeight(17)
		frame:SetFrameStrata("FULLSCREEN_DIALOG")
		
		local text = frame:CreateFontString(nil,"OVERLAY")
		text:SetFont(TSMAPI.Design:GetContentFont("normal"))
		text:SetJustifyH("LEFT")
		text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
		text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)

		local highlight = frame:CreateTexture(nil, "OVERLAY")
		highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
		highlight:SetBlendMode("ADD")
		highlight:SetHeight(14)
		highlight:ClearAllPoints()
		highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
		highlight:SetPoint("LEFT",frame,"LEFT",5,0)
		highlight:Hide()

		local check = frame:CreateTexture("OVERLAY")	
		check:SetWidth(16)
		check:SetHeight(16)
		check:SetPoint("LEFT",frame,"LEFT",3,-1)
		check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
		check:Hide()

		local sub = frame:CreateTexture("OVERLAY")
		sub:SetWidth(16)
		sub:SetHeight(16)
		sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
		sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
		sub:Hide()
		
		frame:SetScript("OnEnter", Frame_OnEnter)
		frame:SetScript("OnLeave", Frame_OnLeave)
		
		local widget = {
			frame = frame,
			text = text,
			highlight = highlight,
			check = check,
			sub = sub,
			useHighlight = true,
			origMethods = methods,
			type = type,
		}
		for method, func in pairs(methods) do
			widget[method] = func
		end
		frame.obj = widget
		
		return widget
	end
end


do
	local Type, Version = "TSMDropdown-Item-Execute", 2
	
	local function Frame_OnClick(this)
		local self = this.obj
		if self.disabled then return end
		self:Fire("OnClick")
		if self.pullout then
			self.pullout:Close()
		end
	end
	
	local function Constructor()
		local item = ItemBase.Create(Type)
		item.frame:SetScript("OnClick", Frame_OnClick)
		return AceGUI:RegisterAsWidget(item)
	end
	
	AceGUI:RegisterWidgetType(Type, Constructor, Version)
end


do
	local Type, Version = "TSMDropdown-Item-Toggle", 2
	
	local function Frame_OnClick(this, button)
		local self = this.obj
		if self.disabled then return end
		self.value = not self.value
		if self.value then
			PlaySound(SOUNDKIT["IG_MAINMENU_OPTION_CHECKBOX_ON"])
		else
			PlaySound(SOUNDKIT["IG_MAINMENU_OPTION_CHECKBOX_OFF"])
		end
		self:UpdateToggle()
		self:Fire("OnValueChanged", self.value)
	end
	
	local methods = {
		["UpdateToggle"] = function(self)
			if self.value then
				self.check:Show()
			else
				self.check:Hide()
			end
		end,
		
		["SetValue"] = function(self, value)
			self.value = value
			self:UpdateToggle()
		end,
		
		["GetValue"] = function(self)
			return self.value
		end,
	}
	
	local function Constructor()
		local item = ItemBase.Create(Type)
		item.frame:SetScript("OnClick", Frame_OnClick)
		for method, func in pairs(methods) do
			item[method] = func
		end
		return AceGUI:RegisterAsWidget(item)
	end
	
	AceGUI:RegisterWidgetType(Type, Constructor, Version)
end