2a7fd87 - Change to UnitIsPlayer
[wowui.git] / libs / AceGUI-3.0 / widgets / AceGUIWidget-DropDown.lua
1 --[[ $Id: AceGUIWidget-DropDown.lua 1101 2013-10-25 12:46:47Z nevcairiel $ ]]--
2 local AceGUI = LibStub("AceGUI-3.0")
3
4 -- Lua APIs
5 local min, max, floor = math.min, math.max, math.floor
6 local select, pairs, ipairs, type = select, pairs, ipairs, type
7 local tsort = table.sort
8
9 -- WoW APIs
10 local PlaySound = PlaySound
11 local UIParent, CreateFrame = UIParent, CreateFrame
12 local _G = _G
13
14 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
15 -- List them here for Mikk's FindGlobals script
16 -- GLOBALS: CLOSE
17
18 local function fixlevels(parent,...)
19         local i = 1
20         local child = select(i, ...)
21         while child do
22                 child:SetFrameLevel(parent:GetFrameLevel()+1)
23                 fixlevels(child, child:GetChildren())
24                 i = i + 1
25                 child = select(i, ...)
26         end
27 end
28
29 local function fixstrata(strata, parent, ...)
30         local i = 1
31         local child = select(i, ...)
32         parent:SetFrameStrata(strata)
33         while child do
34                 fixstrata(strata, child, child:GetChildren())
35                 i = i + 1
36                 child = select(i, ...)
37         end
38 end
39
40 do
41         local widgetType = "Dropdown-Pullout"
42         local widgetVersion = 3
43         
44         --[[ Static data ]]--
45         
46         local backdrop = {
47                 bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
48                 edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
49                 edgeSize = 32,
50                 tileSize = 32,
51                 tile = true,
52                 insets = { left = 11, right = 12, top = 12, bottom = 11 },
53         }
54         local sliderBackdrop  = {
55                 bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
56                 edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
57                 tile = true, tileSize = 8, edgeSize = 8,
58                 insets = { left = 3, right = 3, top = 3, bottom = 3 }
59         }
60
61         local defaultWidth = 200
62         local defaultMaxHeight = 600
63         
64         --[[ UI Event Handlers ]]--
65         
66         -- HACK: This should be no part of the pullout, but there
67         --       is no other 'clean' way to response to any item-OnEnter
68         --       Used to close Submenus when an other item is entered
69         local function OnEnter(item)
70                 local self = item.pullout
71                 for k, v in ipairs(self.items) do
72                         if v.CloseMenu and v ~= item then
73                                 v:CloseMenu()
74                         end
75                 end
76         end
77         
78         -- See the note in Constructor() for each scroll related function
79         local function OnMouseWheel(this, value)
80                 this.obj:MoveScroll(value)
81         end
82         
83         local function OnScrollValueChanged(this, value)
84                 this.obj:SetScroll(value)
85         end
86         
87         local function OnSizeChanged(this)
88                 this.obj:FixScroll()
89         end
90         
91         --[[ Exported methods ]]--
92         
93         -- exported
94         local function SetScroll(self, value)
95                 local status = self.scrollStatus
96                 local frame, child = self.scrollFrame, self.itemFrame
97                 local height, viewheight = frame:GetHeight(), child:GetHeight()
98
99                 local offset
100                 if height > viewheight then
101                         offset = 0
102                 else
103                         offset = floor((viewheight - height) / 1000 * value)
104                 end
105                 child:ClearAllPoints()
106                 child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
107                 child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
108                 status.offset = offset
109                 status.scrollvalue = value              
110         end
111         
112         -- exported
113         local function MoveScroll(self, value)
114                 local status = self.scrollStatus
115                 local frame, child = self.scrollFrame, self.itemFrame
116                 local height, viewheight = frame:GetHeight(), child:GetHeight()
117
118                 if height > viewheight then
119                         self.slider:Hide()
120                 else
121                         self.slider:Show()
122                         local diff = height - viewheight
123                         local delta = 1
124                         if value < 0 then
125                                 delta = -1
126                         end
127                         self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
128                 end
129         end
130         
131         -- exported
132         local function FixScroll(self)
133                 local status = self.scrollStatus
134                 local frame, child = self.scrollFrame, self.itemFrame
135                 local height, viewheight = frame:GetHeight(), child:GetHeight()
136                 local offset = status.offset or 0
137
138                 if viewheight < height then
139                         self.slider:Hide()
140                         child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
141                         self.slider:SetValue(0)
142                 else
143                         self.slider:Show()                      
144                         local value = (offset / (viewheight - height) * 1000)
145                         if value > 1000 then value = 1000 end
146                         self.slider:SetValue(value)
147                         self:SetScroll(value)
148                         if value < 1000 then
149                                 child:ClearAllPoints()
150                                 child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
151                                 child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
152                                 status.offset = offset
153                         end
154                 end
155         end
156         
157         -- exported, AceGUI callback
158         local function OnAcquire(self)
159                 self.frame:SetParent(UIParent)
160                 --self.itemFrame:SetToplevel(true)
161         end
162         
163         -- exported, AceGUI callback
164         local function OnRelease(self)
165                 self:Clear()
166                 self.frame:ClearAllPoints()
167                 self.frame:Hide()
168         end
169         
170         -- exported
171         local function AddItem(self, item)
172                 self.items[#self.items + 1] = item
173                 
174                 local h = #self.items * 16
175                 self.itemFrame:SetHeight(h)
176                 self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
177                 
178                 item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
179                 item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
180                 
181                 item:SetPullout(self)
182                 item:SetOnEnter(OnEnter)
183         end
184                 
185         -- exported
186         local function Open(self, point, relFrame, relPoint, x, y)              
187                 local items = self.items
188                 local frame = self.frame
189                 local itemFrame = self.itemFrame
190                 
191                 frame:SetPoint(point, relFrame, relPoint, x, y)
192
193                                 
194                 local height = 8
195                 for i, item in pairs(items) do
196                         if i == 1 then
197                                 item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
198                         else
199                                 item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
200                         end
201                         
202                         item:Show()
203                         
204                         height = height + 16
205                 end
206                 itemFrame:SetHeight(height)
207                 fixstrata("TOOLTIP", frame, frame:GetChildren())
208                 frame:Show()
209                 self:Fire("OnOpen")
210         end     
211         
212         -- exported
213         local function Close(self)
214                 self.frame:Hide()
215                 self:Fire("OnClose")
216         end     
217         
218         -- exported
219         local function Clear(self)
220                 local items = self.items
221                 for i, item in pairs(items) do
222                         AceGUI:Release(item)
223                         items[i] = nil
224                 end
225         end     
226         
227         -- exported
228         local function IterateItems(self)
229                 return ipairs(self.items)
230         end
231         
232         -- exported
233         local function SetHideOnLeave(self, val)
234                 self.hideOnLeave = val
235         end
236         
237         -- exported
238         local function SetMaxHeight(self, height)
239                 self.maxHeight = height or defaultMaxHeight
240                 if self.frame:GetHeight() > height then
241                         self.frame:SetHeight(height)
242                 elseif (self.itemFrame:GetHeight() + 34) < height then
243                         self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
244                 end
245         end
246                 
247         -- exported
248         local function GetRightBorderWidth(self)
249                 return 6 + (self.slider:IsShown() and 12 or 0)
250         end
251         
252         -- exported
253         local function GetLeftBorderWidth(self)
254                 return 6
255         end
256         
257         --[[ Constructor ]]--
258         
259         local function Constructor()
260                 local count = AceGUI:GetNextWidgetNum(widgetType)
261                 local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
262                 local self = {}
263                 self.count = count
264                 self.type = widgetType
265                 self.frame = frame
266                 frame.obj = self
267                 
268                 self.OnAcquire = OnAcquire
269                 self.OnRelease = OnRelease
270
271                 self.AddItem = AddItem
272                 self.Open    = Open
273                 self.Close   = Close
274                 self.Clear   = Clear
275                 self.IterateItems = IterateItems
276                 self.SetHideOnLeave = SetHideOnLeave
277
278                 self.SetScroll  = SetScroll
279                 self.MoveScroll = MoveScroll
280                 self.FixScroll  = FixScroll
281                 
282                 self.SetMaxHeight = SetMaxHeight
283                 self.GetRightBorderWidth = GetRightBorderWidth
284                 self.GetLeftBorderWidth = GetLeftBorderWidth
285                 
286                 self.items = {}
287                 
288                 self.scrollStatus = {
289                         scrollvalue = 0,
290                 }
291                 
292                 self.maxHeight = defaultMaxHeight
293                         
294                 frame:SetBackdrop(backdrop)
295                 frame:SetBackdropColor(0, 0, 0)
296                 frame:SetFrameStrata("FULLSCREEN_DIALOG")
297                 frame:SetClampedToScreen(true)
298                 frame:SetWidth(defaultWidth)
299                 frame:SetHeight(self.maxHeight) 
300                 --frame:SetToplevel(true)
301         
302                 -- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
303                 local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
304                 local itemFrame = CreateFrame("Frame", nil, scrollFrame)
305                 
306                 self.scrollFrame = scrollFrame
307                 self.itemFrame = itemFrame
308                 
309                 scrollFrame.obj = self
310                 itemFrame.obj = self
311                 
312                 local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
313                 slider:SetOrientation("VERTICAL")
314                 slider:SetHitRectInsets(0, 0, -10, 0)
315                 slider:SetBackdrop(sliderBackdrop)
316                 slider:SetWidth(8)
317                 slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
318                 slider:SetFrameStrata("FULLSCREEN_DIALOG")
319                 self.slider = slider
320                 slider.obj = self
321                                         
322                 scrollFrame:SetScrollChild(itemFrame)
323                 scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
324                 scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
325                 scrollFrame:EnableMouseWheel(true)
326                 scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
327                 scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
328                 scrollFrame:SetToplevel(true)
329                 scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
330                 
331                 itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
332                 itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
333                 itemFrame:SetHeight(400)
334                 itemFrame:SetToplevel(true)
335                 itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
336                 
337                 slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
338                 slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
339                 slider:SetScript("OnValueChanged", OnScrollValueChanged)
340                 slider:SetMinMaxValues(0, 1000)
341                 slider:SetValueStep(1)
342                 slider:SetValue(0)
343                 
344                 scrollFrame:Show()
345                 itemFrame:Show()
346                 slider:Hide()
347                                                 
348                 self:FixScroll()
349                 
350                 AceGUI:RegisterAsWidget(self)
351                 return self
352         end
353         
354         AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
355 end
356
357 do
358         local widgetType = "Dropdown"
359         local widgetVersion = 29
360         
361         --[[ Static data ]]--
362         
363         --[[ UI event handler ]]--
364         
365         local function Control_OnEnter(this)
366                 this.obj.button:LockHighlight()
367                 this.obj:Fire("OnEnter")
368         end
369         
370         local function Control_OnLeave(this)
371                 this.obj.button:UnlockHighlight()
372                 this.obj:Fire("OnLeave")
373         end
374
375         local function Dropdown_OnHide(this)
376                 local self = this.obj
377                 if self.open then
378                         self.pullout:Close()
379                 end
380         end
381         
382         local function Dropdown_TogglePullout(this)
383                 local self = this.obj
384                 PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
385                 if self.open then
386                         self.open = nil
387                         self.pullout:Close()
388                         AceGUI:ClearFocus()
389                 else
390                         self.open = true
391                         self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
392                         self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
393                         AceGUI:SetFocus(self)
394                 end
395         end
396         
397         local function OnPulloutOpen(this)
398                 local self = this.userdata.obj
399                 local value = self.value
400                 
401                 if not self.multiselect then
402                         for i, item in this:IterateItems() do
403                                 item:SetValue(item.userdata.value == value)
404                         end
405                 end
406                 
407                 self.open = true
408                 self:Fire("OnOpened")
409         end
410
411         local function OnPulloutClose(this)
412                 local self = this.userdata.obj
413                 self.open = nil
414                 self:Fire("OnClosed")
415         end
416         
417         local function ShowMultiText(self)
418                 local text
419                 for i, widget in self.pullout:IterateItems() do
420                         if widget.type == "Dropdown-Item-Toggle" then
421                                 if widget:GetValue() then
422                                         if text then
423                                                 text = text..", "..widget:GetText()
424                                         else
425                                                 text = widget:GetText()
426                                         end
427                                 end
428                         end
429                 end
430                 self:SetText(text)
431         end
432         
433         local function OnItemValueChanged(this, event, checked)
434                 local self = this.userdata.obj
435                 
436                 if self.multiselect then
437                         self:Fire("OnValueChanged", this.userdata.value, checked)
438                         ShowMultiText(self)
439                 else
440                         if checked then
441                                 self:SetValue(this.userdata.value)
442                                 self:Fire("OnValueChanged", this.userdata.value)
443                         else
444                                 this:SetValue(true)
445                         end
446                         if self.open then       
447                                 self.pullout:Close()
448                         end
449                 end
450         end
451         
452         --[[ Exported methods ]]--
453         
454         -- exported, AceGUI callback
455         local function OnAcquire(self)
456                 local pullout = AceGUI:Create("Dropdown-Pullout")
457                 self.pullout = pullout
458                 pullout.userdata.obj = self
459                 pullout:SetCallback("OnClose", OnPulloutClose)
460                 pullout:SetCallback("OnOpen", OnPulloutOpen)
461                 self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
462                 fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
463                 
464                 self:SetHeight(44)
465                 self:SetWidth(200)
466                 self:SetLabel()
467                 self:SetPulloutWidth(nil)
468         end
469         
470         -- exported, AceGUI callback
471         local function OnRelease(self)
472                 if self.open then
473                         self.pullout:Close()
474                 end
475                 AceGUI:Release(self.pullout)
476                 self.pullout = nil
477                 
478                 self:SetText("")
479                 self:SetDisabled(false)
480                 self:SetMultiselect(false)
481                 
482                 self.value = nil
483                 self.list = nil
484                 self.open = nil
485                 self.hasClose = nil
486                 
487                 self.frame:ClearAllPoints()
488                 self.frame:Hide()
489         end
490         
491         -- exported
492         local function SetDisabled(self, disabled)
493                 self.disabled = disabled
494                 if disabled then
495                         self.text:SetTextColor(0.5,0.5,0.5)
496                         self.button:Disable()
497                         self.label:SetTextColor(0.5,0.5,0.5)
498                 else
499                         self.button:Enable()
500                         self.label:SetTextColor(1,.82,0)
501                         self.text:SetTextColor(1,1,1)
502                 end
503         end
504         
505         -- exported
506         local function ClearFocus(self)
507                 if self.open then
508                         self.pullout:Close()
509                 end
510         end
511         
512         -- exported
513         local function SetText(self, text)
514                 self.text:SetText(text or "")
515         end
516         
517         -- exported
518         local function SetLabel(self, text)
519                 if text and text ~= "" then
520                         self.label:SetText(text)
521                         self.label:Show()
522                         self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-14)
523                         self:SetHeight(40)
524                         self.alignoffset = 26
525                 else
526                         self.label:SetText("")
527                         self.label:Hide()
528                         self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
529                         self:SetHeight(26)
530                         self.alignoffset = 12
531                 end
532         end
533         
534         -- exported
535         local function SetValue(self, value)
536                 if self.list then
537                         self:SetText(self.list[value] or "")
538                 end
539                 self.value = value
540         end
541         
542         -- exported
543         local function GetValue(self)
544                 return self.value
545         end
546         
547         -- exported
548         local function SetItemValue(self, item, value)
549                 if not self.multiselect then return end
550                 for i, widget in self.pullout:IterateItems() do
551                         if widget.userdata.value == item then
552                                 if widget.SetValue then
553                                         widget:SetValue(value)
554                                 end
555                         end
556                 end
557                 ShowMultiText(self)
558         end
559         
560         -- exported
561         local function SetItemDisabled(self, item, disabled)
562                 for i, widget in self.pullout:IterateItems() do
563                         if widget.userdata.value == item then
564                                 widget:SetDisabled(disabled)
565                         end
566                 end
567         end
568         
569         local function AddListItem(self, value, text, itemType)
570                 if not itemType then itemType = "Dropdown-Item-Toggle" end
571                 local exists = AceGUI:GetWidgetVersion(itemType)
572                 if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
573
574                 local item = AceGUI:Create(itemType)
575                 item:SetText(text)
576                 item.userdata.obj = self
577                 item.userdata.value = value
578                 item:SetCallback("OnValueChanged", OnItemValueChanged)
579                 self.pullout:AddItem(item)
580         end
581         
582         local function AddCloseButton(self)
583                 if not self.hasClose then
584                         local close = AceGUI:Create("Dropdown-Item-Execute")
585                         close:SetText(CLOSE)
586                         self.pullout:AddItem(close)
587                         self.hasClose = true
588                 end
589         end
590         
591         -- exported
592         local sortlist = {}
593         local function SetList(self, list, order, itemType)
594                 self.list = list
595                 self.pullout:Clear()
596                 self.hasClose = nil
597                 if not list then return end
598                 
599                 if type(order) ~= "table" then
600                         for v in pairs(list) do
601                                 sortlist[#sortlist + 1] = v
602                         end
603                         tsort(sortlist)
604                         
605                         for i, key in ipairs(sortlist) do
606                                 AddListItem(self, key, list[key], itemType)
607                                 sortlist[i] = nil
608                         end
609                 else
610                         for i, key in ipairs(order) do
611                                 AddListItem(self, key, list[key], itemType)
612                         end
613                 end
614                 if self.multiselect then
615                         ShowMultiText(self)
616                         AddCloseButton(self)
617                 end
618         end
619         
620         -- exported
621         local function AddItem(self, value, text, itemType)
622                 if self.list then
623                         self.list[value] = text
624                         AddListItem(self, value, text, itemType)
625                 end
626         end
627         
628         -- exported
629         local function SetMultiselect(self, multi)
630                 self.multiselect = multi
631                 if multi then
632                         ShowMultiText(self)
633                         AddCloseButton(self)
634                 end
635         end
636         
637         -- exported
638         local function GetMultiselect(self)
639                 return self.multiselect
640         end
641         
642         local function SetPulloutWidth(self, width)
643                 self.pulloutWidth = width
644         end
645         
646         --[[ Constructor ]]--
647         
648         local function Constructor()
649                 local count = AceGUI:GetNextWidgetNum(widgetType)
650                 local frame = CreateFrame("Frame", nil, UIParent)
651                 local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
652                 
653                 local self = {}
654                 self.type = widgetType
655                 self.frame = frame
656                 self.dropdown = dropdown
657                 self.count = count
658                 frame.obj = self
659                 dropdown.obj = self
660                 
661                 self.OnRelease   = OnRelease
662                 self.OnAcquire   = OnAcquire
663                 
664                 self.ClearFocus  = ClearFocus
665
666                 self.SetText     = SetText
667                 self.SetValue    = SetValue
668                 self.GetValue    = GetValue
669                 self.SetList     = SetList
670                 self.SetLabel    = SetLabel
671                 self.SetDisabled = SetDisabled
672                 self.AddItem     = AddItem
673                 self.SetMultiselect = SetMultiselect
674                 self.GetMultiselect = GetMultiselect
675                 self.SetItemValue = SetItemValue
676                 self.SetItemDisabled = SetItemDisabled
677                 self.SetPulloutWidth = SetPulloutWidth
678                 
679                 self.alignoffset = 26
680                 
681                 frame:SetScript("OnHide",Dropdown_OnHide)
682
683                 dropdown:ClearAllPoints()
684                 dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
685                 dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
686                 dropdown:SetScript("OnHide", nil)
687
688                 local left = _G[dropdown:GetName() .. "Left"]
689                 local middle = _G[dropdown:GetName() .. "Middle"]
690                 local right = _G[dropdown:GetName() .. "Right"]
691                 
692                 middle:ClearAllPoints()
693                 right:ClearAllPoints()
694                 
695                 middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
696                 middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
697                 right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
698
699                 local button = _G[dropdown:GetName() .. "Button"]
700                 self.button = button
701                 button.obj = self
702                 button:SetScript("OnEnter",Control_OnEnter)
703                 button:SetScript("OnLeave",Control_OnLeave)
704                 button:SetScript("OnClick",Dropdown_TogglePullout)
705                 
706                 local button_cover = CreateFrame("BUTTON",nil,self.frame)
707                 button_cover.obj = self
708                 button_cover:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",0,25)
709                 button_cover:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT")
710                 button_cover:SetScript("OnEnter",Control_OnEnter)
711                 button_cover:SetScript("OnLeave",Control_OnLeave)
712                 button_cover:SetScript("OnClick",Dropdown_TogglePullout)
713                 
714                 local text = _G[dropdown:GetName() .. "Text"]
715                 self.text = text
716                 text.obj = self
717                 text:ClearAllPoints()
718                 text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
719                 text:SetPoint("LEFT", left, "LEFT", 25, 2)
720                 
721                 local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
722                 label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
723                 label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
724                 label:SetJustifyH("LEFT")
725                 label:SetHeight(18)
726                 label:Hide()
727                 self.label = label
728
729                 AceGUI:RegisterAsWidget(self)
730                 return self
731         end
732         
733         AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
734 end