annotate Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua @ 0:98c6f55e6619

First commit
author Xiiph
date Sat, 05 Feb 2011 16:45:02 +0100
parents
children
rev   line source
Xiiph@0 1 local Type, Version = "MultiLineEditBox", 25
Xiiph@0 2 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
Xiiph@0 3 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
Xiiph@0 4
Xiiph@0 5 -- Lua APIs
Xiiph@0 6 local pairs = pairs
Xiiph@0 7
Xiiph@0 8 -- WoW APIs
Xiiph@0 9 local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
Xiiph@0 10 local CreateFrame, UIParent = CreateFrame, UIParent
Xiiph@0 11 local _G = _G
Xiiph@0 12
Xiiph@0 13 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
Xiiph@0 14 -- List them here for Mikk's FindGlobals script
Xiiph@0 15 -- GLOBALS: ACCEPT, ChatFontNormal
Xiiph@0 16
Xiiph@0 17 --[[-----------------------------------------------------------------------------
Xiiph@0 18 Support functions
Xiiph@0 19 -------------------------------------------------------------------------------]]
Xiiph@0 20 local function Layout(self)
Xiiph@0 21 self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
Xiiph@0 22
Xiiph@0 23 if self.labelHeight == 0 then
Xiiph@0 24 self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
Xiiph@0 25 else
Xiiph@0 26 self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
Xiiph@0 27 end
Xiiph@0 28
Xiiph@0 29 if self.disablebutton then
Xiiph@0 30 self.scrollBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 21)
Xiiph@0 31 self.scrollBG:SetPoint("BOTTOMLEFT", 0, 4)
Xiiph@0 32 else
Xiiph@0 33 self.scrollBar:SetPoint("BOTTOM", self.button, "TOP", 0, 18)
Xiiph@0 34 self.scrollBG:SetPoint("BOTTOMLEFT", self.button, "TOPLEFT")
Xiiph@0 35 end
Xiiph@0 36 end
Xiiph@0 37
Xiiph@0 38 --[[-----------------------------------------------------------------------------
Xiiph@0 39 Scripts
Xiiph@0 40 -------------------------------------------------------------------------------]]
Xiiph@0 41 local function OnClick(self) -- Button
Xiiph@0 42 self = self.obj
Xiiph@0 43 self.editBox:ClearFocus()
Xiiph@0 44 if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
Xiiph@0 45 self.button:Disable()
Xiiph@0 46 end
Xiiph@0 47 end
Xiiph@0 48
Xiiph@0 49 local function OnCursorChanged(self, _, y, _, cursorHeight) -- EditBox
Xiiph@0 50 self, y = self.obj.scrollFrame, -y
Xiiph@0 51 local offset = self:GetVerticalScroll()
Xiiph@0 52 if y < offset then
Xiiph@0 53 self:SetVerticalScroll(y)
Xiiph@0 54 else
Xiiph@0 55 y = y + cursorHeight - self:GetHeight()
Xiiph@0 56 if y > offset then
Xiiph@0 57 self:SetVerticalScroll(y)
Xiiph@0 58 end
Xiiph@0 59 end
Xiiph@0 60 end
Xiiph@0 61
Xiiph@0 62 local function OnEditFocusLost(self) -- EditBox
Xiiph@0 63 self:HighlightText(0, 0)
Xiiph@0 64 end
Xiiph@0 65
Xiiph@0 66 local function OnEnter(self) -- EditBox / ScrollFrame
Xiiph@0 67 self = self.obj
Xiiph@0 68 if not self.entered then
Xiiph@0 69 self.entered = true
Xiiph@0 70 self:Fire("OnEnter")
Xiiph@0 71 end
Xiiph@0 72 end
Xiiph@0 73
Xiiph@0 74 local function OnLeave(self) -- EditBox / ScrollFrame
Xiiph@0 75 self = self.obj
Xiiph@0 76 if self.entered then
Xiiph@0 77 self.entered = nil
Xiiph@0 78 self:Fire("OnLeave")
Xiiph@0 79 end
Xiiph@0 80 end
Xiiph@0 81
Xiiph@0 82 local function OnMouseUp(self) -- ScrollFrame
Xiiph@0 83 self = self.obj.editBox
Xiiph@0 84 self:SetFocus()
Xiiph@0 85 self:SetCursorPosition(self:GetNumLetters())
Xiiph@0 86 end
Xiiph@0 87
Xiiph@0 88 local function OnReceiveDrag(self) -- EditBox / ScrollFrame
Xiiph@0 89 local type, id, info = GetCursorInfo()
Xiiph@0 90 if type == "spell" then
Xiiph@0 91 info = GetSpellInfo(id, info)
Xiiph@0 92 elseif type ~= "item" then
Xiiph@0 93 return
Xiiph@0 94 end
Xiiph@0 95 ClearCursor()
Xiiph@0 96 self = self.obj
Xiiph@0 97 local editBox = self.editBox
Xiiph@0 98 if not editBox:HasFocus() then
Xiiph@0 99 editBox:SetFocus()
Xiiph@0 100 editBox:SetCursorPosition(editBox:GetNumLetters())
Xiiph@0 101 end
Xiiph@0 102 editBox:Insert(info)
Xiiph@0 103 self.button:Enable()
Xiiph@0 104 end
Xiiph@0 105
Xiiph@0 106 local function OnSizeChanged(self, width, height) -- ScrollFrame
Xiiph@0 107 self.obj.editBox:SetWidth(width)
Xiiph@0 108 end
Xiiph@0 109
Xiiph@0 110 local function OnTextChanged(self, userInput) -- EditBox
Xiiph@0 111 if userInput then
Xiiph@0 112 self = self.obj
Xiiph@0 113 self:Fire("OnTextChanged", self.editBox:GetText())
Xiiph@0 114 self.button:Enable()
Xiiph@0 115 end
Xiiph@0 116 end
Xiiph@0 117
Xiiph@0 118 local function OnTextSet(self) -- EditBox
Xiiph@0 119 self:HighlightText(0, 0)
Xiiph@0 120 self:SetCursorPosition(self:GetNumLetters())
Xiiph@0 121 self:SetCursorPosition(0)
Xiiph@0 122 self.obj.button:Disable()
Xiiph@0 123 end
Xiiph@0 124
Xiiph@0 125 local function OnVerticalScroll(self, offset) -- ScrollFrame
Xiiph@0 126 local editBox = self.obj.editBox
Xiiph@0 127 editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
Xiiph@0 128 end
Xiiph@0 129
Xiiph@0 130 local function OnShowFocus(frame)
Xiiph@0 131 frame.obj.editBox:SetFocus()
Xiiph@0 132 frame:SetScript("OnShow", nil)
Xiiph@0 133 end
Xiiph@0 134
Xiiph@0 135 local function OnFocusGained(frame)
Xiiph@0 136 AceGUI:SetFocus(frame.obj)
Xiiph@0 137 end
Xiiph@0 138
Xiiph@0 139 --[[-----------------------------------------------------------------------------
Xiiph@0 140 Methods
Xiiph@0 141 -------------------------------------------------------------------------------]]
Xiiph@0 142 local methods = {
Xiiph@0 143 ["OnAcquire"] = function(self)
Xiiph@0 144 self.editBox:SetText("")
Xiiph@0 145 self:SetDisabled(false)
Xiiph@0 146 self:SetWidth(200)
Xiiph@0 147 self:DisableButton(false)
Xiiph@0 148 self:SetNumLines()
Xiiph@0 149 self.entered = nil
Xiiph@0 150 self:SetMaxLetters(0)
Xiiph@0 151 end,
Xiiph@0 152
Xiiph@0 153 ["OnRelease"] = function(self)
Xiiph@0 154 self:ClearFocus()
Xiiph@0 155 end,
Xiiph@0 156
Xiiph@0 157 ["SetDisabled"] = function(self, disabled)
Xiiph@0 158 local editBox = self.editBox
Xiiph@0 159 if disabled then
Xiiph@0 160 editBox:ClearFocus()
Xiiph@0 161 editBox:EnableMouse(false)
Xiiph@0 162 editBox:SetTextColor(0.5, 0.5, 0.5)
Xiiph@0 163 self.label:SetTextColor(0.5, 0.5, 0.5)
Xiiph@0 164 self.scrollFrame:EnableMouse(false)
Xiiph@0 165 self.button:Disable()
Xiiph@0 166 else
Xiiph@0 167 editBox:EnableMouse(true)
Xiiph@0 168 editBox:SetTextColor(1, 1, 1)
Xiiph@0 169 self.label:SetTextColor(1, 0.82, 0)
Xiiph@0 170 self.scrollFrame:EnableMouse(true)
Xiiph@0 171 end
Xiiph@0 172 end,
Xiiph@0 173
Xiiph@0 174 ["SetLabel"] = function(self, text)
Xiiph@0 175 if text and text ~= "" then
Xiiph@0 176 self.label:SetText(text)
Xiiph@0 177 if self.labelHeight ~= 10 then
Xiiph@0 178 self.labelHeight = 10
Xiiph@0 179 self.label:Show()
Xiiph@0 180 end
Xiiph@0 181 elseif self.labelHeight ~= 0 then
Xiiph@0 182 self.labelHeight = 0
Xiiph@0 183 self.label:Hide()
Xiiph@0 184 end
Xiiph@0 185 Layout(self)
Xiiph@0 186 end,
Xiiph@0 187
Xiiph@0 188 ["SetNumLines"] = function(self, value)
Xiiph@0 189 if not value or value < 4 then
Xiiph@0 190 value = 4
Xiiph@0 191 end
Xiiph@0 192 self.numlines = value
Xiiph@0 193 Layout(self)
Xiiph@0 194 end,
Xiiph@0 195
Xiiph@0 196 ["SetText"] = function(self, text)
Xiiph@0 197 self.editBox:SetText(text)
Xiiph@0 198 end,
Xiiph@0 199
Xiiph@0 200 ["GetText"] = function(self)
Xiiph@0 201 return self.editBox:GetText()
Xiiph@0 202 end,
Xiiph@0 203
Xiiph@0 204 ["SetMaxLetters"] = function (self, num)
Xiiph@0 205 self.editBox:SetMaxLetters(num or 0)
Xiiph@0 206 end,
Xiiph@0 207
Xiiph@0 208 ["DisableButton"] = function(self, disabled)
Xiiph@0 209 self.disablebutton = disabled
Xiiph@0 210 if disabled then
Xiiph@0 211 self.button:Hide()
Xiiph@0 212 else
Xiiph@0 213 self.button:Show()
Xiiph@0 214 end
Xiiph@0 215 Layout(self)
Xiiph@0 216 end,
Xiiph@0 217
Xiiph@0 218 ["ClearFocus"] = function(self)
Xiiph@0 219 self.editBox:ClearFocus()
Xiiph@0 220 self.frame:SetScript("OnShow", nil)
Xiiph@0 221 end,
Xiiph@0 222
Xiiph@0 223 ["SetFocus"] = function(self)
Xiiph@0 224 self.editBox:SetFocus()
Xiiph@0 225 if not self.frame:IsShown() then
Xiiph@0 226 self.frame:SetScript("OnShow", OnShowFocus)
Xiiph@0 227 end
Xiiph@0 228 end
Xiiph@0 229 }
Xiiph@0 230
Xiiph@0 231 --[[-----------------------------------------------------------------------------
Xiiph@0 232 Constructor
Xiiph@0 233 -------------------------------------------------------------------------------]]
Xiiph@0 234 local backdrop = {
Xiiph@0 235 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
Xiiph@0 236 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
Xiiph@0 237 insets = { left = 4, right = 3, top = 4, bottom = 3 }
Xiiph@0 238 }
Xiiph@0 239
Xiiph@0 240 local function Constructor()
Xiiph@0 241 local frame = CreateFrame("Frame", nil, UIParent)
Xiiph@0 242 frame:Hide()
Xiiph@0 243
Xiiph@0 244 local widgetNum = AceGUI:GetNextWidgetNum(Type)
Xiiph@0 245
Xiiph@0 246 local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
Xiiph@0 247 label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
Xiiph@0 248 label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
Xiiph@0 249 label:SetJustifyH("LEFT")
Xiiph@0 250 label:SetText(ACCEPT)
Xiiph@0 251 label:SetHeight(10)
Xiiph@0 252
Xiiph@0 253 local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate2")
Xiiph@0 254 button:SetPoint("BOTTOMLEFT", 0, 4)
Xiiph@0 255 button:SetHeight(22)
Xiiph@0 256 button:SetWidth(label:GetStringWidth() + 24)
Xiiph@0 257 button:SetText(ACCEPT)
Xiiph@0 258 button:SetScript("OnClick", OnClick)
Xiiph@0 259 button:Disable()
Xiiph@0 260
Xiiph@0 261 local text = button:GetFontString()
Xiiph@0 262 text:ClearAllPoints()
Xiiph@0 263 text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
Xiiph@0 264 text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
Xiiph@0 265 text:SetJustifyV("MIDDLE")
Xiiph@0 266
Xiiph@0 267 local scrollBG = CreateFrame("Frame", nil, frame)
Xiiph@0 268 scrollBG:SetBackdrop(backdrop)
Xiiph@0 269 scrollBG:SetBackdropColor(0, 0, 0)
Xiiph@0 270 scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
Xiiph@0 271
Xiiph@0 272 local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
Xiiph@0 273
Xiiph@0 274 local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
Xiiph@0 275 scrollBar:ClearAllPoints()
Xiiph@0 276 scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
Xiiph@0 277 scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
Xiiph@0 278 scrollBar:SetPoint("RIGHT", frame, "RIGHT")
Xiiph@0 279
Xiiph@0 280 scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
Xiiph@0 281 scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
Xiiph@0 282
Xiiph@0 283 scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
Xiiph@0 284 scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
Xiiph@0 285 scrollFrame:SetScript("OnEnter", OnEnter)
Xiiph@0 286 scrollFrame:SetScript("OnLeave", OnLeave)
Xiiph@0 287 scrollFrame:SetScript("OnMouseUp", OnMouseUp)
Xiiph@0 288 scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
Xiiph@0 289 scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
Xiiph@0 290 scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
Xiiph@0 291
Xiiph@0 292 local editBox = CreateFrame("EditBox", nil, scrollFrame)
Xiiph@0 293 editBox:SetAllPoints()
Xiiph@0 294 editBox:SetFontObject(ChatFontNormal)
Xiiph@0 295 editBox:SetMultiLine(true)
Xiiph@0 296 editBox:EnableMouse(true)
Xiiph@0 297 editBox:SetAutoFocus(false)
Xiiph@0 298 editBox:SetCountInvisibleLetters(false)
Xiiph@0 299 editBox:SetScript("OnCursorChanged", OnCursorChanged)
Xiiph@0 300 editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
Xiiph@0 301 editBox:SetScript("OnEnter", OnEnter)
Xiiph@0 302 editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
Xiiph@0 303 editBox:SetScript("OnLeave", OnLeave)
Xiiph@0 304 editBox:SetScript("OnMouseDown", OnReceiveDrag)
Xiiph@0 305 editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
Xiiph@0 306 editBox:SetScript("OnTextChanged", OnTextChanged)
Xiiph@0 307 editBox:SetScript("OnTextSet", OnTextSet)
Xiiph@0 308 editBox:SetScript("OnEditFocusGained", OnFocusGained)
Xiiph@0 309
Xiiph@0 310
Xiiph@0 311 scrollFrame:SetScrollChild(editBox)
Xiiph@0 312
Xiiph@0 313 local widget = {
Xiiph@0 314 button = button,
Xiiph@0 315 editBox = editBox,
Xiiph@0 316 frame = frame,
Xiiph@0 317 label = label,
Xiiph@0 318 labelHeight = 10,
Xiiph@0 319 numlines = 4,
Xiiph@0 320 scrollBar = scrollBar,
Xiiph@0 321 scrollBG = scrollBG,
Xiiph@0 322 scrollFrame = scrollFrame,
Xiiph@0 323 type = Type
Xiiph@0 324 }
Xiiph@0 325 for method, func in pairs(methods) do
Xiiph@0 326 widget[method] = func
Xiiph@0 327 end
Xiiph@0 328 button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
Xiiph@0 329
Xiiph@0 330 return AceGUI:RegisterAsWidget(widget)
Xiiph@0 331 end
Xiiph@0 332
Xiiph@0 333 AceGUI:RegisterWidgetType(Type, Constructor, Version)