Quantcast

Run button works

Cogwheel-17646 [04-29-08 - 20:29]
Run button works
Line numbers are no longer editable
Lock/unlock buttons work
Lock button now shows the lock icon based on the current state (tooltip reflects this)
Filename
WowLua.lua
WowLua.xml
diff --git a/WowLua.lua b/WowLua.lua
index 1b20b12..25e07d6 100644
--- a/WowLua.lua
+++ b/WowLua.lua
@@ -1,771 +1,800 @@
---[[--------------------------------------------------------------------------
-  Copyright (c) 2007, James Whitehead II
-  All rights reserved.
-
-  WowLua is an interactive interpreter for World of Warcraft
---------------------------------------------------------------------------]]--
-
-WowLua = {
-	VERSION = "WowLua 1.0 Interactive Interpreter",
-}
-
-WowLua_DB = {
-	pages = {
-		[1] = {name = "Untitled 1", content = ""}
-	},
-	currentPage = 1,
-	untitled = 2,
-}
-
-local DB = {}
-
-function WowLua:CreateNewPage()
-	local name = "Untitled " .. WowLua_DB.untitled
-	WowLua_DB.untitled = WowLua_DB.untitled + 1
-	local entry = {
-		name = name,
-		content = "",
-	}
-	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
-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(WowLuaDB.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 == "/reload" then
-		ReloadUI()
-		return true
-	elseif txt == "/reset" 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 == "/reload" 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
-
-local tooltips = {
-	["New"] = "Create a new script page",
-	["Open"] = "Open an existing script page",
-	["Save"] = "Save the current page\n\nHint: You can shift-click this button to rename a page",
-	["Undo"] = "Revert to the last saved version",
-	["Delete"] = "Delete the current page",
-	["Lock"] = "Locks/unlocks the current page from being changed",
-	["Previous"] = "Navigate back one page",
-	["Next"] = "Navigate forward one page",
-	["Run"] = "Run the current script",
-}
-
-function WowLua:Button_OnEnter(frame)
-	GameTooltip:SetOwner(this, "ANCHOR_BOTTOM");
-	local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ")
-	GameTooltip:SetText(operation)
-	if tooltips[operation] then
-		GameTooltip:AddLine(tooltips[operation], 1, 1, 1)
-	end
-	GameTooltip:Show();
-end
-
-function WowLua:Button_OnLeave(frame)
-	GameTooltip:Hide()
-end
-
-function WowLua:UpdateButtons()
-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 == "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)
-	end
-end
-
-function WowLua:Button_New(button)
-	-- Save the page we're currently editing
-	self:Button_Save()
-
-	-- Create a new page and display it
-	local entry, num = WowLua:CreateNewPage()
-
-	WowLuaFrameEditBox:SetText(entry.content)
-	WowLua:UpdateButtons()
-	WowLua:SetTitle(false)
-end
-
-function WowLua:Button_Open(button)
-end
-
-StaticPopupDialogs["WOWLUA_SAVE_AS"] = {
-	text = "Rename page '%s' to:",
-	button1 = TEXT(OKAY),
-	button2 = TEXT(CANCEL),
-	OnAccept = function()
-		local name = this:GetParent():GetName().."EditBox"
-		local button = getglobal(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()
-		getglobal(this:GetName().."Button1"):Disable();
-		getglobal(this:GetName().."EditBox"):SetFocus();
-	end,
-	OnHide = function()
-		if ( ChatFrameEditBox:IsVisible() ) then
-			ChatFrameEditBox:SetFocus();
-		end
-		getglobal(this:GetName().."EditBox"):SetText("");
-	end,
-	EditBoxOnEnterPressed = function()
-		if ( getglobal(this:GetParent():GetName().."Button1"):IsEnabled() == 1 ) then
-			local name = this:GetParent():GetName().."EditBox"
-			local button = getglobal(name)
-			local text = button:GetText()
-			WowLua:RenamePage(WowLua.save_as, text)
-			WowLua:SetTitle()
-			this:GetParent():Hide();
-		end
-	end,
-	EditBoxOnTextChanged = function ()
-		local editBox = getglobal(this:GetParent():GetName().."EditBox");
-		local txt = editBox:GetText()
-		if #txt > 0 then
-			getglobal(this:GetParent():GetName().."Button1"):Enable();
-		else
-			getglobal(this:GetParent():GetName().."Button1"):Disable();
-		end
-	end,
-	EditBoxOnEscapePressed = function()
-		this: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
-		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)
-	end
-end
-
-function WowLua:Button_Undo(button)
-	local page, entry = self:GetCurrentPage()
-	WowLuaFrameEditBox:SetText(entry.content)
-end
-
-function WowLua:Button_Delete(button)
-	local entry, id = self:GetCurrentPage()
-
-	if self:GetNumPages() == 1 then
-		self:Button_New()
-		self:Button_Previous()
-	end
-
-	self:DeletePage(id)
-
-	if id > 1 then
-		local entry = self:SelectPage(id - 1)
-		WowLuaFrameEditBox:SetText(entry.content)
-		self.UpdateButtons()
-	end
-end
-
-function WowLua:Button_Lock(button)
-	local entry,id = self:GetCurrentPage()
-	self:LockPage(id, true)
-
-	button:Hide()
-end
-
-StaticPopupDialogs["WOWLUA_UNSAVED"] = {
-	text = "You have unsaved changes on this page that will be lost if you navigate away from it.  Continue?",
-	button1 = TEXT(OKAY),
-	button2 = TEXT(CANCEL),
-	OnAccept = function()
-		local method = WowLua.previous_action
-		WowLua:Button_Undo()
-		WowLua[method](WowLua)
-	end,
-	timeout = 0,
-	whileDead = 1,
-	exclusive = 1,
-	showAlert = 1,
-	hideOnEscape = 1,
-	EditBoxOnEscapePressed = function()
-		this:GetParent():Hide();
-		ClearCursor();
-	end
-}
-
-function WowLua:Button_Previous()
-	if self:IsModified() then
-		-- Display the unsaved changes dialog
-		self.previous_action = "Button_Previous"
-		StaticPopup_Show("WOWLUA_UNSAVED")
-		return
-	end
-
-	local current = self:GetCurrentPage()
-	local entry = self:SelectPage(current - 1)
-
-	WowLuaFrameEditBox:SetText(entry.content)
-	self:UpdateButtons()
-	self:SetTitle(false)
-end
-
-function WowLua:Button_Next()
-	if self:IsModified() then
-		-- Display the unsaved changes dialog
-		self.previous_action = "Button_Next"
-		StaticPopup_Show("WOWLUA_UNSAVED")
-		return
-	end
-
-	local current = self:GetCurrentPage()
-	local entry = self:SelectPage(current + 1)
-
-	WowLuaFrameEditBox:SetText(entry.content)
-	self:UpdateButtons()
-	self:SetTitle(false)
-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
-end
-
-function WowLua:RunPage()
-	-- Run the script, if there is an error then highlight it
-	local text = WowLuaFrameEditBox:GetText()
-	if text then
-		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
-		local page = WowLuaDB.pages[WowLuaDB.currentPage]
-		WowLuaDB.pages[page] = text
-	end
-end
-
-function WowLua:IsModified()
-	local page,entry = self:GetCurrentPage()
-	local orig = entry.content
-	local current = WowLuaFrameEditBox:GetText(true)
-	return orig ~= current
-end
-
-function WowLua:SetTitle(modified)
-	local page,entry = self:GetCurrentPage()
-	WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "")
-end
-
-local first = true
-local function slashHandler(txt)
-	local page, entry = WowLua:GetCurrentPage()
-	if first then
-		WowLuaFrameEditBox:SetText(entry.content)
-		first = false
-	end
-
-	WowLuaFrame:Show()
-
-	if processSpecialCommands(txt) then
-		return
-	end
-
-	if txt:match("%S") then
-		WowLua:ProcessLine(txt)
-	end
-
-	WowLuaFrameCommandEditBox:SetFocus()
-end
-
-SLASH_WOWLUA1 = "/wowlua"
-SLASH_WOWLUA2 = "/lua"
-SlashCmdList["WOWLUA"] = slashHandler
-
-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
-
+--[[--------------------------------------------------------------------------
+  Copyright (c) 2007, James Whitehead II
+  All rights reserved.
+
+  WowLua is an interactive interpreter for World of Warcraft
+--------------------------------------------------------------------------]]--
+
+WowLua = {
+	VERSION = "WowLua 1.0 Interactive Interpreter",
+}
+
+WowLua_DB = {
+	pages = {
+		[1] = {name = "Untitled 1", content = ""}
+	},
+	currentPage = 1,
+	untitled = 2,
+}
+
+local DB = {}
+
+function WowLua:CreateNewPage()
+	local name = "Untitled " .. WowLua_DB.untitled
+	WowLua_DB.untitled = WowLua_DB.untitled + 1
+	local entry = {
+		name = name,
+		content = "",
+	}
+	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
+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(WowLuaDB.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 == "/reload" then
+		ReloadUI()
+		return true
+	elseif txt == "/reset" 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 == "/reload" 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
+
+local tooltips = {
+	["New"] = "Create a new script page",
+	["Open"] = "Open an existing script page",
+	["Save"] = "Save the current page\n\nHint: You can shift-click this button to rename a page",
+	["Undo"] = "Revert to the last saved version",
+	["Delete"] = "Delete the current page",
+	["Lock"] = "This page is unlocked to allow changes. Click to lock.",
+	["Unlock"] = "This page is locked to prevent changes. Click to unlock.",
+	["Previous"] = "Navigate back one page",
+	["Next"] = "Navigate forward one page",
+	["Run"] = "Run the current script",
+}
+
+function WowLua:Button_OnEnter(frame)
+	GameTooltip:SetOwner(this, "ANCHOR_BOTTOM");
+	local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ")
+	GameTooltip:SetText(operation)
+	if tooltips[operation] then
+		GameTooltip:AddLine(tooltips[operation], 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 == "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)
+	end
+end
+
+function WowLua:Button_New(button)
+	-- Save the page we're currently editing
+	self:Button_Save()
+
+	-- Create a new page and display it
+	local entry, num = WowLua:CreateNewPage()
+
+	WowLuaFrameEditBox:SetText(entry.content)
+	WowLua:UpdateButtons()
+	WowLua:SetTitle(false)
+end
+
+function WowLua:Button_Open(button)
+end
+
+StaticPopupDialogs["WOWLUA_SAVE_AS"] = {
+	text = "Rename page '%s' to:",
+	button1 = TEXT(OKAY),
+	button2 = TEXT(CANCEL),
+	OnAccept = function()
+		local name = this:GetParent():GetName().."EditBox"
+		local button = getglobal(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()
+		getglobal(this:GetName().."Button1"):Disable();
+		getglobal(this:GetName().."EditBox"):SetFocus();
+	end,
+	OnHide = function()
+		if ( ChatFrameEditBox:IsVisible() ) then
+			ChatFrameEditBox:SetFocus();
+		end
+		getglobal(this:GetName().."EditBox"):SetText("");
+	end,
+	EditBoxOnEnterPressed = function()
+		if ( getglobal(this:GetParent():GetName().."Button1"):IsEnabled() == 1 ) then
+			local name = this:GetParent():GetName().."EditBox"
+			local button = getglobal(name)
+			local text = button:GetText()
+			WowLua:RenamePage(WowLua.save_as, text)
+			WowLua:SetTitle()
+			this:GetParent():Hide();
+		end
+	end,
+	EditBoxOnTextChanged = function ()
+		local editBox = getglobal(this:GetParent():GetName().."EditBox");
+		local txt = editBox:GetText()
+		if #txt > 0 then
+			getglobal(this:GetParent():GetName().."Button1"):Enable();
+		else
+			getglobal(this:GetParent():GetName().."Button1"):Disable();
+		end
+	end,
+	EditBoxOnEscapePressed = function()
+		this: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
+		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)
+	end
+end
+
+function WowLua:Button_Undo(button)
+	local page, entry = self:GetCurrentPage()
+	WowLuaFrameEditBox:SetText(entry.content)
+end
+
+function WowLua:Button_Delete(button)
+	local entry, id = self:GetCurrentPage()
+
+	if self:GetNumPages() == 1 then
+		self:Button_New()
+		self:Button_Previous()
+	end
+
+	self:DeletePage(id)
+
+	if id > 1 then
+		local entry = self:SelectPage(id - 1)
+		WowLuaFrameEditBox:SetText(entry.content)
+		self.UpdateButtons()
+	end
+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 = "You have unsaved changes on this page that will be lost if you navigate away from it.  Continue?",
+	button1 = TEXT(OKAY),
+	button2 = TEXT(CANCEL),
+	OnAccept = function()
+		local method = WowLua.previous_action
+		WowLua:Button_Undo()
+		WowLua[method](WowLua)
+	end,
+	timeout = 0,
+	whileDead = 1,
+	exclusive = 1,
+	showAlert = 1,
+	hideOnEscape = 1,
+	EditBoxOnEscapePressed = function()
+		this:GetParent():Hide();
+		ClearCursor();
+	end
+}
+
+function WowLua:Button_Previous()
+	if self:IsModified() then
+		-- Display the unsaved changes dialog
+		self.previous_action = "Button_Previous"
+		StaticPopup_Show("WOWLUA_UNSAVED")
+		return
+	end
+
+	local current = self:GetCurrentPage()
+	local entry = self:SelectPage(current - 1)
+
+	WowLuaFrameEditBox:SetText(entry.content)
+	self:UpdateButtons()
+	self:SetTitle(false)
+end
+
+function WowLua:Button_Next()
+	if self:IsModified() then
+		-- Display the unsaved changes dialog
+		self.previous_action = "Button_Next"
+		StaticPopup_Show("WOWLUA_UNSAVED")
+		return
+	end
+
+	local current = self:GetCurrentPage()
+	local entry = self:SelectPage(current + 1)
+
+	WowLuaFrameEditBox:SetText(entry.content)
+	self:UpdateButtons()
+	self:SetTitle(false)
+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()
+		WowLuaFrameEditBox:SetScript("OnTextChanged", self.lockedTextChanged)
+	else
+		WowLuaButton_Unlock:Hide()
+		WowLuaButton_Lock:Show()
+		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()
+	self:Button_Save()
+	local text = WowLuaFrameEditBox:GetText()
+
+	-- Run the script, if there is an error then highlight it
+	if text then
+		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:IsModified()
+	local page,entry = self:GetCurrentPage()
+	local orig = entry.content
+	local current = WowLuaFrameEditBox:GetText(true)
+	return orig ~= current
+end
+
+function WowLua:SetTitle(modified)
+	local page,entry = self:GetCurrentPage()
+	WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "")
+end
+
+local first = true
+local function slashHandler(txt)
+	local page, entry = WowLua:GetCurrentPage()
+	if first then
+		WowLuaFrameEditBox:SetText(entry.content)
+		first = false
+	end
+
+	WowLuaFrame:Show()
+
+	if processSpecialCommands(txt) then
+		return
+	end
+
+	if txt:match("%S") then
+		WowLua:ProcessLine(txt)
+	end
+
+	WowLuaFrameCommandEditBox:SetFocus()
+end
+
+SLASH_WOWLUA1 = "/wowlua"
+SLASH_WOWLUA2 = "/lua"
+SlashCmdList["WOWLUA"] = slashHandler
+
+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
+
diff --git a/WowLua.xml b/WowLua.xml
index 1d9ddc9..aaaa115 100644
--- a/WowLua.xml
+++ b/WowLua.xml
@@ -246,7 +246,7 @@
 										<Offset x="5" y="0"/>
 									</Anchor>
 								</Anchors>
-								<NormalTexture file="Interface\AddOns\WowLua\images\icons\padlock"/>
+								<NormalTexture file="Interface\AddOns\WowLua\images\icons\padlock-disabled"/>
 								<HighlightTexture file="Interface\AddOns\WowLua\images\icons\highlight"/>
 								<Scripts>
 									<OnHide>
@@ -259,7 +259,7 @@
 									<Anchor point="TOPLEFT" relativeTo="WowLuaButton_Lock" relativePoint="TOPLEFT"/>
 									<Anchor point="BOTTOMRIGHT" relativeTo="WowLuaButton_Lock" relativePoint="BOTTOMRIGHT"/>
 								</Anchors>
-								<NormalTexture file="Interface\AddOns\WowLua\images\icons\padlock-disabled"/>
+								<NormalTexture file="Interface\AddOns\WowLua\images\icons\padlock"/>
 								<HighlightTexture file="Interface\AddOns\WowLua\images\icons\highlight"/>
 								<Scripts>
 									<OnHide>
@@ -427,6 +427,11 @@
 							</Anchor>
 							<Anchor point="BOTTOMRIGHT"/>
 						</Anchors>
+						<Scripts>
+							<OnEditFocusGained>
+								self:ClearFocus()
+							</OnEditFocusGained>
+							</Scripts>
 						<FontString font="Interface\AddOns\WowLua\fonts\VeraMono.ttf">
 							<FontHeight val="14"/>
 						</FontString>
@@ -460,6 +465,12 @@
 						<Size>
 							<AbsDimension x="100" y="100"/>
 						</Size>
+						<Anchors>
+							<Anchor point="TOPLEFT">
+								<Offset x="20" y="0"/>
+							</Anchor>
+							<Anchor point="BOTTOMRIGHT"/>
+						</Anchors>
 						<Layers>
 							<Layer level="BACKGROUND">
 								<FontString name="$parentLineTest" font="Interface\AddOns\WowLua\fonts\VeraMono.ttf" hidden="true">
@@ -469,15 +480,10 @@
 								</FontString>
 							</Layer>
 						</Layers>
-						<Anchors>
-							<Anchor point="TOPLEFT">
-								<Offset x="20" y="0"/>
-							</Anchor>
-							<Anchor point="BOTTOMRIGHT"/>
-						</Anchors>
 						<Scripts>
 							<OnLoad>
 								WowLua.indent.enable(self, nil, 3)
+								WowLua.unlockedTextChanged = self:GetScript("OnTextChanged")
 							</OnLoad>
 							<OnEscapePressed>
 								self:ClearFocus();
@@ -487,6 +493,8 @@
 								WowLua.highlightNum = nil
 							</OnTextChanged>
 							<OnCursorChanged>
+								WowLua.lastCursorPos = WowLua.cursorPos
+								WowLua.cursorPos = self:GetCursorPosition()
 								ScrollingEdit_OnCursorChanged(x,y,w,h)
 								WowLua:UpdateLineNums()
 								WowLuaFrameEditScrollFrameScrollBar:SetValue(WowLuaFrameEditScrollFrame:GetVerticalScroll())