local AceGUI = LibStub('AceGUI-3.0')

-------------
-- Widgets --
-------------
--[[
	Widgets must provide the following functions
		Acquire() - Called when the object is aquired, should set everything to a default hidden state
		Release() - Called when the object is Released, should remove any anchors and hide the Widget
		
	And the following members
		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
		type - the type of the object, same as the name given to :RegisterWidget()
		
	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
	It will be cleared automatically when a widget is released
	Placing values directly into a widget object should be avoided
	
	If the Widget can act as a container for other Widgets the following
		content - frame or derivitive that children will be anchored to
		
	The Widget can supply the following Optional Members


]]

--------------------------
-- Inline Group		 --
--------------------------
--[[
	This is a simple grouping container, no selection
	It will resize automatically to the height of the controls added to it
]]

do
  local Type = 'InlineGroup'
  local Version = 5

  local function OnAcquire(self)
    self:SetWidth(300)
    self:SetHeight(100)
  end

  local function OnRelease(self)
    self.frame:ClearAllPoints()
    self.frame:Hide()
  end

  local PaneBackdrop = {
    bgFile = 'Interface\\ChatFrame\\ChatFrameBackground',
    edgeFile = 'Interface\\Tooltips\\UI-Tooltip-Border',
    tile = true,
    tileSize = 16,
    edgeSize = 16,
    insets = { left = 3, right = 3, top = 5, bottom = 3 },
  }

  local function SetTitle(self, title)
    self.titletext:SetText(title)
  end

  local function LayoutFinished(self, width, height)
    if self.noAutoHeight then
      return
    end
    self:SetHeight((height or 0) + 40)
  end

  local function OnWidthSet(self, width)
    local content = self.content
    local contentwidth = width - 20
    if contentwidth < 0 then
      contentwidth = 0
    end
    content:SetWidth(contentwidth)
    content.width = contentwidth
  end

  local function OnHeightSet(self, height)
    local content = self.content
    local contentheight = height - 20
    if contentheight < 0 then
      contentheight = 0
    end
    content:SetHeight(contentheight)
    content.height = contentheight
  end

  local function Constructor()
    local frame = CreateFrame('Frame', nil, UIParent)
    local self = {}
    self.type = Type

    self.OnRelease = OnRelease
    self.OnAcquire = OnAcquire
    self.SetTitle = SetTitle
    self.frame = frame
    self.LayoutFinished = LayoutFinished
    self.OnWidthSet = OnWidthSet
    self.OnHeightSet = OnHeightSet

    frame.obj = self

    frame:SetHeight(100)
    frame:SetWidth(100)
    frame:SetFrameStrata('FULLSCREEN_DIALOG')

    local titletext = frame:CreateFontString(nil, 'OVERLAY', 'GameFontNormal')
    titletext:SetPoint('TOPLEFT', frame, 'TOPLEFT', 14, 0)
    titletext:SetPoint('TOPRIGHT', frame, 'TOPRIGHT', -14, 0)
    titletext:SetJustifyH('LEFT')
    titletext:SetHeight(18)

    self.titletext = titletext

    local border = CreateFrame('Frame', nil, frame)
    self.border = border
    border:SetPoint('TOPLEFT', frame, 'TOPLEFT', 3, -17)
    border:SetPoint('BOTTOMRIGHT', frame, 'BOTTOMRIGHT', -3, 3)

    border:SetBackdrop(PaneBackdrop)
    border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
    border:SetBackdropBorderColor(0.4, 0.4, 0.4)

    --Container Support
    local content = CreateFrame('Frame', nil, border)
    self.content = content
    content.obj = self
    content:SetPoint('TOPLEFT', border, 'TOPLEFT', 10, -10)
    content:SetPoint('BOTTOMRIGHT', border, 'BOTTOMRIGHT', -10, 10)

    AceGUI:RegisterAsContainer(self)
    return self
  end

  AceGUI:RegisterWidgetType(Type, Constructor, Version)
end
