package org.ninjadev.multivim.movement; import java.io.IOException; import org.ninjadev.multivim.Buffer; import org.ninjadev.multivim.Cursor; import org.ninjadev.multivim.User; import org.ninjadev.multivim.commandparser.operators.AbstractOperator; import org.ninjadev.multivim.commandparser.operators.Movement; import org.ninjadev.multivim.util.CharacterClass; import org.ninjadev.multivim.util.StringUtils; public class ForwardWord implements IMovement{ @Override public boolean move(Cursor cursor, int count, AbstractOperator operator) throws IOException { operator.before(); Cursor operatorCursor = new Cursor(cursor.buffer, cursor.user); operatorCursor.set(cursor); Buffer buffer = cursor.buffer; User user = cursor.user; boolean bigWord = false; boolean EOL = false; while(count --> 0){ CharacterClass startClass = StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord); boolean lastLine = operatorCursor.data.position.row == (buffer.lines.size()-1); int i = operatorCursor.forward(); if(i == -1 || i >= 1 && lastLine){ return false; } if(i >= 1 && EOL && count == 0){ return true; } if(startClass != CharacterClass.WHITESPACE){ while(startClass == StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord)){ i = operatorCursor.forward(); if(i == -1 || (i >= 1 && EOL && count == 0)){ return true; } } } while(StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord) == CharacterClass.WHITESPACE){ if(operatorCursor.data.position.column == 0 && buffer.lines.get(operatorCursor.data.position.row).length() == 0){ break; } i = operatorCursor.forward(); if(i == -1 || ( i>=1 && EOL && count == 0)){ return true; } } } operator.after(cursor, operatorCursor); user.setOperator(new Movement()); return true; } }