Advertisement
Pirnogion

CodeEditor

Mar 2nd, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --КОНСТАНТЫ--
  2. local APIs_DESTINATION  = "MineCodeAPIs/"
  3. local PERMANENT_INDENT = 1
  4.  
  5. --ЗАГРУЗКА СТОРОННИХ БИБЛИОТЕК, ПЕРВОНАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ ПРОГРАММЫ--
  6. --os.loadAPI(apis_path .. "graphics")
  7. os.loadAPI(APIs_DESTINATION .. "SyntaxHighlight")
  8.  
  9. --if (os.version() ~= "CraftOS 1.6") then error("Require " .. os.version() .. ".") end
  10. if not term.isColor() or turtle or pocket then error("This program will run only on advanced computer.") end
  11.  
  12. term.clear()
  13.  
  14. --ПЕРЕМЕННЫЕ--
  15. local sizeOfLineCounter = 1
  16.  
  17. local termWidth, termHeight = term.getSize()
  18. local xAbsoluteCursor, yAbsoluteCursor = 4, 1
  19. local xPrevDeltaCursor, yPrevDeltaCursor = 0, 0
  20. local xDeltaCursor, yDeltaCursor = 0, 0
  21.  
  22. local linesArray = {}
  23. local editedLine = nil
  24.  
  25. local GUIWindow =      window.create(term.current(), 1, 1, termWidth-1, termHeight-1)
  26.       GUIWindow.clear()
  27.  
  28. local LineCounterWindow = window.create(term.current(), 1, 3, sizeOfLineCounter, termHeight-2)
  29.       LineCounterWindow.clear()
  30.      
  31. local WorkspaceWindow = window.create(term.current(), sizeOfLineCounter+1, 3, termWidth-1, termHeight-2)
  32.       WorkspaceWindow.setCursorPos(xAbsoluteCursor, yAbsoluteCursor)
  33.       WorkspaceWindow.clear()
  34. local workspaceWidth, workspaceHeight = WorkspaceWindow.getSize()
  35.  
  36. --РАБОТА С ФАЙЛАМИ--
  37. local function openFile(filename)
  38.     for readedLine in io.lines(filename) do
  39.         table.insert(linesArray, readedLine)
  40.     end
  41.    
  42.     editedLine = linesArray[1]
  43. end
  44.  
  45. local function saveFile(filename)
  46.     local _file = fs.open(filename, "w")
  47.    
  48.     for i = 1, #linesArray do
  49.         _file.writeLine(linesArray[i])
  50.     end
  51.    
  52.     _file.close()
  53. end
  54.  
  55. --ОТРИСОВКА--
  56. local function draw_gui()
  57.    
  58. end
  59.  
  60. local function draw_line(wWindow, iLine)
  61.     WorkspaceWindow.setBackgroundColor(colors.white)
  62.     WorkspaceWindow.setTextColor(colors.black)
  63.     WorkspaceWindow.setCursorPos(PERMANENT_INDENT, iLine)
  64.    
  65.     local _tmpLine = linesArray[yDeltaCursor+iLine]:sub(xDeltaCursor+1, -1)
  66.  
  67.     WorkspaceWindow.write(" " .. _tmpLine .. string.rep(" ", workspaceWidth-1))
  68.  
  69.     SyntaxHighlight.syntaxString(WorkspaceWindow, iLine, PERMANENT_INDENT+1, _tmpLine)
  70. end
  71.  
  72. local function drawLineCounter()
  73.     LineCounterWindow.setBackgroundColor(colors.lightGray)
  74.     LineCounterWindow.setTextColor(colors.white)
  75.     LineCounterWindow.clear()
  76.    
  77.     for i = 1, #linesArray-yDeltaCursor do
  78.         LineCounterWindow.setCursorPos(1, i)
  79.        
  80.         LineCounterWindow.write(yDeltaCursor+i .. string.rep(" ", sizeOfLineCounter))
  81.     end
  82. end
  83.  
  84. --draw_workspace() redraw all
  85. --draw_workspace([startRedrawPos]) redraw startRedrawPos to workspaceHeight lines
  86. --draw_workspace([startRedrawPos, [endRedrawPos]]) redraw startRedrawPos to endRedrawPos lines
  87. local function draw_workspace(startRedrawPos, endRedrawPos)
  88.     local prev_xCur, prev_yCur = WorkspaceWindow.getCursorPos()
  89.    
  90.     WorkspaceWindow.setCursorBlink(false)
  91.  
  92.     local prevSoLC = sizeOfLineCounter
  93.     sizeOfLineCounter = #tostring(#linesArray)
  94.    
  95.     if prevSoLC ~= sizeOfLineCounter then
  96.         WorkspaceWindow = window.create(term.current(), sizeOfLineCounter+1, 3, termWidth-1-sizeOfLineCounter, termHeight-2)
  97.         workspaceWidth, workspaceHeight = WorkspaceWindow.getSize()
  98.     end
  99.    
  100.     for i = startRedrawPos or 1, endRedrawPos or workspaceHeight do
  101.         if linesArray[yDeltaCursor+i] then
  102.             draw_line(WorkspaceWindow, i)
  103.         else
  104.             WorkspaceWindow.setCursorPos(PERMANENT_INDENT, i)
  105.             write(string.rep(" ", workspaceWidth))
  106.         end
  107.     end
  108.    
  109.     if prevSoLC ~= sizeOfLineCounter then
  110.         LineCounterWindow = window.create(term.current(), 1, 3, sizeOfLineCounter, termHeight-2)
  111.         draw_workspace()
  112.     end
  113.     drawLineCounter()
  114.    
  115.     WorkspaceWindow.setBackgroundColor(colors.white)
  116.     WorkspaceWindow.setTextColor(colors.black)
  117.     WorkspaceWindow.setCursorPos(prev_xCur, prev_yCur)
  118.     WorkspaceWindow.setCursorBlink(true)
  119. end
  120.  
  121. local function range(bottom, top, value, step)
  122.     if value + step > top then
  123.         return top
  124.     elseif value + step < bottom then
  125.         return bottom
  126.     end
  127.  
  128.     return value + step
  129. end
  130.  
  131. --РАБОТА С КУРСОРАМИ--
  132. local function checkEndLine()
  133.     return xAbsoluteCursor + 1 > #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1
  134. end
  135.  
  136. local function checkStartLine()
  137.     return xAbsoluteCursor - 1 < PERMANENT_INDENT + 1
  138. end
  139.  
  140. local function checkTopLinesArray()
  141.     return yAbsoluteCursor - 1 < 1
  142. end
  143.  
  144. local function checkBottomLinesArray()
  145.     return yAbsoluteCursor + 1 > #linesArray
  146. end
  147.  
  148.  
  149.  
  150. local function calculateCursors(xRelCur, yRelCur)
  151.     WorkspaceWindow.setCursorPos(xRelCur, yRelCur)
  152.  
  153.     xPrevDeltaCursor = xDeltaCursor
  154.     yPrevDeltaCursor = yDeltaCursor
  155.  
  156.     xDeltaCursor = xAbsoluteCursor - xRelCur
  157.     yDeltaCursor = yAbsoluteCursor - yRelCur
  158. end
  159.  
  160.  
  161.  
  162. local function moveCursorsToStartLine()
  163.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  164.    
  165.     xAbsoluteCursor = PERMANENT_INDENT + 1
  166.     xRelativeCursor = PERMANENT_INDENT + 1
  167.    
  168.     calculateCursors(xRelativeCursor, yRelativeCursor)
  169. end
  170.  
  171. local function moveCursorsToEndLine()
  172.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  173.  
  174.     xAbsoluteCursor = #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1
  175.     xRelativeCursor = math.min(#linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1, workspaceWidth)
  176.    
  177.     calculateCursors(xRelativeCursor, yRelativeCursor)
  178. end
  179.  
  180. local function moveCursorsUpAndDown(step)
  181.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  182.  
  183.     yAbsoluteCursor = range(1, #linesArray, yAbsoluteCursor, step)
  184.     yRelativeCursor = range(1, math.min(workspaceHeight, #linesArray), yRelativeCursor, step)
  185.    
  186.     if checkEndLine() then
  187.         xAbsoluteCursor = #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1
  188.         xRelativeCursor = #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1
  189.     end
  190.    
  191.     calculateCursors(xRelativeCursor, yRelativeCursor)
  192. end
  193.  
  194. local function moveCursorsRightAndLeft(step)
  195.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  196.    
  197.     if step < 0 and checkStartLine() and yAbsoluteCursor > 1 then
  198.         xAbsoluteCursor = #linesArray[yAbsoluteCursor - 1] + PERMANENT_INDENT + 2
  199.         xRelativeCursor = math.min(#linesArray[yAbsoluteCursor - 1] + PERMANENT_INDENT + 2, workspaceWidth)
  200.        
  201.         yAbsoluteCursor = yAbsoluteCursor - 1
  202.         yRelativeCursor = math.max(yRelativeCursor - 1, 1)
  203.     end
  204.    
  205.     if step > 0 and checkEndLine() and yAbsoluteCursor < #linesArray then
  206.         xAbsoluteCursor = PERMANENT_INDENT
  207.         xRelativeCursor = PERMANENT_INDENT
  208.        
  209.         yAbsoluteCursor = yAbsoluteCursor + 1
  210.         yRelativeCursor = math.min(yRelativeCursor + 1, workspaceHeight)
  211.     end
  212.  
  213.     xAbsoluteCursor = range(PERMANENT_INDENT + 1, #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1, xAbsoluteCursor, step)
  214.     xRelativeCursor = range(PERMANENT_INDENT + 1, math.min(workspaceWidth, #linesArray[yAbsoluteCursor] + PERMANENT_INDENT + 1), xRelativeCursor, step)
  215.    
  216.     calculateCursors(xRelativeCursor, yRelativeCursor)
  217. end
  218.  
  219. --РЕДАКТИРОВАНЕ ТЕКСТА--
  220. local function removeChar()
  221.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  222.    
  223.     if xAbsoluteCursor > PERMANENT_INDENT + 1 then
  224.         linesArray[yAbsoluteCursor] = linesArray[yAbsoluteCursor]:sub(1, xAbsoluteCursor-(PERMANENT_INDENT + 2)) .. linesArray[yAbsoluteCursor]:sub(xAbsoluteCursor-PERMANENT_INDENT, -1)
  225.         xAbsoluteCursor = xAbsoluteCursor - 1
  226.         xRelativeCursor = xRelativeCursor - 1
  227.         draw_workspace(yRelativeCursor, yRelativeCursor)
  228.     elseif yAbsoluteCursor > 1 then
  229.         local _temp = #linesArray[yAbsoluteCursor - 1]
  230.        
  231.         linesArray[yAbsoluteCursor - 1] = linesArray[yAbsoluteCursor - 1] .. linesArray[yAbsoluteCursor]:sub(xAbsoluteCursor-PERMANENT_INDENT, -1)
  232.         table.remove(linesArray, yAbsoluteCursor)
  233.        
  234.         yAbsoluteCursor = yAbsoluteCursor - 1
  235.         yRelativeCursor = math.max(yRelativeCursor - 1, 1)
  236.         xAbsoluteCursor = _temp + PERMANENT_INDENT + 1
  237.         xRelativeCursor = math.min(_temp + PERMANENT_INDENT + 1, workspaceWidth)
  238.         draw_workspace(yRelativeCursor, workspaceHeight)
  239.     end
  240.    
  241.     calculateCursors(xRelativeCursor, yRelativeCursor)
  242. end
  243.  
  244. local function writeChar(char)
  245.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  246.     linesArray[yAbsoluteCursor] = linesArray[yAbsoluteCursor]:sub(1, xAbsoluteCursor-(PERMANENT_INDENT + 1)) .. char .. linesArray[yAbsoluteCursor]:sub(xAbsoluteCursor-PERMANENT_INDENT, -1)
  247.     draw_workspace(yRelativeCursor, yRelativeCursor)
  248. end
  249.  
  250. local function newLine()
  251.     local xRelativeCursor, yRelativeCursor = WorkspaceWindow.getCursorPos()
  252.  
  253.     table.insert(linesArray, yAbsoluteCursor + 1, linesArray[yAbsoluteCursor]:sub(xAbsoluteCursor-PERMANENT_INDENT, -1))
  254.     linesArray[yAbsoluteCursor] = linesArray[yAbsoluteCursor]:sub(1, xAbsoluteCursor-(PERMANENT_INDENT + 1))
  255.    
  256.     yAbsoluteCursor = range(1, #linesArray, yAbsoluteCursor, 1)
  257.     yRelativeCursor = range(1, math.min(workspaceHeight, #linesArray), yRelativeCursor, 1)
  258.     xAbsoluteCursor = PERMANENT_INDENT + 1
  259.     xRelativeCursor = PERMANENT_INDENT + 1
  260.  
  261.     calculateCursors(xRelativeCursor, yRelativeCursor)
  262.     draw_workspace(yRelativeCursor-1, workspaceHeight)
  263. end
  264.  
  265. --openFile("edt")
  266. openFile("test")
  267. draw_workspace()
  268.  
  269. --ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ--
  270. while true do
  271.     if xDeltaCursor ~= xPrevDeltaCursor or yDeltaCursor ~= yPrevDeltaCursor then
  272.         draw_workspace()
  273.     end
  274.  
  275.     --GUIWindow.clearLine()
  276.     --GUIWindow.setCursorPos(1, 1)
  277.     --GUIWindow.write("xDC: " .. xDeltaCursor .. ". yDC: " .. yDeltaCursor .. ". xpDC: " .. xPrevDeltaCursor .. ". ypDC: " .. yPrevDeltaCursor)
  278.  
  279.     local event, par1, par2, par3, par4 = os.pullEvent()
  280.    
  281.     if event == "key" then
  282.         if par1 == keys.down then
  283.             moveCursorsUpAndDown(1)
  284.         elseif par1 == keys.up then
  285.             moveCursorsUpAndDown(-1)
  286.         elseif par1 == keys.left then
  287.             moveCursorsRightAndLeft(-1)
  288.         elseif par1 == keys.right then
  289.             moveCursorsRightAndLeft(1)
  290.         elseif par1 == keys.home then
  291.             moveCursorsToStartLine()
  292.         elseif par1 == keys["end"] then
  293.             moveCursorsToEndLine()
  294.         elseif par1 == keys.backspace then
  295.             removeChar()
  296.         elseif par1 == keys.enter then
  297.             newLine()
  298.         elseif par1 == keys.insert then
  299.             saveFile("test")
  300.         end
  301.     end
  302.    
  303.     if event == "char" then
  304.         writeChar(par1)
  305.         moveCursorsRightAndLeft(1)
  306.     end
  307. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement