import java.io.*; import java.util.*; public class DisplayEditor { static MessageLoop messages = new MessageLoop(); // MessageLoopIterator iter = (MessageLoopIterator) messages.iterator(); /** * @param args * @throws FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException { if (args.length == 0) { // yeah, here's our scanner Scanner in = new Scanner(System.in); System.out.print("enter command (? for help)>"); String input = in.nextLine(); while (!(input.equals("q"))) { try { cmdProc(input); } catch (StringIndexOutOfBoundsException e) {} System.out.print("enter command (? for help)>"); input = in.nextLine(); } if (input.equals("q")) { System.out.println("quit"); in.close(); System.out.close(); } } // Oh, thanks for the args. Now we'll process your input file. else { File inpFile = new File(args[0]); // If for some reason it's not there or can't be read. if (!inpFile.exists() || !inpFile.canRead()) { System.out.println("Invalid input file!"); System.exit(1); } Scanner in = new Scanner(inpFile); try { while (in.hasNextLine()) { String temp = in.next(); try { cmdProc(temp); } catch (StringIndexOutOfBoundsException e) {} } }finally { in.close(); } } } // If the message loop is empty, display "no messages to save". Otherwise, // save all the messages to file named filename, one message per line // starting with the current message (and proceeding forward through the // loop). If filename already exists, display // "warning: file already exists, will be overwritten" before saving the // messages. If filename cannot be written to, display "unable to save". public static void save(String filename) throws FileNotFoundException { File dstFile = new File(filename); DblListnode curr; try { curr = (DblListnode) messages.getCurrent(); if (messages.size() == 0) { System.out.println("no messages to save"); } else { if (dstFile.exists()) { System.out.println("warning: file already exists, will be overwritten"); } if (dstFile.isDirectory() || (dstFile.exists() && !dstFile.canWrite())) { System.out.println("unable to save"); } else { PrintStream print = new PrintStream(dstFile); for (int i = 0; i < messages.size(); i++) { print.println(curr.getData()); //System.out.println(curr.getData()); debugging shtuffs curr = curr.getNext(); } print.close(); } } } catch (EmptyLoopException e) { System.out.println("EmptyLoopException getCurrent"); } } // (Note that this command is a lower-case L, not the number one.) If a file // named filename does not exist or cannot be read from, display // "unable to load". Otherwise, load the messages from filename in the order // they are given, and set the current message to be the first message read // from the file. You may assume that there is one message per line, that // there are no blank lines, and that the file is not empty (i.e., it has at // least one line). public static void load(String filename) { File srcFile = new File(filename); if (!srcFile.exists() || !srcFile.canRead() || !srcFile.isFile()) { System.out.println("unable to load"); } else { Scanner inFile; try { inFile = new Scanner(srcFile); while (inFile.hasNext()) { String line = inFile.nextLine(); addMsg(line); } inFile.close(); messages.forward(); } catch (FileNotFoundException e) { System.out.println("FileNotFoundException"); } } } public static void displayMsgs() { MessageLoopIterator iter = (MessageLoopIterator) messages.iterator(); if (messages.size() == 0) { System.out.println("no messages"); } else { // iter.next(); for (int count = 0; count < messages.size(); count++) { System.out.println(iter.next().getData()); // make sure it // starts // at the first one } } } public static void nextMsg() { if(messages.size()==0){ System.out.println("no messages"); } else{ messages.forward(); displayContext(); } } public static void previousMsg() { if(messages.size()==0){ System.out.println("no messages"); } else{ messages.back(); displayContext(); } } public static void jumpAround(int n) { if (messages.size() == 0) { System.out.println("no messges"); } else { if( n >= 0) { for (int i = 0; i < n; i++) messages.forward(); } if (n <= 0) { for (int i = 0; i > n; i--) messages.back(); } displayContext(); } } public static void deleteCurrentMsg() { try { if(messages.size() == 0){ System.out.println("no messages"); } else if (messages.size()==1){ messages.removeCurrent(); System.out.println("no messages"); } else{ messages.removeCurrent(); displayContext(); } } catch (EmptyLoopException e) { System.out.println("EmptyLoopException"); } } // If the message loop is empty, add the new message to the loop and make it // the current message. Otherwise, add the new message immediately after the // current message and make the new message the new current message. In // either case, display the current context (see note below). public static void addMsg(String msg) { if (messages.size() <= 0) { messages.addBefore(msg); } else { messages.addAfter(msg); } } public static void insertMsg(String msg) { if (messages.size() <= 0) { messages.addBefore(msg); } else { messages.addBefore(msg); // messages.back(); } } // MessageLoopIterator iter = (MessageLoopIterator) messages.iterator(); // iterate thru until found record times you iterated, then forward() or // back() that number of times public static void findMsg(String msg) { if (messages.size()==0){ System.out.println("no messages"); } else{ boolean found = false; Iterator iter = messages.iterator(); for (int i = 0; i 2) { System.out.println(curr.getPrev().getData()); System.out.println("*** " + curr.getData() + " ***"); System.out.println(curr.getNext().getData()); } } catch (EmptyLoopException e) { System.out.println("EmptyLoopException"); } } public static void cmdProc (String input) { if (input.equals("?")) { System.out.println("s (save) l (load) " + "d (display) \nn (next) p (previous) " + "j (jump)\nx (delete) a (add after) i " + "(insert before)\nf (find) r (replace) " + "q (quit)\n"); } else if (input.charAt(0) == 's' && input.charAt(1) == ' ') { String filename = (input.substring(2)); try { save(filename); } catch (FileNotFoundException e) { } } else if (input.charAt(0) == 'l' && input.charAt(1) == ' ') { String filename = (input.substring(2)); load(filename); } else if (input.charAt(0) == 'd') { displayMsgs(); } else if (input.charAt(0) == 'n') { nextMsg(); } else if (input.charAt(0) == 'p') { previousMsg(); } else if (input.charAt(0) == 'j' && input.charAt(1) == ' ') { String temp = input.substring(2); if (checkInputForInt(temp)){ int n = Integer.parseInt(temp); jumpAround(n); } else{ System.out.println("invalid command"); } } else if (input.charAt(0) == 'x') { // delete deleteCurrentMsg(); } else if (input.charAt(0) == 'a' && input.charAt(1) == ' ') { // add String temp = input.substring(2); if (temp.length() >= 1) { addMsg(temp); displayContext(); } } else if (input.charAt(0) == 'i' && input.charAt(1) == ' ') { String temp = input.substring(2); if (temp.length() >= 1) { insertMsg(temp); displayContext(); } } else if (input.charAt(0) == 'f' && input.charAt(1) == ' ') { String temp = input.substring(2); if (temp.length() >= 1) { findMsg(temp); } } else if (input.charAt(0) == 'r' && input.charAt(1) == ' ') { replaceMsg(input.substring(2)); } else if (input.equals("cntx")) { //used by us to see the current context displayContext(); } else{ System.out.println("invalid command"); } } public static boolean checkInputForInt(String temp){ if (temp.charAt(0) == '-'){ temp = temp.substring(1); } if (temp.length() == 0){ return false; } for (int i = 0; i