package dasherJava.core.alphabets.actions;
import dasherJava.DasherJava;
import dasherJava.core.output.AccessibilityInterface;
import dasherJava.core.output.KeyboardOutput;
import dasherJava.core.output.PauseDasherTarget;
import dasherJava.core.output.SocketOutput;
import dasherJava.core.output.TextCharOutput;
import dasherJava.core.output.TextCharOutput.TextRange;
import dasherJava.core.output.TextCharOutput.TextTarget;
public interface Action {
static void doAction(Action action) {
//System.out.println("Do Action "+action);
if (action instanceof TextCharAction) {
TextCharAction textCharAction = (TextCharAction) action;
TextCharOutput textCharOutput = DasherJava.getTextCharOutput();
if (textCharOutput!=null) textCharOutput.outputChar(textCharAction.getUnicode());
} else if (action instanceof DeleteTextAction) {
DeleteTextAction deleteTextAction = (DeleteTextAction) action;
TextCharOutput textCharOutput = DasherJava.getTextCharOutput();
if (textCharOutput!=null) textCharOutput.deleteText(deleteTextAction.getRange());
} else if (action instanceof MoveTextCaretAction) {
MoveTextCaretAction moveTextCaretAction = (MoveTextCaretAction) action;
TextCharOutput textCharOutput = DasherJava.getTextCharOutput();
if (textCharOutput!=null) textCharOutput.moveTextCaret(moveTextCaretAction.getTarget());
} else if (action instanceof PauseDasherAction) {
PauseDasherAction pauseDasherAction = (PauseDasherAction) action;
PauseDasherTarget pauseDasherTarget = DasherJava.getPauseDasherTarget();
if (pauseDasherTarget!=null) pauseDasherTarget.pauseForTime(pauseDasherAction.getTime());
} else if (action instanceof ChangeAlphabetAction) {
ChangeAlphabetAction changeAlphabetAction = (ChangeAlphabetAction) action;
DasherJava.changeAlphabet(changeAlphabetAction.getAlphabetName());
} else if (action instanceof KeyboardAction) {
KeyboardAction keyboardAction = (KeyboardAction) action;
KeyboardOutput keyboardOutput = DasherJava.getKeyboardOutput();
if (keyboardOutput!=null) {
if (keyboardAction.getPress()>=0) keyboardOutput.pressKey(keyboardAction.getPress());
if (keyboardAction.getKey()>=0) keyboardOutput.typeKey(keyboardAction.getKey());
if (keyboardAction.getRelease()>=0) keyboardOutput.releaseKey(keyboardAction.getRelease());
}
} else if (action instanceof AccessibilityAction) {
AccessibilityAction accessibilityAction = (AccessibilityAction) action;
AccessibilityInterface accessibilityInterface = DasherJava.getAccessibilityInterface();
String s = accessibilityAction.getDoAction();
if (s!=null && accessibilityInterface!=null) accessibilityInterface.doAction(s);
} else if (action instanceof SocketOutputAction) {
SocketOutputAction socketOutputAction = (SocketOutputAction) action;
SocketOutput socketOutput = DasherJava.getSocketOutput();
String s = socketOutputAction.getDoString();
if (s!=null && socketOutput!=null) socketOutput.sendString(s, socketOutputAction.isSuppressNewline());
}
}
static void undoAction(Action action) {
//System.out.println("Undo Action "+action);
if (action instanceof TextCharAction) {
TextCharOutput textCharOutput = DasherJava.getTextCharOutput();
if (textCharOutput!=null) textCharOutput.deleteLastChar();
} else if (action instanceof KeyboardAction) {
KeyboardAction keyboardAction = (KeyboardAction) action;
KeyboardOutput keyboardOutput = DasherJava.getKeyboardOutput();
if (keyboardOutput!=null) {
if (keyboardAction.getUndoPress()>=0) keyboardOutput.pressKey(keyboardAction.getUndoPress());
if (keyboardAction.getUndoKey()>=0) keyboardOutput.typeKey(keyboardAction.getUndoKey());
if (keyboardAction.getUndoRelease()>=0) keyboardOutput.releaseKey(keyboardAction.getUndoRelease());
}
} else if (action instanceof AccessibilityAction) {
AccessibilityAction accessibilityAction = (AccessibilityAction) action;
AccessibilityInterface accessibilityInterface = DasherJava.getAccessibilityInterface();
String s = accessibilityAction.getUndoAction();
if (s!=null && accessibilityInterface!=null) accessibilityInterface.doAction(s);
} else if (action instanceof SocketOutputAction) {
SocketOutputAction socketOutputAction = (SocketOutputAction) action;
SocketOutput socketOutput = DasherJava.getSocketOutput();
String s = socketOutputAction.getUndoString();
if (s!=null && socketOutput!=null) socketOutput.sendString(s, socketOutputAction.isSuppressNewline());
}
}
class TextCharAction implements Action {
private final int unicode;
public TextCharAction(int unicode) {
this.unicode=unicode;
}
public int getUnicode() {
return unicode;
}
}
class DeleteTextAction implements Action {
private final TextRange range;
public DeleteTextAction(TextRange range) {
this.range=range;
}
public TextRange getRange() {
return range;
}
}
class MoveTextCaretAction implements Action {
private final TextTarget target;
public MoveTextCaretAction(TextTarget target) {
this.target=target;
}
public TextTarget getTarget() {
return target;
}
}
class PauseDasherAction implements Action {
private final int time; //in milliseconds, or forever if negative
public PauseDasherAction(int time) {
this.time=time;
}
public int getTime() {
return time;
}
}
class ChangeAlphabetAction implements Action {
private final String alphabetName;
public ChangeAlphabetAction(String alphabetName) {
this.alphabetName=alphabetName;
}
public String getAlphabetName() {
return alphabetName;
}
}
class KeyboardAction implements Action {
private final int press; //Java virtual keycode, none if negative
private final int key; //Java virtual keycode, none if negative
private final int release; //Java virtual keycode, none if negative
private final int undoPress; //Java virtual keycode, none if negative
private final int undoKey; //Java virtual keycode, none if negative
private final int undoRelease; //Java virtual keycode, none if negative
public KeyboardAction(int press, int key, int release, int undoPress, int undoKey, int undoRelease) {
this.press=press;
this.key=key;
this.release=release;
this.undoPress=undoPress;
this.undoKey=undoKey;
this.undoRelease=undoRelease;
}
public int getPress() {
return press;
}
public int getKey() {
return key;
}
public int getRelease() {
return release;
}
public int getUndoPress() {
return undoPress;
}
public int getUndoKey() {
return undoKey;
}
public int getUndoRelease() {
return undoRelease;
}
}
class AccessibilityAction implements Action {
private final String doAction;
private final String undoAction;
public AccessibilityAction(String doAction, String undoAction) {
this.doAction=doAction;
this.undoAction=undoAction;
}
public String getDoAction() {
return doAction;
}
public String getUndoAction() {
return undoAction;
}
}
class SocketOutputAction implements Action {
private final String doString;
private final String undoString;
private final boolean suppressNewline;
public SocketOutputAction(String doString, String undoString, boolean suppressNewline) {
this.doString=doString;
this.undoString=undoString;
this.suppressNewline=suppressNewline;
}
public String getDoString() {
return doString;
}
public String getUndoString() {
return undoString;
}
public boolean isSuppressNewline() {
return suppressNewline;
}
}
}