package info.u250.c2d.box2deditor.ui;
import info.u250.c2d.box2deditor.io.IO;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.lang.reflect.Field;
import java.util.EventListener;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* used auto change of the java entity and the ui
* @author moonshadow
*
*/
public abstract class Binder {
JComponent inputField;
Object obj;
Field field;
String name;
EventListener l;
int count = 0;
public void enable(){
this.count = 1;
}
void addEventListener(){
if(inputField instanceof JTextField){
JTextField.class.cast(inputField).addKeyListener((KeyAdapter)l);
}else if(inputField instanceof JCheckBox){
JCheckBox.class.cast(inputField).addItemListener((ItemListener)l);
}else if(inputField instanceof JSpinner){
JSpinner.class.cast(inputField).addChangeListener((ChangeListener)l);
}else if(inputField instanceof JComboBox){
JComboBox.class.cast(inputField).addItemListener((ItemListener)l);
}
}
public void update(Object object){
if(object==this.obj){
count++;
}else{
count = 0;
}
this.obj = object;
try {
try{
//first
field = obj.getClass().getDeclaredField(name);
}catch(Exception ex){
try{
//second
field = obj.getClass().getSuperclass().getDeclaredField(name);
}catch(Exception e){
//third
try{
//second
field = obj.getClass().getSuperclass().getSuperclass().getDeclaredField(name);
}catch(Exception exx){
//four~
field = obj.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField(name);
}
}
}
//ok ,let's set it
if(inputField instanceof JTextField){
//common text
JTextField.class.cast(inputField).setText(field.get(obj)+"");
}else if(inputField instanceof JCheckBox){
//boolean value
JCheckBox.class.cast(inputField).setSelected(Boolean.parseBoolean(field.get(obj)+""));
}else if(inputField instanceof JSpinner){
//float,integer,short values
JSpinner.class.cast(inputField).setValue(field.get(obj));
}else if(inputField instanceof JComboBox){
JComboBox.class.cast(inputField).setSelectedIndex(field.getInt(obj));
}
}catch(Exception ex){ex.printStackTrace();}
}
public Binder(final Object object,final String name,final JComponent widget){
this.name = name;
this.inputField = widget;
if(inputField instanceof JTextField){
l = new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
try {
field.set(obj,JTextField.class.cast(inputField).getText());
if(count!=0)doPostSolve();
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
}else if(inputField instanceof JCheckBox){
l = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
try {
field.set(obj, JCheckBox.class.cast(inputField).isSelected());
if(count!=0)doPostSolve();
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
}else if(inputField instanceof JSpinner){
l = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
try{
field.set(obj, JSpinner.class.cast(inputField).getValue());
if(count!=0)doPostSolve();
}catch(Exception ex){
ex.printStackTrace();
}
}
};
}else if(inputField instanceof JComboBox){
l = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
try{
field.set(obj, JComboBox.class.cast(inputField).getSelectedIndex());
if(count!=0)doPostSolve();
}catch(Exception ex){
ex.printStackTrace();
}
}
};
}
this.addEventListener();
this.update(object);
}
void doPostSolve(){
count++;
postSolve();
IO.INSTANCE.save(null);
}
protected abstract void postSolve();
}