package joshie.progression.gui.editors;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.util.ChatAllowedCharacters;
import java.util.HashMap;
public class TextEditor {
private HashMap<ITextEditable, Integer> cachedPosition = new HashMap();
private ITextEditable editable = null;
private boolean isTextEditing;
private int position;
private boolean white;
private int tick;
public boolean setEditable(ITextEditable editable) {
if (this.editable != editable) {
this.position = editable.getTextField().length();
}
this.isTextEditing = true;
this.editable = editable;
return true;
}
public ITextEditable getEditable() {
return editable;
}
public void clearEditable() {
this.isTextEditing = false;
this.editable = null;
this.position = 0;
}
public boolean isEditing() {
return isTextEditing && editable != null;
}
public void keyTyped(char character, int key) {
if (isTextEditing && editable != null) {
///Reset is just in case
//setEditable(editable);
if (key == 203) {
cursorLeft(1);
} else if (key == 205) {
cursorRight(1);
} else if (character == 22) {
add(GuiScreen.getClipboardString());
} else if (key == 14) {
delete(-1);
} else if (key == 211) {
delete(0);
} else if (key == 28 || key == 156) {
add("\n");
} else if (ChatAllowedCharacters.isAllowedCharacter(character)) {
add(Character.toString(character));
}
//Update the cache
cachedPosition.put(editable, position);
}
}
public String getText(ITextEditable editable) {
if (!isTextEditing || editable != this.editable)
return editable.getTextField();
else {
String field = editable.getTextField();
updateColor();
if (white) {
return new StringBuilder(field).insert(Math.min(position, field.length()), "_").toString() + " ";
} else {
return new StringBuilder(field).insert(Math.min(position, field.length()), "_").toString() + " ";
}
}
}
private boolean fixPosition() {
if (editable == null) return false;
if (position > editable.getTextField().length()) {
position = editable.getTextField().length();
}
return true;
}
private void updateColor() {
if (!fixPosition()) return;
tick++;
if (tick % 60 == 0) {
if (white) {
white = false;
} else {
white = true;
}
}
}
private void cursorLeft(int count) {
int left = position - count;
if (left < 0) {
position = 0;
} else position = left;
if (!fixPosition()) return;
}
private void cursorRight(int count) {
if (!fixPosition()) return;
String text = editable.getTextField();
int right = position + count;
if (right > text.length()) {
position = text.length();
} else position = right;
}
private void add(String string) {
if (!fixPosition()) return;
String text = editable.getTextField();
StringBuilder builder = new StringBuilder(text);
text = builder.insert(position, string).toString();
editable.setTextField(text);
cursorRight(string.length());
}
private void delete(int count) {
String text = editable.getTextField();
if ((count < 0 && position > 0) || (count >= 0 && position + count < text.length())) {
StringBuilder builder = new StringBuilder(text);
int delete = position + count;
if (delete > editable.getTextField().length()) {
delete = editable.getTextField().length();
}
text = builder.deleteCharAt(delete).toString();
editable.setTextField(text);
if (count < 0) cursorLeft(-count);
else if (count >= 0) cursorRight(count);
}
}
//If it's null
public void setText(String string) {
if (editable != null) {
editable.setTextField("");
position = editable.getTextField().length();
}
}
}