diff --git a/WowLua.lua b/WowLua.lua
index 4c685bd..e48268a 100644
--- a/WowLua.lua
+++ b/WowLua.lua
@@ -1,969 +1,962 @@
---[[--------------------------------------------------------------------------
- Copyright (c) 2007, James Whitehead II
- All rights reserved.
-
- WowLua is an interactive interpreter for World of Warcraft
---------------------------------------------------------------------------]]--
-
-local addon = ...
-local version = GetAddOnMetadata("WowLua", "Version") or "SVN"
-WowLua = {
- VERSION = "WowLua v" .. version .. " Interactive Interpreter",
- queue = {},
- queuePos = 0,
-}
-local L = WowLuaLocals
-
-WowLua_DB = {
- pages = {
- [1] = {name = format(L.NEW_PAGE_TITLE, 1), content = "", untitled = true}
- },
- currentPage = 1,
- untitled = 2,
- fontSize = 14,
-}
-
-local DB = {}
-
-local eframe = CreateFrame("Frame")
-eframe:RegisterEvent("ADDON_LOADED")
-eframe:SetScript("OnEvent", function(self, event, ...)
- if event == "ADDON_LOADED" then
- local arg1 = ...
- if arg1 == addon then
- if WowLua_DB.fontSize then
- local file, height, flags = WowLuaMonoFont:GetFont()
- WowLuaMonoFont:SetFont(file, WowLua_DB.fontSize, flags)
- end
- end
- end
-end)
-
-function WowLua:CreateNewPage()
- local name = format(L.NEW_PAGE_TITLE, WowLua_DB.untitled)
- WowLua_DB.untitled = WowLua_DB.untitled + 1
- local entry = {
- name = name,
- content = "",
- untitled = true
- }
- table.insert(WowLua_DB.pages, entry)
- WowLua_DB.currentPage = #WowLua_DB.pages
- return entry, #WowLua_DB.pages
-end
-
-function WowLua:GetNumPages()
- return #WowLua_DB.pages
-end
-
-function WowLua:SavePage(num, content)
- local entry = WowLua_DB.pages[num]
- entry.content = content
-end
-
-function WowLua:RenamePage(num, name)
- local entry = WowLua_DB.pages[num]
- entry.name = name
- entry.untitled = nil
-end
-
-function WowLua:DeletePage(num)
- table.remove(WowLua_DB.pages, num)
-end
-
-function WowLua:LockPage(num, locked)
- local entry = WowLua_DB.pages[num]
- entry.locked = locked
-end
-
-function WowLua:IsPageLocked(num)
- local entry = WowLua_DB.pages[num]
- return entry.locked
-end
-
-function WowLua:GetCurrentPage()
- local page = WowLua_DB.currentPage
- return page, WowLua_DB.pages[page]
-end
-
-function WowLua:SelectPage(id)
- if type(id) == "number" then
- WowLua_DB.currentPage = id
- return WowLua_DB.pages[id], id
- elseif type(id) == "string" then
- for idx,entry in ipairs(WowLua_DB.pages) do
- if entry.name == id then
- WowLua_DB.currentPage = idx
- return entry, idx
- end
- end
- end
-end
-
-local function wowpad_print(...)
- local out = ""
- for i=1,select("#", ...) do
- -- Comma seperate values
- if i > 1 then
- out = out .. ", "
- end
-
- out = out .. tostring(select(i, ...))
- end
- WowLuaFrameOutput:AddMessage("|cff999999" .. out .. "|r")
-end
-
-if not print then
- print = wowpad_print
-end
-
-local function processSpecialCommands(txt)
- if txt == L.RELOAD_COMMAND then
- ReloadUI()
- return true
- elseif txt == L.RESET_COMMAND then
- WowLuaFrame:ClearAllPoints()
- WowLuaFrame:SetPoint("CENTER")
- WowLuaFrame:SetWidth(640)
- WowLuaFrame:SetHeight(512)
- WowLuaFrameResizeBar:ClearAllPoints()
- WowLuaFrameResizeBar:SetPoint("TOPLEFT", WowLuaFrame, "BOTTOMLEFT", 14, 100)
- WowLuaFrameResizeBar:SetPoint("TOPRIGHT", WowLuaFrame, "BOTTOMRIGHT", 0, 100)
- return true
- end
-end
-
-function WowLua:ProcessLine(text)
- WowLuaFrameCommandEditBox:SetText("")
-
- if processSpecialCommands(text) then
- return
- end
-
- -- escape any color codes:
- local output = text:gsub("\124", "\124\124")
-
- WowLuaFrameOutput:AddMessage(WowLuaFrameCommandPrompt:GetText() .. output)
-
- WowLuaFrameCommandEditBox:AddHistoryLine(output)
-
- -- If they're using "= value" syntax, just print it
- text = text:gsub("^%s*=%s*(.+)", "print(%1)")
-
- -- Store this command into self.cmd in case we have multiple lines
- if self.cmd then
- self.cmd = self.cmd .. "\n" .. text
- self.orig = self.orig .. "\n" .. text
- else
- self.cmd = text
- self.orig = text
- end
-
- -- Trim the command before we run it
- self.cmd = string.trim(self.cmd)
-
- -- Process the current command
- local func,err = loadstring(self.cmd)
-
- -- Fail to compile? Give it a return
- -- Check to see if this just needs a return in front of it
- if not func then
- local newfunc,newerr = loadstring("print(" .. self.cmd .. ")")
- if newfunc then
- func,err = newfunc,newerr
- end
- end
-
- if not func then
- -- Check to see if this is just an unfinished block
- if err:sub(-7, -1) == "'<eof>'" then
- -- Change the prompt
- WowLuaFrameCommandPrompt:SetText(">> ")
- return
- end
-
- WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
- self.cmd = nil
- WowLuaFrameCommandPrompt:SetText("> ")
- else
- -- Make print a global function
- local old_print = print
- print = wowpad_print
-
- -- Call the function
- local succ,err = pcall(func)
-
- -- Restore the value of print
- print = old_print
-
- if not succ then
- WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
- end
-
- self.cmd = nil
- WowLuaFrameCommandPrompt:SetText("> ")
- end
-end
-
-function WowLua:RunScript(text)
- -- escape any color codes:
- local output = text:gsub("\124", "\124\124")
-
- if text == L.RELOAD_COMMAND then
- ReloadUI()
- end
-
- -- If they're using "= value" syntax, just print it
- text = text:gsub("^%s*=%s*(.+)", "print(%1)")
-
- -- Trim the command before we run it
- text = string.trim(text)
-
- -- Process the current command
- local func,err = loadstring(text, "WowLua")
-
- if not func then
- WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
- return false, err
- else
- -- Make print a global function
- local old_print = print
- print = wowpad_print
-
- -- Call the function
- local succ,err = pcall(func)
-
- -- Restore the value of print
- print = old_print
-
- if not succ then
- WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
- return false, err
- end
- end
-
- return true
-end
-
-function WowLua:Initialize(frame)
- WowLua:OnSizeChanged(frame)
- table.insert(UISpecialFrames, "WowLuaFrame")
- PlaySound("igMainMenuOpen");
- self:UpdateButtons()
-end
-
-function WowLua:Button_OnEnter(frame)
- GameTooltip:SetOwner(frame, "ANCHOR_BOTTOM");
- local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ")
- local tooltip = L.TOOLTIPS[operation]
- GameTooltip:SetText(tooltip and tooltip.name or operation)
- if tooltip then
- GameTooltip:AddLine(tooltip.text, 1, 1, 1)
- end
- GameTooltip:Show();
-end
-
-function WowLua:Button_OnLeave(frame)
- GameTooltip:Hide()
-end
-
-function WowLua:Button_OnClick(button)
- local operation = button:GetName():match("WowLuaButton_(.+)")
- if operation == "New" then
- WowLua:Button_New(button)
- elseif operation == "Open" then
- WowLua:Button_Open(button)
- elseif operation == "Save" then
- WowLua:Button_Save(button)
- elseif operation == "Undo" then
- WowLua:Button_Undo(button)
- elseif operation == "Redo" then
- WowLua:Button_Redo(button)
- elseif operation == "Delete" then
- WowLua:Button_Delete(button)
- elseif operation == "Lock" then
- WowLua:Button_Lock(button)
- elseif operation == "Unlock" then
- WowLua:Button_Unlock(button)
- elseif operation == "Previous" then
- WowLua:Button_Previous(button)
- elseif operation == "Next" then
- WowLua:Button_Next(button)
- elseif operation == "Run" then
- WowLua:Button_Run(button)
- elseif operation == "Config" then
- WowLua:Button_Config(button)
- elseif operation == "Close" then
- WowLua:Button_Close(button)
- end
-end
-
-function WowLua:DebugQueue()
- print("Current queue position: " .. self.queuePos)
- for k,v in pairs(self.queue) do
- print(k, v:sub(1, 20))
- end
-end
-
-function WowLua:FlushQueue()
- table.wipe(self.queue)
- self.queuePos = 0
-end
-
-function WowLua:Queue(text)
- if #self.queue == 0 then
- local page, entry = WowLua:GetCurrentPage()
- self.queue[1] = entry.content
- self.queuePos = 1
- end
-
- if text ~= self.queue[self.queuePos] then
- self.queuePos = self.queuePos+1
- self.queue[self.queuePos] = text
- for i=self.queuePos+1,#self.queue do
- self.queue[i]=nil
- end
- end
-end
-
-function WowLua:GetUndoPage()
- -- Before we do any "Undo", queue the current text
- WowLua:Queue(WowLuaFrameEditBox:GetText())
-
- local item = self.queue[self.queuePos-1]
- if item then
- self.queuePos = self.queuePos-1
- return item
- end
-
- return self.queue[self.queuePos]
-end
-
-function WowLua:GetRedoPage()
- local item = self.queue[self.queuePos+1]
- if item then
- self.queuePos = self.queuePos+1
- return item
- end
- return self.queue[self.queuePos]
-end
-
-function WowLua:Button_New(button)
- if self:IsModified() then
- -- Display the unsaved changes dialog
- local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
- dialog.data = "Button_New"
- return
- end
-
- -- Create a new page and display it
- local entry, num = WowLua:CreateNewPage()
-
- WowLuaFrameEditBox:SetText(entry.content)
- WowLua:UpdateButtons()
- WowLua:SetTitle(false)
- WowLua:FlushQueue()
-end
-
-function WowLua:Button_Open(button)
- ToggleDropDownMenu(1, nil, WowLuaOpenDropDown, button:GetName(), 0, 0)
-end
-
-function WowLua:OpenDropDownOnLoad(frame)
- UIDropDownMenu_Initialize(frame, self.OpenDropDownInitialize)
-end
-
-local function dropDownFunc(button, page)
- WowLua:GoToPage(page)
-end
-
-function WowLua.OpenDropDownInitialize()
- UIDropDownMenu_AddButton{
- text = L.OPEN_MENU_TITLE,
- isTitle = 1
- }
-
- for page, entry in ipairs(WowLua_DB.pages) do
- UIDropDownMenu_AddButton{
- text = entry.name,
- func = dropDownFunc,
- arg1 = page
- }
- end
-end
-
-StaticPopupDialogs["WOWLUA_SAVE_AS"] = {
- text = L.SAVE_AS_TEXT,
- button1 = TEXT(OKAY),
- button2 = TEXT(CANCEL),
- OnAccept = function(self)
- local name = self:GetName().."EditBox"
- local button = _G[name]
- local text = button:GetText()
- WowLua:RenamePage(WowLua.save_as, text)
- WowLua:SetTitle()
- end,
- timeout = 0,
- whileDead = 1,
- exclusive = 1,
- showAlert = 1,
- hideOnEscape = 1,
- hasEditBox = 1,
- maxLetters = 32,
- OnShow = function(self)
- getglobal(self:GetName().."Button1"):Disable();
- local editBox = _G[self:GetName().."EditBox"]
- editBox:SetFocus()
- editBox:SetText(WowLua.save_as_name)
- editBox:HighlightText()
- end,
- OnHide = function(self)
- local activeWindow = ChatEdit_GetActiveWindow()
- if activeWindow then
- activeWindow:SetText("")
- end
- end,
- EditBoxOnEnterPressed = function(self)
- if _G[self:GetParent():GetName().."Button1"]:IsEnabled() == 1 then
- local name = self:GetParent():GetName().."EditBox"
- local button = _G[name]
- local text = button:GetText()
- WowLua:RenamePage(WowLua.save_as, text)
- WowLua:SetTitle()
- self:GetParent():Hide();
- end
- end,
- EditBoxOnTextChanged = function (self)
- local editBox = _G[self:GetParent():GetName().."EditBox"];
- local txt = editBox:GetText()
- if #txt > 0 then
- _G[self:GetParent():GetName().."Button1"]:Enable();
- else
- _G[self:GetParent():GetName().."Button1"]:Disable();
- end
- end,
- EditBoxOnEscapePressed = function(self)
- self:GetParent():Hide();
- ClearCursor();
- end
-}
-
-function WowLua:Button_Save(button)
- if button and IsShiftKeyDown() then
- -- Show the static popup for renaming
- local page, entry = self:GetCurrentPage()
- WowLua.save_as = page
- WowLua.save_as_name = entry.name
- StaticPopup_Show("WOWLUA_SAVE_AS", entry.name)
- return
- else
- local text = WowLuaFrameEditBox:GetText()
- local page = self:GetCurrentPage()
- self:SavePage(page, text)
- self:UpdateButtons()
- self:SetTitle(false)
- WowLua:Queue(text)
- end
-end
-
-function WowLua:Button_Undo(button)
- local page, entry = self:GetCurrentPage()
- local undo = WowLua:GetUndoPage()
- WowLuaFrameEditBox:SetText(undo or entry.content)
-end
-
-function WowLua:Button_Redo(button)
- local page, entry = self:GetCurrentPage()
- local redo = WowLua:GetRedoPage()
- WowLuaFrameEditBox:SetText(redo)
-end
-
-function WowLua:Button_Delete(button)
- if self:IsModified() then
- -- Display the unsaved changes dialog
- local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
- dialog.data = "Button_Delete"
- return
- end
-
- local page, entry = self:GetCurrentPage()
- if self:GetNumPages() == 1 then
- self:Button_New()
- self:Button_Previous()
- end
-
- self:DeletePage(page)
-
- if page > 1 then page = page - 1 end
- local entry = self:SelectPage(page)
- WowLuaFrameEditBox:SetText(entry.content)
- self:UpdateButtons()
- self:SetTitle(false)
-end
-
-function WowLua:Button_Lock(button)
- local id = self:GetCurrentPage()
- self:LockPage(id, true)
- self:UpdateButtons()
-end
-
-function WowLua:Button_Unlock(button)
- local id = self:GetCurrentPage()
- self:LockPage(id, false)
- self:UpdateButtons()
-end
-
-StaticPopupDialogs["WOWLUA_UNSAVED"] = {
- text = L.UNSAVED_TEXT,
- button1 = TEXT(OKAY),
- button2 = TEXT(CANCEL),
- OnAccept = function(self)
- local page,entry = WowLua:GetCurrentPage()
- WowLuaFrameEditBox:SetText(entry.content)
- local action = self:GetParent().data
- if type(action) == "string" then
- WowLua[action](WowLua)
- else
- WowLua:GoToPage(self:GetParent().data)
- end
- end,
- timeout = 0,
- whileDead = 1,
- exclusive = 1,
- showAlert = 1,
- hideOnEscape = 1,
- EditBoxOnEscapePressed = function(self)
- self:GetParent():Hide();
- ClearCursor();
- end
-}
-
-function WowLua:Button_Previous()
- self:GoToPage(self:GetCurrentPage() - 1)
-end
-
-function WowLua:Button_Next()
- self:GoToPage(self:GetCurrentPage() + 1)
-end
-
-function WowLua:GoToPage(page)
- if self:IsModified() then
- -- Display the unsaved changes dialog
- local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
- dialog.data = page
- return
- end
-
- local entry = self:SelectPage(page)
- if not entry then
- return
- end
-
- WowLuaFrameEditBox:SetText(entry.content)
- self:UpdateButtons()
- self:SetTitle(false)
- WowLua:FlushQueue()
-end
-
-function WowLua:UpdateButtons()
- local current = self:GetCurrentPage()
- local max = self:GetNumPages()
-
- if current == 1 then
- WowLuaButton_Previous:Disable()
- else
- WowLuaButton_Previous:Enable()
- end
-
- if current == max then
- WowLuaButton_Next:Disable()
- else
- WowLuaButton_Next:Enable()
- end
-
- self.indent.indentEditbox(WowLuaFrameEditBox)
-
- if self:IsPageLocked(current) then
- WowLuaButton_Unlock:Show()
- WowLuaButton_Lock:Hide()
- WowLuaButton_Delete:Disable()
- WowLuaFrameEditBox:SetScript("OnTextChanged", self.lockedTextChanged)
- else
- WowLuaButton_Unlock:Hide()
- WowLuaButton_Lock:Show()
- WowLuaButton_Delete:Enable()
- WowLuaFrameEditBox:SetScript("OnTextChanged", self.unlockedTextChanged)
- end
-end
-
-function WowLua.lockedTextChanged(box)
- if WowLua.reverting then
- WowLua.reverting = false
- else
- WowLua.reverting = true
- local entry = select(2, WowLua:GetCurrentPage())
- local pos = WowLua.lastCursorPos
- box:SetText(entry.content)
- WowLua.indent.indentEditbox(WowLuaFrameEditBox)
- if pos then
- box:SetCursorPosition(pos)
- end
- end
-end
-
-function WowLua:Button_Run()
- local text = WowLuaFrameEditBox:GetText()
-
- -- Run the script, if there is an error then highlight it
- if text then
- -- Add the current state of the page to the queue
- WowLua:Queue(text)
-
- local succ,err = WowLua:RunScript(text)
- if not succ then
- local chunkName,lineNum = err:match("(%b[]):(%d+):")
- lineNum = tonumber(lineNum)
- WowLua:UpdateLineNums(lineNum)
-
- -- Highlight the text in the editor by finding the char of the line number we're on
- text = WowLua.indent.coloredGetText(WowLuaFrameEditBox)
-
- local curLine,start = 1,1
- while curLine < lineNum do
- local s,e = text:find("\n", start)
- start = e + 1
- curLine = curLine + 1
- end
-
- local nextLine = select(2, text:find("\n", start))
-
- WowLuaFrameEditBox:SetFocus()
- WowLuaFrameEditBox:SetCursorPosition(start - 1)
- end
- end
-end
-
-function WowLua:Button_Config()
- InterfaceOptionsFrame_OpenToCategory("WowLua")
-end
-
-function WowLua:Button_Close()
- if self:IsModified() then
- -- Display the unsaved changes dialog
- local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
- dialog.data = "Button_Close"
- return
- end
-
- HideUIPanel(WowLuaFrame)
-end
-
-function WowLua:IsModified()
- local page,entry = self:GetCurrentPage()
- local orig = entry.content
- local current = WowLuaFrameEditBox:GetText(true)
- return orig ~= current
-end
-
-function WowLua:IsUntitled()
- local page, entry = self:GetCurrentPage()
- return entry.untitled
-end
-
-function WowLua:SetTitle(modified)
- local page,entry = self:GetCurrentPage()
- WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "")
-end
-
-function WowLua:OnSizeChanged(frame)
- -- The first graphic is offset 13 pixels to the right
- local width = frame:GetWidth() - 13
- local bg2w,bg3w,bg4w = 0,0,0
-
- -- Resize bg2 up to 256 width
- local bg2w = width - 256
- if bg2w > 256 then
- bg3w = bg2w - 256
- bg2w = 256
- end
-
- if bg3w > 256 then
- bg4w = bg3w - 256
- bg3w = 256
- end
-
- local bg2 = WowLuaFrameBG2
- local bg3 = WowLuaFrameBG3
- local bg4 = WowLuaFrameBG4
-
- if bg2w > 0 then
- bg2:SetWidth(bg2w)
- bg2:SetTexCoord(0, (bg2w / 256), 0, 1)
- bg2:Show()
- else
- bg2:Hide()
- end
-
- if bg3w and bg3w > 0 then
- bg3:SetWidth(bg3w)
- bg3:SetTexCoord(0, (bg3w / 256), 0, 1)
- bg3:Show()
- else
- bg3:Hide()
- end
-
- if bg4w and bg4w > 0 then
- bg4:SetWidth(bg4w)
- bg4:SetTexCoord(0, (bg4w / 256), 0, 1)
- bg4:Show()
- else
- bg4:Hide()
- end
-
- if WowLuaFrameResizeBar and false then
- local parent = WowLuaFrameResizeBar:GetParent()
- local cursorY = select(2, GetCursorPosition())
- local newPoint = select(5, WowLuaFrameResizeBar:GetPoint())
- local maxPoint = parent:GetHeight() - 175;
-
- if newPoint < 100 then
- newPoint = 100
- elseif newPoint > maxPoint then
- newPoint = maxPoint
- end
-
- WowLuaFrameResizeBar:ClearAllPoints()
- WowLuaFrameResizeBar:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint)
- WowLuaFrameResizeBar:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint)
- end
-end
-
-function WowLua:ResizeBar_OnMouseDown(frame, button)
- frame.cursorStart = select(2, GetCursorPosition())
- frame.anchorStart = select(5, frame:GetPoint())
- frame:SetScript("OnUpdate", function(...) WowLua:ResizeBar_OnUpdate(...) end)
-end
-
-function WowLua:ResizeBar_OnMouseUp(frame, button)
- frame:SetScript("OnUpdate", nil)
-end
-
-function WowLua:ResizeBar_OnUpdate(frame, elapsed)
- local parent = frame:GetParent()
- local cursorY = select(2, GetCursorPosition())
- local newPoint = frame.anchorStart - (frame.cursorStart - cursorY)/frame:GetEffectiveScale()
- local maxPoint = parent:GetHeight() - 175;
-
- if newPoint < 100 then
- newPoint = 100
- elseif newPoint > maxPoint then
- newPoint = maxPoint
- end
-
- frame:ClearAllPoints()
- frame:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint)
- frame:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint)
-end
-
-function WowLua:OnVerticalScroll(scrollFrame)
- local offset = scrollFrame:GetVerticalScroll();
- local scrollbar = getglobal(scrollFrame:GetName().."ScrollBar");
-
- scrollbar:SetValue(offset);
- local min, max = scrollbar:GetMinMaxValues();
- local display = false;
- if ( offset == 0 ) then
- getglobal(scrollbar:GetName().."ScrollUpButton"):Disable();
- else
- getglobal(scrollbar:GetName().."ScrollUpButton"):Enable();
- display = true;
- end
- if ((scrollbar:GetValue() - max) == 0) then
- getglobal(scrollbar:GetName().."ScrollDownButton"):Disable();
- else
- getglobal(scrollbar:GetName().."ScrollDownButton"):Enable();
- display = true;
- end
- if ( display ) then
- scrollbar:Show();
- else
- scrollbar:Hide();
- end
-end
-
-function WowLua:UpdateLineNums(highlightNum)
- -- highlightNum is the line number indicated by the error message
- if highlightNum then
- WowLua.highlightNum = highlightNum
- else
- highlightNum = WowLua.highlightNum
- end
-
- -- Since we know this is FAIAP enabled, we need to pass true in order
- -- to get the raw values
- local editbox = WowLuaFrameEditBox
- local linebox = WowLuaFrameLineNumEditBox
- local linetest = WowLuaFrameEditBoxLineTest
- local linescroll = WowLuaFrameLineNumScrollFrame
-
- local width = editbox:GetWidth()
- local text = editbox:GetText(true)
-
- local linetext = ""
- local count = 1
- for line in text:gmatch("([^\n]*\n?)") do
- if #line > 0 then
- if count == highlightNum then
- linetext = linetext .. "|cFFFF1111" .. count .. "|r" .. "\n"
- else
- linetext = linetext .. count .. "\n"
- end
- count = count + 1
-
- -- Check to see if the line of text spans more than one actual line
- linetest:SetText(line:gsub("|", "||"))
- local testwidth = linetest:GetWidth()
- if testwidth >= width then
- linetext = linetext .. string.rep("\n", testwidth / width)
- end
- end
- end
-
- if text:sub(-1, -1) == "\n" then
- linetext = linetext .. count .. "\n"
- count = count + 1
- end
-
- -- Make the line number frame wider as necessary
- local offset = tostring(count):len() * 10
- linescroll:ClearAllPoints()
- linescroll:SetPoint("TOPLEFT", WowLuaFrame, "TOPLEFT", 18, -74)
- linescroll:SetPoint("BOTTOMRIGHT", WowLuaFrameResizeBar, "TOPLEFT", 15 + offset, -4)
-
- linebox:SetText(linetext)
- linetest:SetText(text)
-end
-
-local function canScroll(scroll, direction)
- local num, displayed, currScroll = scroll:GetNumMessages(),
- scroll:GetNumLinesDisplayed(),
- scroll:GetCurrentScroll();
- if ( direction == "up" and
- (
- num == displayed or
- num == ( currScroll + displayed )
- )
- ) then
- return false;
- elseif ( direction == "down" and currScroll == 0 ) then
- return false;
- end
- return true;
-end
-
-function WowLua:UpdateScrollingMessageFrame(frame)
- local name = frame:GetName();
- local display = false;
-
- if ( canScroll(frame, "up") ) then
- getglobal(name.."UpButton"):Enable();
- display = true;
- else
- getglobal(name.."UpButton"):Disable();
- end
-
- if ( canScroll(frame, "down") ) then
- getglobal(name.."DownButton"):Enable();
- display = true;
- else
- getglobal(name.."DownButton"):Disable();
- end
-
- if ( display ) then
- getglobal(name.."UpButton"):Show();
- getglobal(name.."DownButton"):Show();
- else
- getglobal(name.."UpButton"):Hide();
- getglobal(name.."DownButton"):Hide();
- end
-end
-
-local scrollMethods = {
- ["line"] = { ["up"] = "ScrollUp", ["down"] = "ScrollDown" },
- ["page"] = { ["up"] = "PageUp", ["down"] = "PageDown" },
- ["end"] = { ["up"] = "ScrollToTop", ["down"] = "ScrollToBottom" },
-};
-
-function WowLua:ScrollingMessageFrameScroll(scroll, direction, type)
- -- Make sure we can scroll first
- if ( not canScroll(scroll, direction) ) then
- return;
- end
- local method = scrollMethods[type][direction];
- scroll[method](scroll);
-end
-
-function WowLua:OnTextChanged(frame)
- frame.highlightNum = nil
-end
-
-function WowLua:OnCursorChanged(frame)
- WowLua.dirty = true
-end
-
-BINDING_HEADER_WOWLUA = "WowLua Editor/Interpreter"
-BINDING_NAME_TOGGLE_WOWLUA = "Show/Hide window"
-BINDING_NAME_RUN_WOWLUA = "Run current page"
-BINDING_NAME_SAVE_WOWLUA = "Save current page"
-
-SLASH_WOWLUA1 = "/lua"
-SLASH_WOWLUA2 = "/wowlua"
-local first = true
-SlashCmdList["WOWLUA"] = function(txt)
- local page, entry = WowLua:GetCurrentPage()
- if first then
- WowLuaFrameEditBox:SetText(entry.content)
- WowLuaFrameEditBox:SetWidth(WowLuaFrameEditScrollFrame:GetWidth())
- WowLua:SetTitle(false)
- first = false
- end
-
- WowLuaFrame:Show()
-
- if processSpecialCommands(txt) then
- return
- end
-
- if txt:match("%S") then
- WowLua:ProcessLine(txt)
- end
-
- WowLuaFrameCommandEditBox:SetFocus()
-end
-
-local function printf(fmt, ...)
- print(fmt:format(...))
-end
-
-SLASH_WOWLUARUN1 = "/luarun"
-SLASH_WOWLUARUN2 = "/wowluarun"
-SlashCmdList["WOWLUARUN"] = function(txt, editbox)
- local entry, idx = WowLua:SelectPage(txt)
- if not entry then
- printf("|cFF33FF99WowLua|r: Unable to find a page named '%s'", txt)
- return
- else
- printf("|cFF33FF99WowLua|r: Running page '%s'", txt)
- local func, err = loadstring(entry.content, "WowLua")
- if not func then
- printf("|cFF33FF99WowLua|r: Error compiling page '%s': %s", txt, err)
- else
- -- Call the function
- local succ, err = pcall(func)
-
- if not succ then
- printf("|cFF33FF99WowLua|r: Error while running page '%s': %s", txt, err)
- end
- end
- end
-end
+--[[--------------------------------------------------------------------------
+ Copyright (c) 2007-2017, James Whitehead II
+ All rights reserved.
+
+ WowLua is an interactive interpreter for World of Warcraft
+--------------------------------------------------------------------------]]--
+
+local addon = ...
+local version = GetAddOnMetadata("WowLua", "Version") or "SVN"
+WowLua = {
+ VERSION = "WowLua v" .. version .. " Interactive Interpreter",
+ queue = {},
+ queuePos = 0,
+}
+local L = WowLuaLocals
+
+WowLua_DB = {
+ pages = {
+ [1] = {name = format(L.NEW_PAGE_TITLE, 1), content = "", untitled = true}
+ },
+ currentPage = 1,
+ untitled = 2,
+ fontSize = 14,
+}
+
+local DB = {}
+
+local eframe = CreateFrame("Frame")
+eframe:RegisterEvent("ADDON_LOADED")
+eframe:SetScript("OnEvent", function(self, event, ...)
+ if event == "ADDON_LOADED" then
+ local arg1 = ...
+ if arg1 == addon then
+ if WowLua_DB.fontSize then
+ local file, height, flags = WowLuaMonoFont:GetFont()
+ WowLuaMonoFont:SetFont(file, WowLua_DB.fontSize, flags)
+ end
+ end
+ end
+end)
+
+function WowLua:CreateNewPage()
+ local name = format(L.NEW_PAGE_TITLE, WowLua_DB.untitled)
+ WowLua_DB.untitled = WowLua_DB.untitled + 1
+ local entry = {
+ name = name,
+ content = "",
+ untitled = true
+ }
+ table.insert(WowLua_DB.pages, entry)
+ WowLua_DB.currentPage = #WowLua_DB.pages
+ return entry, #WowLua_DB.pages
+end
+
+function WowLua:GetNumPages()
+ return #WowLua_DB.pages
+end
+
+function WowLua:SavePage(num, content)
+ local entry = WowLua_DB.pages[num]
+ entry.content = content
+end
+
+function WowLua:RenamePage(num, name)
+ local entry = WowLua_DB.pages[num]
+ entry.name = name
+ entry.untitled = nil
+end
+
+function WowLua:DeletePage(num)
+ table.remove(WowLua_DB.pages, num)
+end
+
+function WowLua:LockPage(num, locked)
+ local entry = WowLua_DB.pages[num]
+ entry.locked = locked
+end
+
+function WowLua:IsPageLocked(num)
+ local entry = WowLua_DB.pages[num]
+ return entry.locked
+end
+
+function WowLua:GetCurrentPage()
+ local page = WowLua_DB.currentPage
+ return page, WowLua_DB.pages[page]
+end
+
+function WowLua:SelectPage(id)
+ if type(id) == "number" then
+ WowLua_DB.currentPage = id
+ return WowLua_DB.pages[id], id
+ elseif type(id) == "string" then
+ for idx,entry in ipairs(WowLua_DB.pages) do
+ if entry.name == id then
+ WowLua_DB.currentPage = idx
+ return entry, idx
+ end
+ end
+ end
+end
+
+local function wowpad_print(...)
+ local out = ""
+ for i=1,select("#", ...) do
+ -- Comma seperate values
+ if i > 1 then
+ out = out .. ", "
+ end
+
+ out = out .. tostring(select(i, ...))
+ end
+ WowLuaFrameOutput:AddMessage("|cff999999" .. out .. "|r")
+end
+
+if not print then
+ print = wowpad_print
+end
+
+local function processSpecialCommands(txt)
+ if txt == L.RELOAD_COMMAND then
+ ReloadUI()
+ return true
+ elseif txt == L.RESET_COMMAND then
+ WowLuaFrame:ClearAllPoints()
+ WowLuaFrame:SetPoint("CENTER")
+ WowLuaFrame:SetWidth(640)
+ WowLuaFrame:SetHeight(512)
+ WowLuaFrameResizeBar:ClearAllPoints()
+ WowLuaFrameResizeBar:SetPoint("TOPLEFT", WowLuaFrame, "BOTTOMLEFT", 14, 100)
+ WowLuaFrameResizeBar:SetPoint("TOPRIGHT", WowLuaFrame, "BOTTOMRIGHT", 0, 100)
+ return true
+ end
+end
+
+function WowLua:ProcessLine(text)
+ WowLuaFrameCommandEditBox:SetText("")
+
+ if processSpecialCommands(text) then
+ return
+ end
+
+ -- escape any color codes:
+ local output = text:gsub("\124", "\124\124")
+
+ WowLuaFrameOutput:AddMessage(WowLuaFrameCommandPrompt:GetText() .. output)
+
+ WowLuaFrameCommandEditBox:AddHistoryLine(output)
+
+ -- If they're using "= value" syntax, just print it
+ text = text:gsub("^%s*=%s*(.+)", "print(%1)")
+
+ -- Store this command into self.cmd in case we have multiple lines
+ if self.cmd then
+ self.cmd = self.cmd .. "\n" .. text
+ self.orig = self.orig .. "\n" .. text
+ else
+ self.cmd = text
+ self.orig = text
+ end
+
+ -- Trim the command before we run it
+ self.cmd = string.trim(self.cmd)
+
+ -- Process the current command
+ local func,err = loadstring(self.cmd)
+
+ -- Fail to compile? Give it a return
+ -- Check to see if this just needs a return in front of it
+ if not func then
+ local newfunc,newerr = loadstring("print(" .. self.cmd .. ")")
+ if newfunc then
+ func,err = newfunc,newerr
+ end
+ end
+
+ if not func then
+ -- Check to see if this is just an unfinished block
+ if err:sub(-7, -1) == "'<eof>'" then
+ -- Change the prompt
+ WowLuaFrameCommandPrompt:SetText(">> ")
+ return
+ end
+
+ WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
+ self.cmd = nil
+ WowLuaFrameCommandPrompt:SetText("> ")
+ else
+ -- Make print a global function
+ local old_print = print
+ print = wowpad_print
+
+ -- Call the function
+ local succ,err = pcall(func)
+
+ -- Restore the value of print
+ print = old_print
+
+ if not succ then
+ WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
+ end
+
+ self.cmd = nil
+ WowLuaFrameCommandPrompt:SetText("> ")
+ end
+end
+
+function WowLua:RunScript(text)
+ -- escape any color codes:
+ local output = text:gsub("\124", "\124\124")
+
+ if text == L.RELOAD_COMMAND then
+ ReloadUI()
+ end
+
+ -- If they're using "= value" syntax, just print it
+ text = text:gsub("^%s*=%s*(.+)", "print(%1)")
+
+ -- Trim the command before we run it
+ text = string.trim(text)
+
+ -- Process the current command
+ local func,err = loadstring(text, "WowLua")
+
+ if not func then
+ WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
+ return false, err
+ else
+ -- Make print a global function
+ local old_print = print
+ print = wowpad_print
+
+ -- Call the function
+ local succ,err = pcall(func)
+
+ -- Restore the value of print
+ print = old_print
+
+ if not succ then
+ WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r")
+ return false, err
+ end
+ end
+
+ return true
+end
+
+function WowLua:Initialize(frame)
+ WowLua:OnSizeChanged(frame)
+ table.insert(UISpecialFrames, "WowLuaFrame")
+ PlaySound("igMainMenuOpen");
+ self:UpdateButtons()
+end
+
+function WowLua:Button_OnEnter(frame)
+ GameTooltip:SetOwner(frame, "ANCHOR_BOTTOM");
+ local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ")
+ local tooltip = L.TOOLTIPS[operation]
+ GameTooltip:SetText(tooltip and tooltip.name or operation)
+ if tooltip then
+ GameTooltip:AddLine(tooltip.text, 1, 1, 1)
+ end
+ GameTooltip:Show();
+end
+
+function WowLua:Button_OnLeave(frame)
+ GameTooltip:Hide()
+end
+
+function WowLua:Button_OnClick(button)
+ local operation = button:GetName():match("WowLuaButton_(.+)")
+ if operation == "New" then
+ WowLua:Button_New(button)
+ elseif operation == "Open" then
+ WowLua:Button_Open(button)
+ elseif operation == "Save" then
+ WowLua:Button_Save(button)
+ elseif operation == "Undo" then
+ WowLua:Button_Undo(button)
+ elseif operation == "Redo" then
+ WowLua:Button_Redo(button)
+ elseif operation == "Delete" then
+ WowLua:Button_Delete(button)
+ elseif operation == "Lock" then
+ WowLua:Button_Lock(button)
+ elseif operation == "Unlock" then
+ WowLua:Button_Unlock(button)
+ elseif operation == "Previous" then
+ WowLua:Button_Previous(button)
+ elseif operation == "Next" then
+ WowLua:Button_Next(button)
+ elseif operation == "Run" then
+ WowLua:Button_Run(button)
+ elseif operation == "Config" then
+ WowLua:Button_Config(button)
+ elseif operation == "Close" then
+ WowLua:Button_Close(button)
+ end
+end
+
+function WowLua:DebugQueue()
+ print("Current queue position: " .. self.queuePos)
+ for k,v in pairs(self.queue) do
+ print(k, v:sub(1, 20))
+ end
+end
+
+function WowLua:FlushQueue()
+ table.wipe(self.queue)
+ self.queuePos = 0
+end
+
+function WowLua:Queue(text)
+ if #self.queue == 0 then
+ local page, entry = WowLua:GetCurrentPage()
+ self.queue[1] = entry.content
+ self.queuePos = 1
+ end
+
+ if text ~= self.queue[self.queuePos] then
+ self.queuePos = self.queuePos+1
+ self.queue[self.queuePos] = text
+ for i=self.queuePos+1,#self.queue do
+ self.queue[i]=nil
+ end
+ end
+end
+
+function WowLua:GetUndoPage()
+ -- Before we do any "Undo", queue the current text
+ WowLua:Queue(WowLuaFrameEditBox:GetText())
+
+ local item = self.queue[self.queuePos-1]
+ if item then
+ self.queuePos = self.queuePos-1
+ return item
+ end
+
+ return self.queue[self.queuePos]
+end
+
+function WowLua:GetRedoPage()
+ local item = self.queue[self.queuePos+1]
+ if item then
+ self.queuePos = self.queuePos+1
+ return item
+ end
+ return self.queue[self.queuePos]
+end
+
+function WowLua:Button_New(button)
+ if self:IsModified() then
+ -- Display the unsaved changes dialog
+ local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
+ dialog.data = "Button_New"
+ return
+ end
+
+ -- Create a new page and display it
+ local entry, num = WowLua:CreateNewPage()
+
+ WowLuaFrameEditBox:SetText(entry.content)
+ WowLua:UpdateButtons()
+ WowLua:SetTitle(false)
+ WowLua:FlushQueue()
+end
+
+function WowLua:Button_Open(button)
+ ToggleDropDownMenu(1, nil, WowLuaOpenDropDown, button:GetName(), 0, 0)
+end
+
+function WowLua:OpenDropDownOnLoad(frame)
+ UIDropDownMenu_Initialize(frame, self.OpenDropDownInitialize)
+end
+
+local function dropDownFunc(button, page)
+ WowLua:GoToPage(page)
+end
+
+function WowLua.OpenDropDownInitialize()
+ UIDropDownMenu_AddButton{
+ text = L.OPEN_MENU_TITLE,
+ isTitle = 1
+ }
+
+ for page, entry in ipairs(WowLua_DB.pages) do
+ UIDropDownMenu_AddButton{
+ text = entry.name,
+ func = dropDownFunc,
+ arg1 = page
+ }
+ end
+end
+
+StaticPopupDialogs["WOWLUA_SAVE_AS"] = {
+ text = L.SAVE_AS_TEXT,
+ button1 = TEXT(OKAY),
+ button2 = TEXT(CANCEL),
+ OnAccept = function(self)
+ local name = self:GetName().."EditBox"
+ local button = _G[name]
+ local text = button:GetText()
+ WowLua:RenamePage(WowLua.save_as, text)
+ WowLua:SetTitle()
+ end,
+ timeout = 0,
+ whileDead = 1,
+ exclusive = 1,
+ showAlert = 1,
+ hideOnEscape = 1,
+ hasEditBox = 1,
+ maxLetters = 32,
+ OnShow = function(self)
+ getglobal(self:GetName().."Button1"):Disable();
+ local editBox = _G[self:GetName().."EditBox"]
+ editBox:SetFocus()
+ editBox:SetText(WowLua.save_as_name)
+ editBox:HighlightText()
+ end,
+ OnHide = function(self)
+ local activeWindow = ChatEdit_GetActiveWindow()
+ if activeWindow then
+ activeWindow:SetText("")
+ end
+ end,
+ EditBoxOnEnterPressed = function(self)
+ if _G[self:GetParent():GetName().."Button1"]:IsEnabled() == 1 then
+ local name = self:GetParent():GetName().."EditBox"
+ local button = _G[name]
+ local text = button:GetText()
+ WowLua:RenamePage(WowLua.save_as, text)
+ WowLua:SetTitle()
+ self:GetParent():Hide();
+ end
+ end,
+ EditBoxOnTextChanged = function (self)
+ local editBox = _G[self:GetParent():GetName().."EditBox"];
+ local txt = editBox:GetText()
+ if #txt > 0 then
+ _G[self:GetParent():GetName().."Button1"]:Enable();
+ else
+ _G[self:GetParent():GetName().."Button1"]:Disable();
+ end
+ end,
+ EditBoxOnEscapePressed = function(self)
+ self:GetParent():Hide();
+ ClearCursor();
+ end
+}
+
+function WowLua:Button_Save(button)
+ if button and IsShiftKeyDown() then
+ -- Show the static popup for renaming
+ local page, entry = self:GetCurrentPage()
+ WowLua.save_as = page
+ WowLua.save_as_name = entry.name
+ StaticPopup_Show("WOWLUA_SAVE_AS", entry.name)
+ return
+ else
+ local text = WowLuaFrameEditBox:GetText()
+ local page = self:GetCurrentPage()
+ self:SavePage(page, text)
+ self:UpdateButtons()
+ self:SetTitle(false)
+ WowLua:Queue(text)
+ end
+end
+
+function WowLua:Button_Undo(button)
+ local page, entry = self:GetCurrentPage()
+ local undo = WowLua:GetUndoPage()
+ WowLuaFrameEditBox:SetText(undo or entry.content)
+end
+
+function WowLua:Button_Redo(button)
+ local page, entry = self:GetCurrentPage()
+ local redo = WowLua:GetRedoPage()
+ WowLuaFrameEditBox:SetText(redo)
+end
+
+function WowLua:Button_Delete(button)
+ if self:IsModified() then
+ -- Display the unsaved changes dialog
+ local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
+ dialog.data = "Button_Delete"
+ return
+ end
+
+ local page, entry = self:GetCurrentPage()
+ if self:GetNumPages() == 1 then
+ self:Button_New()
+ self:Button_Previous()
+ end
+
+ self:DeletePage(page)
+
+ if page > 1 then page = page - 1 end
+ local entry = self:SelectPage(page)
+ WowLuaFrameEditBox:SetText(entry.content)
+ self:UpdateButtons()
+ self:SetTitle(false)
+end
+
+function WowLua:Button_Lock(button)
+ local id = self:GetCurrentPage()
+ self:LockPage(id, true)
+ self:UpdateButtons()
+end
+
+function WowLua:Button_Unlock(button)
+ local id = self:GetCurrentPage()
+ self:LockPage(id, false)
+ self:UpdateButtons()
+end
+
+StaticPopupDialogs["WOWLUA_UNSAVED"] = {
+ text = L.UNSAVED_TEXT,
+ button1 = TEXT(OKAY),
+ button2 = TEXT(CANCEL),
+ OnAccept = function(self)
+ local page,entry = WowLua:GetCurrentPage()
+ WowLuaFrameEditBox:SetText(entry.content)
+ local action = self:GetParent().data
+ if type(action) == "string" then
+ WowLua[action](WowLua)
+ else
+ WowLua:GoToPage(self:GetParent().data)
+ end
+ end,
+ timeout = 0,
+ whileDead = 1,
+ exclusive = 1,
+ showAlert = 1,
+ hideOnEscape = 1,
+ EditBoxOnEscapePressed = function(self)
+ self:GetParent():Hide();
+ ClearCursor();
+ end
+}
+
+function WowLua:Button_Previous()
+ self:GoToPage(self:GetCurrentPage() - 1)
+end
+
+function WowLua:Button_Next()
+ self:GoToPage(self:GetCurrentPage() + 1)
+end
+
+function WowLua:GoToPage(page)
+ if self:IsModified() then
+ -- Display the unsaved changes dialog
+ local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
+ dialog.data = page
+ return
+ end
+
+ local entry = self:SelectPage(page)
+ if not entry then
+ return
+ end
+
+ WowLuaFrameEditBox:SetText(entry.content)
+ self:UpdateButtons()
+ self:SetTitle(false)
+ WowLua:FlushQueue()
+end
+
+function WowLua:UpdateButtons()
+ local current = self:GetCurrentPage()
+ local max = self:GetNumPages()
+
+ if current == 1 then
+ WowLuaButton_Previous:Disable()
+ else
+ WowLuaButton_Previous:Enable()
+ end
+
+ if current == max then
+ WowLuaButton_Next:Disable()
+ else
+ WowLuaButton_Next:Enable()
+ end
+
+ self.indent.indentEditbox(WowLuaFrameEditBox)
+
+ if self:IsPageLocked(current) then
+ WowLuaButton_Unlock:Show()
+ WowLuaButton_Lock:Hide()
+ WowLuaButton_Delete:Disable()
+ WowLuaFrameEditBox:SetScript("OnTextChanged", self.lockedTextChanged)
+ else
+ WowLuaButton_Unlock:Hide()
+ WowLuaButton_Lock:Show()
+ WowLuaButton_Delete:Enable()
+ WowLuaFrameEditBox:SetScript("OnTextChanged", self.unlockedTextChanged)
+ end
+end
+
+function WowLua.lockedTextChanged(box)
+ if WowLua.reverting then
+ WowLua.reverting = false
+ else
+ WowLua.reverting = true
+ local entry = select(2, WowLua:GetCurrentPage())
+ local pos = WowLua.lastCursorPos
+ box:SetText(entry.content)
+ WowLua.indent.indentEditbox(WowLuaFrameEditBox)
+ if pos then
+ box:SetCursorPosition(pos)
+ end
+ end
+end
+
+function WowLua:Button_Run()
+ local text = WowLuaFrameEditBox:GetText()
+
+ -- Run the script, if there is an error then highlight it
+ if text then
+ -- Add the current state of the page to the queue
+ WowLua:Queue(text)
+
+ local succ,err = WowLua:RunScript(text)
+ if not succ then
+ local chunkName,lineNum = err:match("(%b[]):(%d+):")
+ lineNum = tonumber(lineNum)
+ WowLua:UpdateLineNums(lineNum)
+
+ -- Highlight the text in the editor by finding the char of the line number we're on
+ text = WowLua.indent.coloredGetText(WowLuaFrameEditBox)
+
+ local curLine,start = 1,1
+ while curLine < lineNum do
+ local s,e = text:find("\n", start)
+ start = e + 1
+ curLine = curLine + 1
+ end
+
+ local nextLine = select(2, text:find("\n", start))
+
+ WowLuaFrameEditBox:SetFocus()
+ WowLuaFrameEditBox:SetCursorPosition(start - 1)
+ end
+ end
+end
+
+function WowLua:Button_Config()
+ InterfaceOptionsFrame_OpenToCategory("WowLua")
+end
+
+function WowLua:Button_Close()
+ if self:IsModified() then
+ -- Display the unsaved changes dialog
+ local dialog = StaticPopup_Show("WOWLUA_UNSAVED")
+ dialog.data = "Button_Close"
+ return
+ end
+
+ HideUIPanel(WowLuaFrame)
+end
+
+function WowLua:IsModified()
+ local page,entry = self:GetCurrentPage()
+ local orig = entry.content
+ local current = WowLuaFrameEditBox:GetText(true)
+ return orig ~= current
+end
+
+function WowLua:IsUntitled()
+ local page, entry = self:GetCurrentPage()
+ return entry.untitled
+end
+
+function WowLua:SetTitle(modified)
+ local page,entry = self:GetCurrentPage()
+ WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "")
+end
+
+function WowLua:OnSizeChanged(frame)
+ -- The first graphic is offset 13 pixels to the right
+ local width = frame:GetWidth() - 13
+ local bg2w,bg3w,bg4w = 0,0,0
+
+ -- Resize bg2 up to 256 width
+ local bg2w = width - 256
+ if bg2w > 256 then
+ bg3w = bg2w - 256
+ bg2w = 256
+ end
+
+ if bg3w > 256 then
+ bg4w = bg3w - 256
+ bg3w = 256
+ end
+
+ local bg2 = WowLuaFrameBG2
+ local bg3 = WowLuaFrameBG3
+ local bg4 = WowLuaFrameBG4
+
+ if bg2w > 0 then
+ bg2:SetWidth(bg2w)
+ bg2:SetTexCoord(0, (bg2w / 256), 0, 1)
+ bg2:Show()
+ else
+ bg2:Hide()
+ end
+
+ if bg3w and bg3w > 0 then
+ bg3:SetWidth(bg3w)
+ bg3:SetTexCoord(0, (bg3w / 256), 0, 1)
+ bg3:Show()
+ else
+ bg3:Hide()
+ end
+
+ if bg4w and bg4w > 0 then
+ bg4:SetWidth(bg4w)
+ bg4:SetTexCoord(0, (bg4w / 256), 0, 1)
+ bg4:Show()
+ else
+ bg4:Hide()
+ end
+
+ if WowLuaFrameResizeBar and false then
+ local parent = WowLuaFrameResizeBar:GetParent()
+ local cursorY = select(2, GetCursorPosition())
+ local newPoint = select(5, WowLuaFrameResizeBar:GetPoint())
+ local maxPoint = parent:GetHeight() - 175;
+
+ if newPoint < 100 then
+ newPoint = 100
+ elseif newPoint > maxPoint then
+ newPoint = maxPoint
+ end
+
+ WowLuaFrameResizeBar:ClearAllPoints()
+ WowLuaFrameResizeBar:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint)
+ WowLuaFrameResizeBar:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint)
+ end
+end
+
+function WowLua:ResizeBar_OnMouseDown(frame, button)
+ frame.cursorStart = select(2, GetCursorPosition())
+ frame.anchorStart = select(5, frame:GetPoint())
+ frame:SetScript("OnUpdate", function(...) WowLua:ResizeBar_OnUpdate(...) end)
+end
+
+function WowLua:ResizeBar_OnMouseUp(frame, button)
+ frame:SetScript("OnUpdate", nil)
+end
+
+function WowLua:ResizeBar_OnUpdate(frame, elapsed)
+ local parent = frame:GetParent()
+ local cursorY = select(2, GetCursorPosition())
+ local newPoint = frame.anchorStart - (frame.cursorStart - cursorY)/frame:GetEffectiveScale()
+ local maxPoint = parent:GetHeight() - 175;
+
+ if newPoint < 100 then
+ newPoint = 100
+ elseif newPoint > maxPoint then
+ newPoint = maxPoint
+ end
+
+ frame:ClearAllPoints()
+ frame:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint)
+ frame:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint)
+end
+
+function WowLua:OnVerticalScroll(scrollFrame)
+ local offset = scrollFrame:GetVerticalScroll();
+ local scrollbar = getglobal(scrollFrame:GetName().."ScrollBar");
+
+ scrollbar:SetValue(offset);
+ local min, max = scrollbar:GetMinMaxValues();
+ local display = false;
+ if ( offset == 0 ) then
+ getglobal(scrollbar:GetName().."ScrollUpButton"):Disable();
+ else
+ getglobal(scrollbar:GetName().."ScrollUpButton"):Enable();
+ display = true;
+ end
+ if ((scrollbar:GetValue() - max) == 0) then
+ getglobal(scrollbar:GetName().."ScrollDownButton"):Disable();
+ else
+ getglobal(scrollbar:GetName().."ScrollDownButton"):Enable();
+ display = true;
+ end
+ if ( display ) then
+ scrollbar:Show();
+ else
+ scrollbar:Hide();
+ end
+end
+
+function WowLua:UpdateLineNums(highlightNum)
+ -- highlightNum is the line number indicated by the error message
+ if highlightNum then
+ WowLua.highlightNum = highlightNum
+ else
+ highlightNum = WowLua.highlightNum
+ end
+
+ -- Since we know this is FAIAP enabled, we need to pass true in order
+ -- to get the raw values
+ local editbox = WowLuaFrameEditBox
+ local linebox = WowLuaFrameLineNumEditBox
+ local linetest = WowLuaFrameEditBoxLineTest
+ local linescroll = WowLuaFrameLineNumScrollFrame
+
+ local width = editbox:GetWidth()
+ local text = editbox:GetText(true)
+
+ local linetext = ""
+ local count = 1
+ for line in text:gmatch("([^\n]*\n?)") do
+ if #line > 0 then
+ if count == highlightNum then
+ linetext = linetext .. "|cFFFF1111" .. count .. "|r" .. "\n"
+ else
+ linetext = linetext .. count .. "\n"
+ end
+ count = count + 1
+
+ -- Check to see if the line of text spans more than one actual line
+ linetest:SetText(line:gsub("|", "||"))
+ local testwidth = linetest:GetWidth()
+ if testwidth >= width then
+ linetext = linetext .. string.rep("\n", testwidth / width)
+ end
+ end
+ end
+
+ if text:sub(-1, -1) == "\n" then
+ linetext = linetext .. count .. "\n"
+ count = count + 1
+ end
+
+ -- Make the line number frame wider as necessary
+ local offset = tostring(count):len() * 10
+ linescroll:ClearAllPoints()
+ linescroll:SetPoint("TOPLEFT", WowLuaFrame, "TOPLEFT", 18, -74)
+ linescroll:SetPoint("BOTTOMRIGHT", WowLuaFrameResizeBar, "TOPLEFT", 15 + offset, -4)
+
+ linebox:SetText(linetext)
+ linetest:SetText(text)
+end
+
+local function canScroll(scroll, direction)
+ if direction == "up" then
+ return not scroll:AtTop()
+ end
+ if direction == "down" then
+ return not scroll:AtBottom()
+ end
+ return true;
+end
+
+function WowLua:UpdateScrollingMessageFrame(frame)
+ local name = frame:GetName();
+ local display = false;
+
+ if ( canScroll(frame, "up") ) then
+ getglobal(name.."UpButton"):Enable();
+ display = true;
+ else
+ getglobal(name.."UpButton"):Disable();
+ end
+
+ if ( canScroll(frame, "down") ) then
+ getglobal(name.."DownButton"):Enable();
+ display = true;
+ else
+ getglobal(name.."DownButton"):Disable();
+ end
+
+ if ( display ) then
+ getglobal(name.."UpButton"):Show();
+ getglobal(name.."DownButton"):Show();
+ else
+ getglobal(name.."UpButton"):Hide();
+ getglobal(name.."DownButton"):Hide();
+ end
+end
+
+local scrollMethods = {
+ ["line"] = { ["up"] = "ScrollUp", ["down"] = "ScrollDown" },
+ ["page"] = { ["up"] = "PageUp", ["down"] = "PageDown" },
+ ["end"] = { ["up"] = "ScrollToTop", ["down"] = "ScrollToBottom" },
+};
+
+function WowLua:ScrollingMessageFrameScroll(scroll, direction, type)
+ -- Make sure we can scroll first
+ if ( not canScroll(scroll, direction) ) then
+ return;
+ end
+ local method = scrollMethods[type][direction];
+ scroll[method](scroll);
+end
+
+function WowLua:OnTextChanged(frame)
+ frame.highlightNum = nil
+end
+
+function WowLua:OnCursorChanged(frame)
+ WowLua.dirty = true
+end
+
+BINDING_HEADER_WOWLUA = "WowLua Editor/Interpreter"
+BINDING_NAME_TOGGLE_WOWLUA = "Show/Hide window"
+BINDING_NAME_RUN_WOWLUA = "Run current page"
+BINDING_NAME_SAVE_WOWLUA = "Save current page"
+
+SLASH_WOWLUA1 = "/lua"
+SLASH_WOWLUA2 = "/wowlua"
+local first = true
+SlashCmdList["WOWLUA"] = function(txt)
+ local page, entry = WowLua:GetCurrentPage()
+ if first then
+ WowLuaFrameEditBox:SetText(entry.content)
+ WowLuaFrameEditBox:SetWidth(WowLuaFrameEditScrollFrame:GetWidth())
+ WowLua:SetTitle(false)
+ first = false
+ end
+
+ WowLuaFrame:Show()
+
+ if processSpecialCommands(txt) then
+ return
+ end
+
+ if txt:match("%S") then
+ WowLua:ProcessLine(txt)
+ end
+
+ WowLuaFrameCommandEditBox:SetFocus()
+end
+
+local function printf(fmt, ...)
+ print(fmt:format(...))
+end
+
+SLASH_WOWLUARUN1 = "/luarun"
+SLASH_WOWLUARUN2 = "/wowluarun"
+SlashCmdList["WOWLUARUN"] = function(txt, editbox)
+ local entry, idx = WowLua:SelectPage(txt)
+ if not entry then
+ printf("|cFF33FF99WowLua|r: Unable to find a page named '%s'", txt)
+ return
+ else
+ printf("|cFF33FF99WowLua|r: Running page '%s'", txt)
+ local func, err = loadstring(entry.content, "WowLua")
+ if not func then
+ printf("|cFF33FF99WowLua|r: Error compiling page '%s': %s", txt, err)
+ else
+ -- Call the function
+ local succ, err = pcall(func)
+
+ if not succ then
+ printf("|cFF33FF99WowLua|r: Error while running page '%s': %s", txt, err)
+ end
+ end
+ end
+end
diff --git a/WowLua.toc b/WowLua.toc
index aa48928..2d53fc3 100644
--- a/WowLua.toc
+++ b/WowLua.toc
@@ -1,15 +1,15 @@
-## Interface: 60200
-## Title: WowLua
-## Version: @project-version@
-## Author: Cladhaire
-## Notes: Interactive Lua interpreter and scratchpad
-## LoadManagers: AddonLoader
-## X-LoadOn-Slash: /wowlua, /lua, /wowluarun, /luarun
-## SavedVariables: WowLua_DB
-
-Localization.enUS.lua
-
-WowLua.lua
-FAIAP.lua
-WowLua.xml
-WowLua_Config.lua
+## Interface: 70100
+## Title: WowLua
+## Version: @project-version@
+## Author: Cladhaire
+## Notes: Interactive Lua interpreter and scratchpad
+## LoadManagers: AddonLoader
+## X-LoadOn-Slash: /wowlua, /lua, /wowluarun, /luarun
+## SavedVariables: WowLua_DB
+
+Localization.enUS.lua
+
+WowLua.lua
+FAIAP.lua
+WowLua.xml
+WowLua_Config.lua
diff --git a/WowLua.xml b/WowLua.xml
index 3480342..a725d9d 100644
--- a/WowLua.xml
+++ b/WowLua.xml
@@ -665,8 +665,12 @@
<OnMouseDown>
WowLuaFrameCommandEditBox:SetFocus()
</OnMouseDown>
+ <OnLoad>
+ self:SetFont([[Interface\AddOns\WowLua\fonts\VeraMono.ttf]], 14)
+ self:SetJustifyH("LEFT")
+ self:SetFading(False)
+ </OnLoad>
</Scripts>
- <FontString inherits="WowLuaMonoFont" justifyH="LEFT"/>
</ScrollingMessageFrame>
</Frames>
<Scripts>