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 BackwardWord 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 stop = false;
counterLoop:
while(count --> 0){
CharacterClass startClass = StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord);
if(operatorCursor.backward() == -1){
return false;
}
if(!stop || startClass == StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord) || startClass == CharacterClass.WHITESPACE){
while(StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord) == CharacterClass.WHITESPACE){
if(operatorCursor.data.position.column == 0 && buffer.lines.get(operatorCursor.data.position.row).length() == 0){
stop = false;
continue counterLoop;
}
if(operatorCursor.backward() == -1){
return true;
}
}
CharacterClass cc = StringUtils.getCharacterClass(operatorCursor.getCharacter(), bigWord);
while(StringUtils.getCharacterClass(operatorCursor.getCharacter(),bigWord) == cc){
if(operatorCursor.backward() == -1) return true;
}
}
operatorCursor.forward();
}
operator.after(cursor, operatorCursor);
user.setOperator(new Movement());
return true;
}
}