--[[----------------------------------------------------------------------------
ReadOnly.lua
Author: VladVRO, mozers
version 1.3

Наглядная установка/снятие режима "только для чтения"
индикация режима ReadOnly в строке состояния, стилем поля
с нумерацией строк и отключением мерцания курсора

Подключение:
В файл SciTEStartup.lua добавьте строку:
  dofile (props["SciteDefaultHome"].."\\tools\\ReadOnly.lua")
включите scite.readonly в статусную строку:
  statusbar.text.1=Line:$(LineNumber) Col:$(ColumnNumber) [$(scite.readonly)]
задайте в файле .properties цвет фона поля с нумерацией строк в режиме "только для чтения":
  style.back.readonly=#FFEEEE
--]]----------------------------------------------------------------------------

local function SetReadOnly(ro)
	if ro then
		if props["normal.style.saved"] == "" then
			props["normal.style.saved"] = "1"
			props["caret.period.normal"] = props["caret.period"]
			props["caret.width.normal"] = props["caret.width"]
			props["style.*.33.normal"] = props["style.*.33"]
		end

		props["caret.period"] = 0
		props["caret.width"] = 0
		if props["style.back.readonly"] ~= "" then
			props["style.*.33"] = props["style.*.33"]..",back:"..props["style.back.readonly"]
		end
		scite.Perform("reloadproperties:")

		props["scite.readonly"] = "VIEW"

	else
		if props["scite.readonly"] == "VIEW" then
			props["style.*.33"] = props["style.*.33.normal"]
			props["caret.period"] = props["caret.period.normal"]
			props["caret.width"] = props["caret.width.normal"]
			scite.Perform("reloadproperties:")
		end

		props["scite.readonly"] = "EDIT"
	end

	scite.UpdateStatusBar()
end

-- Добавляем свой обработчик события OnSwitchFile
local old_OnSwitchFile = OnSwitchFile
function OnSwitchFile(file)
	local result
	if old_OnSwitchFile then result = old_OnSwitchFile(file) end
	if SetReadOnly(editor.ReadOnly) then return true end
	return result
end

-- Добавляем свой обработчик события OnOpen
local old_OnOpen = OnOpen
function OnOpen(file)
	local result
	if old_OnOpen then result = old_OnOpen(file) end
	if SetReadOnly(editor.ReadOnly) then return true end
	return result
end

-- Добавляем свой обработчик события, возникающего при вызове пункта меню "Read-Only"
local old_OnSendEditor = OnSendEditor
function OnSendEditor(id_msg, wp, lp)
	local result
	if old_OnSendEditor then result = old_OnSendEditor(id_msg, wp, lp) end
	if id_msg == SCI_SETREADONLY then
		if SetReadOnly(wp~=0) then return true end
	end
	return result
end
