package com.akjava.gwt.three.client.java.ui.experiments;
import com.akjava.gwt.three.client.js.THREE;
import com.akjava.gwt.three.client.js.math.Euler;
import com.akjava.gwt.three.client.js.math.Vector3;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
public class SimpleEulerEditor extends HorizontalPanel {
private Euler value;
private DoubleBox xEditor;
private DoubleBox yEditor;
private DoubleBox zEditor;
public Euler getValue() {
return value;
}
public void copyWithToDegree(Vector3 newData,boolean fireListener){
if(value==null){
return;
}
xEditor.setValue(Math.toDegrees(newData.getX()));
yEditor.setValue(Math.toDegrees(newData.getY()));
zEditor.setValue(Math.toDegrees(newData.getZ()));
value.setX(xEditor.getValue());
value.setY(yEditor.getValue());
value.setZ(zEditor.getValue());
if(fireListener){//fire or not
flush();
}
}
public void copy(Vector3 newData,boolean fireListener){
if(value==null){
return;
}
xEditor.setValue(newData.getX());
yEditor.setValue(newData.getY());
zEditor.setValue(newData.getZ());
value.setX(xEditor.getValue());
value.setY(yEditor.getValue());
value.setZ(zEditor.getValue());
if(fireListener){//fire or not
flush();
}
}
public void setValue(Euler value) {
this.value = value;
if(value==null){
xEditor.setEnabled(false);
yEditor.setEnabled(false);
zEditor.setEnabled(false);
return;
}else{
xEditor.setEnabled(true);
yEditor.setEnabled(true);
zEditor.setEnabled(true);
}
xEditor.setValue(Math.toDegrees(value.getX()));
yEditor.setValue(Math.toDegrees(value.getY()));
zEditor.setValue(Math.toDegrees(value.getZ()));
}
private SimpleEulerEditorListener listener;
public void setListener(SimpleEulerEditorListener listener) {
this.listener = listener;
}
/*
* even if make true Editor-framework,need listenre if you'd like to dynamic change instead of Update button's update
*/
public SimpleEulerEditor(SimpleEulerEditorListener listener){
this.listener=listener;
this.value=THREE.Euler();
this.add(new Label("X:"));
xEditor = new DoubleBox();
xEditor.setWidth("80px");
xEditor.addValueChangeHandler(new ValueChangeHandler<Double>() {
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
flush();
}
});
this.add(xEditor);
this.add(new Label("Y:"));
yEditor = new DoubleBox();
yEditor.addValueChangeHandler(new ValueChangeHandler<Double>() {
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
flush();
}
});
yEditor.setWidth("80px");
this.add(yEditor);
this.add(new Label("Z:"));
zEditor = new DoubleBox();
zEditor.addValueChangeHandler(new ValueChangeHandler<Double>() {
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
flush();
}
});
zEditor.setWidth("80px");
this.add(zEditor);
}
protected void flush() {
if(value==null){
return;
}
value.setX(Math.toRadians(xEditor.getValue()));
value.setY(Math.toRadians(yEditor.getValue()));
value.setZ(Math.toRadians(zEditor.getValue()));
if(listener!=null){
listener.onValueChanged(value);
}
}
public static interface SimpleEulerEditorListener{
public void onValueChanged(Euler value);
}
public void setEnabled(boolean enabled) {
xEditor.setEnabled(enabled);
yEditor.setEnabled(enabled);
zEditor.setEnabled(enabled);
}
}