diff --git a/texted.c b/texted.c new file mode 100644 index 0000000..e296b8b --- /dev/null +++ b/texted.c @@ -0,0 +1,682 @@ +#include "texted.h" +#define MAX_SIZE 1048576 + +/* ********************************************************************************************************************************************** */ + +// STUFF TO IMPLEMENT + +// ******DONE****** 1. Characters should be removed from array after backspace (maybe keep track of which element in the array the cursor is on. +// ******DONE****** 2. Enter should add newline character to array. +// ******DONE****** 3. Backspace and Left Arrow at first character in row should move up to the last character on the previous row. (vice versa for right arrow) +// ********(PAGE UP AND) PAGE DOWN SOMETIMES DOESN'T MOVE REAL CURSOR ACCORDINGLY - TEXTCOUNTER SHOULD BE ADJUSTED******** 4. Page scrolling up/down (initially with page up/page down keys). - Idea: Implement by printing from nth new line character till first null character. +// 5. (OPTIONAL): Convert the mainwin into a pad, to make scrolling easier. +// **KIND OF DONE** 6. Word wrapping. +// ******DONE****** 7. Getting Save File Location from argv +// ******DONE?***** 8. Up Arrow and Down Arrow Keys. +// ******DONE****** 9. Integrate with file manager program. +// ******DONE****** 10. Opening and editing text files +// **MOSTLY DONE*** 11. Save Dialog. +// ******DONE****** 12. Insert character into array after pressing left arrow and typing a character. + +// SOLVE ERROR WITH LAST LINE IN A FILE (IT DOESN'T HAVE MAINX CHARACTERS AND IT DOESN'T HAVE TWO NEWLINES) + +// ******DONE****** 13. Backspace at first character ignores spaces. +// ******DONE?***** 14. Adding character at last line of window. +// ******DONE?***** 15. Page down/Page up with word wrapping. + + +/* ********************************************************************************************************************************************** */ + + + + +int run(char* dir,WINDOW* mainwin,int argc) { + char* text; + char* saveLocation; +// char* tempSaveLoc; + int textCounter; + int selRow=1; +// int numCharsCurrent; +// int numCharsNext; + int selCol=1; + int xSize,ySize,mainX,mainY; + int charArrayCounter; + FILE* myFile; + int ch; + int numLines; + bool newLineFound; +// int textIndex; +// char* shortText; + int upArrowDistance; + int charsOnLine; + + + text = malloc(MAX_SIZE * (sizeof(char))); + + initscr(); + noecho(); +// cbreak(); + raw(); + getmaxyx(stdscr,ySize,xSize); + +// mvwaddstr(stdscr,2,5,"^S - Save | ^C - Quit | ^R - Reset Cursor"); + + + mvwaddstr(stdscr,2,5,"^S - Save | ^C - Quit | - Scroll Down | - Scroll Up"); + + + +// WINDOW* boxwin = newwin(ySize-7,xSize-8,5,5); + keypad(mainwin,true); +// box(boxwin,0,0); + getmaxyx(mainwin,mainY,mainX); + refresh(); + wrefresh(mainwin); +// wrefresh(boxwin); + wmove(mainwin,selRow,selCol); +// ch = wgetch(mainwin); + ch = ' '; + textCounter=0; + numLines=0; + int numNewLinesFound=0; + int indexToBegin=0; + FILE* readFile; +// int tempSelRow,tempSelCol; + +// if (argc > 1) { + if (readFile = fopen(dir,"r")) { + fread(text,MAX_SIZE,1,readFile); + printFromIndex(mainwin,text,0,1,1,0); +// } else { +// strcpy(argv[1],tempSaveLoc); + } +// } + wmove(mainwin,selRow,selCol); + + while (ch != ('s' & 0x1f) && (ch != ('c' & 0x1f))) { + indexToBegin=0; + numNewLinesFound=0; + charsOnLine=0; + if (numLines > 0) { + for (int i=0;i=mainX-2){ + numNewLinesFound++; + charsOnLine=0; + } + } + } + // if (indexToBegin!=0){ + printFromIndex(mainwin,text,indexToBegin,selRow,selCol,numLines); + // } + box(mainwin,0,0); + + + + // getyx(mainwin,selRow,selCol); + wmove(stdscr,1,1); + wclrtoeol(stdscr); + mvwprintw(stdscr,1,1,"%d,%d",selRow,selCol); + + mvwprintw(stdscr,3,1,"%c",findCharInArray(text,2,1,numLines)); + + wmove(mainwin,selRow,selCol); + + ch = wgetch(mainwin); + switch (ch) { + case 7: + case KEY_BACKSPACE: + case 8: + case 127: + if (selCol > 1) { + wmove(mainwin,selRow,--selCol); + wdelch(mainwin); + textCounter--; + shiftElementsDown(text,textCounter); + + } else if (selCol == 1 && selRow > 1) { + textCounter--; + --selRow; + selCol=findLastChar(mainwin,selRow,mainX)+charToNewLine(text,textCounter); + wmove(mainwin,selRow,selCol); + shiftElementsDown(text,textCounter); + + } + break; + + case KEY_LEFT: + if (selCol > 1) { + wmove(mainwin,selRow,--selCol); + textCounter--; + } else if (selCol == 1 && selRow > 1) { + textCounter--; + --selRow; + selCol=findLastChar(mainwin,selRow,mainX)+charToNewLine(text,textCounter); + if (selCol==2) { + selCol--; +// *(int*)0=0; + } + wmove(mainwin,selRow,selCol); + } + + break; + + case KEY_RIGHT: +// if (!(isLastChar(mainwin,selRow,selCol,mainX))) { + + + if (*(text+textCounter) != '\0') { + if (*(text+textCounter) != '\n' && selCol mainX-3) { + textCounter--; + } + + textCounter += (findLastChar(mainwin,selRow,mainX)); + + +// textCounter += (findLastCharWithArray(mainwin,stdscr,selRow,mainX,text,textCounter,numLines)); +// selCol=1; + */ + + wmove(mainwin,++selRow,selCol); + } + break; + + case KEY_UP: + + if (selRow-1 > 0 && (selCol == 1 && (*(text+textCounter-(findLastChar(mainwin,selRow-1,mainX)))) != '\0')) { + + int selColOfNewLine = 500; + newLineFound=false; + upArrowDistance=0; + for (int i=1;i 1) { + saveLocation = getSaveLoc(mainX,mainY,dir); + } else { + saveLocation = getSaveLoc(mainX,mainY,"$$$"); + } + if (saveLocation == "$$$") { + ch = ' '; + wmove(mainwin,selRow,selCol); + break; + } +// myFile = fopen("savedFile.txt","w"); + myFile = fopen(saveLocation,"w"); + mvwaddstr(stdscr,1,1,saveLocation); + charArrayCounter=0; + do { + fputc(*(text+charArrayCounter),myFile); + charArrayCounter++; +// } while (charArrayCounter < (strlen(shortText))); + } while (*(text+charArrayCounter) != '\0'); + + if (*(text+charArrayCounter) != '\n') { + fputc('\n',myFile); + } +// fputc('\0',myFile); + fclose(myFile); +// wgetch(mainwin); + break; + + case KEY_NPAGE: + if (selRow > 1) { + numLines++; + selRow--; + wmove(mainwin,selRow,selCol); + } else { + if (selCol == 1) { + numLines++; + + while (*(text+textCounter) != '\n' && selCol= mainY-2 && selCol == 1 && selRow > 1) { + textCounter -= (findLastChar(mainwin,selRow-1,mainX)); + selRow--; + } + if (numLines > 0){ + selCol=1; + wmove(mainwin,selRow,selCol); + numLines--; + selRow++; + } + // if (numLines == 0) { + // selRow++; + // } + break; + default: +// waddch(mainwin,ch); + mvwinsch(mainwin,selRow,selCol,ch); + if (*(text+textCounter+1-1) != '\0') { + shiftElementsUp(text,textCounter); + } + *(text + textCounter) = ch; + textCounter++; + + + if (selCol >= mainX-1) { + selCol=2; + selRow++; + wmove(mainwin,selRow,selCol); + } else { + + + // selCol++; + +// /*Temporary uncomment*/ +// selCol++; + // wmove(mainwin,selRow,selCol+1); + + wmove(mainwin,selRow,++selCol); + + } + +// mvwprintw(stdscr,1,2,"%d",*(text+textCounter-1)); + + +// mvwprintw(mainwin,6,6,"%d",ch); + break; + + } +// mvwprintw(mainwin,3,3,"%d",textCounter); + box(mainwin,0,0); + } + + endwin(); + + return 0; +} + + + +char* shortenString (char* origString) { + int numNullChars = 0; + char* newString = malloc((strlen(origString)+1) * (sizeof(char))); +// for (int i=0;i=arrCounter;i--) { + *(arr+i+1) = *(arr+i); + } + *(arr+arrCounter) = '\0'; + + + +} + +char* getSaveLoc(int mainX,int mainY, char* tempSaveLoc) { + WINDOW* saveDiag = newwin(8,40,((mainY/2)-4),((mainX/2)-20)); + char* saveLoc = malloc(SAVE_LOC_SIZE * sizeof(char)); + box(saveDiag,0,0); + refresh(); + wrefresh(saveDiag); + mvwaddstr(saveDiag,1,1,"Save to?"); + mvwhline(saveDiag,4,2,0,36); + wmove(saveDiag,3,2); + int i=0; + char ch = 65; + raw(); + int saveY,saveX; +// cbreak(); + if (tempSaveLoc != "$$$") { + do { + wmove(saveDiag,3,i+2); + + waddch(saveDiag,*(tempSaveLoc+i)); + *(saveLoc+i) = *(tempSaveLoc+i); + i++; + } while (i 2) { + wmove(saveDiag,3,i+1); +// wdelch(saveDiag); + waddch(saveDiag,32); + wmove(saveDiag,3,i+1); + *(saveLoc+i-1) = '\0'; + i--; + } + } else { + wmove(saveDiag,3,i+2); + waddch(saveDiag,ch); + *(saveLoc+i) = ch; + i++; + } + refresh(); + wrefresh(saveDiag); + } while (ch != 10 && ch != ('c' & 0x1f)); +// raw(); + wclear(saveDiag); + refresh(); + wrefresh(saveDiag); +// return shortenString(saveLoc); + if (ch == ('c' & 0x1f)) { + return "$$$"; + } + return saveLoc; + + + +} + + +int findLastChar(WINDOW* mainwin,int selRow,int mainX) { + int selCol=0; + for (int i=mainX-2;i>=1;i--){ + if (mvwinch(mainwin,selRow,i) != 32) { + selCol=i; + break; + } + } + + if (selCol==0){ + return selCol; + } + + return selCol+1; +} + +int findLastCharWithArray(WINDOW* mainwin,WINDOW* std,int selRow,int mainX,char* text, int textCounter,int numLines) { + int selCol=0; + for (int i=0;i>mainX;i++){ +// if (findCharInArray(text,selRow,i+1,numLines) == mvwinch(mainwin,selRow+1,1)) { + + mvwprintw(stdscr,3,1,"%c\n",findCharInArray(text,selRow,i+1,numLines)); + + if (findCharInArray(text,selRow,i+1,numLines) == '\n') { + + abort(); + selCol=i; +// *(int*)0 = 0; + break; + } + } + return selCol+1; +} + + +bool isLastChar(WINDOW* mainwin,int selRow,int selCol,int mainX) { + for (int i=selCol;i= mainX-1) { + selColTemp=1; + selRowTemp++; +// index++; + wmove(mainwin,selRowTemp,selColTemp); + } + index++; + } + + +// box(boxwin,0,0); + refresh(); +// wrefresh(boxwin); +// wmove(mainwin,selRow,selCol); + wmove(mainwin,numLines,selCol); + if (numLines == 0) { + wmove(mainwin,++selRow,selCol); + } +} + + +char findCharInArray(char* charArray, int selRow, int selCol, int numLines) { + int indexToBegin=0; + int numNewLinesFound=0; + if (numLines > 0) { + for (int i=0;i + #include + #include + + #define SAVE_LOC_SIZE 500 + + char* shortenString(char*); + void shiftElementsDown(char*,int); + void shiftElementsUp(char*,int); + char* getSaveLoc(int,int,char*); + int findLastChar(WINDOW*,int,int); + int findLastCharWithArray(WINDOW*,WINDOW*,int,int,char*,int,int); + bool isLastChar(WINDOW*,int,int,int); + void printFromIndex(WINDOW*,char*,int,int,int,int); + char findCharInArray(char*,int,int,int); + int charToNewLine(char*,int); + int run(char*,WINDOW*,int); + +#endif