package kpc.common.kawa;
import gnu.mapping.Procedure1;
import kpc.api.Signal;
import kpc.api.computer.OperatingSystem;
import kpc.api.computer.Terminal;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
public final class gets
extends Procedure1 {
private final OperatingSystem os;
private final Terminal terminal;
public gets(OperatingSystem os, Terminal terminal){
this.os = os;
this.terminal = terminal;
}
@Override
public Object apply1(Object arg)
throws Throwable {
Object c = this.get();
if(c == null){
return arg;
} else if(c.equals(-1)){
if(arg.toString().length() == 0){
return this.apply1(arg.toString());
} else{
this.terminal.backspace();
this.terminal.setCursorPos(this.terminal.getCursorX() - 1, this.terminal.getCursorY());
return this.apply1(((String) arg).substring(0, ((String) arg).length() - 1));
}
} else if(c instanceof String){
this.terminal.write(c.toString());
this.terminal.setCursorPos(this.terminal.getCursorX() + c.toString().length(), this.terminal.getCursorY());
return this.apply1(arg.toString() + c.toString());
} else{
this.terminal.write(String.valueOf(c));
this.terminal.setCursorPos(this.terminal.getCursorX() + String.valueOf(c).length(), this.terminal.getCursorY());
return this.apply1(arg.toString() + ((char) c));
}
}
private Object get(){
Signal signal = this.os.pull();
if(signal.name().equals("char")){
if(signal.args()[0].equals("__enter__")){
return null;
} else if(signal.args()[0].equals("__back__")){
return -1;
} else if(signal.args()[0].equals("__ctrl__")){
return "";
} else if(signal.args()[0].equals("__ctrlv__")){
try{
return Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
} catch (Exception e) {
return "";
}
} else{
return ((String) signal.args()[0]).charAt(0);
}
} else{
return null;
}
}
}