// Copyright 2021 Aaron Hance // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. { Prog->edit - Simple text editor @author(Aaron Hance ) } unit edit; interface uses console, terminal, keyboard, shell, strings, tracer, storagemanagement, lmemorymanager, util; procedure init(); implementation const width = 60; height = 20; var Handle : HWND = 0; Colors : uint32; ColorsSel : uint32; position : uint32; ////////////////////////////// fileName : pchar; extension : pchar = 'txt'; //chars : array[0..(height * width)] of char; chars : pchar; mousePos : uint32 =0; procedure OnClose(); begin Handle:= 0; end; procedure Draw(); var y : uint32; pos : uint32; begin push_trace('edit.draw'); if Handle <> 0 then begin clearWNDEx(Handle, Colors); for y:=0 to (width * height)-1 do begin pos := y; if y = mousePos then begin writecharexWND(chars[pos], ColorsSel, Handle); end else begin writecharexWND(chars[pos], Colors, Handle); end; if (chars[pos] = char(0)) then break; // need to not do this at the end maybe... end; end end; procedure shiftBuffer(start : uint32); var buffer : pchar; begin buffer := stringnew(stringSize(chars) + 1); memset(uint32(buffer), 0, stringSize(chars) + 1); memcpy(uint32(chars), uint32(@buffer[1]), stringSize(chars)); memcpy(uint32(chars), uint32(buffer), start); kfree(puint32(chars)); chars:= buffer; end; procedure OnKeyPressed(info : TKeyInfo); var i : uint32; pos : uint32; begin //writeintlnWND(info.key_code, getTerminalHWND()); if (info.CTRL_DOWN and (info.key_code = 115)) then begin //SAVE FILE // storagemanagement.writeNewFile(fileName, extension, puint32(chars), stringSize(chars)); writestringlnWND('saved', getTerminalHWND()); //writeintlnWND(stringSize(chars), getTerminalHWND()); end else begin //delete key if (info.key_code = 8) then begin //console.backspaceWND(Handle); if mousePos > 0 then mousePos -=1; chars[mousePos] := char(32); end else if info.key_code = 20 then begin mousePos +=1; end else if info.key_code = 19 then begin mousePos -=1; end else if info.key_code = 18 then begin if mousePos < width * height-1 then begin mousePos += width; end; end else if info.key_code = 16 then begin if mousePos > width+1 then begin mousePos -= width; end; end else begin if mousePos < stringSize(chars) then begin shiftBuffer(mousePos + 1); end; chars[mousePos] := char(info.key_code); //writecharexWND(char(info.key_code), Colors, Handle); mousePos +=1; end; end end; procedure run(Params : PParamList); var buffer : puint32; bytes : puint32; error : puint32; test : pchar; begin tracer.push_trace('edit.run'); fileName := stringCopy(getParam(0, Params)); bytes := puint32(kalloc(4)); bytes^ := 0; buffer := kalloc(4); // error := storagemanagement.readfile(fileName, extension, buffer, bytes); if error^ = 1 then begin //file doesn't exists, make new writestringlnWND('File does not exist, will save as a new file.', getTerminalHWND()); console.redrawWindows(); chars := pchar(kalloc(sizeof(char) * (width * height) * 10)); memset(uint32(puint32(chars)), 0, sizeof(char) * (width * height)); end else begin //load file from buffer writestringlnWND('File exsists, loading', getTerminalHWND()); console.redrawWindows(); //chars := pchar(buffer); chars := pchar(kalloc(bytes^)); memset(uint32(chars), 0, bytes^); if uint32(puint32(chars)) = 0 then begin console.writestringlnWND('unable to allocate memory for file.', getTerminalHWND()); console.writestringWND('attempted to allocate: ', getTerminalHWND()); console.writeintWND(bytes^, getTerminalHWND()); redrawWindows(); exit; end; //memset(uint32(chars), 0, bytes^ * 2); //memcpy(uint32(buffer), uint32(chars), uint32(bytes^)); memcpy(uint32(buffer^), uint32(puint32(chars)), uint32(bytes^)); end; // kfree(buffer); // kfree(bytes); // kfree(error); if Handle = 0 then begin Handle:= newWindow(20, 40, width, height, 'Edit'); registerEventHandler(Handle, EVENT_DRAW, void(@Draw)); registerEventHandler(Handle, EVENT_CLOSE, void(@OnClose)); registerEventHandler(Handle, EVENT_KEY_PRESSED, void(@OnKeyPressed)); writestringlnWND('Edit Started.', getTerminalHWND); end; clearWNDEx(Handle, Colors); end; procedure init(); begin tracer.push_trace('edit.init'); Colors:= combineColors($0000, $FFFF); ColorsSel:= combineColors($FFFF, $0000); terminal.registerCommand('EDIT', @Run, 'Edit those jucy text files'); end; end.