due: Monday March 31 at 11:59pm (submit on Gradescope here).
In this lab, you'll use a doubly-linked list of characters to represent the lines of text in your own text editor called MiddDocs.
As in Lab 4, you'll work in groups. Recall that only one group member should start the Live Share server (by clicking on Live Share). Then send this link to the other group member(s). Please work in pairs. If necessary, you can form a group of 3 but no higher than this please (this limit has been set in Gradescope).
Line class.You do not need to change any of the code in TextEditor.java, but feel free to investigate if you're curious about certain things! The only file you need to change, and upload to Gradescope is the Line.java file. The starter code can be downloaded here.
Line.java contains two class definitions: CharacterNode and Line. The CharacterNode class represents a character in a line of text, which is designed as a node in a doubly-linked list. Hence, it has prev and next fields (which are public). It also stores the character (private), which is like the data field we used in our examples in class.
The Line class is a doubly-linked list which keeps track of the head and cursor nodes. The head is the first character in the line (if any) and the cursor is the current location of the cursor, which can be moved with the arrow keys. There is no tail in the Line linked list. All operations (insertion, deletion, cursor movement) operate on the current location of the cursor node. When the cursor is drawn (as a vertical bar |), it is drawn immediately after the character where the cursor is located. For example, the sequence of characters abcd|efgh means the cursor is at the letter d (and the head is at the letter a).
Important note: in order to represent the cursor being at the beginning of a line, the cursor can be null (while the head is non-null). For example, the line |abcd means the cursor is null, and the head is a.
Your task is to complete 5 methods, which we suggest implementing in the following order. Make sure to check and update the next and prev fields (as necessary).
insert(char c): inserts a character right after the current cursor location. For example, calling insert('a') when the current Line is ban|na will produce bana|na. Note that the head and cursor are initially null, so be sure to treat the case when the first character is inserted. Edge cases to consider: (1) what if the head is null? (2) what if the cursor is null? (3) what if cursor.next is null? Remember to update cursor to the new node in all cases.
delete(): deletes the character located at the cursor. For example, calling delete when the current Line is spider|rman will produce spide|rman. Edge cases to consider: (1) what if the head and/or cursor are null? (2) what if cursor.prev is null? (3) what if cursor.next is null?
moveCursorLeft(): moves the cursor to the previous CharacterNode (if the cursor isn't null). This is called when the left arrow key is pressed. For example, calling moveCursorLeft() when the Line is polyg|on will produce poly|gon. Edge case to consider: can the cursor move left if it is null?
moveCursorRight(): moves the cursor to the next CharacterNode (if the next isn't null). This is called when the right arrow key is pressed. For example, calling moveCursorRight() when the Line is middleb|ury will produce middlebu|ry. Edge cases to consider: (1) what should the cursor be set to if it is currently null (see the Important note above)? (2) can the cursor move right if cursor.next is null?
Line(String line): creates an entire line from an input String. This is used when loading a file into the text editor. The cursor should be at the beginning of the line after reading the entire line. For example, creating a Line using new Line("middlebury") will render as "|middlebury". Hints: (1) use your insert method to add characters to this; (2) remember you can use s.charAt(i) to get the i-th character from a String s; (3) remember at the end to reset cursor so it is at the beginning of the line.
A PSVM has been set up for you to get started testing these methods. Please use this to develop your Line class. You can then test the fully-featured MiddDocs editor by running TextEditor.java.
You can use the Escape key to exit MiddDocs. You'll then be prompted (in the command-line) about saving the file: respond with either y (yes) or n (no). If you save the file, you can then re-open it directly from the command-line, which will require compiling your code separately with javac and then running it with java. For example if you write a poem and save it to poem.txt:
$ javac TextEditor.java
$ java TextEditor poem.txtUpload Line.java to Gradescope. Since you worked on the code as a group, you can submit as a group or you can submit individually if you prefer. Remember to check the style of your code and remember to include name(s) at the top of the file!