package org.ninjadev.multivim; import java.io.IOException; import org.ninjadev.multivim.commandparser.operators.AbstractOperator; import org.ninjadev.multivim.commandparser.operators.Movement; import org.ninjadev.multivim.notimplemented.NotImplemented; import org.ninjadev.multivim.util.CharacterClass; import org.ninjadev.multivim.util.StringUtils; public class Cursor implements Comparable { public CursorData data; public int desiredColumn; public Buffer buffer; public User user; public Cursor(Buffer buffer, User user){ data = new CursorData(); this.buffer = buffer; this.user = user; } public void set(Cursor cursor){ data.position = new Position(cursor.data.position); desiredColumn = cursor.desiredColumn; } /* returns 1 when going to the next line * returns 2 when moving forward onto a null at the end of a line * returns -1 when at the end of a file * returns 0 otherwise */ public int forward(){ String character = getCharacter(); if(character != null){ /* still within line, move to next char (may be null) */ data.position.column++; desiredColumn = data.position.column; return getCharacter() == null ? 2 : 0; } if(data.position.row != buffer.lines.size()-1){ data.position.column = 0; data.position.row++; desiredColumn = data.position.column; return 1; } return -1; } public int backward(){ if(data.position.column > 0){ data.position.column--; desiredColumn = data.position.column; return 0; } if(data.position.row > 0){ data.position.row--; data.position.column = buffer.lines.get(data.position.row).length(); desiredColumn = data.position.column; return 1; } return -1; } private void setCharacter(String character) { buffer.setChar(character, data.position.row, data.position.column); } public boolean backwardWord(long count, boolean bigWord, boolean stop){ counterLoop: while(count --> 0){ CharacterClass startClass = StringUtils.getCharacterClass(getCharacter(), bigWord); if(backward() == -1){ return false; } if(!stop || startClass == StringUtils.getCharacterClass(getCharacter(), bigWord) || startClass == CharacterClass.WHITESPACE){ while(StringUtils.getCharacterClass(getCharacter(), bigWord) == CharacterClass.WHITESPACE){ if(data.position.column == 0 && buffer.lines.get(data.position.row).length() == 0){ stop = false; continue counterLoop; } if(backward() == -1){ return true; } } CharacterClass cc = StringUtils.getCharacterClass(getCharacter(), bigWord); while(StringUtils.getCharacterClass(getCharacter(),bigWord) == cc){ if(backward() == -1) return true; } } forward(); } return true; } public String getCharacter() { return buffer.getChar(data.position.row, data.position.column); } public Object getNextCharacter() { return buffer.getChar(data.position.row, data.position.column+1); } public boolean cursor_up(int n){ if(n > 0){ int row = data.position.row; if(row-n < 0){ row = n; } row -= n; data.position.row = row; } coladvance(desiredColumn); return true; } public boolean cursor_down(int n){ if(n > 0){ int row = data.position.row; if(row+n > buffer.lines.size()-1){ row = buffer.lines.size()-1; } row += n; data.position.row = row; } coladvance(desiredColumn); return true; } private boolean coladvance(int column) { try{ data.position.column = Math.min(column, buffer.lines.get(data.position.row).length()); }catch(IndexOutOfBoundsException e){ data.position.column = 0; } return data.position.column == column; } public void insert(char character) throws IOException { buffer.insert(""+character, this); System.out.println("trying to insert yo"); forward(); } public void delete() throws IOException { buffer.delete(this); backward(); } @Override public int compareTo(Object o) { Cursor cursor = (Cursor) o; int rowDifference = cursor.data.position.row - data.position.row; if(rowDifference != 0){ return rowDifference; } int columnDifference = cursor.data.position.column - data.position.column; return columnDifference; } }